bno055 --- ไดรเวอร์ BNO055 IMU

โมดูลนี้ให้ไดรเวอร์สำหรับ Bosch BNO055 ซึ่งเป็นเซนเซอร์วัดทิศทางสัมบูรณ์ 9 แกนผ่าน I2C BNO055 รวมข้อมูลจากแอคเซลเลอโรมิเตอร์ แมกนีโตมิเตอร์ และไจโรสโคปบนชิป และแสดงผลลัพธ์เป็นควอเทอร์เนียน มุม Euler ความเร่งเชิงเส้น และความโน้มถ่วง นอกจากช่องสัญญาณเซนเซอร์ดิบ

ตัวอย่างการใช้งาน:

import time
from machine import I2C
import bno055

bus = I2C(1)
imu = bno055.BNO055(bus)

while True:
    print(imu.euler())
    time.sleep_ms(100)

คลาส

class bno055.BNO055(bus: machine.I2C, address: int = 0x28, mode: int = NDOF_MODE, axis: bytes = AXIS_P4)

สร้างอินสแตนซ์ไดรเวอร์ BNO055

  • bus คืออ็อบเจกต์บัส machine.I2C ที่กำหนดค่าแล้ว ใช้สำหรับสื่อสารกับเซนเซอร์

  • address คือที่อยู่ I2C 7-bit ของอุปกรณ์ ค่าเริ่มต้นคือ 0x28

  • mode คือโหมดการทำงานที่อุปกรณ์จะถูกตั้งค่าหลังรีเซ็ต ดูค่าคงที่โหมดการทำงานด้านล่าง ค่าเริ่มต้นคือ NDOF_MODE

  • axis คือค่าการกำหนดค่าการจัดเรียงแกนขนาด 2 ไบต์ ดูค่าคงที่การวางแกนด้านล่าง ค่าเริ่มต้นคือ AXIS_P4

คอนสตรักเตอร์จะตรวจสอบ chip ID ทำการ soft reset สลับไปยังพลังงานปกติ ใช้การกำหนดค่าแกน และเข้าสู่โหมดการทำงานที่ร้องขอโดยใช้ออสซิลเลเตอร์ภายนอก ทำให้เกิด RuntimeError หากไม่สามารถอ่านค่า ID register ที่คาดหวังกลับมาได้

read_registers(register: int, size: int = 1) bytes

อ่าน size ไบต์จาก register อุปกรณ์ที่ระบุและคืนค่าเป็นออบเจกต์ bytes

write_registers(register: int, data: bytes) None

เขียน data ไบต์ที่ระบุไปยังอุปกรณ์โดยเริ่มจาก register

operation_mode(mode: int = None) int

รับหรือตั้งค่า register โหมดการทำงาน หากไม่มีอาร์กิวเมนต์ จะคืนค่าโหมดปัจจุบันเป็น int หากมีอาร์กิวเมนต์ mode จะเขียนโหมดใหม่ไปยังอุปกรณ์ ดูค่าคงที่โหมดการทำงานด้านล่าง

system_trigger(data: int) None

เขียน data ไปยัง register system trigger (0x3F) ใช้ภายในเพื่อออก soft reset (0x20) และเลือกออสซิลเลเตอร์ภายนอก (0x80)

power_mode(mode: int = None) bytes

รับหรือตั้งค่า register โหมดพลังงาน หากไม่มีอาร์กิวเมนต์ จะคืนค่าเนื้อหา register โหมดพลังงานปัจจุบัน หากมีอาร์กิวเมนต์ mode จะเขียนโหมดพลังงานใหม่ไปยังอุปกรณ์

page(num: int = None) None

รับหรือตั้งค่าหน้า register หากไม่มีอาร์กิวเมนต์ จะอ่าน register หน้าปัจจุบัน หากมีอาร์กิวเมนต์ num จะเลือกหน้า

temperature() int

คืนค่า register อุณหภูมิชิปเป็น unsigned byte

read_id() bytes

คืนค่าบล็อก ID ขนาด 4 ไบต์ที่อ่านจาก register 0x00 ค่าที่คาดหวังคือ b'\xA0\xFB\x32\x0F'

axis(placement: bytes = None) bytes

รับหรือตั้งค่าการกำหนดค่าการจัดเรียงแกน หากไม่มีอาร์กิวเมนต์ จะคืนค่าการกำหนดค่าแกน 2 ไบต์ปัจจุบัน หากมีอาร์กิวเมนต์ placement จะเขียนการกำหนดค่าแกน 2 ไบต์ที่ระบุ ใช้ค่าคงที่ AXIS_P0..AXIS_P7 ด้านล่าง

quaternion() list

คืนค่าทิศทางที่ฟิวส์แล้วเป็นลิสต์ 4 องค์ประกอบ [w, x, y, z] ของค่าทศนิยมที่ปรับขนาดเป็นช่วงควอเทอร์เนียนหน่วย

euler() list

คืนค่าทิศทางที่ฟิวส์แล้วเป็นลิสต์ 3 องค์ประกอบ [yaw, roll, pitch] ของค่าทศนิยมเป็นองศา

accelerometer() list

คืนค่าการอ่านแอคเซลเลอโรมิเตอร์เป็นลิสต์ 3 องค์ประกอบ [x, y, z] ของค่าทศนิยมเป็น m/s^2

magnetometer() list

คืนค่าการอ่านแมกนีโตมิเตอร์เป็นลิสต์ 3 องค์ประกอบ [x, y, z] ของค่าทศนิยมเป็นไมโคร-เทสลา

gyroscope() list

คืนค่าการอ่านไจโรสโคปเป็นลิสต์ 3 องค์ประกอบ [x, y, z] ของค่าทศนิยมเป็นองศาต่อวินาที

linear_acceleration() list

คืนค่าความเร่งเชิงเส้นที่ชดเชยแรงโน้มถ่วงแล้วเป็นลิสต์ 3 องค์ประกอบ [x, y, z] ของค่าทศนิยมเป็น m/s^2

gravity() list

คืนค่าเวกเตอร์แรงโน้มถ่วงเป็นลิสต์ 3 องค์ประกอบ [x, y, z] ของค่าทศนิยมเป็น m/s^2

ค่าคงที่

โหมดการทำงาน

bno055.CONFIG_MODE: int

โหมดการกำหนดค่า (0x00) อุปกรณ์ต้องอยู่ในโหมดนี้เพื่อเปลี่ยน register การกำหนดค่า

bno055.ACCONLY_MODE: int

โหมดไม่ฟิวส์แอคเซลเลอโรมิเตอร์อย่างเดียว (0x01)

bno055.MAGONLY_MODE: int

โหมดไม่ฟิวส์แมกนีโตมิเตอร์อย่างเดียว (0x02)

bno055.GYRONLY_MODE: int

โหมดไม่ฟิวส์ไจโรสโคปอย่างเดียว (0x03)

bno055.ACCMAG_MODE: int

โหมดไม่ฟิวส์แอคเซลเลอโรมิเตอร์ + แมกนีโตมิเตอร์ (0x04)

bno055.ACCGYRO_MODE: int

โหมดไม่ฟิวส์แอคเซลเลอโรมิเตอร์ + ไจโรสโคป (0x05)

bno055.MAGGYRO_MODE: int

โหมดไม่ฟิวส์แมกนีโตมิเตอร์ + ไจโรสโคป (0x06)

bno055.AMG_MODE: int

โหมดไม่ฟิวส์แอคเซลเลอโรมิเตอร์ + แมกนีโตมิเตอร์ + ไจโรสโคป (0x07)

bno055.IMUPLUS_MODE: int

โหมดฟิวส์ IMU โดยใช้แอคเซลเลอโรมิเตอร์ + ไจโรสโคป (0x08)

bno055.COMPASS_MODE: int

โหมดฟิวส์เข็มทิศโดยใช้แอคเซลเลอโรมิเตอร์ + แมกนีโตมิเตอร์ (0x09)

bno055.M4G_MODE: int

โหมดฟิวส์ magnet-for-gyroscope (0x0A)

bno055.NDOF_FMC_OFF_MODE: int

โหมดฟิวส์ 9-DOF โดยปิดใช้งานการสอบเทียบแมกนีโตมิเตอร์แบบเร็ว (0x0B)

bno055.NDOF_MODE: int

โหมดฟิวส์ 9-DOF โดยเปิดใช้งานการสอบเทียบแมกนีโตมิเตอร์แบบเร็ว (0x0C) นี่คือโหมดเริ่มต้นที่ใช้โดยคอนสตรักเตอร์

การวางแกน

ค่า 2 ไบต์ต่อไปนี้จะถูกส่งไปยัง BNO055.axis() เพื่อจัดเรียงระบบพิกัดของอุปกรณ์ใหม่ ค่าคงที่แต่ละค่าคือคู่ register (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) จากเอกสารข้อมูล BNO055 (ส่วนที่ 3.4, Axis remap) ที่เข้ารหัสล่วงหน้าสำหรับแปดทิศทางการวางแบบมาตรฐาน

เลือกค่าคงที่ที่แกนเอาต์พุตตรงกับการติดตั้งชิปบน PCB จริง:

ค่าคงที่

เอาต์พุต X

เอาต์พุต Y

เอาต์พุต Z

ไบต์

การติดตั้ง

AXIS_P0

-Yc

+Xc

+Zc

21 04

หน้าขึ้น หมุน 90° ทวนเข็มนาฬิกาจาก P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

หน้าขึ้น ค่าเริ่มต้นของเอกสารข้อมูล

AXIS_P2

-Xc

-Yc

+Zc

24 06

หน้าขึ้น หมุน 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

หน้าขึ้น หมุน 90° ตามเข็มนาฬิกาจาก P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

หน้าลง พลิกรอบแกน X (ค่าเริ่มต้นของคอนสตรักเตอร์)

AXIS_P5

+Yc

+Xc

-Zc

21 01

หน้าลง หมุน 90° ทวนเข็มนาฬิกาจาก P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

หน้าลง หมุน 180° จาก P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

หน้าลง หมุน 90° ตามเข็มนาฬิกาจาก P4

Xc / Yc / Zc หมายถึงแกนภายในของชิป (ตามที่พิมพ์ในเอกสารข้อมูล BNO055) คอลัมน์ "เอาต์พุต" คือแกนที่อุปกรณ์ส่งออกผ่าน BNO055.euler(), BNO055.gyro() เป็นต้น P0 ถึง P3 คือการหมุน 90° สี่แบบของชิปในทิศทางหน้าชิปขึ้น ส่วน P4 ถึง P7 คือการหมุนสี่แบบเดิมหลังจากพลิกชิปลง

bno055.AXIS_P0: bytes

ชิปหน้าขึ้น หมุน 90° ทวนเข็มนาฬิกาจาก AXIS_P1 แกนเอาต์พุต: X = -Yc, Y = +Xc, Z = +Zc

bno055.AXIS_P1: bytes

ชิปหน้าขึ้นในทิศทางเริ่มต้นของเอกสารข้อมูล BNO055 ไม่มีการจัดเรียงใหม่: X = +Xc, Y = +Yc, Z = +Zc

bno055.AXIS_P2: bytes

ชิปหน้าขึ้น หมุน 180° จาก AXIS_P1 แกนเอาต์พุต: X = -Xc, Y = -Yc, Z = +Zc

bno055.AXIS_P3: bytes

ชิปหน้าขึ้น หมุน 90° ตามเข็มนาฬิกาจาก AXIS_P1 แกนเอาต์พุต: X = +Yc, Y = -Xc, Z = +Zc

bno055.AXIS_P4: bytes

ชิปพลิกลง (ด้านชิปลง) เทียบกับ AXIS_P1 แกนเอาต์พุต: X = +Xc, Y = -Yc, Z = -Zc นี่คือการวางที่ใช้โดยคอนสตรักเตอร์ BNO055 เมื่อไม่มีอาร์กิวเมนต์ axis

bno055.AXIS_P5: bytes

ชิปหน้าลง หมุน 90° ทวนเข็มนาฬิกาจาก AXIS_P4 แกนเอาต์พุต: X = +Yc, Y = +Xc, Z = -Zc

bno055.AXIS_P6: bytes

ชิปหน้าลง หมุน 180° จาก AXIS_P4 แกนเอาต์พุต: X = -Yc, Y = -Xc, Z = -Zc

bno055.AXIS_P7: bytes

ชิปหน้าลง หมุน 90° ตามเข็มนาฬิกาจาก AXIS_P4 แกนเอาต์พุต: X = -Xc, Y = +Yc, Z = -Zc