Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

キャリブレーション

ボードを回転させると、磁力計に対する地球の磁場の向きは変わるはずですが、 その大きさは変わらないはずです! ところが、磁力計はボードを回転させると 磁場の大きさが変化していることを示します。

なぜそうなるのでしょうか? 実は、正しい値を返すには磁力計を キャリブレーションする必要があります。

このキャリブレーションにはかなり多くの数学(行列)が関わるため、ここでは扱いませんが、 興味があれば、このアプリケーションノートに手順が説明されています。代わりに、この セクションでは、どれだけずれているのかを可視化することにします。

次の実験をしてみましょう。ボードをさまざまな方向にゆっくり回転させながら、 磁力計の読み取り値を記録します。読み取り値をタブ区切り値(TSV)として整形するために、 iprintln マクロを使います。

#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux15::{entry, iprint, iprintln, prelude::*, I16x3};

#[entry]
fn main() -> ! {
    let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init();

    loop {
        let I16x3 { x, y, z } = lsm303dlhc.mag().unwrap();

        iprintln!(&mut itm.stim[0], "{}\t{}\t{}", x, y, z);

        delay.delay_ms(100_u8);
    }
}

コンソールには次のような出力が表示されるはずです。

$ # itmdump コンソール
-76     213     -54
-76     213     -54
-76     213     -54
-76     213     -54
-73     213     -55

次のようにして、これをファイルにパイプできます。

$ # 注意! 実行中の別の `itmdump` インスタンスがある場合は終了してください
$ itmdump -F -f itm.txt > emf.txt

数秒間データを記録しながら、ボードを多くの異なる方向に回転させてください。

次に、その TSV ファイルを表計算ソフトに取り込むか(または以下に示す Python スクリプトを使って)、 最初の 2 列を散布図としてプロットしてください。

#!/usr/bin/python

import csv
import math
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import sys

# プロットスタイルを適用する
sns.set()

x = []
y = []

with open(sys.argv[1], 'r') as f:
    rows = csv.reader(f, delimiter='\t')

    for row in rows:
        # データが欠けている行を破棄する
        if len(row) != 3 or not row[0] or not row[1]:
            continue

        x.append(int(row[0]))
        y.append(int(row[1]))

r = math.ceil(max(max(np.abs(x)), max(np.abs(y))) / 100) * 100

plt.plot(x, y, '.')
plt.xlim(-r, r)
plt.ylim(-r, r)
plt.gca().set_aspect(1)
plt.tight_layout()

plt.savefig('emf.svg')
plt.close

ボードを平らな水平面の上で回転させた場合、磁場の Z 成分は 比較的一定のままであり、このプロットは原点を中心とする円周(楕円ではなく) になっているはずです。上のプロットのように、ボードをランダムな方向に回転させた 場合は、原点を中心とする多数の点からなる円が得られるはずです。 円の形からのずれは、磁力計をキャリブレーションする必要があることを示しています。

要点: センサーの読み取り値をただ信じてはいけません。妥当な値を出力していることを 確認してください。そうでない場合は、キャリブレーションしてください。