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 ของอุปกรณ์ ค่าเริ่มต้นคือ0x28modeคือโหมดการทำงานที่อุปกรณ์จะถูกตั้งค่าหลังรีเซ็ต ดูค่าคงที่โหมดการทำงานด้านล่าง ค่าเริ่มต้นคือNDOF_MODEaxisคือค่าการกำหนดค่าการจัดเรียงแกนขนาด 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จะเลือกหน้า
- 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]ของค่าทศนิยมเป็นองศาต่อวินาที
ค่าคงที่¶
โหมดการทำงาน¶
การวางแกน¶
ค่า 2 ไบต์ต่อไปนี้จะถูกส่งไปยัง BNO055.axis() เพื่อจัดเรียงระบบพิกัดของอุปกรณ์ใหม่ ค่าคงที่แต่ละค่าคือคู่ register (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) จากเอกสารข้อมูล BNO055 (ส่วนที่ 3.4, Axis remap) ที่เข้ารหัสล่วงหน้าสำหรับแปดทิศทางการวางแบบมาตรฐาน
เลือกค่าคงที่ที่แกนเอาต์พุตตรงกับการติดตั้งชิปบน PCB จริง:
ค่าคงที่ |
เอาต์พุต X |
เอาต์พุต Y |
เอาต์พุต Z |
ไบต์ |
การติดตั้ง |
|---|---|---|---|---|---|
|
|
|
|
หน้าขึ้น หมุน 90° ทวนเข็มนาฬิกาจาก P1 |
|
|
|
|
|
หน้าขึ้น ค่าเริ่มต้นของเอกสารข้อมูล |
|
|
|
|
|
หน้าขึ้น หมุน 180° |
|
|
|
|
|
หน้าขึ้น หมุน 90° ตามเข็มนาฬิกาจาก P1 |
|
|
|
|
|
หน้าลง พลิกรอบแกน X (ค่าเริ่มต้นของคอนสตรักเตอร์) |
|
|
|
|
|
หน้าลง หมุน 90° ทวนเข็มนาฬิกาจาก P4 |
|
|
|
|
|
หน้าลง หมุน 180° จาก P4 |
|
|
|
|
|
หน้าลง หมุน 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_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