July 01, 2006

室内飛行機用の基板、到着

indoor_plain_board.png

Olimexに頼んでいた、室内飛行機を制御するための基板が届きました。左から順にプロポとPCを接続するアダプタ、超音波センサをドライブする回路、制御基板のマザーボードです。詳しくは過去の記事、『プロポとPCの接続基板』『機体搭載基板』をどうぞ。

届いてびっくりしたのですが、金メッキ仕様になったのでしょうか、スルーホールなどの部分の色が以前は銀色だったのに今回は金色になっています。
注文ページを見たところ、どうやら現在業界で叫ばれている"鉛フリー"に対応するための措置のようです。金色というのはなかなか格好がよく、思わず見とれてしまっています。基板を鑑賞して微笑んでいると怪しい人にしか見えないのが、ちょっとあれですが。

※その後、ラジコン受信機とマイコン(H8/3694)を接続する方法を紹介してみました。
※さらにその後、超音波センサモジュールとマイコン(H8/3694)の接続について記事を書きました。

22:10 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (7) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/497

July 07, 2006

Ruby Debug Injection

Rubyでプログラムをよく書くのですが、メソッドの入出力を監視したい、つまりメソッドの引数と返り値が何であるか知りたくなることがあります。
こんなとき、いちいち当該メソッドにいわゆるprintfを仕込んだりするのは面倒なので、何かよい案がないか考えてみました。もしかしたら標準の機能でそういうものがあったかもしれませんが、とりあえず作ってみたので公開してみたいと思います。

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
    extend Debugger
end

Target::new.a(1)    # normal
Target::new.a(1,2)    # normal

Target::debug(:a)    #attach debugger to method :a
Target::new.a(1)    # debugging ...
Target::new.a(1,2)    # debugging ...

Target::debug(:a, false)    #detach debugger from method :a
Target::new.a(1)    # normal
Target::new.a(1,2)    # normal

スクリプト言語だから当たり前といってしまえばそれまでですが、Rubyはリフレクションの機能が強力なので怪しげなことが簡単にできてしまって楽しいです。でも、リフレクションを使いまくると明らかにコードが読みにくくなり、他の人に迷惑がかかるので注意したほうがいいかもしれません。ちなみに僕はリフレクションは好きな方なので、チームで開発した際に他のメンバーに迷惑をかけた記憶があります(笑)。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/498

July 11, 2006

ThinkPadのスクロール機能

ThinkPad X60sを買ってから2ヶ月近く経とうとしているのですが、ThinkPadのスクロール機能で不満が出てきました。なんと、特定のアプリケーションでスクロール機能が効かないのです。

ThinkPadの入力デバイスはTrackPointという独自のもので、下に3つに並んだボタンと中央の突起(通称"ち○び"というらしい)を利用して入力する仕組みになっています。スクロール機能はそのうちの真ん中のボタンと中央の突起を使って行い、真ん中のボタンを押しつつ突起を上下に押せば、ホイール付マウスでホイールをくりくりするのと同じ効果が得られます。
しかしながらこの機能、エクスプローラやM$のワード、エクセルなどでは働くのですが、Eagleなどのマイナーソフトではなぜか働きません。Eagleとは基板を作るためのソフトで、スクロール機能を使って基板図面の拡大縮小をするのでスクロール機能がないと話になりません。このままではいちいちホイールがあるマウスを外付け、という面倒な状況になりかねないので、どうにかしたいと考えていました。

とりあえずGoogle先生に聞いてみました。謎が解けました。
どうやら最近のThinkPadでは、tp4serv.exeというソフトがTrackPointによる入力を受け、それをアプリケーションに伝えることによって機能しているようです。マウスやキーボードのような、標準的な入力デバイスとして認識されているわけではないのですね。
そしてtp4servはWindowsのSystem32ディレクトリ内にあるtp4table.datという設定ファイルによって動作を決定していることもわかりました。そのファイルを開くと、スクロール機能の設定らしきものがありました。

; Record Format
; 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の場合にはPass 1 rulesの下に
*,*,eagle.exe,*,*,*,WheelStd,1,9
と書き足してtp4serv.exeを再起動すると、スクロール機能が有効になりました。

もしスクロール機能が働かないアプリケーションがあったら、上記の方法でうまくいくかもしれません。こういうことはサポート機能としてGUIが設定できるようになっている必要がある思うのですが、いかがでしょうか。

23:25 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (4) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/499

July 15, 2006

ラジコン受信機とマイコンの接続

室内で飛行する模型飛行機の自動制御を企んでいるわけですが、機体外から送られてきた制御情報と、機体に搭載されたセンサから得られた情報を、機体内のマイコンでミキシングすることによって全体のシステムが成立するようなことを考えています。
つまり機体外の情報を一度、機体内のマイコンにとりこむ必要があるのですが、今回は機体外の情報の通信手段としてはラジコンの無線を利用することを考えているので、ラジコンの受信機とマイコンを接続すれば達成できることになります。

ラジコンの受信機は普通、制御する対象の数(チャンネル数)だけ配線があり、そこにパルス(OFF→ON→OFFの信号)が出力されます。このパルスのON時間と制御量は比例関係にあるので、パルスのON時間をマイコンで計測できれば目的が達成されます。
しかしマイコン側でON時間を計るための機能は、残念ながらチャンネル数分ないことがほとんどであるため、なんらかの工夫をする必要があります。今回は6チャンネルの受信機をH8/3694マイコンの2つ分のパルス計測機能(正確にはタイマWのインプットキャプチャ機能、端子はFTIOAとFTIOB)で計ることにしました。

rx2cpu.png
こんな回路でできます。

工夫というのは単純な話で、ラジコン受信機からでてくるパルスは、チャンネルが違えば出力されるタイミングが異なることを利用しました。回路は図のとおりです。

あとはプログラムですが、これは続きをどうぞ。

続きを読む "ラジコン受信機とマイコンの接続"
02:24 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (9) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/500

July 19, 2006

マイコンと超音波センサの接続

室内で飛行する模型飛行機の自動制御ですが、超音波センサを利用して壁までの距離、あるいは床までの距離を検出することを考えています。超音波センサは加速度計やジャイロのように単体で使うことができるわけではなく、超音波の送受信回路が付加回路として必要になるため、付加回路を制御するためのPICを含めたモジュール構成になっています。詳細は機体搭載基板をどうぞ。
従って、その超音波センサモジュールとメインのマイコンをなんらかの方法で接続する必要があるのですが、今回はどのように通信すればデータをやりとりできるか考えてみた話です。

世の中にはこういった通信規格が山のようにあり、電子工作的メジャーなものだとシリアルEEPROMやA/D変換機に搭載されているI2Cがあります。しかし今回は超音波センサモジュールから受信するだけなので、お手軽プロトコルを自作してみました。回路と通信方式は図のとおりです。

us_protocol.png

要点は中央のマイコンがモジュール側にデータを送るタイミングを一方的に指示していることです。このため、超音波センサの計測時間によるタイムラグを無視していることになるので、なんらかの対策を講じる必要があります。つまり、マイコン側からデータ要求を受けた時点で計測していたのでは、間に合わないことになります。
そこで、超音波センサモジュール側は一定間隔で計測しており、最新の値を常に更新しているものとして、マイコンから要求があったときにその最新の値を返すようにすることにしました。これならデータを送信するだけですので、十分余裕をもって対応できると思います。

概念的なコードを書いてみました。続きをどうぞ。

続きを読む "マイコンと超音波センサの接続"
16:44 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/501

July 21, 2006

Death March

デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
最近第2版が発売されたのを機に、タイトルが気になった本『デスマーチ ~ ソフトウェア開発はなぜ混乱するのか』を読んでみました。デスマーチというのは、プログラマとかSEとか、コンピュータ関係の職業に就かれている方なら耳にタコができるくらい聞いている、そして多くの場合は体験されている(笑)かと思いますが、馴染みがない方に簡単に説明しておくと、その成功例がいわゆるプロジェクトXみたいなもので、失敗する可能性が非常に高い『えいやっ』でなんとかする類のプロジェクトのことです。

以下はこの本を読んでみた感想です。

続きを読む "Death March"
08:49 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (5) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/502

July 24, 2006

トラックバックでBus Error (10)

久しぶりのサーバやサイトの管理をしてみました。Webサーバのバージョンをあげてみたりとか、リンク切れを修正してみたりとか、見た目的には何も変わらないので非常に報われない作業です。そんな中でWebサーバのエラーログを見たのですが、あまり見たくないエラーがありました。ありえない領域をアクセスした際に発生するBus Errorというエラーが。
そういえばここ1年くらいトラックバックがないなぁと思って調べてみると、どうやらトラックバックが送られてきたときにこのエラーが発生しているようです。

このサイトにもしトラックバックを送られていた方がいたら本当にごめんなさい。現在鋭意作業中ですが、また解決には至っていません。以下、その闘いの記録です。

※その後、strstr()の問題とわかり、mod_encodingのソースを修正することで解決しました。

続きを読む "トラックバックでBus Error (10)"
00:10 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/503

July 27, 2006

H8/3694用のフレームワーク

室内飛行機の自律制御システム秋月電子のH8/3694ボードを利用して作成しているのですが、色々とプログラムができてきたので、ソースを公開してみようと思います。

ところでですが、マイコンで電子工作をする際、シリアルポートからデータを送受信したりだとか、A/D変換をしたりだとか決まりきった動作があると思います。そういったものは別のシステムを作成する際にも後々再利用が可能なので、そういったコードはフレームワーク、つまり枠組みとしてできる限りアプリケーション寄りのコードから切り離しておくと便利だと思いませんか?
今回はそういったコンセプトで再利用可能な部分を切り離してみました。ソースをおいておきます。なおまとめてダウンロードしたい方はtar玉で固めておきました。cygwinなら

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にも対応可能だと思います。

03:35 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/504