NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

電子コンパスの使い方(GY-273,HMC5883L)

イメージ 7
電子コンパス(GY-273、HMC5883L)
 
 電子コンパスモジュールを使ってみました
GPSでも一方向に動いていれば、向かっている方位を知る事が出来ますが、止まっている状態ではめちゃくちゃな方位になりロボットなどはどちらを向いているのかわかりません そんな時のお助けアイテムが電子コンパスです!
 GPS付き携帯電話にもほぼセットで使用されており割と身近な電子部品です
 
 電子コンパスとは、半導体を用いた地磁気(方位)センサーで、地球が生じている南北の地磁気を検出して、方角を知る事が出来ます。
 地磁気の強さを検出するセンサー部にMR(磁気抵抗、Magneto-resistive)素子が使われています。
 磁気抵抗素子と言う名の通り、磁気の強さに応じて抵抗(R)が変化する性質を利用しており、HMC5883L ICはXYZ方向(3軸)それぞれに一つずつセンサーを持っている事から、どのような向きにモジュールを向けても正しい方位を検出する事が可能です。
 ※私の作った3.プログラムはXYの2軸しか利用していませんので傾けるとOUTです
 
イメージ 5
図1:電子コンパスICの構造概略図
 

2. つなげ方

2.1 端子図
 HMC5883L ICを搭載したGY-273の外観は図2の通りです。
 左の「XYZ」と印字されている面が表で、右の裏面には「VCC,GND,SCL,SDA,DRDY」と各端子の説明が印字されています。
イメージ 2
図2:GY-273端子図
 
2.2 接続
 接続にはブレッドボードを使用しました。
 ArduinoUNOGY-273のつなげ方を図3 回路図に、実際に接続したものを図4に示します。
イメージ 6
図3:fritzing回路図
 
イメージ 3
図4:実際につなげた状態
 

3. プログラム

 図4のArduinoUNOに下記プログラムを書き込み実行すると図5の様にPCのシリアルモニタ上に現在電子コンパスモジュールが向いている方位が「°」で表示されます。
※X矢印(図2左図参照)を北に向けた際は0°から始まり、東90°、南180°、西270°と360°迄表示され、1°単位で方角が分かります。
#include <Wire.h> //I2C Arduino Library
#define address 0x1E //0011110b, I2C 7bit address of HMC5883

void setup() {
  //GY-273
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(address); //open communication with HMC5883
  Wire.write(0x02); //select mode register
  Wire.write(0x00); //continuous measurement mode
  Wire.endTransmission();
}

void loop() {
  Serial.println(Angleread()) ;          // 方位角を返す
  delay(500) ;                            // 500ms後に繰り返す
}
int Angleread() {
  int x, y, z; //triple axis data
  Wire.beginTransmission(address);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
  Wire.requestFrom(address, 6);
  if (6 <= Wire.available()) {
    x = Wire.read() << 8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read() << 8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read() << 8; //Y msb
    y |= Wire.read(); //Y lsb
  }
  return atan2((x + 20) , (y + 20) * (-1)) * RAD_TO_DEG + 180; //40と20は補正値
}
イメージ 1
図1:プログラム例
 
イメージ 1
図5:シリアルモニタ画面(方位測定結果 単位:°)
※↑電子コンパスを必死でくるくる回してます( ;∀;)
 
※補正値
 図6の横軸はx軸センサの値、縦軸はy軸センサの値です。
測定方法は上記プログラムのXYの値をシリアルプリントする様に変更し、電子コンパスをゆっくり一周回しながら取得しました。
 
 測定単位はLSB(Least Significant Bit)で、1000LSBが1080mG(ミリガウス)です。
 日本の地磁気は310mGなので、本来は原点0を中心に半径287LSBの円となるはずですが、中心がXY軸共に-20LSB程度(左下へ)移動しています。
 
 このままだと、正確な方位が計算出来ないので、中心点が「0」に寄る様に上記プログラムでは補正(XY軸共に-20する)を行っています。
 
 中心がズレる原因としてはセンサーの個体差や、測定環境周辺から発生している磁場によるものなので、初期状態と場所に応じてゼロ点補正を行う必要が有りそうです。
 そんな難しいプログラムは簡単に書けそうにないので、取り敢えず気分的に1回だけ補正しておきました。
 
イメージ 4
図6:XY軸別と磁場測定結果 単位:LSB
 

4. まとめ

 昔iPadでコンパスの補正画面が急に出てきて言われるがまま∞字に回してましたがやっと何をしていたのかが分かりました
 今は∞字回しの儀式をしていないのは人の動きを利用してプログラムが内部で勝手に補正してくれているそうです。
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る