March 07, 2011

AR.Drone上でintercepttyを動かす

空飛ぶおもちゃAR.Droneですが、中身はつまるところARM9を搭載したLinuxコンピュータです。ということで、ソースがあるプログラムでしたら、それをARMベースLinuxの環境に移植することで、AR.Droneの中で走らせることが可能です。この記事ではシリアルポートの通信履歴を記録してくれるintercepttyというプログラムを、AR.Drone上で走らせるまでにしたことを記録しておこうと思います。なおプログラムのビルドはWindows環境(CPUは無論x86)で行いました。

まずはビルド環境を整えます。x86をホストとし、ターゲットがARMとなるクロスビルド環境を導入します。AR.DroneのGPL関連サイトによるとクロスコンパイラといったツールの詰め合わせ(Toolchain)として、『G++ Lite 2009q1-203 toolchain for ARM GNU/Linux』を使っているとありますので、それを導入します。Toolchainを自分で作ってもよいのですが、時間がかかる上、結構失敗する可能性が高いのでコンパイル済みのものをそのまま使うことにしました。Sourcery G++ Lite 2009q1-203 for ARM GNU/Linuxの『IA32 Windows Installer』を有難くそのままインストールすることにします。

次にソースをコンパイルする際に必要となるLinuxのヘッダー等のソースを集めてきます。現時点でのAR.Droneに搭載されたLinuxカーネルは2.6.27で、AR.Drone用に改修された部分を含めたソースがARDrone linux kernel source codeにありますので、それをダウンロードして適切な場所に展開します。

ここからは動かしたいプログラムに依存する項目ですが、冒頭で紹介したintercepttyの場合は、ビルドを行うためのオマジナイconfigureスクリプトがありますので、それを改修したり、適宜オプションを与えることでビルドすることができました。configureの改修(差分はinterceptty-0.6.patch)とオプションを与える点で共通しているのは、AR.Doroneには共有ライブラリが全くといっていいほど入っていないので、共有ライブラリをダイナミックリンクで取り込もうとしないようにする、ということを行ってあります。configureのオプションは以下の通りです。

CC=arm-none-linux-gnueabi-gcc ./configure --includedir=/path/to/Sourcery\ G++\ Lite/arm-none-linux-gnueabi/include --host=arm-linux-elf --disable-dev-ptmx --disable-dev-ptc --disable-libutil

パス等は適宜修正してください。あとはmakeをかけることでAR.Drone上で動くintercepttyができました。ビルド済みのzipで包んだバイナリをおいておきます。AR.Drone上でのintercepttyの使い方は、例えばモータコントローラと接続されているttyPA1に対する適用が参考になります。

最後にですが、どうやってWindows環境でビルドされたARM/Linux用のプログラムをAR.Droneに転送するか、という話があります。方法はいくつかあるようですが、最も単純なTFTPを使って行うことにしました。TFTPとは、ネットを使ってデータを送受信する簡易的なプロトコル(FTPよりも遥かに単純)で、このクライアント用コマンドがAR.Droneにはあらかじめ組み込まれています。例えばTftpd32を使ってWindows側をTFTPサーバとし、AR.Drone側にtelnetでログインして、tftpコマンドのgetモードで接続、WIndow上TFTPサーバから目的のプログラムを取得することができました。これで転送完了です。モードをputにすると、逆にAR.Droneのファイルを送信することができますので、intercepttyで取得したログはこれで転送するとよいでしょう。

AR.Droneの物理的なI/Fも探ってみています。

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

March 15, 2011

AR.Drone BLCとのI/Fで悩む

AR.Droneをプロポで完全手動操縦したいと考え、前回のintercepttyの記事をはじめとして色々と解析を行っているところですが、中央のメイン基板から指令を受け各モータを制御しているBLC(BrushLess Controller)基板に関して、その物理的接続をどうすればよいか悩んでいます。
というのも以前テスターでBLC基板の配線を確認した際、指令をやりとりしているピン(BLC基板5ピンコネクタのうち3番ピン)は内部的に送信と受信が結線されているため、半二重通信、つまり送信と受信のタイミングをずらすことで、1本の線でも送受信できるようにしなければなりません。またメイン基板の1つのシリアル通信(/dev/ttyPA1)を4つのBLC基板で共有して通信を行っていることが、調査結果から明らかになっていますので、それも考慮しなけれはいけません。

そこで以下の図ような接続方法を考えてみました。

ar.drone_blc_if.png
(太線は4本分)

4つのBLC基板をマルチプレクスするのと、半二十通信を実現するため、CPLDを導入してロジックを組んであります。またBLC側のマイコンATmgea8aが5V I/Oなので、指令を出すマイコンが3V I/Oであることを想定して、入力5VトレラントのCPLDXilinx XC9536XLを使っています。同時に送信側では、Hレベルが5Vとなるよう、open-drain出力にしてあります。

これでうまく動けばいいのですが、なかなか苦戦しています。なお使ったCPLD XC9536XLは100円ちょっとで買えます。標準ロジックを複数買うよりも断然お得なので、今後も機会があったら積極的に使っていきたいと思います。

※(2011/3/17追記)上の回路を実装して試してみましたが、XC9536XLの出力ドライバの能力があまり高くなく、1つのピンではATmega8aに対するシンク電流を十分に確保できないようです。(参考: XC9500XLのシンク能力) 複数ピンを使って試してみています。

※※(2011/3/27追記)3本束ねたら動きました。

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

March 22, 2011

東京電力の電力の使用状況グラフが使いにくい 改め にくかった

先日の大震災の影響で関東地方では電力の供給不足という状況に陥っていますが、それに関連して、東京電力には電力の消費状況をモニタするサイト『電力の使用状況グラフ(当社サービスエリア内)』があります。このサイトでは電力の消費状況に加えて計画停電の実行状況を知ることもできます。

ところがこのサイト、データが画像として提供されているだけで、APIなどコンピュータフレンドリな方法が一切なく、他の機器でこのデータを応用することが難しくなっています。そこで、この画像を読み取り数値データに変換するスクリプトを作成してみました。

即席なので、特定の画素の色データを読み込んで数値に変換するといういい加減なコードです。ですが例えば、電力消費がやばそうだからエアコンを自動的に切る、といった電力関係のアプリを作ろうとしている方のお役に立てければ幸いです。

※ここで公開しているスクリプトを応用して、Twitterのボットを作ってみました。save_energy_jpというアカウントです。

こんな感じでつぶやいています。

※※APIを作られた方も現れました。moyashiさん(Yahoo!ソースでImageMagick+tesseract-ocr)のJSON APIssciさんのJSON

※※※(2011/3/24) 元サイトでもCSV形式で数値データが提供されるようになりましたので、今後は画像から抽出する必要はなさそうです!

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

March 27, 2011

AR.Drone用 何か Rev.B

空飛ぶおもちゃAR.Droneをプロポで飛ばしたり、その他諸々のことをしたいなと思っています。そういう経緯があって以前『AR.Drone用 何か』という記事ではオリジナル基板を紹介したのですが、残念ながら回路の不備によって思った動作をしませんでした。そこで新たに設計したRev.B基板で作業を進めています。今回の記事はそのRev.B基板の紹介です。

まずは恒例の基板写真。

ar.drone_mod_revB_bottom.jpg
ar.drone_mod_revB_top.jpg
表と裏。

基本構成は以前のRev.Aとほとんど変わりませんが、以前の74標準ロジックに変えてどんなインターフェイスにも対応できるようCPLD XC9536XLを搭載したこと、絶対気圧がi2cで計測できるセンサ Bosch BMP085を追加搭載したことが主な変更点です。

この基板を使ってAR.DroneのモータコントローラであるBLC(Brushless Controller)を直接制御する(つまりAR.Droneに搭載された中央の基板であるマザーボードとナビゲーションボードを使わずに飛ばす)ということを試みていますが、ほぼ成功しつつあります。これは、ときにシリアル通信を覗き見するintercepttyを使って、また、ときに信号線を直接オシロスコープで見ることによって、BLCのプロトコルを解析することで進めています。このBLCプロトコルについては、解析方法の話も含めて、別の記事にまとめてみようと思います。

さてこの基板ですが、表面に銅線(UEW)を這わせて修正をしています。拡大図を以下に示します。

ar.drone_XC9500XL_mod.jpg
赤丸は隣接ピン短絡用0オーム

この修正は以前の『AR.Drone BLCとのI/Fで悩む』の末尾で触れた、XC9536XLの電流駆動能力不足を解消するための修正です。元の基板上のパターンに接続されたピン、銅線のピン、そしてその隣のピン、これら全部で3本のピンを束ねることによって、接続先のATmega8aが標準状態で出力しているロジックレベル(H)を覆してLにすることができました。こういう細かい修正で思ったとおりの動作をしてくれるようになると、基板が無駄にならず大変報われた気分になれます。

最後に作業風景の写真でも。机にモノが散らかっていないのは仕様外です(笑、ここから撤収することになりました)。

dr_desk_last.jpg

この机には4年間お世話になりました。

※その後、BLCのプロトコル解析結果を書きました。

※※そしてとうとうこの基板を使ってプロポで操縦できました。

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