Raspberry Pi Pico(s_16)KXR94-2050 用モジュール
KXR94-2050 KXR94c.py
KXR94-2050モジュールは3軸加速度センサーKXR94-2050を基盤に半田付けされたモジュールです。
測定レンジは±2gです。電源3.3Ⅴ時、感度660mV/gです。※詳細はKXR94-2050のデータシートなどを参照ください。
Raspberry Pi PicoでKXR94-2050センサーモジュールを使う自作の’KXR94c.py’を作成しました。記事d_20を元に作成しています。’KXR94c.py’は末尾にあります。使い方だけを記載します。
使い方
■ ファイル転送
Raspberry Pi Picoへ’KXR94c.py’を送った後でimportして使います。
※KXR94c.pyの末尾に、使用例(KXR94c_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘KXR94c’をimportすると「g_xyz、zero_ajust、deg_ab」のメソッドが使えるようになります。
KXR94()で初期化します。
KXR94-2050モジュールの電源電圧は3300mV、x、y、zの出力をRaspberry Pi PicoのADC0、1、2に各々接続している状態を前提にしています。
さらに、KXR94-2050モジュールが水平上向き時のゼロ調整値を(-51, 11, -12)にしています。
(01)g_xyz()
KXR94-2050で測定した加速度を返します。x,y,zのリスト値を返します。
(02)deg_ab(a,b)
tan(a/b)の角度を返します。
測定した加速度x,y,zとすると、deg_ab(x,z)でx軸の傾きになります。
(03)zero_ajust()
KXR94-2050モジュールが水平上向き時の調整値を返します。x,y,zのリスト値を返します。
初期の調整値は(-51, 11, -12)にしています。適宜修正してください。
使用例
KXR94-2050でx,y,zの加速度を測定し、tan(x/z)、tan(y/z)の角度を表示します。
KXR94c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import ADC,Pin
import math
from KXR94c import KXR94
# KXR94-2500 ±2g Tri-axis Accelerometer
## example
a=KXR94()
# x,y,z 加速度測定
x,y,z=a.g_xyz()
print('x=%6.4f'%x,'y=%6.4f'%y,'z=%6.4f'%z)
# 傾斜算出
x_deg=a.deg_ab(x,z) # x,z atan(x/z)
print('xdeg=%4.1f'%x_deg) # 表示
y_deg=a.deg_ab(y,z) # y,z atan(y/z)
print('ydeg=%4.1f'%y_deg) # 表示
実行結果
KXR94-2050モジュールを適当な傾きで実行すると以下のようになりました。※Thonnyのshellに表示されます。
>>> %Run -c $EDITOR_CONTENT 0.1
x=0.3742 y=-0.5470 z=0.7106
xdeg=27.8
ydeg=-37.6
スクリプト実行後にThonnyのshellで調整値を確認してみました。
>>> print(a.aj_x, a.aj_y, a.aj_z)
-51 11 -12 #初期の調整値
>>> a.zero_ajust() #調整値の測定
(-67, -6, -11)
>>>
KXR94-2050モジュール用
KXR94c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import ADC,Pin
import math
# KXR94-2500 ±2g Tri-axis Accelerometer
class KXR94:
def __init__(self):
self.vdd=3300 # 3300mV
self.v_ref=(self.vdd/2**16) # ADC_ref=3.3V
#sens= Vdd/5 /1g 1g感度は電源電圧÷5
self.sens=self.vdd/5
#offset= Vdd/2
self.ofset=self.vdd/2
#ゼロ調整値 ajust
(self.aj_x,self.aj_y,self.aj_z)=(-51, 11, -12)
#ADC測定Pin指定
Pin(26,mode=Pin.IN) #ADC(0) OUT_X
Pin(27,mode=Pin.IN) #ADC(1) OUT_Y
Pin(28,mode=Pin.IN) #ADC(2) OUT_Z
# OUT_x,y,z ADC
def d_out(self):
# X,Y,Z
dx=int(ADC(0).read_u16()*self.v_ref) #ADC(0) Pin(26)
dy=int(ADC(1).read_u16()*self.v_ref) #Pin(27)
dz=int(ADC(2).read_u16()*self.v_ref) #Pin(28)
return dx,dy,dz
#ゼロ調整値 センサー上向き 調整値(差分)
def zero_ajust(self):
# Position 5の出力値 x,y,z 1650,1650,2310
(dx, dy, dz)=self.d_out()
self.aj_x=int(1650-dx)
self.aj_y=int(1650-dy)
self.aj_z=int(2310-dz)
# 出力値の差分
return self.aj_x,self.aj_y,self.aj_z
# acc-x,y,z
def g_xyz(self):
(dx, dy, dz)=self.d_out()
out_x=int(dx + self.aj_x - self.ofset) #ADC(0) Pin(26)
out_y=int(dy + self.aj_y - self.ofset) #Pin(27)
out_z=int(dz + self.aj_z - self.ofset) #Pin(28)
# out(mV)/sens(mv/g)=g
x=out_x/self.sens
y=out_y/self.sens
z=out_z/self.sens
return x,y,z
# tan(a/b)の角度
def deg_ab(self,a,b):
ath = math.atan(a/b) # tan(a/b)の角度
deg= math.degrees(ath)
#print('deg=%4.1f'%deg) # 表示
return deg