開発環境(IDE)
今回の開発の環境にはThonny https://thonny.org/ を使用しました。
3軸加速度センサー(ADXL345)は https://akizukidenshi.com/catalog/g/gM-06724/を使用し、I2Cで通信させてます。
MicoroPythonはRaspberry Pi PicoのGetting StartedよりダウンロードしRaspberry Pi Picoに書き込んでください。
接続例
以下のように接続します。
ジャンパーワイヤの色が統一感が無いのはDEBUGで一部不良だったため適当な色に交換しています。その影響で分かりにくいかもしれません。
コード例
動作したコードを置いておきます。
若干、無駄なような記述がありますが、動作した時点のコードですのでご容赦ください。
from machine import Pin
from machine import I2C
import time
import ustruct
DATA_FORMAT = 0x31
BW_RATE = 0x2c
POWER_CTL = 0x2d
INT_ENABLE = 0x2E
BW_RATE_1600HZ = 0x0F
BW_RATE_800HZ = 0x0E
BW_RATE_400HZ = 0x0D
BW_RATE_200HZ = 0x0C
BW_RATE_100HZ = 0x0B
BW_RATE_50HZ = 0x0A
BW_RATE_25HZ = 0x09
RANGE_2G = 0x00
RANGE_4G = 0x01
RANGE_8G = 0x02
RANGE_16G = 0x03
OFSX = 0x1e
OFSY =0x1f
OFSZ =0x20
class adxl345:
def __init__(self, scl, sda):
self.scl = scl
self.sda = sda
self.i2c = I2C(0,scl = self.scl, sda = self.sda, freq = 100000)
slv = self.i2c.scan()
for s in slv:
buf = self.i2c.readfrom_mem(s, 0, 1)
if(buf[0] == 0xe5):
self.slvAddr = s
print('adxl345 found')
break
#self.writeByte(POWER_CTL,0x00) #sleep
#time.sleep(0.001)
self.writeByte(DATA_FORMAT,0x2B)
self.writeByte(BW_RATE,0x0A)
self.writeByte(INT_ENABLE,0x00)
self.writeByte(OFSX,0x00)
self.writeByte(OFSY,0x00)
self.writeByte(OFSZ,0x00)
self.writeByte(POWER_CTL,0x28)
time.sleep(1)
def readXYZ(self):
fmt = '<h' #little-endian
buf1 = self.readByte(0x32)
buf2 = self.readByte(0x33)
buf = bytearray([buf1[0], buf2[0]])
x, = ustruct.unpack(fmt, buf)
x = x*3.9
buf1 = self.readByte(0x34)
buf2 = self.readByte(0x35)
buf = bytearray([buf1[0], buf2[0]])
y, = ustruct.unpack(fmt, buf)
y = y*3.9
buf1 = self.readByte(0x36)
buf2 = self.readByte(0x37)
buf = bytearray([buf1[0], buf2[0]])
z, = ustruct.unpack(fmt, buf)
z = z*3.9
return (x,y,z)
def writeByte(self, addr, data):
d = bytearray([data])
self.i2c.writeto_mem(self.slvAddr, addr, d)
def readByte(self, addr):
return self.i2c.readfrom_mem(self.slvAddr, addr, 1)
scl = Pin(17)
sda = Pin(16)
snsr = adxl345(scl, sda)
while True:
x,y,z = snsr.readXYZ()
print('x:',x,'y:',y,'z:',z,'uint:mg')
time.sleep(0.5)
実行風景
参考文献
Raspberry Pi PicoのmicroPythonでI2CとADCを使ってみる
https://qiita.com/SamAkada/items/07f4929a9fcfbfd942bc
【以上】