micro:bit 方角の測定(方角ブロック)

2022.10.30 2021.10.29 Coskx Lab

1 はじめに

micro:bit MakeCodeには「方角(°)」というブロックがあります。
このブロックを使うと水平におかれたmicro:bitの「y軸+」の方角が得られます。
この測定にはmicro:bitに搭載されている「3軸磁気センサ」が使用されています。
方角は,磁北を0度とし,時計回りに0度から359度までの値が得られます。(方位磁石の真東が90度)

2 使用環境

3 micro:bitの方角測定

「方角(°)」ブロックを使用して,図ようにmicro:bitのy軸の方角を測定します。
水平置きされたmicro:bitを上から見たところ

プログラムでは「入力」メニュー中から,「方角(°)」ブロックを取り出して使います。


「方角(°)」ブロックを使うプログラムの初回起動時にLED画面に「TILT TO FILL SCREEN」が表示されます。
この表示が現れたら,その後に続くLED画面で,micro:bitをいろいろな姿勢にします。
いろいろな姿勢にするとLEDの点灯が増えていきます。
全てのLEDが点灯したら,磁気センサの較正(キャリブレーション)が終了し,磁気センサが正しく動作するようになります。
しかし,較正(キャリブレーション)が終わっても取得される方角には10度前後の誤差が含まれます。

micro:bitでこのプログラムが起動し,Makecode画面左のShow data deviceボタンを押すと,次のように得られた表示が連続して表示されます。

342
339
342
339
340
342
340
339
341
339

micro:bitを動かさないようにして方角データを取得してるのに方角データは揺れています。

4 方角データの平均化

方角データとしては平均化して使う方が良い場合があります。
次のプログラムでは,10回平均した方角を取得する関数を使うようになっています。



関数azimuth10は,10回平均の方角値を返す関数なので,「ずっと」ブロック中の「シリアル通信 1行に書き出す」で使えます。
方角の連続取得の場合には,このプログラムにあるように20msecの間隔が必要です。(補足2 短インターバル繰り返し測定)
また,この値を所望の変数に代入することもできます。
平均化したときの様子は次のようになりました。まだ少し揺れがありますが,1度以下の揺れになりました。
ただし,10回の平均値を求めるのに,200ms=0.2secかかることになります。 用途によって平均化回数を考える必要があります。

311
310
310
311
310
310
310
310
310
310
309
311
310
310

しかし,方角の平均値を求めるときは,0と359の間に不連続なところがあるので,計算にはもう一工夫必要です。
例えば,359,1,359,1,0の平均値は0になるはずですね。

5 方位測定上の注意

スマートフォンやiPhoneなど方位測定アプリでは,様々な工夫がされていて,安定して方位測定出来るようになっています。
micro:bitでの方位測定では磁気センサから直接測定値を取り出しているため,方位角では10度程度の誤差を含みます。
また,近くに磁石がある場合や,鉄製の器具がある場合,建物に鉄製の構造材が使われている場合,地磁気が乱れていて,正しい方位を求められないことがあります。
地磁気の乱れがある場合は,スマートフォンやiPhoneなど方位測定アプリでも同様なことが起こります。
地磁気の乱れがあっても,周辺の鉄製の器具などが動かないならば,同じ位置で方位測定を複数回行なってみると,正しい方位とは限りませんが,測定値はほとんど変わりません。(時不変の性質,再現性があります。)

6 まとめ

micro:bit MakeCodeの「方角(°)」ブロックを使用してmicro:bitの方角(磁北とy軸+のなす角)を求めました。

注意 「方角(°)」ブロックを連続使用するときは,最低でも20msは間隔をとる必要があります。
micro:bit側の測定値更新が20msほどかかるので,それ以下の間隔での測定値取得では,同じ値を取り込んでしまうことになります。
特に測定値の平均化のときは,平均化が無意味になってしまうので注意が必要です。
「ずっと」ブロックを使って毎回測定する場合は,「ずっと」ブロックの舞台裏で20msの一時停止(pause)が行われるため問題ありません。
(「補足2 短インターバル繰り返し測定」参照)



補足1 測定上の誤差

micro:bitでの方角の検出における誤差は次のような原因があります。

A micro:bit自身に起因する誤差

  1. 方角センサ(磁気センサ)はキャリブレーション(コンパスの調整)されても,感度のばらつきとオフセットがあります。あまり正確な方角は期待できません。(10度から20度ほど誤差があります。)
  2. micro:bit v2にはマグネティックスピーカが付きました。スピーカの磁気回路は閉じているはずですが,磁束の漏れが検出されます。漏れた磁束が磁気センサに一定のオフセットを生じさせている可能性があります。スマートフォンでもマグネットスピーカと磁気センサが搭載されていますが,距離が離れています。micro:bitはコンパクトにまとめられているためスピーカと磁気センサの距離が20mmほどしかありません。
  3. モータやサーボモータなど磁石を使った部品と一緒に1つのシステムを構成した場合,micro:bitとモータなどとの距離はできるだけ離したとしても200mmほどとなります。モータやサーボモータの漏れ磁束は鉄片などを吸着するほどは大きくないのですが,磁気センサには影響を与えています。

B 環境に起因する誤差

  1. 方角の検出においては,環境も重要です。
    磁石や鉄製の器具の周囲では,方角検出に大きな誤差が生じます。(スマートフォンの方角検出でも大きな影響を受けることがあります。)
  2. 磁石や鉄製の器具が見当たらないところであっても,床下に鉄製の構造物があるような場合には,方角検出で大きな影響を受けることがあります。

上記のような影響があるため,次のようなことが起こります。誤差が生ずることを念頭に,実際に方角測定を行って,評価してから使う必要があります

  1. 絶対方位:地理上の位置により磁北の方角は決まっています。micro:bitで磁北を見つけたとしても,環境によって磁場がゆがめられた分,ずれが生じています。
  2. リニアリティ:ある場所において,micro:bitをある方角に向けてから10度ずつ(0度から350度まで)回転させてみます。しかし,センサから取得できる方角は同じよう10度ずつ増加するようには変化しません。測定器では測定対象の変化に比例して測定結果が得られなければならないのですが,その比例状態からはずれてしまいます。このずれは特定の方角で最大になり10度ほどになります。
  3. 再現性:ある場所において,ある向きにmicro:bitを固定し,方角を測定します。micro:bitを固定したまま,しばらくしてから方角を測定すると,ほぼ同じ値が得られます。これは何回やっても同じです。(再現性があります)

補足2 短インターバル繰り返し測定

「方角(°)」ブロックは磁気センサを利用しています。磁気センサは,内部でAD変換・I2C通信しており,その結果をプログラムで磁気センサ値さらに方角として受け取っています。
AD変換・I2C通信は一定の時間を必要とするため,短インターバル繰り返しで磁気センサ値を受け取ろうとすると,思い通りの測定値が得られないことがあります。(実は舞台裏でセンサ値の更新周期が設定されています。)
micro;bitを絶えず動かしながら(取得されるべきセンサ値は不規則に変化するはず)
 (1)インターバル無し
 (2)インターバル10ms
 (3)インターバル20ms
で16回連続測定し,得られた方角を観察してみました。

(1)インターバル無し(測定間隔ほぼ0)
16回の測定するときは,時間のかかる測定値表示をせず,配列に測定値を保存して,最速で測定します。測定終了後に,配列に保存されていた測定値をコンソールに表示する手法をとりました。




その結果は次の通りになりました。(改行を削除して,1行で表示しています)
16回の取得データはすべて同じ値でした。
AD変換・I2C通信によるデータの更新が間に合わず,同じデータを受け取り続けていたと考えられます。 これでは使えません。

started
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32

(2)インターバル10ms(測定間隔10ms)
16回の測定するときは,時間のかかる測定値表示をせず,配列に測定値を保存して,10msのpause(一時停止)を行っています。測定終了後に,配列に保存されていた測定値をコンソールに表示する手法をとりました。




その結果は次の通りになりました。(改行を削除して,1行で表示しています)
ところどころで,同じデータが2回続けて得られています。
AD変換・I2C通信によるデータの更新が完全には間に合わず,同じデータを受け取ってしまうことがあると考えられます。 これでは使えません。

started
64 66 63 63 58 58 56 59 58 57 57 61 60 59 58 58

(3)インターバル20ms(測定間隔20ms)
16回の測定するときは,時間のかかる測定値表示をせず,配列に測定値を保存して,20msのpause(一時停止)を行っています。測定終了後に,配列に保存されていた測定値をコンソールに表示する手法をとりました。




その結果は次の通りになりました。(改行を削除して,1行で表示しています)
同じデータが繰り返し取得されることなく,測定できています。

started
67 64 47 57 68 62 65 76 74 77 93 84 95 92 88 98

このテストから,方角の測定には,20msほどのインターバルが必要なことがわかりました。
なお,「ずっと」ブロックでは舞台裏において20msのpause(一時停止)が行われているため,「ずっと」ブロック中ではプログラム中にpause(一時停止)を書かなくても最新の測定値を得ることができます。
参考 「ずっと」ブロックの動作