マイクロビット(e_07)KXR94-2050 3軸加速度センサー
KXR94-2050 モジュール
3軸加速度センサーモジュールKXR94-2050を使ってみます。以下がセンサーの外観です。
※仕様など詳細はデータシート等を参照ください。
接続例
カタログ、モジュールの取説をみるとモジュールのピン配置は以下のようになっています。電源電圧は2.5~5.25V(標準3.3V)なのでmicro:bitから供給できます。(下図はデータシートから)
以下のようにmicro:bitとKXR94-2050モジュールを接続しました。KXR94-2050モジュールのx、y、z軸の出力をmicro:bitのアナログ入力ピンP0、P1、P2に各々接続します。モードはアナログ入力にします。
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。
各軸の出力電圧
先ず単純に各軸の出力電圧をThonnyのShellで表示させてみます。スクリプトは以下のようにしました。
from microbit import *
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
#KXR94-2050 モジュール ±2g
# power supply 3215mv
Vs=3300 # 電源電圧 3.30V(3300mV)
# X:pin0 Y:pin1 Z:pin2
display.off()
pin0.set_pull(pin0.NO_PULL) # 一応、NO_PULLに設定しておく
pin1.set_pull(pin1.NO_PULL)
pin2.set_pull(pin2.NO_PULL)
while True:
r_v0 = pin0.read_analog() # 読み込む(0~1023)
r_v1 = pin1.read_analog()
r_v2 = pin2.read_analog()
#print(r_v0, r_v1, r_v2)
sleep(100)
v0=u_map(r_v0, 0, 1024, 0, Vs) # 電圧値に換算する
v1=u_map(r_v1, 0, 1024, 0, Vs)
v2=u_map(r_v2, 0, 1024, 0, Vs)
print('%04d' % v0, '%04d' % v1 ,'%4d' % v2) #各軸の出力電圧値の表示
sleep(1000*3)
実行結果です。(ThonnyのShell表示)
>>> %Run b1119_kxr94_acc_00.py
1680 1654 2299 # x,y,z出力電圧値 mv
1680 1654 2296
1680 1654 2299
1680 1654 2296
オフセット調整
データシートをみるとモジュール表面が上向きで電源電圧が3.3Vの場合は下図になるようです。ややズレています。データシートをみるとゼロオフセットがあるそうです。各々のゼロオフセット値を簡易的に-30、-4、+12としました。(下図はデータシートから)
先の換算する部分にゼロオフセットを追加しました。
v0=u_map(r_v0, 0, 1024, 0, Vs)-30
v1=u_map(r_v1, 0, 1024, 0, Vs)-4
v2=u_map(r_v2, 0, 1024, 0, Vs)+12
実行結果です。(ThonnyのShell表示)
だいたいデータシートに近い値になりました。これで各軸の出力電圧を得られるようになりました。
>>> %Run b1119_kxr94_acc_00.py
1650 1650 2311 # x,y,z出力電圧値 mv
1653 1650 2311
1650 1650 2308
1650 1650 2308
加速度に換算
次にこの各軸の出力電圧を加速度に換算します。KXR94-2050のデータシートから1g の感度(sens)は電源電圧(Vs)÷5、オフセット電圧(offset)は電源電圧(Vs)÷2 です。スクリプトは以下のようにしました。
from microbit import *
# 電圧換算の関数
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
#KXR94-2050 モジュール ±2g
# power supply mv
Vs=3300 # 電源電圧3.30V(3300mV)
#offset Vs*1/2 # オフセット電圧は電源電圧(Vs)÷2
offset=Vs/2
x_zero=30 # 各軸にゼロオフセット電圧を加算
y_zero=4
z_zero=-12
#sens (Vs/5) /1g # 1g感度は電源電圧÷5
sens=Vs/5
# X:pin0 Y:pin1 Z:pin2
display.off()
pin0.set_pull(pin0.NO_PULL)
pin1.set_pull(pin1.NO_PULL)
pin2.set_pull(pin2.NO_PULL)
while True:
r_v0 = pin0.read_analog()
r_v1 = pin1.read_analog()
r_v2 = pin2.read_analog()
#print(r_v0, r_v1, r_v2)
sleep(100)
v0=u_map(r_v0, 0, 1024, 0, Vs)-offset-x_zero
v1=u_map(r_v1, 0, 1024, 0, Vs)-offset-y_zero
v2=u_map(r_v2, 0, 1024, 0, Vs)-offset-z_zero
#print(v0, v1, v2)
x=v0/sens # 各出力電圧を感度mV/gで割る>加速度gになる
y=v1/sens
z=v2/sens
print('%8.4f ' % x, '%8.4f ' % y ,'%8.4f ' % z) # 各軸の加速度を表示
sleep(1000*3)
実行結果です。(ThonnyのShell表示、ThonnyのSTOPアイコンで停止)
前後、左右に少し傾けて測定したデータです。
傾斜角の算出
KXR94-2050の計算が大まかに正しいか傾きを測定してみます。下図のようになります。※右図はデータシートから
傾きはtanΘ=x/zなので Θ=atan(x/z)で得られます。
atanの計算ができるようにmathモジュールを読み込みます。角度の計算するため以下を追加します。
ath = math.atan(x/z)
deg= math.degrees(ath)
print(deg)
from microbit import *
import math # math インポート
# 電圧換算の関数
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
#KXR94-2050 モジュール ±2g
# power supply mv
Vs=3300 # 電源電圧3.30V(3300mV)
#offset Vs*1/2 # オフセット電圧は電源電圧(Vs)÷2
offset=Vs/2
x_zero=30 # 各軸にゼロオフセット電圧を加算
y_zero=4
z_zero=-12
#sens (Vs/5) /1g # 1g感度は電源電圧÷5
sens=Vs/5
# X:pin0 Y:pin1 Z:pin2
display.off()
pin0.set_pull(pin0.NO_PULL)
pin1.set_pull(pin1.NO_PULL)
pin2.set_pull(pin2.NO_PULL)
while True:
r_v0 = pin0.read_analog()
r_v1 = pin1.read_analog()
r_v2 = pin2.read_analog()
#print(r_v0, r_v1, r_v2)
sleep(100)
v0=u_map(r_v0, 0, 1024, 0, Vs)-offset-x_zero
v1=u_map(r_v1, 0, 1024, 0, Vs)-offset-y_zero
v2=u_map(r_v2, 0, 1024, 0, Vs)-offset-z_zero
#print(v0, v1, v2)
x=v0/sens # 各出力電圧を感度mV/gで割る>加速度gになる
y=v1/sens
z=v2/sens
print('%8.4f ' % x, '%8.4f ' % y ,'%8.4f ' % z) # 各軸の加速度を表示
ath = math.atan(x/z) # 傾きの計算
deg= math.degrees(ath)
print(deg) # 傾きの表示
sleep(1000*3)
実行結果です。(ThonnyのShell表示)
だいたい45°の傾きで実行しました。結果は-42°でした。だいたい正しいようです。
>>> %Run b1119_kxr94_acc_02.py
-0.6637 -0.0085 0.7342
-42.1139 # 傾き
-0.6637 -0.0036 0.7342
-42.1139
-0.6588 -0.0036 0.7293
-42.0936
※実際の電源電圧をテスタで測定すると3215mVでした。
この電源電圧の値で各オフセット電圧、ゼロオフセットの値を変更して再実行すると-46.2°でした。
まとめ
micro:bitで3軸加速度センサーKXR94-2050のモジュールを使ってみました。傾きの計算もしてみました。だいたい合っているようでした。