About this site
このサイトは、航空・宇宙コンピュータ電子工作といった時代の最先端のことから、登山といった文明生活から遥かにかけ離れたことまで、思うがままに書いてあります。写真も大好きです。
興味がある方にしかおもしろくないと思いますが、どうぞ楽しんでいってください。あと、MovableTypeのカスタマイズ情報を提供しています。

If you are interested in "Super Sylphide", an autopilot system for small UAVs, please visit this page.

Super Sylphide猫カメラGPSロガーXBee電力計


最後に、はてなアンテナやRSSリーダーで読む場合はこちらからどうぞ。
Entries @ recently

May 11, 2012

DMAとFIFOの難しい関係

オートパイロットシステム TinyFeatherのなかなか再現しないバグが最近ようやく解消したので、どういう問題であったのかということを、自分への備忘録として残しておきたいと思います。なかなか気づきにくい種類のバグでしたが、理屈がわかってしまえばとても納得のいく問題でしたので、スッキリしたついので勢いで記事を書いています。

バグを抱えていたのはDSPのUARTの受信部分でした。DSPのUARTは受信用のハードウェアバッファ(FIFO)を持っており、FIFOに一定量のデータがたまるとDMAが動作するようになっています。本体の計算能力を奪わないためにも、また、FIFOの容量より大きなデータを受信できるようにするためにも、DMAを活用してFIFOの内容をメインメモリに転送することにしました。メインメモリ上にはリングバッファが形成されており、その他のポーリングルーチンなどから任意のタイミングで受信データを読み出せるようにしてあります。図示すると以下のようになっています。

DMA_FIFO_normal.png
正常時

正常に動作している場合は、流れるようにFIFOへの受信、FIFOからメインメモリ上リングバッファへのDMA転送、リングバッファからの読み出しが行えています。

しかし偶発的に計算負荷があがり、リングバッファからの読み出しをサボる事態が発生すると、リングバッファに空きがなくなります。さらにDMAもリングバッファ上の空きがないことを知って、休眠状態に入ってしまいます。ここからいかに回復するか、というところにバグが含まれていました。状態と解決方法を整理した図を以下に示します。

DMA_FIFO_abnormal.png
異常時

リングバッファに新たに空きができても、DMAが動作しないことが問題でした。上から4番目の図に青字でしめしたとおり、DMAを手動で起こしに行く必要があります。今回のDSP(TMS320C6745)の場合、DMAを起こすためには、FIFOを一旦空にして、DMAトリガーが再びかかるようにする必要がありました。

繰り返しになりますが、気づいてしまえばなんということはない問題です。FIFO、DMA、リングバッファと登場人物が多かったのが、解決への道のりを長くしていたのだと思います。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/842

May 04, 2012

Xperia Active ST17i を買ったよ!

最近のマイブームはAndroidのアプリを作ることなのですが、それのデバッグ用に端末を一台購入しました。Sony EricssonのXperia Active (ST17i) という国内未発売のモデルです。いわゆるSIMフリー端末というヤツですね。電波関係のことはこれ以上書くと(ウワナニヲスルヤメロ)なので、使用感を書いておこうと思います。

ST17i.jpg
ST17iを持って撮影

一番気に入っているのがその小ささです。別に一台所有しているG-shockスマホ(Casio IS11CA)ですと、画面の幅が結構あるので、掴んでいる側と反対側をタップするときに結構親指を伸ばさなければいけなかったり、あるいは別の手で入力、ということで少々大変でした。ST17iでは上記の写真にあるとおり、片手で余裕で操作できる大きさで、そこがとても気に入っています。

防水仕様なのもいいですね。手が多少ぬれていてもタップに対して反応してくれます。IS11CAよりも感度がよいと思いました。

カメラ用のシャッターボタンも気に入っています。普通のカメラと同じ構造で、半押しでフォーカス/AEロック、全押しでシャッターという2段階ボタンなので、構図をいじりやすいです。

使用感はこんなところでしょうか。後はどっちかというとこっちの方が本題だったりするのですが、自分メモとして何をやったか記録を残しておこうと思います。

  • OpenWnnフリック入力対応 を導入。同梱されているPOBoxでは、変換候補まで表示されてしまうと、テキスト入力エリアが十分に映らなくなり、不便。小さいソフトキーボードを探してOpenWnnにいきついた。
  • root化。購入時点で4.0.2.A.0.62というビルド番号だったが、これはroot化が困難らしい。ということで4.0.2.A.0.42にダウングレードしrootをとって、4.0.2.A.0.62にアップデートした。root化は維持されている。いちおうオリジナルの62もバックアップとして取得しておいた。
  • FM Radioを日本の周波数帯にあわせた。/system以下にある設定ファイルを書き換えで対応。
  • フォントをメイリオに変えた。購入時の中華フォントでは漢字が一部異なることに違和感を覚えたため。
  • セルスタンバイ問題の解消。データ専用SIMを使っていてビックリマークのアイコンが気になったことが発端。結果電力消費を抑えることにも役に立つらしいので満足。

バリバリ使っていく予定です。

22:29 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/841

April 13, 2012

Super Sylphide 進捗状況(50) -- Sylphideデータ形式

前回の進捗記事ではオートパイロットシステムSuper SylphideおよびTinyFeather通信プロトコルについて紹介しましたが、今回はそのペイロードとして載ってくるデータの形式について記事を書きたいと思います。このデータ形式は32bytesの固定長で、通信のペイロードとして載ってくる以外に、SDカードに保存されるログの形式としても使っています。

データ形式の構造は単純で、先頭1byteによって残り31bytesにどのようなデータが含まれているかを示しています。種類ごとに『ページ』という呼び方をしており、現在のところ以下のようなものがあります。

ページ種類内容
Nページ航法情報
GページGPS情報(中身はu-bloxのubx形式)
AページA/D変換データ
FページPWM入出力情報
Mページ地磁気情報
PページADS情報
Cページコマンド
Dページデバック情報

ページが違えば、内部の形式はまた定義が異なるのですが、例えば、航法情報を保存しているNページは以下のような形式になっています。

オフセット備考変換例
00x4Eヘッダ`N'
10x03シーケンス番号3
20x00(予約)0
30x00(予約)0
[4-7]0xD0 0x1B 0x00 0x00GPS時刻, Little Endian, 単位はmsec7120
[8-11]0xC8 0x6F 0x49 0x15緯度, Little Endian, signed, 単位は[0.0000001deg]35.713428
[12-15]0x28 0x09 0x4E 0x53経度, Little Endian, signed, 単位は[0.0000001deg]139.762308
[16-19]0x00 0x35 0x0C 0x00高度, Little Endian, signed, 単位は[0.0001m]80
[20-21]0x32 0x00北方向速度, Little Endian, signed, 単位は[0.01m]0.5
[22-23]0x9C 0xFF東方向速度, Little Endian, signed, 単位は[0.01m]-1.0
[24-25]0x05 0x00下方向速度, Little Endian, signed, 単位は[0.01m]0.05
[26-27]0x39 0x30ヘディング(ヨー), Little Endian, signed, 単位は[0.01deg]123.45
[28-29]0x2E 0xFFロール, Little Endian, signed, 単位は[0.01deg]-2.1
[30-31]0x7B 0x00ピッチ, Little Endian, signed, 単位は[0.01deg]1.23

その他ページの定義についてはコードを見ていただくのが一番だと思いますので、このデータ形式を処理するC++ソースJavaソースを公開したいと思います。

なおデータ形式を32byutes固定長にしたのは、2の乗数にすると効果的にログ保存ができるためです。SDカードに記録する際にはセクタサイズ(512bytes)等を意識して書き込みをするとよいので、その長さを効率よく使えるよう32bytesとしました。また、通信プロトコルに32bytesの固定長モードがあるというのも、データ形式が32bytes固定長を効率よく転送できるようにするためです。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/840

April 05, 2012

石垣島

[Photo]

石垣島に先日行ってきました。あいにくのお天気だったのですが、持っていった自転車で様々な場所を巡ることができました。たまたま天気が良かった日の写真を一枚、貼ってみます。

ishigaki.jpg
IS11CAで撮影

海がとても綺麗でした。写真は石垣島北側で撮ったもので、島内を自転車でほぼ一周した際に撮りました。川平湾や○○ビーチといった名所もいいのですが、こういった何気ない風景も大好きです。

08:03 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/839

March 29, 2012

Super Sylphide 進捗状況(49) -- Sylphide通信プロトコル

ご無沙汰しています。オートパイロットシステム Super Sylphide、およびその後継機のTiny Featherでは、無線を使って地上からモニタおよび指令を行うことができますが、独自規格ながら通信データのプロトコルを定めて運用してきました。このたび @henshiru 氏がメインで開発していたSuper Sylphide用地上モニタソフトのMaeve(メイヴ)がオープンソース化(MIT Licenseだと思う)されたことを受けて、このプロトコルの話を少し書こうと思います。

maeve_screen_shot.jpg
動作中のMeave

世の中には色々なプロトコルがあるので、既存の規格にあわせることも考えたのですが、なかなかお手ごろなシンプルなものがありません。僕が欲しいと思ったのは、流れてくるデータを意味単位に切り分けられること、簡単なエラー検出、この2つがあればいいと思いました。エラー訂正など、より機能を充実させるためにはTCP/IP方式で、このプロトコルをさらに上位プロトコルで包んであげればよいという思想も背景にあります。

結局、独自規格として以下に定めるSylphideプロトコル(固定長と可変長の2タイプ)を定めました。

0/32bytes 固定長プロトコル

インデックス 内容
0 0xF7 (ヘッダ, 8bits)
1 0xE (ヘッダ, 4bits) & 4 bits (ACK要求,ACK返答,ペイロード非所有,RESERVED='0')
2, 3 シーケンス番号(2bytes)
(4 - 35) ペイロード(32 bytes)
(36, 37) or (4, 5 : ペイロードなしの場合) CRC-16 2bytes (CRCの計算範囲はインデックス2から直前(3か35)まで)

N bytes 可変長プロトコル

インデックス 内容
0 0xF7 (ヘッダ, 8bits)
1 0xE (ヘッダ, 4bits) & 4 bits (ACK要求,ACK返答,ペイロード非所有,RESERVED='1')
2, 3 シーケンス番号(2bytes)
4, 5 ペイロードサイズ
(6 - (6 + (N - 1))) ペイロード(N bytes)
(6 + N, 6 + (N + 1)) CRC-16 2bytes (CRCの計算範囲はインデックス2から直前(6 + (N - 1))まで)

転送効率やエラー検出能力について詳細に検証したことはないのですが、これまで使ってきて大きな問題は発生していません。ちよっとした補足としては、ヘッダ(0xF7, 0xEX)については、ペイロードを調べて出現確率が最も低い組み合わせを算出しました。

現在、このプロトコルのパーサとしてC++版、およびJava版があります。拡張は簡単にできるよう、それぞれstd::[i/o]streamとJava.io.Filter[Input/Output]Streamに準拠させてました。なおJava版は、ある目的のために最近作ったもので、近いうちに成果物をださればよいなと考えています。

※次の進捗記事は、通信プロトコルのペイロードにあたる部分について書きました。

07:06 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/838

March 04, 2012

野沢 スキー

[Timely]

先日、野沢温泉にスキーに行ってきました。まずまずの天気でした。

2012_nozawa.jpg
(注)右下の板は違う方のです(笑)

今季はもう打ち止めな気がします。結局、5回(白馬五竜、水上、ガーラ(石内丸山)、高畑、野沢)です。一番滑ったのは高畑かな。穴場的なとても滑りやすいスキー場でした。次点は水上。

23:48 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/837

February 25, 2012

クワッドロータの電源回路

先日、クワッドロータ XAircraft X650 をお披露目しましたが、そのフライトコントローラをぼちぼち作っています。その過程で、電源回路にちょっと気になることがあったので、記事を書きたいと思います。

X650をはじめ多くクワッドロータの電源回路は、おおむね以下のようになっています。

qtw_power.png
電源概略図。

メインバッテリから4つのESC(スピコン)に分岐し、それぞれのESCがそれぞれのモータを回すことになります。一方、ESCはメインバッテリよりも低い電圧の電源を新たに生成し、フライトコントローラや受信機用を駆動しています。いわゆるBEC(Battery Eliminator Circuit)電源と呼ばれるものです。BEC電源はESCの数だけ、すなわち4つ生成されることになります。

ここで問題となるのが、その4つのBEC電源を並列接続してしまう可能性があることです。BEC電源は多くの場合、リニアレギュレータで生成されているのですが、リニアレギュレータを並列接続して使うことは推奨されていません。リニアレギュレータは個体差があり、生成される電圧が細かい部分で異なります。並列に接続すると電圧の高い側から異常に電流が供給されることになるためです。

一般的なラジコン飛行機やヘリは、ESCが1つしかなくBEC電源は1つ、あるいは複数のESCを使う場合は受信機用の電源を別途用意することが多く、BEC電源を並列にしてしまう可能性は低いようです。クワッドロータならではの問題点というこだと思います。

僕が計画中のフライトコントローラは、ESCから供給される4つのBEC電源のうちの1つでも十分電力に余裕がある予定です。並列接続しないように気をつけたいと思います。

22:53 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/836