目次
はじめに
6軸とはx,y,z方向の加速度(3)と、x,y,z軸を中心とした回転速度(3)のことです。
加速度の単位はG(≒9.81m/s^2)、回転速度はdeg/sが使われています。
加速度センサーは、デバイスの傾き、運動の検出、重力方向の特定などに使用されます。
ジャイロスコープは、デバイスの回転速度や方向の変化を検出するのに使用されます。例えば、ドローンの姿勢制御やスマートフォンの画面の向き検出などに利用されます。
リンク
6軸センサの仕組み
加速度センサー
x,y,z軸毎に微小な機械的構造体がポリシリコンスプリングで吊り下げられている。
特定の軸に力が加わると、構造体が動き、構造内の静電容量が変化する。
その変化を電圧信号に変換することで軸に加わった力を加速度として算出する。
ジャイロスコープ
x,y,z軸毎に回転するディスクや振動する構造体があり、その回転や振動の変化を感知する。
回転すると、コリオリ力と呼ばれる力が働き、これにより構造体が歪む。
この歪みを電気信号に変換し、角速度として算出する。
配線
I2C接続。OLEDディスプレイと同じです。
RaspberryPi Pico | MPU6050 |
VSYS(39番) | VCC |
GND(38番) | GND |
GP17(22番) | SCL |
GP16(21番) | SDA |
MPU6050センサ値をOLEDディスプレイに表示する
加速度センサーとジャイロスコープの値をOLEDディスプレイに表示します。
MPU6050とOLEDディスプレイを同じI2Cに接続してください。
加速度の単位はm/s^2としています。水平に設置すればaccel_yは重力加速度である9.81m/s^2前後になります。
from machine import Pin, I2C
import ssd1306
import time
# MPU6050のI2Cアドレス
MPU6050_ADDR = 0x68
# レジスタアドレス
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
GYRO_XOUT_H = 0x43
GYRO_YOUT_H = 0x45
GYRO_ZOUT_H = 0x47
def MPU6050_init(i2c):
# MPU6050をスリープモードから解除
i2c.writeto_mem(MPU6050_ADDR, PWR_MGMT_1, b'\x00')
def read_raw_data(i2c, addr):
high = i2c.readfrom_mem(MPU6050_ADDR, addr, 1)
low = i2c.readfrom_mem(MPU6050_ADDR, addr + 1, 1)
value = (high[0] << 8) | low[0]
if value > 32768:
value -= 65536
return value
def get_accel_gyro_data(i2c):
accel_x = read_raw_data(i2c, ACCEL_XOUT_H)
accel_y = read_raw_data(i2c, ACCEL_YOUT_H)
accel_z = read_raw_data(i2c, ACCEL_ZOUT_H)
gyro_x = read_raw_data(i2c, GYRO_XOUT_H)
gyro_y = read_raw_data(i2c, GYRO_YOUT_H)
gyro_z = read_raw_data(i2c, GYRO_ZOUT_H)
# 加速度の値をm/s^2に変換
accel_x = (accel_x / 16384.0) * 9.81
accel_y = (accel_y / 16384.0) * 9.81
accel_z = (accel_z / 16384.0) * 9.81
# ジャイロスコープの値を度/秒に変換
gyro_x = gyro_x / 131.0
gyro_y = gyro_y / 131.0
gyro_z = gyro_z / 131.0
return accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z
# I2Cの設定
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)
# MPU6050を初期化
MPU6050_init(i2c)
# OLEDの設定(幅128ピクセル、高さ64ピクセル)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
while True:
# 加速度とジャイロのデータを取得
accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z = get_accel_gyro_data(i2c)
# OLEDにデータを表示
oled.fill(0) # 画面をクリア
oled.text('Accel X: {:.2f} '.format(accel_x), 0, 0)
oled.text('Accel Y: {:.2f} '.format(accel_y), 0, 10)
oled.text('Accel Z: {:.2f} '.format(accel_z), 0, 20)
oled.text('Gyro X: {:.2f} '.format(gyro_x), 0, 30)
oled.text('Gyro Y: {:.2f} '.format(gyro_y), 0, 40)
oled.text('Gyro Z: {:.2f} '.format(gyro_z), 0, 50)
oled.show() # 画面を更新
time.sleep(1)
リンク
コメント