手前のコンパスはビクセンの製品 |
LSM303はデジタル出力3軸磁気/3軸加速度センサ。 I2Cバス接続となる。
(コンパスを実現するにはMCUでの計算が必要)
気象センサとしては必要ないセンサではある。
しかし設置時に方位と傾きが人の手で設定されるとは限らないとしたらどうだろう。
空中散布を考えるならば必要な機能だ。
FemtoCubeはもともと衛星のハードウェアを市販部品で置き換えたらどうなるかという実験台なので、既にワイヤレスでセンサ値を取得する評価環境として完成しつつある。I2Cにぶら下げるセンサの追加は想定していたので、実装もそれほど手がかからなかった。
…場所だけは手こずった。 結局XBee基板に吊り下げることにした。 電子系基板の密集率がすごいことになっている。
真ん中の赤い基板がLEM303 奥の気圧センサと並ぶ形で |
・光の強さ(ルクス)
・焦点範囲の色(RGB)
・温度
・気圧
・バッテリ電圧、太陽電池電圧
・3軸磁気
・3軸加速度
となった。 衛星の機能模擬としてはだいぶ充実した。
最近は9自由度センサ(加速度、ジャイロ、磁気)を備えたワンチップなセンサICが出始めているので、こうした機能を組み込むものがありふれてきた。
例えば、ArduIMU v3 http://www.sparkfun.com/products/11055 これなどはCANSATやローバーに必要なIMU機能を提供してくれるし、基板もとても小さい。
キャリブレーション、方位算出
LSM303については、データシートに色々なレジスタ設定が書いてある。結構設定作業がありそうだ。
傾き補正コンパスの数式や計算方法については、STmicroのアプリケーションノートに丁寧な説明があるので、それを参考にするといいかも。
見つけたサンプルコードを試してみた。(arduino-022環境)
Sparkfunのセンサは傾き補正コード入りだが、キャリブレーションしないからか、値が怪しい。
pololuも同じセンサを採用しているみたいなので、Arduino向けライブラリを公開している。
https://github.com/pololu/LSM303
こちらはライブラリ化されていた。
磁気キャリブレーションを行い、補正値を書き込んだコードを実行すると、、コンパスはちゃんと360度の値を返してくれる。 そして傾き補正も動作した。 向けたい方角と表示される方位が正反対なので何かと思ったら、Y軸の設定が逆なだけなようだ…。 そうだといいけど。
※あとでライブラリコードの中に設定箇所を見つけた。
改変後
int heading = compass.heading((LSM303DLH::vector){0,1,0}); //初期値: {0,-1,0}
今度はちゃんと向きが合っている。
1,
タイムスタンプ,電源電圧,気温,気圧,R,G,B,露出設定,照度生データ,換算ルクス 2,タイムスタンプ、電源電圧、LSM303の生データ(磁気/加速度),方位角 |
流れとしては、
・キャリブレーションをモード化して、各軸の磁界強度の最大値、最小値を取得
・その結果を使って、コンパス(傾き補正付き)として使う
という流れのコードを組み込めば良さそげ。いまはキャリブレーションは手動。
Cube本体は手に持てる大きさでワイヤレスなので、数値を垂れ流しての検証作業が楽だった。
何か本体だけで人間向きなフィードバックを返せると魅力的かもしれない。 残念ながらATmega328のままではI/Oが足りない。 受け取ったデータで何か動くものを作りたいなあ。
このセンサをつかった実験計画としては
・ローバーで方位角を加えた誘導制御
・TLEを読み込んで計算する組み込みAR八木アンテナ
この2つを試したい。