1. 電子コンパスとは
電子コンパスとは、半導体を用いた地磁気(方位)センサーで、地球が生じている南北の地磁気を検出して、方角を知る事が出来ます。
地磁気の強さを検出するセンサー部にMR(磁気抵抗、Magneto-resistive)素子が使われています。
磁気抵抗素子と言う名の通り、磁気の強さに応じて抵抗(R)が変化する性質を利用しており、HMC5883L ICはXYZ方向(3軸)それぞれに一つずつセンサーを持っている事から、どのような向きにモジュールを向けても正しい方位を検出する事が可能です。
※私の作った3.プログラムはXYの2軸しか利用していませんので傾けるとOUTです
2. つなげ方
2.1 端子図
HMC5883L ICを搭載したGY-273の外観は図2の通りです。
左の「XYZ」と印字されている面が表で、右の裏面には「VCC,GND,SCL,SDA,DRDY」と各端子の説明が印字されています。

2.2 接続
接続にはブレッドボードを使用しました。
ArduinoUNOとGY-273のつなげ方を図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は補正値
}

※↑電子コンパスを必死でくるくる回してます( ;∀;)
※補正値
図6の横軸はx軸センサの値、縦軸はy軸センサの値です。
測定方法は上記プログラムのXYの値をシリアルプリントする様に変更し、電子コンパスをゆっくり一周回しながら取得しました。
測定単位はLSB(Least Significant Bit)で、1000LSBが1080mG(ミリガウス)です。
日本の地磁気は310mGなので、本来は原点0を中心に半径287LSBの円となるはずですが、中心がXY軸共に-20LSB程度(左下へ)移動しています。
このままだと、正確な方位が計算出来ないので、中心点が「0」に寄る様に上記プログラムでは補正(XY軸共に-20する)を行っています。
中心がズレる原因としてはセンサーの個体差や、測定環境周辺から発生している磁場によるものなので、初期状態と場所に応じてゼロ点補正を行う必要が有りそうです。
そんな難しいプログラムは簡単に書けそうにないので、取り敢えず気分的に1回だけ補正しておきました。

4. まとめ
昔iPadでコンパスの補正画面が急に出てきて言われるがまま∞字に回してましたがやっと何をしていたのかが分かりました
今は∞字回しの儀式をしていないのは人の動きを利用してプログラムが内部で勝手に補正してくれているそうです。