稼働中

マイクロビット(c_04)KXR94-2050 用モジュール

KXR94-2050 c_kxr94_00.py

KXR94-2050は3軸加速度センサーです。※詳細はデータシートを参照ください。
KXR94-2050センサーモジュールで使う自作の’c_kxr94_00.py’を作成しました。
(※記事e_07を元にクラスにしました。)
‘c_kxr94_00.py’は末尾にあります。使い方だけを記載します。

使い方

ファイル転送
micro:bitへ’c_kxr94_00.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※c_kxr94_00.pyの末尾に、使用例(c_kxr94_ex.py)の## example以降をコピペ追加しても動作確認できます。

メソッド
‘c_kxr94_00’をimportすると「kxr_deg, kxr_ajust, kxr_out」のメソッドが使えるようになります。

KXR94(x_pin=pin0, y_pin=pin1, z_pin=pin2, vs=3300)で初期化します。
KXR94-2050のxyzのoutと接続するmicro:bitのピンを指定します。vsはKXR94-2050の供給電源電圧です。

(01)kxr_ajust()
KXR94-2050の電源電圧が3.3V、Face up時のxyzの出力値から補正値を算出して返します。
xyzの出力を10回測定した平均値を返します。
(02)kxr_out(ajust=(-27, 7, 11))
x軸、y軸、z軸の加速度値を返します。
ajust値は3.3V、Face upで測定したkxr_ajust()の値です。
(03)kxr_deg()
kxr_outで得た値からatan(x/z)をdegree値で返します。

使用例

xyzの値と角度計算の例です。


c_kxr94_ex.py
from microbit import *
from c_kxr94_00 import KXR94
import math

## example---------------------------------
#KXR94-2050 ±2g Tri-axis Accelerometer
a=KXR94()               # instance

ajust=a.kxr_ajust()     # 補正値計算
print('ajust=',ajust)

# xyz gravity(g)
x,y,z=a.kxr_out()       # x,y,z(g)
print('xyz=','%8.4f ' % x, '%8.4f ' % y ,'%8.4f ' % z) 
sleep(1000)

実行結果
3.3V、Face upで測定


>>> %Run c_kxr94_ex.py
ajust= (-27, 8, 13)      # ほぼdefault値
xyz=   0.0825   -0.0179    0.9633 
deg= 4.8923
>>>

傾けて測定、先のajust= (-27, 8, 13)の値を使って測定
Thonnyのシェルで実行


>>> x,y,z=a.kxr_out((-27, 8, 13))
>>> deg=a.kxr_deg()
>>> print('deg=',deg)
deg= 65.114
>>> 

モジュール


c_kxr94_00.py
from microbit import *
import math

#KXR94-2050 ±2g Tri-axis Accelerometer
class KXR94:
    def __init__(self,x_pin=pin0,y_pin=pin1,z_pin=pin2,vs=3300):
        # X:pin_x  Y:pin_y  Z:pin_z
        self.pin_x=x_pin
        self.pin_y=y_pin
        self.pin_z=z_pin

        display.off()       # 一応display offに
        self.pin_x.set_pull(self.pin_x.NO_PULL)   # アナログ入力に
        self.pin_y.set_pull(self.pin_y.NO_PULL)
        self.pin_z.set_pull(self.pin_z.NO_PULL)
        
        # power supply 3300mv 
        self.Vs=vs
        # offset Vs*1/2
        self.offset=self.Vs/2
        # sens (Vs/5) V/g
        self.sens=self.Vs/5
        
    def kxr_ajust(self):
        # Vs=3.3V TOP(Face-up) xyz_vout 1650,1650,2310mV(データシート値)に合わす補正値算出
        v0=v1=v2=0
        # 10回測定の平均値
        for i in range(10):
            r_v0, r_v1, r_v2=self.r_out()
            sleep(100)
            v0=v0+r_v0
            v1=v1+r_v1
            v2=v2+r_v2
        # 平均値で調整
        x_jst=1650-int(v0/10)
        y_jst=1650-int(v1/10)
        z_jst=2310-int(v2/10)
        
    return x_jst, y_jst, z_jst

    # x,y,z_pin out-data 
    def r_out(self):
        self.r_v0 = self.pin_x.read_analog()*self.Vs/1024
        self.r_v1 = self.pin_y.read_analog()*self.Vs/1024
        self.r_v2 = self.pin_z.read_analog()*self.Vs/1024
        return(self.r_v0, self.r_v1, self.r_v2)

    # sensのunit(V/g)
    def kxr_out(self,ajust=(-27, 7, 11)):
        r_v0, r_v1, r_v2 = self.r_out()
        self.x = (r_v0-self.offset-ajust[0])/self.sens
        self.y = (r_v1-self.offset-ajust[1])/self.sens
        self.z = (r_v2-self.offset-ajust[2])/self.sens
        return(self.x, self.y, self.z)

    # 角度計算 y軸回り kxr_out後に kxr_degで角度算出
    def kxr_deg(self):
        ath = math.atan(self.x/self.z)
        deg= math.degrees(ath)
        return deg