Arduino/Genuino 101
前回のGenuino101の使い方(加速度センサー編)その1では手で振った時の加速度と言う良く分からない測定値でしたので、今回は加速度センサーの精度がどれ位か重力を使ってちゃんと測ってみました
1. 重力とは?
図1:地球
重力とは、地球の中心に向かう引力と、自転軸から垂直に遠ざかろうとする遠心力の合力です。
その為、両極と赤道以外の地点においては重力が地球の中心に向きません。
式①は赤道と両極でしか成り立ちませんので厳密には違いますが凡そのイメージです。
m:物体の質量(kg)
g:重力加速度(標準重力加速度9.807m/s2)
F:物体の質量「m」に重力加速度「g」を掛けた値に等しい
重力(mg) ≒ 引力(mg) - 遠心力(F) ・・・式①
1.1 引力
地球の中心に向かう引力の大きさは、地球の中心からの距離の2乗に反比例します。
地球の形は遠心力の影響で楕円体である為、地球の中心からの距離は赤道が一番大きく、北極・南極が一番小さいです。
その為、引力は赤道が一番小さく、両極で一番大きくなっています。
これを数式で表すと式②のようになります。
m:物体の質量(kg)
g:現在地点での重力加速度(標準重力加速度9.807m/s2)
M:地球の質量(5.974×1024kg)
R:現在地の地球中心からの距離(赤道半径6.378×106m、極半径6.356×106m)
引力(mg) = GMm÷R2 ・・・式②
1.2 遠心力
遠心力は自転軸からの距離に比例します。
地球は一定の角速度で自転している為、遠心力は赤道が一番大きく、北極と南極では生じる遠心力はゼロです。
これを数式で表すと式③のようになります。
F:物体の質量「m」に重力加速度「g」を掛けた値に等しい
m:物体の質量
r:現在地の地球自転軸からの距離(赤道6.378×106m、極0m)
ω:地球の自転の角速度(7.269×10-5rad・s-1)
遠心力(F) = mrω2 ・・・式③
1.4 赤道と両極の重力
式②より、引力の大きさ 「両極>赤道」
式③より、遠心力の大きさ「赤道>両極」
と言う事が分かります。
つまり赤道では地球の中心に向かう引力が最小で、外に向かう遠心力が最大となる事から重量は軽くなります。(引力と遠心力の比率は290:1)
反対に両極では地球の中心に向かう引力が最大で、外に向かう遠心力がゼロとなる事から、重量は重くなります。(引力と遠心力の比率は∞:1)
因みに北極で重量1kgの物体を赤道にもっていくと989.7gと、1.03%軽くなるそうです。
2. 現在地の重力
今回重力を使ってGenuino101が測定した加速度がどの程度の誤差とバラつきがあるのか知りたいです。
緯度・経度・標高が分かればその地点の重力を計算する事は可能です。
しかし、厳密な重力の計算にはまず自分の居る場所の経度・緯度・標高が分からなければならず、また計算も地球楕円体表面のある地点における地球自転軸からの距離(r)と地球中心からの距離(R)を計算し、そこから引力と遠心力をベクトルで計算し、2つのベクトルの合力を求めると、なかなか大変です
2.1 便利なサイト
これらお困り事を一気に解決してくれる2つのサイトを見つけました有りがたく使わせて頂きました!
図2:電子国土Web
例:東京駅の緯度(35度40分58.88秒)・経度(139.45度45分50.70秒)・標高(2.7m)
2.1.2 :重力値計算
重力値計算と言う図3のサイトに、図2で探した世界測地系の経度・緯度・標高を入力し、「計算」を押すと推定重力値が「mGal」で表示されます。
図3:重力値計算
2.2 現在地の重力計算
図3より、実際に自分の居る場所で計算してみた結果が式④です。
現在地の重力加速度(mGal) = 979740.3mGal ・・・式④
またGalはcgs単位系における加速度の単位で、mks単位系の1gとは式⑤に示す関係が有ります。
標準重力加速度1g = 9.80665m/s2 = 980665mGal ・・・式⑤
式④を式⑤で割れば自分の居る場所の重力が分かるので計算したものが式⑥です
現在地の重力(g) = 979740.3mGal ÷ 980665mGal = 0.999057g ・・・式⑥
と言うことで現在地の重力は0.999gである事が簡単にわかりました。
3. プログラム
Genuino101をひっくり返した状態で重力加速度を測定すると、Z軸の-1g未満の値が0となってしまいましたので、前回使用したプログラムから下記の通り一箇所だけ変更しました。
CurieIMU.setAccelerometerRange(2); → CurieIMU.setAccelerometerRange(3);
#include "CurieIMU.h" void setup() { Serial.begin(9600); // シリアル通信を初期化 while (!Serial); // シリアルポートが開くのを待つ // デバイスの初期化 Serial.println("Initializing IMU device..."); CurieIMU.begin(); // 加速度計の範囲を2Gに設定する CurieIMU.setAccelerometerRange(2); } void loop() { float ax, ay, az; //スケールされた加速度計の値 // デバイスからの加速度計測定値を設定された範囲にスケール CurieIMU.readAccelerometerScaled(ax, ay, az); // タブで区切られた加速度計のx / y / z値を表示する Serial.print("a:\t"); Serial.print(ax); Serial.print("\t"); Serial.print(ay); Serial.print("\t"); Serial.print(az); Serial.println(); }
図1:プログラム例
4. 実験!
4.1 XYZ軸全方向について測定
図5の通り、Genuino101の向きをXYZ軸それぞれについて+-方向の計6方向について重力加速度(g)を測定してみました!
図5-1:プラス方向重力加速度測定(左からXYZ軸)
図5-2:マイナス方向重力加速度測定(左からXYZ軸)
4.2 重力加速度測定結果
図5の方向で各1000回測定し、式⑥から得られた現在地の重力加速度(0.999g)との誤差とばらつきを、図6の通りグラフ化してみました!
誤差は実際の値よりマイナス方向に出る傾向が有るようですが、この辺は「.autoCalibrateAccelerometerOffset()」関数で自動校正が出来るので中央に寄せられます。
データのばらつきは最大でも0.023g程度でした。
図6:測定結果
5. まとめ
Genuino101の加速度センサーを実際に使ってみるとレスポンスも良く、自動校正も出来て精度も良さそうです。
この加速度センサーを使って色々遊べそうです!
励みになりますのでよければクリック下さい(^o^)/