bno055 --- Driver IMU BNO055#

Mô-đun này cung cấp driver cho cảm biến định hướng tuyệt đối 9 trục Bosch BNO055 qua I2C. BNO055 hợp nhất dữ liệu từ gia tốc kế, từ kế và con quay hồi chuyển trên chip và cung cấp đầu ra quaternion, góc Euler, gia tốc tuyến tính và trọng lực ngoài các kênh cảm biến thô.

Ví dụ sử dụng:

import time
from machine import I2C
import bno055

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

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

Lớp#

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

Khởi tạo một thể hiện driver BNO055.

  • bus là đối tượng bus machine.I2C đã được cấu hình, dùng để giao tiếp với cảm biến.

  • address là địa chỉ I2C 7-bit của thiết bị. Mặc định là 0x28.

  • mode là chế độ hoạt động mà thiết bị được đặt vào sau khi reset. Xem các hằng số chế độ hoạt động bên dưới. Mặc định là NDOF_MODE.

  • axis là giá trị cấu hình ánh xạ trục 2 byte. Xem các hằng số vị trí trục bên dưới. Mặc định là AXIS_P4.

Constructor xác minh ID chip, thực hiện soft reset, chuyển sang nguồn điện bình thường, áp dụng cấu hình trục, và vào chế độ hoạt động được yêu cầu bằng bộ dao động ngoài. Gây ra RuntimeError nếu không đọc lại được giá trị thanh ghi ID mong đợi.

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

Đọc size byte từ thanh ghi thiết bị đã cho và trả về chúng dưới dạng đối tượng bytes.

write_registers(register: int, data: bytes) None#

Ghi các byte data đã cho vào thiết bị bắt đầu từ register.

operation_mode(mode: int = None) int#

Lấy hoặc đặt thanh ghi chế độ hoạt động. Không có đối số, trả về chế độ hiện tại dưới dạng int. Với đối số mode, ghi chế độ mới vào thiết bị. Xem các hằng số chế độ hoạt động bên dưới.

system_trigger(data: int) None#

Ghi data vào thanh ghi kích hoạt hệ thống (0x3F). Được dùng nội bộ để phát lệnh soft reset (0x20) và để chọn bộ dao động ngoài (0x80).

power_mode(mode: int = None) bytes#

Lấy hoặc đặt thanh ghi chế độ nguồn điện. Không có đối số, trả về nội dung thanh ghi chế độ nguồn điện hiện tại. Với đối số mode, ghi chế độ nguồn điện mới vào thiết bị.

page(num: int = None) None#

Lấy hoặc đặt trang thanh ghi. Không có đối số, đọc thanh ghi trang hiện tại. Với đối số num, chọn trang đó.

temperature() int#

Trả về giá trị thanh ghi nhiệt độ chip dưới dạng byte không dấu.

read_id() bytes#

Trả về khối ID 4 byte được đọc từ thanh ghi 0x00. Giá trị mong đợi là b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes#

Lấy hoặc đặt cấu hình ánh xạ trục. Không có đối số, trả về cấu hình trục 2 byte hiện tại. Với đối số placement, ghi cấu hình trục 2 byte được cung cấp. Sử dụng một trong các hằng số AXIS_P0..AXIS_P7 bên dưới.

quaternion() list#

Trả về định hướng hợp nhất dưới dạng danh sách 4 phần tử [w, x, y, z] của các số thực được chia tỷ lệ theo phạm vi quaternion đơn vị.

euler() list#

Trả về định hướng hợp nhất dưới dạng danh sách 3 phần tử [yaw, roll, pitch] của các số thực tính bằng độ.

accelerometer() list#

Trả về giá trị đọc từ gia tốc kế dưới dạng danh sách 3 phần tử [x, y, z] của các số thực tính bằng m/s^2.

magnetometer() list#

Trả về giá trị đọc từ từ kế dưới dạng danh sách 3 phần tử [x, y, z] của các số thực tính bằng micro-Tesla.

gyroscope() list#

Trả về giá trị đọc từ con quay hồi chuyển dưới dạng danh sách 3 phần tử [x, y, z] của các số thực tính bằng độ/giây.

linear_acceleration() list#

Trả về gia tốc tuyến tính đã loại bỏ thành phần trọng lực dưới dạng danh sách 3 phần tử [x, y, z] của các số thực tính bằng m/s^2.

gravity() list#

Trả về vectơ trọng lực dưới dạng danh sách 3 phần tử [x, y, z] của các số thực tính bằng m/s^2.

Hằng số#

Chế độ hoạt động#

bno055.CONFIG_MODE: int#

Chế độ cấu hình (0x00). Thiết bị phải ở chế độ này để thay đổi các thanh ghi cấu hình.

bno055.ACCONLY_MODE: int#

Chế độ không hợp nhất chỉ dùng gia tốc kế (0x01).

bno055.MAGONLY_MODE: int#

Chế độ không hợp nhất chỉ dùng từ kế (0x02).

bno055.GYRONLY_MODE: int#

Chế độ không hợp nhất chỉ dùng con quay hồi chuyển (0x03).

bno055.ACCMAG_MODE: int#

Chế độ không hợp nhất dùng gia tốc kế + từ kế (0x04).

bno055.ACCGYRO_MODE: int#

Chế độ không hợp nhất dùng gia tốc kế + con quay hồi chuyển (0x05).

bno055.MAGGYRO_MODE: int#

Chế độ không hợp nhất dùng từ kế + con quay hồi chuyển (0x06).

bno055.AMG_MODE: int#

Chế độ không hợp nhất dùng gia tốc kế + từ kế + con quay hồi chuyển (0x07).

bno055.IMUPLUS_MODE: int#

Chế độ hợp nhất IMU dùng gia tốc kế + con quay hồi chuyển (0x08).

bno055.COMPASS_MODE: int#

Chế độ hợp nhất la bàn dùng gia tốc kế + từ kế (0x09).

bno055.M4G_MODE: int#

Chế độ hợp nhất từ kế thay con quay hồi chuyển (0x0A).

bno055.NDOF_FMC_OFF_MODE: int#

Chế độ hợp nhất 9-DOF với hiệu chỉnh nhanh từ kế bị tắt (0x0B).

bno055.NDOF_MODE: int#

Chế độ hợp nhất 9-DOF với hiệu chỉnh nhanh từ kế được bật (0x0C). Đây là chế độ mặc định được sử dụng bởi constructor.

Vị trí trục#

Các giá trị 2 byte sau đây được truyền cho BNO055.axis() để ánh xạ lại hệ tọa độ của thiết bị. Mỗi hằng số là cặp thanh ghi (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) từ datasheet BNO055 (Mục 3.4, Axis remap), đã được mã hóa trước cho một trong tám hướng đặt tiêu chuẩn.

Chọn hằng số có trục đầu ra khớp với cách chip được gắn vật lý trên PCB chủ:

Hằng số

Đầu ra X

Đầu ra Y

Đầu ra Z

Byte

Cách đặt

AXIS_P0

-Yc

+Xc

+Zc

21 04

mặt trên, xoay 90° ngược chiều kim đồng hồ so với P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

mặt trên, hướng mặc định theo datasheet

AXIS_P2

-Xc

-Yc

+Zc

24 06

mặt trên, xoay 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

mặt trên, xoay 90° theo chiều kim đồng hồ so với P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

mặt dưới, lật theo trục X (mặc định của constructor)

AXIS_P5

+Yc

+Xc

-Zc

21 01

mặt dưới, xoay 90° ngược chiều kim đồng hồ so với P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

mặt dưới, xoay 180° so với P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

mặt dưới, xoay 90° theo chiều kim đồng hồ so với P4

Xc / Yc / Zc biểu thị các trục nội tại của chip (như được in trong datasheet BNO055). Các cột "Đầu ra" là các trục mà thiết bị cung cấp qua BNO055.euler(), BNO055.gyro(), v.v. P0 đến P3 là bốn góc xoay 90° của chip ở hướng mặt linh kiện lên trên; P4 đến P7 là bốn góc xoay tương tự sau khi lật chip xuống mặt dưới.

bno055.AXIS_P0: bytes#

Chip mặt trên, xoay 90° ngược chiều kim đồng hồ so với AXIS_P1. Các trục đầu ra: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes#

Chip mặt trên theo hướng mặc định của datasheet BNO055. Không áp dụng ánh xạ lại: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes#

Chip mặt trên, xoay 180° so với AXIS_P1. Các trục đầu ra: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes#

Chip mặt trên, xoay 90° theo chiều kim đồng hồ so với AXIS_P1. Các trục đầu ra: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes#

Chip lật mặt xuống dưới (mặt linh kiện hướng xuống) so với AXIS_P1. Các trục đầu ra: X = +Xc, Y = -Yc, Z = -Zc. Đây là vị trí đặt được sử dụng bởi constructor BNO055 khi không cung cấp đối số axis.

bno055.AXIS_P5: bytes#

Chip mặt dưới, xoay 90° ngược chiều kim đồng hồ so với AXIS_P4. Các trục đầu ra: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes#

Chip mặt dưới, xoay 180° so với AXIS_P4. Các trục đầu ra: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes#

Chip mặt dưới, xoay 90° theo chiều kim đồng hồ so với AXIS_P4. Các trục đầu ra: X = -Xc, Y = +Yc, Z = -Zc.