稼働中

マイクロビット(e_07)KXR94-2050 3軸加速度センサー

KXR94-2050 モジュール

3軸加速度センサーモジュールKXR94-2050を使ってみます。以下がセンサーの外観です。
※仕様など詳細はデータシート等を参照ください。

KXR94-2500外観

接続例

カタログ、モジュールの取説をみるとモジュールのピン配置は以下のようになっています。電源電圧は2.5~5.25V(標準3.3V)なのでmicro:bitから供給できます。(下図はデータシートから)

KXR94モジュール回路図

以下のようにmicro:bitとKXR94-2050モジュールを接続しました。KXR94-2050モジュールのx、y、z軸の出力をmicro:bitのアナログ入力ピンP0、P1、P2に各々接続します。モードはアナログ入力にします。

KXR94接続図
※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のモジュールを使ってみました。傾きの計算もしてみました。だいたい合っているようでした。