マイクロビット(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