TJ3BでHMC5883L(QMC5883L)を使う方法

※※※※※※※※
2019/03/26追記 現在はBNO055というIC(基板セットだとGY-BNO055)が販売されていて、そちらのほうが初心者向けには良いと思います。そちらの情報も検索すれば諸先輩の記事が出てくるようになっていますので参考にしてください。
HMC5883Lも使いようによっては十分使えますが、ジャイロ併用の9Dコンパスの普及によって、磁場の乱れがあまり重要視されなくなり、純粋な地磁気センサーは不利な状況になることがあるのでお勧めできなくなりました。以下の記事は参考程度としてください。
※※※※※※※※

安価なコンパスが欲しくてHMC5883Lを購入しました。
しかし、別物が届きました。

HMC5883Lと名の付いたQMC5883Lの磁気センサーモジュールです。
GY-271というものと、GY-273というものの2種類あります。どちらも同じプログラムで動きます。現状ではどちらが良いというデータはありません。Amazonで購入できます。



HMCとQMCの見分け方はチップにグレーで書かれた文字で分かります。
DA5883書いてあるものはQMCです。HMCはL883と書かれています。
最近4つ購入しましたがすべてQMCのチップが乗ったものが届きました。
HMC5883Lは製造中止されているようなので、今後はQMCが届くと思った方がよさそうです。



HMCとQMCでは設定やデータの格納されるレジスタアドレスが異なるため、HMC5883L用のプログラムでは動きません。

プログラムソースです。

まず、C:\Daisen\C-Style for TJ3B V170511\Build\Build_V170511
にある、D_I2C.cを書き換えます。
元ファイルは別名に名前を変えてバックアップしておいて下さい。編集に失敗して戻せなくなっても責任はとれません。

本当ならD_I2C.hや、D_Eio.h, D_Eio.cに分けて記述するべきなんですが、動くこと優先で公開します。こだわる人は自分の判断で分けてください。

1. D_I2C.cの #include "D_I2C.hの下に以下2行を追加します。

 #include "D_Eio.h"
 #include "../mcc18_v337/h/math.h"

2. 次に元のget_dir()関数はget_dir_org()などの名前に変更してください

3. 最後に以下のソースをD_I2C.cの最後に追記して保存します。

QMC5883L用プログラムソース 
(リンクが古くなっていたようなので更新しました。2023/1/29)

貼りつけたあと、最後の行に改行を忘れないようにしてください。ビルド失敗します。

以下、C-STYLEに移ります。

C-STYLEのセットアップのチェックは6D-compasにつけます。



サンプルプログラムです。
キャリブレーションはc-codeで書きます。
get_dir_cal(0); と書いてください。


このプログラムをダウンロードした後、センサーモニターで見た時にコンパスの赤い線がふらふらと動けば成功です。しかし、おそらくロボットを一回転しても赤い線は一回転しません。

北を判別するためにはコンパスの基準値を設定してやる必要があり、これをキャリブレーションといいます。これはサッカーの新しいフィールドで動かす前に白線を判別するためにしきい値を変更してやるようなものです。

入力としてスイッチがロボットについているのなら、サンプルのCN6のようにスイッチを使ってキャリブレーションプログラムと通常のプログラムを切り替えられるようにしておくと楽です。スイッチがない場合は、キャリブレーションのC-codeだけが書かれたプログラムをダウンロードして実行してください。

キャリブレーションで求めた値をコンパスに覚える機能はないので、電源を切っても使えるようにTJ3Bのマイコンに覚えさせます。EEPROMを使います。EEPROMについては別記事にまとめているのでそちらを読んでください。アドレスは 0x70~ 0x75を使います。他の用途で使う場合はソースを書き換えてください。

キャリブレーションを行った後、センサーモニターで確認して、ロボットの動きに合わせて赤い線が回転したら成功です。

注意点
  • コンパスの磁気センサーの向きが反対のものがあります。4つのうち、一つはロボットの回転と同じ方向にセンサーモニターの赤い線が回転しましたが、3つは反対に回転しました。センサーを表裏反対に取り付ければよいのですが、同じ基盤なのにセンサーの向きが統一されていないというのはなぜなのでしょうか。疑問です。
  • 磁気コンパスは磁石に弱いです。近づけないようにしましょう。近づけた場合しばらくの間、値がずれたままになることがあります。キャリブレーションし直しましょう。放置しておけばそのうち戻ります。
  • 磁石付きのドライバーでコンパス近くのネジを回すと上記理由で狂うことがあります。
  • センサーの感度は個体差がけっこうあります。私が買った4つの中でさえ、一番感度が悪いものは、できれば別の物にしてあげたほうがいいかな、という感じでした。この辺はamazonで海外から取り寄せる以上、自己責任でお願いします。
  • キャリブレーションは磁気とコンパスが安定している条件で一度やれば大丈夫です。すぐにずれてしまって何度も必要な場合は、知らないうちにドライバーなどの磁石を近づけていないか確認してください。
このソースの元となった記事です。でむらさんありがとうございます。きっとこの記事がなければ動かせませんでした。
e-gadgetやTJ3で地磁気センサHMC5883Lを使う方法1/3
http://demura.net/robocup/10156.html
※3/3まであります。


おまけ

 センサの個体差。円が大きいほど感度が良いです。円の位置は精度には関係しません。

 ②が最も精度が良く、①、③でもちゃんと使えます。 
 ④まで円が小さくなると角度が10~20度ぶれますがオウンゴールを防ぐ目的でどちらを向いているかを判断する程度であれば十分使えます。


技術情報一覧へ

コメント

このブログの人気の投稿

センサー自作のための参考情報

TJ3Bにm5stck UnitV AI Cameraをつなぐ(暫定版)