KXR94-2050 3軸加速度センサDIP化モジュール(MDK022)とArduino Nano
◆ソースコード
https://github.com/setapolo/arduino_sample_KXR94-2050/blob/master/analogRead_smoothing.ino
//******************************** | |
//加速度センサの値を取得するプログラム x軸の平滑化 | |
//******************************** | |
int ax[20]; | |
int ax_len=(sizeof(ax)/sizeof(int)); | |
void setup(){ | |
for (int i;i<ax_len;i++){ | |
ax[i]=0; | |
} | |
Serial.begin(9600) ; | |
} | |
void loop(){ | |
long x , y , z ; | |
x = y = z = 0 ; | |
x = analogRead(3) ; // X軸 | |
y = analogRead(4) ; // Y軸 | |
z = analogRead(5) ; // Z軸 | |
long sx=0; | |
for (int i=ax_len-1;i>0;i--){ | |
ax[i]=ax[i-1]; | |
sx = sx + ax[i]; | |
} | |
ax[0] = x; | |
sx = sx + x; | |
x=sx/ax_len; | |
Serial.print(x) ; | |
Serial.print(",") ; | |
Serial.print(y) ; | |
Serial.print(",") ; | |
Serial.print(z) ; | |
Serial.println(""); | |
delay(50) ; | |
} |
◆MDK022 DIP化モジュールの取り扱い説明書(日本語)
http://akizukidenshi.com/download/ds/akizuki/AE-KXR94-2050.pdf
測定幅が+-2gで電圧によってg当たりの測定値が異なり、オフセット値がある事が分かる。5Vの時はオフセットが2.5V(0g)となる。
(また、DIP化にあたり使えなくなっているPINがありKXR94-2050の機能が制限されていると説明がある。)
◆背景理解(センサーの天地に応じたg値のあらまし)
http://gihyo.jp/dev/serial/01/windows-phone/0024
Windows Phoneの例だが、携帯をどの方向に向けるとx,y,zどの軸に+-1Gかかるかを説明している。
https://developer.apple.com/documentation/coremotion/getting_raw_accelerometer_events
iOSの説明では右側がプラスになっているので、決まったルールは無いのかもしれない。
https://jp.mathworks.com/help/supportpkg/android/ref/accelerometer.html
こちらはAndroidで、iOSと同じ。
◆測定値の理解
センサーをブレッドボードにつけ水平に置いたままで、シリアルモニタから数値をとると、若干の数字の振幅があるのが分かる。ソース及び配線は加速度センサの値を取得するプログラムを利用した。
X:519 Y:507 Z:709
X:518 Y:509 Z:709
X:520 Y:510 Z:710
デバイスの天地は上記で、iOSとAndroidで説明されていたものと同じようだった。(右が+1g)
数字の振幅はあるものの、以下のような測定値となった
Y(8-5のナンバリング)を真上 X:527 Y:735 Z:511
Yを真下 X:533 Y:267 Z:478右を真上 X:762 Y:507 Z:495
右を真下 X:297 Y:516 Z:489
裏返し X:486 Y:461 Z:301
◆analogRead関数(英語)と数字の読み方 10bit AD変換
https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
Arduino boards contain a multichannel, 10-bit analog to digital converter. This means that it will map input voltages between 0 and the operating voltage(5V or 3.3V) into integer values between 0 and 1023.
analogRead関数が10ビットのアナログデジタル変換を行い整数値として0から1023の間で値を返すということが分かる。こちらのサイトを参考にまず5ボルト変換する。
測定ボルト=測定値 * 5(ボルト) / 1023(ユニット)
水平に置いている場合
X:528 2.58v Y:502 2.45v Z:708 3.46v
となり、X,Yについてはほぼオフセット値と近い値の測定値となった。垂直方向となっているZは+1V(=1g)の数値が返ってきている計算となる。
◆モデル化と角度への変換
キャリブレーションを各方向についてかけ数値をそろえる。平均値を取る方法もあるが、ここでは水平状態の中央値として計算で
2.5v * 1023 / 5 = 512(=0g)
垂直状態の中央値として
3.5v * 1023 / 5 =716(=+1g),
真下の状態を1.5v * 1023 / 5 = 307(=-1g)
を基準としてモデル化する。
数値の範囲を180度で割って、一度あたりの数値の算出を行う
https://deviceplus.jp/hobby/entry017/
1度あたりのセンサ値 = (最大値 – 最小値) /180
aps=716 - 307 / 180 = 2.27
角度 = (現在のセンサ値 – 最小値)/aps – 90
a = (x - 307)/2.27 - 90
かなり平面に置いている状態でもぶれの出る結果となった
xについてのみ、数値の履歴をとりその平均をとることで数値の平滑化を試みた。青色がxの値の動きだが、反応は遅くなるものの動きはなめらかになった。
◆KXR94-2050のデータシート(英語)
http://kionixfs.kionix.com/en/datasheet/KXR94-2050%20Specifications%20Rev%203.pdf
こちらがフルスペック。
◆理論
https://ja.wikipedia.org/wiki/%E9%87%8D%E5%8A%9B%E5%8A%A0%E9%80%9F%E5%BA%A6
こちらの解説により、単位gがグラムでなくgravitational acceleration(重力加速度)であることが分かる。 また標準重力加速度が1G=9.80665 m/s2であるのが分かる
◆参考にさせていただいたサイト
https://deviceplus.jp/hobby/entry017/
https://www.petitmonte.com/robot/howto_kxr94_2050.html
http://physics.cocolog-nifty.com/weblog/2018/07/arduino203kxr94.html
http://myct.jp/arduino/index.php?%E5%8A%A0%E9%80%9F%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5+KXR94-2050
https://qiita.com/umekengogo/items/d7df87fe289de9e22e56
http://select.marutsu.co.jp/list/detail.php?id=493
http://lecture.nakayasu.com/?p=2389
https://ameblo.jp/jambo0809/entry-11909763061.html
https://www5.hp-ez.com/hp/tottyiwata/page4/bid-438596
https://www.qoosky.io/products/3358893f96
https://necotech.org/archives/220
http://rcmemorial.seesaa.net/article/403613585.html
https://www.yukisako.xyz/entry/acceleration_sensor
https://www.petitmonte.com/robot/howto_kxr94_2050.html
https://qiita.com/NaotakaSaito/items/a8186ad41d1844408eca
https://iot.keicode.com/arduino/arduino-analogread.php
http://www.microstone.co.jp/archives/14777324.html
Comments
Post a Comment