神攝手 WRO 版(HUE12) 指令參考
這一頁列出神攝手 WRO 版(HUE12)送給每個上位機的每一個值、每一個命令:它是什麼意思、範圍多少、在 SPIKE/EV3/Arduino I2C/mBlock/MATRIX/micro:bit 各要怎麼讀。網址加 ?host=spike(或 ev3、arduino、mblock、matrix、microbit)會直接展開那個平台。
SPIKEEV3Arduino I2CmBlockMATRIXmicro:bit
| 項目 | 內容 |
|---|---|
| I2C 出廠位址 | 0x4C |
| hw[0] | 2(F0 高 byte、SPIKE 模式 8/EV3 模式 5 ID 高 byte) |
| 型號 | HUE12 |
| 協議版本 | 2 |
| 支援平台 | SPIKE、EV3、Arduino I2C、mBlock、micro:bit |
值一覽
| 編號 | 值 | 範圍 | SPIKE | EV3 | Arduino I2C | mBlock | micro:bit |
|---|---|---|---|---|---|---|---|
10~1B |
色點 1~12 顏色碼 | 0~255 | ✓ | ✓ | ✓ | ✓ | ✓ |
20~2B |
色點 1~12 鮮豔度 | 0~255 | ✓ | ✓ | ✓ | ✓ | ✓ |
✓ = 這個平台有這個值;— = 沒有(表格裡的平台欄位只列產品支援的平台)。
每個值怎麼讀
10~1B 色點 1~12 顏色碼 spotColor
| 項目 | 內容 |
|---|---|
| 用途 | 10 |
| 範圍 | 0~255 |
| I2C/mBlock 編號 | 10~1B |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 0 🔒。備註:同 EV3:Pybricks read(0) 得 8 個 int32,每個拆 3 byte(積木網站 MBC_HUE12 設定檔);玩具版不送;鎖住
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
spotColor = dev.read(0)[0] # 色點 1~12 顏色碼MBC 函式庫
from pybricks.parameters import Port
from MBC_hue12_Lib import HUE12Sensor
cam = HUE12Sensor(Port.A)
cam.update() # 每圈先更新一次
spotColor = cam.get_slot(1)[1] # list,第 1 路 = [0]EV3
模式 0 · int32×8 · HUE12 8×int32 LE(32 B):24 byte = [色相, 鮮豔度]×12,每 3 byte 塞一個 int32(byte3 = 0);格 n 色相 = byte 2(n−1) → int32 k = idx/3、byte = idx%3;鎖住(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
spotColor = sensor.read(0)[0:12] # 色點 1~12 顏色碼' clev3r (BASIC)
Sensor.SetMode(1, 0)
spotColor1 = Sensor.ReadRawValue(1, 0) ' 第 1 筆;第 N 筆改成 0 + N - 1Arduino I2C
編號 0x10~0x1B 連號,一次 mbcReadMany 讀完保證同一瞬間。
int16_t spotColor[12];
mbcReadMany(0x4C, 0x10, 12, spotColor); // 色點 1~12 顏色碼:0~255
for (uint8_t i = 0; i < 12; i++) { Serial.print(spotColor[i]); Serial.print(' '); }
Serial.println();mBlock
積木傳回 色點 112 顏色碼(0255)。主機送 [10] → 回 [值低][值高][10 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x10 + (N − 1)。
(神攝手舊版 WRO 連接埠 [1 v] 色點 [1 v] 顏色碼 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色點 (1) 顏色碼 :: #00A4E4)
let spotColor = mbc.camSpotColor(1) // 色點 1~12 顏色碼:0~255(N = 1~12)相關積木「神攝手 色點 [1~12] 是 [彩色]?」
let camSpotIs = mbc.camSpotIs(1, MbcCamSpotKind.Colour)20~2B 色點 1~12 鮮豔度 spotVivid
| 項目 | 內容 |
|---|---|
| 用途 | 20 |
| 範圍 | 0~255 |
| I2C/mBlock 編號 | 20~2B |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 1 🔒。備註:同 EV3;鎖住
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
spotVivid = dev.read(0)[1] # 色點 1~12 鮮豔度MBC 函式庫
from pybricks.parameters import Port
from MBC_hue12_Lib import HUE12Sensor
cam = HUE12Sensor(Port.A)
cam.update() # 每圈先更新一次
spotVivid = cam.get_slot(1)[2] # list,第 1 路 = [0]EV3
模式 0 · int32×8 · 同 10~1B:格 n 鮮豔度 = byte 2(n−1)+1;鎖住(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
spotVivid = sensor.read(0)[0:12] # 色點 1~12 鮮豔度' clev3r (BASIC)
Sensor.SetMode(1, 0)
spotVivid1 = Sensor.ReadRawValue(1, 0) ' 第 1 筆;第 N 筆改成 0 + N - 1Arduino I2C
編號 0x20~0x2B 連號,一次 mbcReadMany 讀完保證同一瞬間。
int16_t spotVivid[12];
mbcReadMany(0x4C, 0x20, 12, spotVivid); // 色點 1~12 鮮豔度:0~255
for (uint8_t i = 0; i < 12; i++) { Serial.print(spotVivid[i]); Serial.print(' '); }
Serial.println();mBlock
積木傳回 色點 112 鮮豔度(0255)。主機送 [20] → 回 [值低][值高][20 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x20 + (N − 1)。
(神攝手舊版 WRO 連接埠 [1 v] 色點 [1 v] 鮮豔度 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色點 (1) 鮮豔度 :: #00A4E4)
let spotVivid = mbc.camSpotVivid(1) // 色點 1~12 鮮豔度:0~255(N = 1~12)狀態旗標 F3
F3 每個 bit 一個狀態;I2C、mBlock、micro:bit 直接讀。
| bit | 名稱 | 說明 |
|---|---|---|
| b0 | 就緒 (ready) |
恆 1;b1 = 0(WRO 版沒有「有找到色塊」) |
SPIKE
SPIKE 沒有 F3 旗標;模式 8 回裝置 ID/版本。官方 App 讀不到模式 8。
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
id_word, proto, fw, seq = dev.read(8) # 模式 8:[ID | hw0<<8, 協議版 2, 主版×100+次版, 更新序號]
addr = id_word & 0xFF # 0x4C
hw0 = id_word >> 8 # 2EV3
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 # 0x4C
hw0 = id_word >> 8 # 2Arduino I2C
int16_t st = mbcRead(0x4C, 0xF3);
bool ready = st & (1 << 0); // 就緒mBlock
狀態旗標 F3 的各 bit 由擴展拆成布林積木(就緒、校準中…)。
<神攝手舊版 WRO 連接埠 [1 v] 連線正常? :: sensing>
micro:bit
<位址 (0x4C v) 的裝置就緒? :: #00A4E4>
let ready = mbc.deviceReady(0x4C) // F3 bit0;沒接 = false
let st = mbc.status(0x4C) // 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/cam_wro.json(單一真相來源,轉錄自 2026-10-21 協定定案)產生。
- hw0 = 2(共識 #6:神攝手 2 = WRO 版);model = HUE12(樂高模式名)。
- I2C 0x4C 與學校版同一位址(主機用 F0 高 byte 1/2 分辨);D4:SDA = IO3、SCL = IO1,與 EV3/SPIKE 串口模式二選一編譯;ESP32 從機 onReceive 預載 32 B;上機待測。mBlock 用 Serial.begin(38400, SERIAL_8N1, 3, 1)。
- 值表只有 10
1B、202B(mBlock 定案);兩群各 12 個,I2C 一次連續讀 12 個值(24 B)剛好一群。 - EV3/SPIKE 只有一個模式 HUE12(type 95,動態描述表 DATA32×8),鎖住照盤點 §0-2 排法;沒有 ID 模式(type 95 只宣告 1 個模式,不加)。
- mVision 鎖住照盤點 §4:[0xAA][9][18 B][xor],byte 0
11 顏色碼、1217 鮮豔度 4 bit;WRO 隊伍的 HUE12_AS_mVisionSensor_v1.0.8.mbr4 在用,不動;B-6:不節流(每圈 loop 送)。 - mVision 的鮮豔度是 S>>4(0
15),值表 202B 是完整 0~255;兩者不同是既有設計,不改。 - 顏色碼 255 只代表「色點沒開」,不代表「沒找到」(沒抓到時仍回種子點顏色,盤點 §0-1)。
- 不做 0x22(hosts.matrix = false);沒有寫入命令;F3 只有 b0。