Nanoのソフト担当です。今回は、HMC5883Lというコンパスセンサーを制御してみました。

これです(秋月に飛びます)

12/15 追記 Amazonの方が圧倒的に安いですね

では、早速制御してみませう。

今回は、Arduino Mega 2560を使いました。回路は、こんな感じです。

SN3Q0136

ただ繋げただけですが、一応表にまとめておきます。

Arduino HMC5883L
5 V VCC
GND GND
SCL SCL
SDA SDA

もう一度書きますが、ただ繋げただけです

では、プログラムを書いていきましょう。

I2Cで通信し、角度を取得する仕組みです。しかし、返ってくる値は基本的によく判らないので、楽をするためにちょっとしたライブラリを作りました。

GitHubで公開してます。

https://github.com/GcraudNano/GC5883

☆つかいかた☆

いつもはXcodeを開発環境として使っているのですが、今回は大衆向けにArduino IDEを対象とした使用法を紹介します。(違うIDE使ってるような人は自分で判るだろうし)

ステップ1 ファイルの配置

このあたりからZipに固められたライブラリを落とします

Arduino IDEを起動し、メニューのスケッチ→ライブラリを使用→Add Library ...と進み、ダウンロードしたZipファイルを選択してOKすれば、インストール完了です。
img1img2

ステップ2 ライブラリの使用

Arduino IDEを再起動し、メニューのスケッチ→ライブラリを使用→GC5883を選択します。
img3 

Wireライブラリも選択してください。

こんな感じのスケッチになると思います

img4

ステップ3 プログラミング

ライブラリは非常に簡便に使用できるよう設計されています。

たったの3ステップで値が取得できます。

  1. GC5883型の変数を宣言する。
  2. その変数.init()を呼び出す。
  3. その変数を任意の数値型にキャストする。

詳しくみていきましょう。

1. GC5883型の変数を宣言する。

これは普通に宣言するだけです。

GC5883 compass;

こんな感じで宣言してください。非常に癪ですが、グローバル変数としても普通に宣言できます。

2. その変数.init()を呼び出す。

setup()の中あたりで呼び出してください。宣言した変数の名前が上記の例のように"compass"だった場合は

compass.init();

でOKです。

3. その変数を任意の数値型にキャストする。

これにはいくつかの方法があります。

  • Serial.print()で出力したい場合
Serial.print((double)compass);

これでdouble型として角度を取得し、シリアルで出力することができます。

  • 変数に格納したい場合
double deg = compass;
これで、変数"deg"に角度がdouble型として格納されます。もちろん、
double deg = (double)compass;

こんな具合で丁寧に書いてもらっても結構です。

とにかく、"(型)変数名"という形で書けば角度になります。

使える型は以下のとおりです。

  • int (-179 ~ 180)
  • unsigned int (1 ~ 360)
  • double
  • float

それから、

compass.getValue()

という形でdouble型の値を得ることもできます。

他にもいくつかありますが、ヘッダーを読んで下さい。

結局どうすればいいかよくわからんというハード担当のような人へ

サンプルスケッチを以下に示します。

#include <Wire.h>
#include <GC5883.h>
GC5883 compass;
void setup()
{
    Serial.begin(9600);
    compass.init();
}
void loop()
{
    double deg = compass;
    Serial.println(deg);
}

シリアルに少数で角度を垂れ流すだけです。

GitHubにもサンプルがあります。

さいごに

このライブラリから得られる方位は正確なものではありません。多少のズレが生じます。あくまで、ロボカップジュニアサッカーチャレンジ用です。

相手ゴール方向に向いたりするためにお使いください。

あまりまずいことにならない範囲で改造とか再配布とかはご自由にどうぞ。

以上、Nanoソフト担当でした。