July 01, 2006室内飛行機用の基板、到着Olimexに頼んでいた、室内飛行機を制御するための基板が届きました。左から順にプロポとPCを接続するアダプタ、超音波センサをドライブする回路、制御基板のマザーボードです。詳しくは過去の記事、『プロポとPCの接続基板』と『機体搭載基板』をどうぞ。 届いてびっくりしたのですが、金メッキ仕様になったのでしょうか、スルーホールなどの部分の色が以前は銀色だったのに今回は金色になっています。 ※その後、ラジコン受信機とマイコン(H8/3694)を接続する方法を紹介してみました。 July 07, 2006Ruby Debug Injection
[Computer]
Rubyでプログラムをよく書くのですが、メソッドの入出力を監視したい、つまりメソッドの引数と返り値が何であるか知りたくなることがあります。 module Debugger
使い方としてはdef debug(target_method, do_debug = true) if target_method.class != Symbol then target_method = target_method.intern end target_orig = "#{target_method}_orig".intern unless self.instance_methods.include?(target_orig.to_s) then self.instance_eval{ alias_method(target_orig, target_method) } end target_debug = "#{target_method}_debug".intern unless self.instance_methods.include?(target_debug.to_s) then self.module_eval(<<-__EVAL_STRING__) def #{target_debug}(*params) params.each_with_index{|param, i| puts 'INPUT' + i.to_s + ': ' + param.inspect } output = #{target_orig}(*params) puts 'OUTPUT: ' + output.inspect return output end __EVAL_STRING__ end self.instance_eval{ alias_method(target_method, do_debug ? target_debug : target_orig) } end end class Target
def a(b, c=nil) puts "ARG0: #{b}" puts "ARG1: #{c}" return c end end class Target Target::new.a(1) # normal Target::debug(:a) #attach debugger to method :a Target::debug(:a, false) #detach debugger from method :a スクリプト言語だから当たり前といってしまえばそれまでですが、Rubyはリフレクションの機能が強力なので怪しげなことが簡単にできてしまって楽しいです。でも、リフレクションを使いまくると明らかにコードが読みにくくなり、他の人に迷惑がかかるので注意したほうがいいかもしれません。ちなみに僕はリフレクションは好きな方なので、チームで開発した際に他のメンバーに迷惑をかけた記憶があります(笑)。 July 11, 2006ThinkPadのスクロール機能
[Computer]
ThinkPad X60sを買ってから2ヶ月近く経とうとしているのですが、ThinkPadのスクロール機能で不満が出てきました。なんと、特定のアプリケーションでスクロール機能が効かないのです。 ThinkPadの入力デバイスはTrackPointという独自のもので、下に3つに並んだボタンと中央の突起(通称"ち○び"というらしい)を利用して入力する仕組みになっています。スクロール機能はそのうちの真ん中のボタンと中央の突起を使って行い、真ん中のボタンを押しつつ突起を上下に押せば、ホイール付マウスでホイールをくりくりするのと同じ効果が得られます。 とりあえずGoogle先生に聞いてみました。謎が解けました。 ; Record Format
どうやらここに設定を書き込めばよいようです。色々と試してみた結果、例えばEagleの場合にはPass 1 rulesの下に; OsName,OsVersion,AppName,TopClass,ParentClass,WindowClass,ScrollingType, ; Pass,Exit (中略) ; Pass 1 rules (These rules run last) (中略) ; Outlook Express patch for 3 button systems WIN,*,msimn.exe,*,*,SysTreeView32,WheelStd,1,9 *,*,eagle.exe,*,*,*,WheelStd,1,9
と書き足してtp4serv.exeを再起動すると、スクロール機能が有効になりました。
もしスクロール機能が働かないアプリケーションがあったら、上記の方法でうまくいくかもしれません。こういうことはサポート機能としてGUIが設定できるようになっている必要がある思うのですが、いかがでしょうか。 July 15, 2006ラジコン受信機とマイコンの接続室内で飛行する模型飛行機の自動制御を企んでいるわけですが、機体外から送られてきた制御情報と、機体に搭載されたセンサから得られた情報を、機体内のマイコンでミキシングすることによって全体のシステムが成立するようなことを考えています。 ラジコンの受信機は普通、制御する対象の数(チャンネル数)だけ配線があり、そこにパルス(OFF→ON→OFFの信号)が出力されます。このパルスのON時間と制御量は比例関係にあるので、パルスのON時間をマイコンで計測できれば目的が達成されます。 工夫というのは単純な話で、ラジコン受信機からでてくるパルスは、チャンネルが違えば出力されるタイミングが異なることを利用しました。回路は図のとおりです。 あとはプログラムですが、これは続きをどうぞ。 続きを読む "ラジコン受信機とマイコンの接続"July 19, 2006マイコンと超音波センサの接続室内で飛行する模型飛行機の自動制御ですが、超音波センサを利用して壁までの距離、あるいは床までの距離を検出することを考えています。超音波センサは加速度計やジャイロのように単体で使うことができるわけではなく、超音波の送受信回路が付加回路として必要になるため、付加回路を制御するためのPICを含めたモジュール構成になっています。詳細は機体搭載基板をどうぞ。 世の中にはこういった通信規格が山のようにあり、電子工作的メジャーなものだとシリアルEEPROMやA/D変換機に搭載されているI2Cがあります。しかし今回は超音波センサモジュールから受信するだけなので、お手軽プロトコルを自作してみました。回路と通信方式は図のとおりです。 要点は中央のマイコンがモジュール側にデータを送るタイミングを一方的に指示していることです。このため、超音波センサの計測時間によるタイムラグを無視していることになるので、なんらかの対策を講じる必要があります。つまり、マイコン側からデータ要求を受けた時点で計測していたのでは、間に合わないことになります。 概念的なコードを書いてみました。続きをどうぞ。 続きを読む "マイコンと超音波センサの接続"July 21, 2006Death March
[Computer]
以下はこの本を読んでみた感想です。 続きを読む "Death March"July 24, 2006トラックバックでBus Error (10)久しぶりのサーバやサイトの管理をしてみました。Webサーバのバージョンをあげてみたりとか、リンク切れを修正してみたりとか、見た目的には何も変わらないので非常に報われない作業です。そんな中でWebサーバのエラーログを見たのですが、あまり見たくないエラーがありました。ありえない領域をアクセスした際に発生するBus Errorというエラーが。 このサイトにもしトラックバックを送られていた方がいたら本当にごめんなさい。現在鋭意作業中ですが、また解決には至っていません。以下、その闘いの記録です。 ※その後、strstr()の問題とわかり、mod_encodingのソースを修正することで解決しました。 続きを読む "トラックバックでBus Error (10)"July 27, 2006H8/3694用のフレームワーク室内飛行機の自律制御システムを秋月電子のH8/3694ボードを利用して作成しているのですが、色々とプログラムができてきたので、ソースを公開してみようと思います。 ところでですが、マイコンで電子工作をする際、シリアルポートからデータを送受信したりだとか、A/D変換をしたりだとか決まりきった動作があると思います。そういったものは別のシステムを作成する際にも後々再利用が可能なので、そういったコードはフレームワーク、つまり枠組みとしてできる限りアプリケーション寄りのコードから切り離しておくと便利だと思いませんか? wget https://fenrir.naruoka.org/download/embedded/framework/H8_3694/H8_3694_framework.tar.bz2;
とすることで全コードを入手できます。
tar -jvxf H8_3694_framework.tar.bz2 フレームワークの主な内容ですが、シリアル送受信、A/D変換、インターバルタイマ(タイマAを使用)、ウォッチドックタイマをサポートしておりスタートアップルーチンとリンカスクリプトも内蔵しています。シリアル送受信とA/D変換にはリングバッファを使用しているので、途切れのないやり取りが可能です。この辺りの事情は『ソフトウェアFIFO』の記事を参考にどうぞ。 このフレームワークを利用する場合はH8用gccやmakeが必要です。開発環境の導入は『h8300-elf Makefile』の記事を参考にどうぞ。開発環境の導入が完了したら、フレームワークを展開したトップディレクトリのmain.cに自分用のアプリケーションコードを書き make
するだけです。使い方はフレームワーク自身のソースや、それを利用して作った室内飛行機用のコード、あるいは自動生成のドキュメントを参考にしてください。関数の一覧が一番役に立つかもしれません。 最後にですが、動作検証は秋月のH8/3694でしています。リンカスクリプトを少々修正することで同じTinyシリーズの3664にも対応可能だと思います。 |
かれんだ~
スポンサード リンク
|