コンパスセンサ(HMC5883L)をArduinoで使う場合、計測値をどうキャリブレーション(較正)するかが肝になると思われる。

コンパスの値を読むのは以下のライブラリを使う。
http://www.loveelectronics.co.uk/Tutorials/8/hmc5883l-tutorial-and-arduino-library

非オムニホイールロボをゆっくり回転(2秒で2回転程度)させながら100回計測したコンパスセンサのX軸・Y軸の出力値はこんな感じ。

▼較正前

値は概ね円状になっているが、その中心は原点からかなりズレており、X軸・Y軸の出力値から atan() で角度を計算しても、正しい方位が得られない。

そこで、X軸・Y軸のそれぞれの最小・最大値を求め、その中間点までの値分オフセットすると、こんな感じ。

▼較正後

この出力値をオフセットした値を使い、atan()で角度を計算し、方位とする。
オフセット用の値はEEPROMに書き込んでおき、電源投入時に再度較正しないですむようにする。



較正中はLEDテープを1灯づつ青く光らせてみた。


(追記)
以下に、計測値が楕円になる点も考慮するスケッチがあったので参考にする。
http://www.bildr.org/forum/viewtopic.php?f=29&t=650