December 01, 2011Make: Tokyo Meeting 07 出展します!
[Timely]
ものづくり系イベント、Make: Tokyo Meeting (MTM) が今週末の12/3(土), 4(日)と東京工業大学 大岡山キャンパスでありますが、そこで僕が作っている模型飛行機のオートパイロット装置 Tiny Featherを展示します。MTMの慣わしてとして、『細かいことはいいんだよ! (笑)』という雰囲気がありますので、できるだけインタラクティブな展示に努めたいと思います。 こんな展示をする予定です。是非動かしにきてやってください。あ、あと中身はそれなりにすごいことをしていますので、決して「Wiiリモコンと同じじゃん!」なんて言わないでくださいね(笑)。
当日は体育館内で展示しています。上の地図のちょうど『はかるひと』の『る』の位置のテーブルです。 『はかるひと』というのは今回のサークル名で、『加速度ジャイロ』というタイトルの共同展示になっています。僕に加えて、人力飛行機をやっている @HirakuTOIDA くんと モデルロケットをやっている @ina111 さま が出展しています。共通点はみんな加速度計やジャイロを使って物の動きをはかっている人たち、『はかるひと』なことです。 では当日、会場で僕と握手! (笑) ※当日のデモ動画を後日あげました。 December 06, 2011MTM07 お疲れ様でした
[Timely]
Make: Tokyo Meeting 07では、Tiny Featherで傾きが検出できるよー、というデモをやっておりました。 ぬるぬる動いたよ! 動画は @lynnlynn1 さん提供 言い訳を一つさせください。動画の中盤以降にあるとおり、あまりに激しい動きをすると追従しきれなくなってしまいますが、これは補正が効いてしばらくたつと動画のとおり戻るので、問題とは考えていません。また内部のパラメータ調整次第で、解消も可能だと思います。室内でGPSが使えない環境下で結構健闘しているとも思います。 ご来場いただいた方、また出展のお手伝いいただいた方、その他の出展者の方、企画者の方、皆様、どうもありがとうございます。 ※追加です。人力飛行機のテストフライトにTiny Featherを載せてとった飛行ログを、フライトの様子とあわせた動画も、当日再生していました。@HirakuTOIDA くん作動画です。 左右にバンクして、S字飛行しています。 December 14, 2011ソフトウェアSPIが動かない (解決済)マイコンを使っていると、時々マイコンに組み込まれた周辺機能だけでは事が足りなくなって、汎用I/Oポートを使って、ソフトウェア的に機能を実現するということがよくあります。ポートのH/Lをコントロールしたり、はたまた汎用ポートをHi-Z(ハイインピーダンス)の状態にしてH/Lを読み込んだりすることで実現されます。よくやられるのが、ソフトウェアSPIやIソフトウェアUARTといったものです。最近、そのソフトウェアSPIを実装していて嵌りましたので、今回は僕の失敗談を披露したいと思います。 ソフトウェアSPIに限らず、ポートの状態の書き出しとポートの状態の読み込みを行うものでは起こりうる問題なので、せっかくなので一般化して話を進めたいと思います。汎用ポートは、多くの場合、複数のポートをひとまとめとして、1つのレジスタで扱われます。ここではP1というレジスタに8個の汎用I/O、すなわちP1.0からP1.7の8個が割り当てられていたとしましょう。その中でP1.0を状態の書き込みに、P.1.1を状態の読み込みに使うことにします。 たとえば、P1.0(出力)にP.1.1(入力)と同じ信号レベルを出したければ、次のようなコードを書いて実現することが多いかもしれません。 if(P1 & 0x02){P1 |= 0x01;}else{P1 &= ~0x01;}
ところが、このコード、特定のマイコンでは、一度P1.1がLになると、たとえ他のマイコン等から再びP1.1にHが出力されようとも以降はLが読み出され、二度とP1.0がHにならなくなりました。僕はC8051というSilicon Laboratoriesのマイコンで今回この失敗を経験しました。 原因はP1というレジスタの構成にありました。レジスタに複数の機能が割り当てられているのでした。ポートが出力として設定されている場合は、1や0を書き込むことでHやLが出力されます。また入力の場合は読み出すことで、ポートのHやLを1や0で返してくれます。 ところが入力の場合に書き込むとどうなるでしょう。C8051では、1を書き込むことによってHi-Zの状態、0を書き込むことによってGNDとショート(厳密にいうと、オープンドレインのFETがONになって、電流を引き込む)になるのです。そのため、P1.1に一度0が書き込まれてしまうと、他のマイコン等ががんばってHを出力しても、電流がどんどん吸い込まれLとなってしまうのでした。 『えっ、入力ポートに書き込んでないんじゃないの?』と思われた方(主に僕)、コードをよくご覧ください。演算子として、|= や &= が使われていますね。この演算子が意味するところは、一度読み出したレジスタを加工した上で、またレジスタに代入するということです。ということは入力ポートとして設定したP1.1にも、当然書き込み処理は行われているのです。これに気づくのにかなりの時間を要しましたorz 結果、僕が使っているC8051では、例題としてあげたコードは、次のコードに書き換える必要がありました。 if(P1 & 0x02){P1 = (P1 | 0x01) | 0x02;}else{P1 = (P1 & ~0x01) | 0x02;}
最後にですが、汎用ポートを動かす際、レジスタ単位ではなく、ピット単位で動かせるものは、今回のような誤動作を避けるためにもピット単位での操作(P1.0 = 1; P1.0 = 0;)をするべきたと思いました。 December 24, 2011Super Sylphide 進捗状況(46) -- TinyFeatherの誘導制御スケルトン無人航空機(UAV)用オートパイロットシステム TinyFeatherですが、ようやく足回りが終わり、楽しい匂いがするところにやってきました。誘導制御です。ちなみに僕は天邪鬼で、足回りである航法の方が面白かったりします。 誘導制御則を実装するにあたって、その骨組み、スケルトンを作ってみました。 図を説明すると、1つのループが一定時間間隔で繰り返されることで誘導制御を構成しています。中央の円がそのループで、順を追って説明すると
となっています。加えて、地上局からWay Point (WP)の変更など飛び方の指令が非同期的に送られてくる可能性があるので、それを処理できるよう、図の下に示すアップリンク通知ブロックがあります。 コードはguidance_control_skeleton.cppにあります。航法情報として得られるものはヘッダ guidance_control.h に書いてあります。TinyFeatherとこのコードを使って、皆さん独自の制御則を作ってみることが可能なようにしていきたいです。 ※Tiny Feather用ADSがようやく完成しました。 |
かれんだ~
スポンサード リンク
|