Raspberry Pi Pico ー 加速度センサ(I2C通信)

2/13/2023

Pico Raspberry Pi

t f B! P L
Raspberry Pi Picoを触り始めてからまずは手持ちであった部品類の動作確認的なことを行ってきた。今回は加速度センサをI2Cで接続して数値を読んでみる。

使用した機材等


配線


I2Cで接続。
(持っている加速度センサのパーツがFritzingで見つからなかったが、使用したピンは同じ)

ADXL345 RPi Pico Pin
VDD VBUS (DC5V) 40
GND GND 38
VSS 3V3 (OUT) 36
SCL I2C0 SCL 22 (GP17)
SDA I2C0 SDA 21 (GP16)


コード

今回はひとまずDigikeyのWebサイトに掲載されていたコードをベースに作成。ひとまず数値を読み込むことはすぐに出来たものの、I2C通信を理解するにはもう少しゆっくり読み解いていく必要あり…。
  • XYZ加速度データの変換
    • 計測レンジ: +/-16g
    • 分解能: 13bit (+/-12bit)
    • 加速度への変換: 1g/8bit(256)

import machine
import utime
import ustruct
import sys

# Constant
SENSITIVITY = 1.0 / 256 # [g/LSB]
gravity = 9.80665

# I2Cの設定
i2c = machine.I2C(0, scl=machine.Pin(17), sda=machine.Pin(16), freq=400000)

# I2Cデバイスアドレスを確認
addr = i2c.scan()
ADXL345_ADDR = 0x1d

# Register
REG_DEVID = 0x00
REG_POWER_CTL = 0x2D
REG_DATAX0 = 0x32
DEVID = 0xE5

# I2C Read/Write Functions
def reg_write(i2c, addr, reg, data):
    msg = bytearray()
    msg.append(data)
    i2c.writeto_mem(addr, reg, msg)
    
def reg_read(i2c, addr, reg, nbytes=1):
    if nbytes < 1:
        return bytearray()
    data = i2c.readfrom_mem(addr, reg, nbytes)
    return data

# Main
# Read device ID
data = reg_read(i2c, ADXL345_ADDR, REG_DEVID)
if (data != bytearray((DEVID,))):
    print("ERROR: Cound not communicate with ADXL345")
    sys.exit()
    
# Read Power Control Register
data = reg_read(i2c, ADXL345_ADDR, REG_POWER_CTL)

# Start measurement
data = int.from_bytes(data, "big")|(1<<3)
reg_write(i2c, ADXL345_ADDR, REG_POWER_CTL, data)

print("XYZ Acceleration [m/s2] with ADXL345")
utime.sleep(1.0)

while True:
    # Read X, Y, Z values (16 bits each)
    data = reg_read(i2c, ADXL345_ADDR, REG_DATAX0, 6)
    # Convert 2 bytes (little-endian) into 16-bit integer (signed)
    data_acc_x = ustruct.unpack_from("<h", data, 0)[0]
    data_acc_y = ustruct.unpack_from("<h", data, 2)[0]
    data_acc_z = ustruct.unpack_from("<h", data, 4)[0]
    # Convert to g >> m/s^2
    acc_x = data_acc_x * SENSITIVITY * gravity
    acc_y = data_acc_y * SENSITIVITY * gravity
    acc_z = data_acc_z * SENSITIVITY * gravity

    # Print measurements
    print("X: ", "{:.2f}".format(acc_x),
          "Y: ", "{:.2f}".format(acc_y),
          "Z: ", "{:.2f}".format(acc_z))
    utime.sleep(0.5)

結果

とりあえずThonnyに加速度を表示させることが出来た。机に置いてある状態でZ方向は重力加速度分を読めている。ブレッドボードを傾けるとそれぞれ+/-1gの範囲では計測できることを確認できた。

少しバラつき(ノイズ(?))がある


参考にしたサイト


このブログを検索

ラベル

Outdoor (21) 3D Printer (12) Raspberry Pi (10) Learning (9) Movie (7) Pico (6) FreeCAD (5) Game (5) Blog (4) MSFS (4) Python (4) Gadget (1) Unity (1)

ブログ アーカイブ

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

人気の投稿

QooQ