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

Popular posts from this blog

28BYJ-48 ステッピングモーターとULN2003とArduino Nano

SG92RサーボモータとArduino Nano

ARLISSのロケットデザインについて ARLISS-M Design Guide ブースター