Arduino用のLSM303DLH(デジタルコンパス+加速度センサ)ライブラリ

1つのチップに3軸の地磁気センサ(デジタルコンパス)と3軸の加速度センサを内蔵した、LSM303DLHというチップを搭載したSparkfunのボードがスイッチサイエンスなどから販売されています。お値段も円高効果か3000円を切っていてお買い得。

LSM303DLH搭載傾き補償付きデジタルコンパス・加速度センサモジュール--販売終了 - スイッチサイエンス

ちなみに地磁気センサ単体だと、水平から傾けた場合に正しく方位がとれません。これは地磁気のベクトルは水平ではなく傾いているため(この傾きを伏角と言います。関東だと49°らしい。結構斜めですよね)。傾きの成分を拾ってしまい、誤差が出ます。そこで加速度センサで重力の方向を検知して、傾きを補償することで、正確な方角を計算する必要があります。


例によって、このセンサをArduinoで使うためのライブラリを作ってみました。

http://neocat.jp/arduino/Library-LSM303DLH.zip


展開してできたLSM303DLHフォルダを、Macならホーム/Documents/Arduino/libraries/ 、WindowsならMy Documents\Arduino\libraries\ に入れ、ArduinoIDEを再起動すれば準備完了です。

File→Examples→LSM303DLH→LSM303DLH_sample を開くと、サンプルスケッチを見られます。


このコードをArudinoにアップロードし、ソース中にある通りにLSM303DLHとArduinoを配線してSerial monitorを見ると、加速度センサX/Y/Z、地磁気センサX/Y/Zの値(計6軸)の数値が転送されてくるのが見られます。



また、センサの出力からボードの姿勢を計算して3DでビジュアライズするProcessingのコードも、LSM303DLH/samples/LSM303DLH_sample/Processing_SampleProject/RotateXYZ/RotateXYZ.pde に入っています。


プロジェクトのファイルをProcessingで開いて、シリアルポートの名前を自分のArduinoのボードに合わせて修正してから実行すると、冒頭のようなボードの絵が表示されます。そして、実物を回転させると同じように3Dで回転するはずです。
※フォント周りでエラーがでる場合は、Monaco-24 をTools → Create Fontメニューから生成してあげてください。


表示されている数値は、6軸の値、およびX軸の方角(裏面にSparkfunと書かれている方向が北だと0°、時計回りに-180°〜179°で表示)です。ちゃんと補償された方角になっているはず。(計算間違ってたらすんません><)



なお、感度などの設定は全てデフォルト値になっています。変更したい場合は、データシートに従ってレジスタの値を

LSM303DLH.write_reg(アドレス, 値);

として書き換えてください。アドレスが00h〜12hは磁気センサ、20h〜は加速度センサのレジスタを書き換えることができます。

更新速度は begin() に渡す定数を変えることで変更できます。デフォルトでは、加速度センサはlow-powerモードの10Hz (ローパスフィルタは37Hz)、地磁気センサは15Hzで更新される設定になっています。詳しくはライブラリのヘッダファイルを見てください。