電子コンパス(GY-273、HMC5883L)
電子コンパスモジュールを使ってみました
GPSでも一方向に動いていれば、向かっている方位を知る事が出来ますが、止まっている状態ではめちゃくちゃな方位になりロボットなどはどちらを向いているのかわかりません そんな時のお助けアイテムが電子コンパスです!
GPS付き携帯電話にもほぼセットで使用されており割と身近な電子部品です
1. 電子コンパスとは
磁気抵抗素子と言う名の通り、磁気の強さに応じて抵抗(R)が変化する性質を利用しており、HMC5883L ICはXYZ方向(3軸)それぞれに一つずつセンサーを持っている事から、どのような向きにモジュールを向けても正しい方位を検出する事が可能です。
※私の作った3.プログラムはXYの2軸しか利用していませんので傾けるとOUTです
2. つなげ方
2.1 端子図
HMC5883L ICを搭載したGY-273の外観は図2の通りです。
左の「XYZ」と印字されている面が表で、右の裏面には「VCC,GND,SCL,SDA,DRDY」と各端子の説明が印字されています。
図2:GY-273端子図
2.2 接続
接続にはブレッドボードを使用しました。
図3:fritzing回路図
図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:プログラム例
図5:シリアルモニタ画面(方位測定結果 単位:°)
※↑電子コンパスを必死でくるくる回してます( ;∀;)
※補正値
図6の横軸はx軸センサの値、縦軸はy軸センサの値です。
測定方法は上記プログラムのXYの値をシリアルプリントする様に変更し、電子コンパスをゆっくり一周回しながら取得しました。
測定単位はLSB(Least Significant Bit)で、1000LSBが1080mG(ミリガウス)です。
日本の地磁気は310mGなので、本来は原点0を中心に半径287LSBの円となるはずですが、中心がXY軸共に-20LSB程度(左下へ)移動しています。
このままだと、正確な方位が計算出来ないので、中心点が「0」に寄る様に上記プログラムでは補正(XY軸共に-20する)を行っています。
中心がズレる原因としてはセンサーの個体差や、測定環境周辺から発生している磁場によるものなので、初期状態と場所に応じてゼロ点補正を行う必要が有りそうです。
そんな難しいプログラムは簡単に書けそうにないので、取り敢えず気分的に1回だけ補正しておきました。
図6:XY軸別と磁場測定結果 単位:LSB
4. まとめ
昔iPadでコンパスの補正画面が急に出てきて言われるがまま∞字に回してましたがやっと何をしていたのかが分かりました
今は∞字回しの儀式をしていないのは人の動きを利用してプログラムが内部で勝手に補正してくれているそうです。
励みになりますのでよければクリック下さい(^o^)/