稼働中

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