這頁內容已整合到新的說明頁:陀螺儀 IMU 九軸

IMU 陀螺儀 指令參考

回到IMU 陀螺儀產品頁

這一頁列出IMU 陀螺儀送給每個上位機的每一個值、每一個命令:它是什麼意思、範圍多少、在 SPIKE/EV3/Arduino I2C/mBlock/MATRIX/micro:bit 各要怎麼讀。網址加 ?host=spike(或 ev3、arduino、mblock、matrix、microbit)會直接展開那個平台。

SPIKEEV3Arduino I2CmBlockMATRIXmicro:bit

項目 內容
I2C 出廠位址 0x6A
hw[0] 1(F0 高 byte、SPIKE 模式 8/EV3 模式 5 ID 高 byte)
型號 IMU
協議版本 2
支援平台 EV3、Arduino I2C、mBlock、MATRIX、micro:bit

值一覽

編號 值 範圍 EV3 Arduino I2C mBlock MATRIX micro:bit
01 陀螺 3D 航向 -32768~32767 ° ✓ ✓ ✓ ✓ ✓
02 融合航向 -32768~32767 ° ✓ ✓ ✓ ✓ ✓
03 陀螺 1D 航向 -32768~32767 ° ✓ ✓ ✓ ✓ ✓
04 磁力航向 -32768~32767 ° ✓ ✓ ✓ — ✓
05 轉向軸角速度 -32768~32767 0.1 dps ✓ ✓ ✓ — ✓
06 俯仰角 -90~+90 ° ✓ ✓ ✓ — ✓
07 俯仰角速度 -32768~32767 0.1 dps ✓ ✓ ✓ — ✓
08 磁力信任度 0~255 — ✓ ✓ — ✓
09 磁場干擾度 0~255 0.01° — ✓ ✓ — ✓
0A 朝上的面 0~5 — ✓ ✓ — ✓
10~12 角速度 1~3 軸 -32768~32767 0.1 dps — ✓ ✓ — ✓
13~15 加速度 1~3 軸 -32768~32767 mg — ✓ ✓ — ✓
16~18 磁力 1~3 軸 -32768~32767 mG — ✓ ✓ — ✓
0B 命令狀態 0~0xEF03 — ✓ — — —

✓ = 這個平台有這個值;— = 沒有(表格裡的平台欄位只列產品支援的平台)。

每個值怎麼讀

01 陀螺 3D 航向 headingGyro3D

項目 內容
用途 四元數算出的航向,度,開機/歸零 = 0,連續累積可超過 360(int16 到 ±32767 繞回,約 91 圈)
範圍 -32768~32767 °
I2C/mBlock 編號 01
鎖住 🔒 已鎖住的樂高模式排法不再改

怎麼讀

EV3

模式 0 · int16 · GYRO-ANG 1×int16(盤點:mode0 = 陀螺 3D,INO:232-234)(已鎖住的模式,韌體與主機端都不再改)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingGyro3D = sensor.read(0)[0]   # 陀螺 3D 航向:-32768~32767 °
' clev3r (BASIC)
Sensor.SetMode(1, 0)
headingGyro3D = Sensor.ReadRawValue(1, 0)
Arduino I2C

這個值本身就可能是 −32768(最高位元 = 1,例如 0x8000),跟讀不到時回的 MBC_NONE 一樣,不要拿 −32768 判斷有沒有讀到:要分辨就改用 mbcReadMany(0x6A, 0x01, 1, &headingGyro3D),回傳 false 才是讀不到。

int16_t headingGyro3D = mbcRead(0x6A, 0x01);   // 陀螺 3D 航向:-32768~32767 °
mBlock

積木傳回 陀螺 3D 航向(-32768~32767 °)。主機送 [01] → 回 [值低][值高][01 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 陀螺 3D 航向 :: sensing)
MATRIX

0x22 R~G (+32768)。

// A. 原廠 0x22 積木:R~G = 陀螺 3D 航向(R = (航向+32768) 低 byte、G = 高 byte(R4 版:低在前);主機 hi×256+lo−32768)
int raw = MiniR4.I2C1.MXColor.getColor(R);   // 第 1 組
micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [陀螺 3D v] 航向(°) :: #00A4E4)
let headingGyro3D = mbc.imuHeading(MbcImuHeading.Gyro3D)   // 陀螺 3D 航向:-32768~32767 °

02 融合航向 headingFused

項目 內容
用途 陀螺 3D 加磁力計慢修正的航向,度,減去相對零點;可超過 360
範圍 -32768~32767 °
I2C/mBlock 編號 02
鎖住 🔒 已鎖住的樂高模式排法不再改

怎麼讀

EV3

模式 1 · int16 · GYRO-RATE 1×int16 = 融合航向(EV3 定案:不改)(已鎖住的模式,韌體與主機端都不再改)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingFused = sensor.read(1)[0]   # 融合航向:-32768~32767 °
' clev3r (BASIC)
Sensor.SetMode(1, 1)
headingFused = Sensor.ReadRawValue(1, 0)
Arduino I2C

這個值本身就可能是 −32768(最高位元 = 1,例如 0x8000),跟讀不到時回的 MBC_NONE 一樣,不要拿 −32768 判斷有沒有讀到:要分辨就改用 mbcReadMany(0x6A, 0x02, 1, &headingFused),回傳 false 才是讀不到。

int16_t headingFused = mbcRead(0x6A, 0x02);   // 融合航向:-32768~32767 °
mBlock

積木傳回 融合航向(-32768~32767 °)。主機送 [02] → 回 [值低][值高][02 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 融合航向 :: sensing)
MATRIX

0x22 B~C (+32768)。

// A. 原廠 0x22 積木:B~C = 融合航向(B = 低 byte、C = 高 byte)
int raw = MiniR4.I2C1.MXColor.getColor(B);   // 第 1 組
micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [融合 v] 航向(°) :: #00A4E4)
let headingFused = mbc.imuHeading(MbcImuHeading.Fused)   // 融合航向:-32768~32767 °

相關積木「當陀螺儀 轉了 90 °」

mbc.onImuTurned(90, function () {
})

03 陀螺 1D 航向 headingGyro1D

項目 內容
用途 只繞轉向軸積分的航向,度,開機/歸零 = 0;可超過 360
範圍 -32768~32767 °
I2C/mBlock 編號 03
鎖住 🔒 已鎖住的樂高模式排法不再改

怎麼讀

EV3

模式 3 · int16 · GYRO-G&A 2×int16 [陀螺 1D, 磁力航向](已鎖住的模式,韌體與主機端都不再改)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingGyro1D = sensor.read(3)[0]   # 陀螺 1D 航向:-32768~32767 °
' clev3r (BASIC)
Sensor.SetMode(1, 3)
headingGyro1D = Sensor.ReadRawValue(1, 0)
Arduino I2C

這個值本身就可能是 −32768(最高位元 = 1,例如 0x8000),跟讀不到時回的 MBC_NONE 一樣,不要拿 −32768 判斷有沒有讀到:要分辨就改用 mbcReadMany(0x6A, 0x03, 1, &headingGyro1D),回傳 false 才是讀不到。

int16_t headingGyro1D = mbcRead(0x6A, 0x03);   // 陀螺 1D 航向:-32768~32767 °
mBlock

積木傳回 陀螺 1D 航向(-32768~32767 °)。主機送 [03] → 回 [值低][值高][03 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 陀螺 1D 航向 :: sensing)
MATRIX

0x22 M~Y (+32768)。

// A. 原廠 0x22 積木:M~Y = 陀螺 1D 航向(M = 低 byte、Y = 高 byte;K(10)= 0)
int raw = MiniR4.I2C1.MXColor.getColor(M);   // 第 1 組
micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [陀螺 1D v] 航向(°) :: #00A4E4)
let headingGyro1D = mbc.imuHeading(MbcImuHeading.Gyro1D)   // 陀螺 1D 航向:-32768~32767 °

04 磁力航向 headingMag

項目 內容
用途 磁力計傾斜補償航向,度,減去相對零點
範圍 -32768~32767 °
I2C/mBlock 編號 04
鎖住 🔒 已鎖住的樂高模式排法不再改

怎麼讀

EV3

模式 3 · int16(已鎖住的模式,韌體與主機端都不再改)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingMag = sensor.read(3)[1]   # 磁力航向:-32768~32767 °
' clev3r (BASIC)
Sensor.SetMode(1, 3)
headingMag = Sensor.ReadRawValue(1, 1)
Arduino I2C

這個值本身就可能是 −32768(最高位元 = 1,例如 0x8000),跟讀不到時回的 MBC_NONE 一樣,不要拿 −32768 判斷有沒有讀到:要分辨就改用 mbcReadMany(0x6A, 0x04, 1, &headingMag),回傳 false 才是讀不到。

int16_t headingMag = mbcRead(0x6A, 0x04);   // 磁力航向:-32768~32767 °
mBlock

積木傳回 磁力航向(-32768~32767 °)。主機送 [04] → 回 [值低][值高][04 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 磁力航向 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [磁力計 v] 航向(°) :: #00A4E4)
let headingMag = mbc.imuHeading(MbcImuHeading.Magnetic)   // 磁力航向:-32768~32767 °

05 轉向軸角速度 yawRate

轉向軸角速度
項目 內容
用途 繞轉向軸(getYawAxis())的角速度,0.1 度/秒,正負跟航向同向
範圍 -32768~32767 0.1 dps
I2C/mBlock 編號 05

怎麼讀

EV3

模式 2 · int16 · GYRO-FAS 1×int16(#67 新增,原本 0)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

yawRate = sensor.read(2)[0]   # 轉向軸角速度:-32768~32767 0.1 dps
' clev3r (BASIC)
Sensor.SetMode(1, 2)
yawRate = Sensor.ReadRawValue(1, 0)
Arduino I2C

這個值本身就可能是 −32768(最高位元 = 1,例如 0x8000),跟讀不到時回的 MBC_NONE 一樣,不要拿 −32768 判斷有沒有讀到:要分辨就改用 mbcReadMany(0x6A, 0x05, 1, &yawRate),回傳 false 才是讀不到。

int16_t yawRate = mbcRead(0x6A, 0x05);   // 轉向軸角速度:-32768~32767 0.1 dps
mBlock

積木傳回 轉向軸角速度(-32768~32767 0.1 dps)。主機送 [05] → 回 [值低][值高][05 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 轉向角速度 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 轉向角速度(0.1 °/s) :: #00A4E4)
let yawRate = mbc.imuYawRate()   // 轉向軸角速度:-32768~32767 0.1 dps

相關積木「陀螺儀 [靜止]?」

let imuFlag = mbc.imuFlag(MbcImuFlag.Still)

06 俯仰角 pitch

俯仰角
項目 內容
用途 板子絲印 X 軸相對水平面的仰角:X 軸朝上 +90、朝下 −90、水平 0(用重力向量 atan2 算)
範圍 -90~+90 °
I2C/mBlock 編號 06

怎麼讀

EV3

模式 6 · int16 · TILT-ANG 1×int16(#67 新增,原本 0)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

pitch = sensor.read(6)[0]   # 俯仰角:-90~+90 °
' clev3r (BASIC)
Sensor.SetMode(1, 6)
pitch = Sensor.ReadRawValue(1, 0)
Arduino I2C

讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。

int16_t pitch = mbcRead(0x6A, 0x06);   // 俯仰角:-90~+90 °
mBlock

積木傳回 俯仰角(-90~+90 °)。主機送 [06] → 回 [值低][值高][06 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 俯仰角 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 俯仰角(°) :: #00A4E4)
let pitch = mbc.imuPitch()   // 俯仰角:-90~+90 °

07 俯仰角速度 pitchRate

俯仰角速度
項目 內容
用途 繞板子絲印 X 軸的角速度,0.1 度/秒(右手定則,從 +X 端看逆時針為正);注意這是 gyro X,不是 06 的微分
範圍 -32768~32767 0.1 dps
I2C/mBlock 編號 07

怎麼讀

EV3

模式 5 · int16 · TILT-RATE 1×int16(#67:取代 #65 統一時放的 ID,ID 移到模式 4)

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

pitchRate = sensor.read(5)[0]   # 俯仰角速度:-32768~32767 0.1 dps
' clev3r (BASIC)
Sensor.SetMode(1, 5)
pitchRate = Sensor.ReadRawValue(1, 0)
Arduino I2C

這個值本身就可能是 −32768(最高位元 = 1,例如 0x8000),跟讀不到時回的 MBC_NONE 一樣,不要拿 −32768 判斷有沒有讀到:要分辨就改用 mbcReadMany(0x6A, 0x07, 1, &pitchRate),回傳 false 才是讀不到。

int16_t pitchRate = mbcRead(0x6A, 0x07);   // 俯仰角速度:-32768~32767 0.1 dps
mBlock

積木傳回 俯仰角速度(-32768~32767 0.1 dps)。主機送 [07] → 回 [值低][值高][07 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 俯仰角速度 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 俯仰角速度(0.1 °/s) :: #00A4E4)
let pitchRate = mbc.imuPitchRate()   // 俯仰角速度:-32768~32767 0.1 dps

08 磁力信任度 magTrust

磁力信任度
項目 內容
用途 融合演算法對磁力計的信任度 0255(= 01 × 255)
範圍 0~255
I2C/mBlock 編號 08

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。

int16_t magTrust = mbcRead(0x6A, 0x08);   // 磁力信任度:0~255
mBlock

積木傳回 磁力信任度(0~255)。主機送 [08] → 回 [值低][值高][08 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 磁力信任度 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 磁力信任度 :: #00A4E4)
let magTrust = mbc.imuMagTrust()   // 磁力信任度:0~255

09 磁場干擾度 magDisturb

磁場干擾度
項目 內容
用途 磁場干擾程度 0~255(度 × 100,上限 255)
範圍 0~255 0.01°
I2C/mBlock 編號 09

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。

int16_t magDisturb = mbcRead(0x6A, 0x09);   // 磁場干擾度:0~255 0.01°
mBlock

積木傳回 磁場干擾度(0~255 0.01°)。主機送 [09] → 回 [值低][值高][09 ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 磁場干擾度 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 磁場干擾度 :: #00A4E4)
let magDisturb = mbc.imuMagDisturbance()   // 磁場干擾度:0~255 0.01°

0A 朝上的面 upFace

朝上的面
項目 內容
用途 哪個軸朝上:0 +X、1 +Y、2 +Z、3 −X、4 −Y、5 −Z(實體軸)
範圍 0~5
I2C/mBlock 編號 0A

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。

int16_t upFace = mbcRead(0x6A, 0x0A);   // 朝上的面:0~5
mBlock

積木傳回 朝上的面(0~5)。主機送 [0A] → 回 [值低][值高][0A ^ 值低 ^ 值高],值 = int16 小端。

(IMU 陀螺儀 連接埠 [1 v] 朝上的面 :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 朝上的面 :: #00A4E4)
let upFace = mbc.imuFaceUp()   // 朝上的面:0~5

相關積木「陀螺儀 朝上的面是 [+Z]?」

let imuFaceUpIs = mbc.imuFaceUpIs(MbcImuFace.PlusZ)

10~12 角速度 1~3 軸 gyro

角速度 1~3 軸
項目 內容
用途 10 X、11 Y、12 Z 角速度,0.1 度/秒(實體軸,已套軸向號誌)
範圍 -32768~32767 0.1 dps
I2C/mBlock 編號 10~12

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

編號 0x10~0x12 連號,一次 mbcReadMany 讀完保證同一瞬間。

int16_t gyro[3];
mbcReadMany(0x6A, 0x10, 3, gyro);   // 角速度 1~3 軸:-32768~32767 0.1 dps
for (uint8_t i = 0; i < 3; i++) { Serial.print(gyro[i]); Serial.print(' '); }
Serial.println();
mBlock

積木傳回 角速度 13 軸(-3276832767 0.1 dps)。主機送 [10] → 回 [值低][值高][10 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x10 + (N − 1)。

(IMU 陀螺儀 連接埠 [1 v] 角速度 [軸] :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [角速度(0.1 °/s) v] [X v] 軸 :: #00A4E4)
let gyro = [mbc.imuAxis(MbcImuSensor.Gyro, MbcAxis.X), mbc.imuAxis(MbcImuSensor.Gyro, MbcAxis.Y), mbc.imuAxis(MbcImuSensor.Gyro, MbcAxis.Z)]   // 角速度 1~3 軸:-32768~32767 0.1 dps

13~15 加速度 1~3 軸 accel

加速度 1~3 軸
項目 內容
用途 13 X、14 Y、15 Z 加速度,mg(1000 = 1 g)
範圍 -32768~32767 mg
I2C/mBlock 編號 13~15

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

編號 0x13~0x15 連號,一次 mbcReadMany 讀完保證同一瞬間。

int16_t accel[3];
mbcReadMany(0x6A, 0x13, 3, accel);   // 加速度 1~3 軸:-32768~32767 mg
for (uint8_t i = 0; i < 3; i++) { Serial.print(accel[i]); Serial.print(' '); }
Serial.println();
mBlock

積木傳回 加速度 13 軸(-3276832767 mg)。主機送 [13] → 回 [值低][值高][13 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x13 + (N − 1)。

(IMU 陀螺儀 連接埠 [1 v] 加速度 [軸] :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [加速度(mg) v] [X v] 軸 :: #00A4E4)
let accel = [mbc.imuAxis(MbcImuSensor.Accel, MbcAxis.X), mbc.imuAxis(MbcImuSensor.Accel, MbcAxis.Y), mbc.imuAxis(MbcImuSensor.Accel, MbcAxis.Z)]   // 加速度 1~3 軸:-32768~32767 mg

16~18 磁力 1~3 軸 mag

磁力 1~3 軸
項目 內容
用途 16 X、17 Y、18 Z 磁場強度,mG(毫高斯)
範圍 -32768~32767 mG
I2C/mBlock 編號 16~18

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

編號 0x16~0x18 連號,一次 mbcReadMany 讀完保證同一瞬間。

int16_t mag[3];
mbcReadMany(0x6A, 0x16, 3, mag);   // 磁力 1~3 軸:-32768~32767 mG
for (uint8_t i = 0; i < 3; i++) { Serial.print(mag[i]); Serial.print(' '); }
Serial.println();
mBlock

積木傳回 磁力 13 軸(-3276832767 mG)。主機送 [16] → 回 [值低][值高][16 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x16 + (N − 1)。

(IMU 陀螺儀 連接埠 [1 v] 磁力 [軸] :: sensing)
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。

(陀螺儀 [磁力(mG) v] [X v] 軸 :: #00A4E4)
let mag = [mbc.imuAxis(MbcImuSensor.Mag, MbcAxis.X), mbc.imuAxis(MbcImuSensor.Mag, MbcAxis.Y), mbc.imuAxis(MbcImuSensor.Mag, MbcAxis.Z)]   // 磁力 1~3 軸:-32768~32767 mG

0B 命令狀態 cmdStatus

項目 內容
用途 (最後命令碼 << 8) | 狀態;狀態 0 完成、1 忙碌、2 失敗、3 拒絕(跟 SPIKE 命令回覆(模式 8 v3)同一套碼);E1~EB 都會回報;EB 以後沒定義的命令:I2C 直接不理、0B 不變(SPIKE 回 3 拒絕)
範圍 0~0xEF03
I2C/mBlock 編號 0B

怎麼讀

EV3

EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。

Arduino I2C

讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。

int16_t cmdStatus = mbcRead(0x6A, 0x0B);   // 命令狀態:0~0xEF03
MATRIX

MATRIX 原廠 0x22 積木沒有這個值。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.readValue(位址, 編號) 讀(讀不到 = −32768)。

let cmdStatus = mbc.readValue(0x6A, 0x0B)   // 命令狀態:0~0xEF03

寫入命令

只有 Arduino I2C、mBlock、micro:bit 能送命令;SPIKE/EV3 接頭是唯讀的。

E0 航向歸零 zeroHeading

項目 內容
作用 四個航向都歸零(zeroHeadings());EV3 另有原廠 WRITE 0x11 陀螺歸零
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE0);   // 航向歸零
mBlock

主機送 [E0] → 感應器回 [00][00][E0](收到了)再執行。

IMU 陀螺儀 連接埠 [1 v] 航向歸零 :: sensing
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit
陀螺儀 航向歸零 :: #00A4E4
mbc.imuZeroHeading()   // 航向歸零

E1 加速度計校準開始 accelCalStart

項目 內容
作用 開始加速度計校準(= v1 的 0x20=0x01);期間 F3 b4 = 1;磁力計校準中 → 忽略(0B 狀態 3 拒絕)
參數 無
忙碌旗標 F3 bit4(執行中 = 1)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE1);   // 加速度計校準開始
// 校準中 F3 bit4 = 1。照產品說明做完動作後送「加速度計校準結束」:mbcWrite(0x6A, 0xE2); bit4 才會變 0
mBlock

主機送 [E1] → 感應器回 [00][00][E1](收到了)再執行;執行期間 F3 bit4 = 1。

IMU 陀螺儀 連接埠 [1 v] 加速度計校準開始 :: sensing
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit
陀螺儀 校準 [加速度計 開始 v] :: #00A4E4
mbc.imuCalibrate(MbcImuCalib.AccelStart)   // 加速度計校準開始

E2 加速度計校準結束 accelCalEnd

項目 內容
作用 結束加速度計校準並存 EEPROM(= v1 的 0x20=0x02);通過後重新擷取安裝軸,擺正靜置後才航向歸零(不是馬上歸零);沒在校準中 → 拒絕(0B 狀態 3);驗證沒過 → 0B 狀態 2 失敗
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE2);   // 加速度計校準結束
mBlock

主機送 [E2] → 感應器回 [00][00][E2](收到了)再執行。

IMU 陀螺儀 連接埠 [1 v] 加速度計校準結束 :: sensing
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit
陀螺儀 校準 [加速度計 結束 v] :: #00A4E4
mbc.imuCalibrate(MbcImuCalib.AccelEnd)   // 加速度計校準結束

E3 磁力計校準開始 magCalStart

項目 內容
作用 開始磁力計校準(= v1 的 0x20=0x03);期間 F3 b5 = 1;磁力計故障時 → 忽略(0B 狀態 3)
參數 無
忙碌旗標 F3 bit5(執行中 = 1)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE3);   // 磁力計校準開始
// 校準中 F3 bit5 = 1。照產品說明做完動作後送「磁力計校準結束」:mbcWrite(0x6A, 0xE4); bit5 才會變 0
mBlock

主機送 [E3] → 感應器回 [00][00][E3](收到了)再執行;執行期間 F3 bit5 = 1。

IMU 陀螺儀 連接埠 [1 v] 磁力計校準開始 :: sensing
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit
陀螺儀 校準 [磁力計 開始 v] :: #00A4E4
mbc.imuCalibrate(MbcImuCalib.MagStart)   // 磁力計校準開始

E4 磁力計校準結束 magCalEnd

項目 內容
作用 結束磁力計校準並存 EEPROM(= v1 的 0x20=0x04);成功後馬上航向歸零;沒在校準中 → 拒絕(0B 狀態 3);驗證沒過 → 0B 狀態 2 失敗
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE4);   // 磁力計校準結束
mBlock

主機送 [E4] → 感應器回 [00][00][E4](收到了)再執行。

IMU 陀螺儀 連接埠 [1 v] 磁力計校準結束 :: sensing
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit
陀螺儀 校準 [磁力計 結束 v] :: #00A4E4
mbc.imuCalibrate(MbcImuCalib.MagEnd)   // 磁力計校準結束

E5 航向設成指定角度 setHeading

項目 內容
作用 [角度 int16 小端]:四個航向都設成這個角度(RAM);校準中不能做 → 拒絕(0B 狀態 3)
參數 角度 int16 °(2 byte)
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE5, 32);   // 航向設成指定角度(角度 int16 °)
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xE5, [參數])。

E6 以磁北為 0 zeroNorth

項目 內容
作用 陀螺航向設成目前的磁北方位 0~359,之後只扣整圈(顯示絕對方位);融合重新初始化約 3 秒內完成,逾時 = 失敗;校準中不能做 → 拒絕(0B 狀態 3)
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE6);   // 以磁北為 0
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xE6, [參數])。

E7 陀螺零點重估 gyroBiasReset

項目 內容
作用 靜止約 1.5 秒(連續 3 個靜止窗)重新估計陀螺零點;4 秒內被移動湊不滿 = 失敗;校準中不能做 → 拒絕(0B 狀態 3)
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE7);   // 陀螺零點重估
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xE7, [參數])。

E8 重抓安裝軸 recaptureAxis

項目 內容
作用 重新判定安裝方向(擷取後自動歸零);RAM;校準中不能做 → 拒絕(0B 狀態 3)
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE8);   // 重抓安裝軸
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xE8, [參數])。

E9 取消校準 cancelCalib

項目 內容
作用 取消進行中的加速度計/磁力計校準,不存檔、還原舊值
參數 無
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xE9);   // 取消校準
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xE9, [參數])。

EA 航向修正係數 headingCorrection

項目 內容
作用 [uint16 小端] 轉一圈的實際度數 × 10(0.1 度/圈),3500~3700;0 = 回 360.0。存 EEPROM 0x60(停 3 秒才寫,值沒變不寫),改完航向歸零;少參數或範圍外 → 0B 狀態 2(SPIKE 也回 2)
參數 0.1 度/圈 0, 3500~3700(2 byte)
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xEA, 32);   // 航向修正係數(0.1 度/圈 0, 3500~3700)
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xEA, [參數])。

EB 校準回出廠 calibFactoryReset

項目 內容
作用 [A5]:加速度計、磁力計校準與航向修正係數都回出廠值,馬上存 EEPROM;確認碼不對 → 0B 狀態 2;校準中 → 拒絕(3)
參數 確認碼 0xA5(1 byte)
忙碌旗標 無(立即生效)

怎麼送

EV3

EV3 接頭沒有寫入命令;校準用感應器上的按鈕,設定用 Arduino I2C/mBlock。

Arduino I2C
mbcWrite(0x6A, 0xEB, 0xA5);   // 校準回出廠(確認碼 0xA5)
MATRIX

MATRIX 原廠 0x22 積木沒有這個命令。

micro:bit

擴充沒有這顆積木;在 JavaScript 用 mbc.writeCmd(0x6A, 0xEB, [參數])。

狀態旗標 F3

F3 每個 bit 一個狀態;I2C、mBlock、micro:bit 直接讀。

bit 名稱 說明
b0 就緒 (ready) 恆 1
b1 靜止 (still) 1 = 感應器靜止中
b2 已擷取安裝軸 (axisCaptured) 1 = 已判定安裝方向(首次擷取後自動歸零一次)
b3 安裝過歪 (mountTilted) 1 = 安裝角度偏離太多
b4 加速度計校準中 (accelCalibrating) E1 之後、E2 之前 = 1
b5 磁力計校準中 (magCalibrating) E3 之後、E4 之前 = 1
b6 磁力融合已初始化 (fusionInit) 1 = 融合航向可用
b7 磁力自動校準已收斂 (magAutoCalDone) 1 = 磁力計自動校準偏移已收斂
EV3

EV3 沒有 F3 旗標;模式 5 回裝置 ID 與韌體版本(ID 格式 B)。

from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

id_word, fw = sensor.read(5)   # 模式 5:[ID | hw0<<8, 主版×100+次版]
addr = id_word & 0xFF             # 0x6A
hw0 = id_word >> 8                # 1
Arduino I2C
int16_t st = mbcRead(0x6A, 0xF3);
bool ready = st & (1 << 0);   // 就緒
bool still = st & (1 << 1);   // 靜止
bool axisCaptured = st & (1 << 2);   // 已擷取安裝軸
bool mountTilted = st & (1 << 3);   // 安裝過歪
bool accelCalibrating = st & (1 << 4);   // 加速度計校準中
bool magCalibrating = st & (1 << 5);   // 磁力計校準中
bool fusionInit = st & (1 << 6);   // 磁力融合已初始化
bool magAutoCalDone = st & (1 << 7);   // 磁力自動校準已收斂
mBlock

狀態旗標 F3 的各 bit 由擴展拆成布林積木(就緒、校準中…)。

MATRIX

MATRIX 原廠 0x22 積木讀不到狀態旗標。

micro:bit
<位址 (0x6A v) 的裝置就緒? :: #00A4E4>
let ready = mbc.deviceReady(0x6A)   // F3 bit0;沒接 = false
let st = mbc.status(0x6A)   // F3

共用暫存器與命令

所有產品相同,只在 通用 I2C 協議 寫一次:

編號 名稱 說明
F0 裝置 ID 低 byte = 出廠 I2C 位址(換位址後不變),高 byte = hw[0](通道數/顆數/類別)
F1 協議版本 本版 = 2(SPIKE 模式 8 v[1]、EV3 ID 封包同一個數字)
F2 韌體版本 主版×100 + 次版(例 102 = 1.2)
F3 狀態旗標 b0 就緒,其餘各產品定義(見各產品 flags)
F4 更新序號 每 10 ms 快照 +1,0~255 循環(2.56 秒一圈,不能拿來偵測重開機;不動 = 模組忙)
F5 開機秒數 開機後秒數,到 32767 停住(約 9 小時);數字變小 = 重開機過
F8 換 I2C 位址 [F8][新位址 0x08~0x77][新位址取反],存 EEPROM,重開機後生效;[F8][0x00][0xFF] = 回出廠位址(共識 B-5)
EF 重新開機 [EF][0xA5];mBlock 先回 ACK 再重開

本頁依據與假設

本頁由 _build/gen-reference.mjs 從 _build/protocol/imu.json(單一真相來源,轉錄自 2026-10-21 協定定案)產生。

  • hw0 = 1(共識 #6);EV3 模式 4 = [0x6A | 1<<8, 韌體主×100+次, 0, 0](格式 B 再補 2 個 0),模式 5 改送俯仰角速度(取代 #65 放的 ID)。
  • EV3 鎖住模式 0/1/3 照盤點程式碼:0 = 陀螺 3D、1 = 融合航向、3 = [陀螺 1D, 磁力航向](INO:213 註解寫反,以程式為準)。
  • 0x22 照 R4 版(出貨版)鎖住:命令 49 = 三個航向 +32768 的「低 byte 在前、高 byte 在後」;盤點檔分析的是主韌體(高在前),主韌體 #67 改成跟 R4 版逐 byte 相同。命令 1012 = 0;0x01、0x0A、0x0F、F1~F4 都觸發航向歸零(刻意,不動)。
  • B-13:E1~E4 加速度計/磁力計校準開始/結束補回(v1 的 0x20 = 01/02/03/04),I2C 定案 §3 只列 E0。busyFlag:E1 → b4、E3 → b5。
  • 俯仰角範圍定案沒寫(韌體尚無現成值,#67 用 atan2 新算),range 先填「°」不給 min/max,韌體做好後再補。
  • 磁力信任度 08 = round(trust×255),磁場干擾度 09 = round(disturbance×100) 上限 255,朝上的面 0A = 軸號 + 3×負向:公式照盤點 I2C v1 0x34~0x36。
  • 角速度 1012 = round(dps×SIGN×10)、加速度 1315 = mm/s²×1000/9806.65、磁力 1618 = raw×SIGN×4/15:公式照盤點 I2C v1 0x220x24;mBlock 一併有(I2C 定案 §4 共用值表)。
  • 主對話 2026-10-22:06 俯仰角範圍 −90~+90、07 = gyro X(照字面),取自 F5 韌體實作。
LINE 詢價選購指南