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 dpsmBlock
積木傳回 轉向軸角速度(-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 dpsmBlock
積木傳回 俯仰角速度(-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 dps08 磁力信任度 magTrust
| 項目 | 內容 |
|---|---|
| 用途 | 融合演算法對磁力計的信任度 0 |
| 範圍 | 0~255 |
| I2C/mBlock 編號 | 08 |
怎麼讀
EV3
EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。
Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t magTrust = mbcRead(0x6A, 0x08); // 磁力信任度:0~255mBlock
積木傳回 磁力信任度(0~255)。主機送 [08] → 回 [值低][值高][08 ^ 值低 ^ 值高],值 = int16 小端。
(IMU 陀螺儀 連接埠 [1 v] 磁力信任度 :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(陀螺儀 磁力信任度 :: #00A4E4)
let magTrust = mbc.imuMagTrust() // 磁力信任度:0~25509 磁場干擾度 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~5mBlock
積木傳回 朝上的面(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
| 項目 | 內容 |
|---|---|
| 用途 | 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 dps13~15 加速度 1~3 軸 accel
| 項目 | 內容 |
|---|---|
| 用途 | 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 mg16~18 磁力 1~3 軸 mag
| 項目 | 內容 |
|---|---|
| 用途 | 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 mG0B 命令狀態 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~0xEF03MATRIX
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 才會變 0mBlock
主機送 [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 才會變 0mBlock
主機送 [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); // 以磁北為 0MATRIX
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 # 1Arduino 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 版(出貨版)鎖住:命令 4
9 = 三個航向 +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。
- 角速度 10
12 = 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 韌體實作。