神攝手 學校版 指令參考
這一頁列出神攝手 學校版送給每個上位機的每一個值、每一個命令:它是什麼意思、範圍多少、在 SPIKE/EV3/Arduino I2C/mBlock/MATRIX/micro:bit 各要怎麼讀。網址加 ?host=spike(或 ev3、arduino、mblock、matrix、microbit)會直接展開那個平台。
SPIKEEV3Arduino I2CmBlockMATRIXmicro:bit
| 項目 | 內容 |
|---|---|
| I2C 出廠位址 | 0x4C |
| hw[0] | 1(F0 高 byte、SPIKE 模式 8/EV3 模式 5 ID 高 byte) |
| 型號 | CAMSCH |
| 協議版本 | 2 |
| 支援平台 | SPIKE、EV3、Arduino I2C、mBlock、micro:bit |
值一覽
| 編號 | 值 | 範圍 | SPIKE | EV3 | Arduino I2C | mBlock | micro:bit |
|---|---|---|---|---|---|---|---|
01 |
色相 | -1~100 | ✓ | ✓ | ✓ | ✓ | ✓ |
02 |
飽和度 | 0~100 | ✓ | ✓ | ✓ | ✓ | ✓ |
03 |
明度 | 0~100 | ✓ | ✓ | ✓ | ✓ | ✓ |
04 |
動態 | 0~100 | ✓ | ✓ | ✓ | ✓ | ✓ |
05 |
色塊 X | 0~100 | ✓ | ✓ | ✓ | ✓ | ✓ |
06 |
色塊 Y | 0~75 | ✓ | ✓ | ✓ | ✓ | ✓ |
07 |
色塊寬 | 0~100 | ✓ | ✓ | ✓ | ✓ | ✓ |
08 |
色塊高 | 0~75 | ✓ | ✓ | ✓ | ✓ | ✓ |
09 |
色塊面積 | 0~7500 | ✓ | — | ✓ | ✓ | ✓ |
0A |
有找到色塊 | 0~1 | — | — | ✓ | ✓ | ✓ |
✓ = 這個平台有這個值;— = 沒有(表格裡的平台欄位只列產品支援的平台)。
每個值怎麼讀
01 色相 hue
| 項目 | 內容 |
|---|---|
| 用途 | S1 取樣點色相 0 |
| 範圍 | -1~100 |
| I2C/mBlock 編號 | 01 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 0 🔒;模式 0 (toy) byte 1 🔒;模式 5 v[0] 🔒;模式 9 v[0] lo 🔒。備註:−1 = 0xFF; 0~10(÷10); raw = (色相×256 ± 128)/25 ≈ 色相×10.24,v[0]=v[1]=v[2];Pybricks reflection() ÷10.24 還原
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[0]
hue = (w & 0xFF) # 色相(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
hue = cam.hue()EV3
模式 0 · int8 · IR-PROX 1×int8;模式 1 · int8 · IR-SEEK [色相, 飽和, 明度, 動態, X, Y, W, H];模式 2 · int8 · IR-REMOTE [色相, 飽和, 明度, 動態];模式 3 · int16 · IR-REM-A 1×int16(#65 已修成正確符號延伸,−1 = 0xFFFF);模式 5 · int16 · IR-CAL [色相, 飽和] 2×int16(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
hue = sensor.read(0)[0] # 色相:-1~100
hue = sensor.read(1)[0] # 色相:-1~100
hue = sensor.read(2)[0] # 色相:-1~100
hue = sensor.read(3)[0] # 色相:-1~100
hue = sensor.read(5)[0] # 色相:-1~100' clev3r (BASIC)
Sensor.SetMode(1, 0)
hue = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 1)
hue = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 2)
hue = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 3)
hue = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 5)
hue = Sensor.ReadRawValue(1, 0)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t hue = mbcRead(0x4C, 0x01); // 色相:-1~100mBlock
積木傳回 色相(-1~100)。主機送 [01] → 回 [值低][值高][01 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 色相 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 顏色 [色相 v] :: #00A4E4)
let hue = mbc.camColor(MbcCamColor.Hue) // 色相:-1~100相關積木「神攝手 顏色是黑白灰?」
let camIsGrey = mbc.camIsGrey()02 飽和度 saturation
| 項目 | 內容 |
|---|---|
| 用途 | S1 取樣點飽和度 0~100 |
| 範圍 | 0~100 |
| I2C/mBlock 編號 | 02 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[0] hi 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[0]
saturation = ((w >> 8) & 0xFF) # 飽和度(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
saturation = cam.saturation()EV3
模式 1 · int8;模式 2 · int8;模式 5 · int16(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
saturation = sensor.read(1)[1] # 飽和度:0~100
saturation = sensor.read(2)[1] # 飽和度:0~100
saturation = sensor.read(5)[1] # 飽和度:0~100' clev3r (BASIC)
Sensor.SetMode(1, 1)
saturation = Sensor.ReadRawValue(1, 1)
Sensor.SetMode(1, 2)
saturation = Sensor.ReadRawValue(1, 1)
Sensor.SetMode(1, 5)
saturation = Sensor.ReadRawValue(1, 1)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t saturation = mbcRead(0x4C, 0x02); // 飽和度:0~100mBlock
積木傳回 飽和度(0~100)。主機送 [02] → 回 [值低][值高][02 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 飽和度 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 顏色 [飽和度 v] :: #00A4E4)
let saturation = mbc.camColor(MbcCamColor.Saturation) // 飽和度:0~10003 明度 value
| 項目 | 內容 |
|---|---|
| 用途 | S1 取樣點明度 0~100 |
| 範圍 | 0~100 |
| I2C/mBlock 編號 | 03 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[1] lo 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[1]
value = (w & 0xFF) # 明度(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
value = cam.brightness()EV3
模式 1 · int8;模式 2 · int8(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
value = sensor.read(1)[2] # 明度:0~100
value = sensor.read(2)[2] # 明度:0~100' clev3r (BASIC)
Sensor.SetMode(1, 1)
value = Sensor.ReadRawValue(1, 2)
Sensor.SetMode(1, 2)
value = Sensor.ReadRawValue(1, 2)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t value = mbcRead(0x4C, 0x03); // 明度:0~100mBlock
積木傳回 明度(0~100)。主機送 [03] → 回 [值低][值高][03 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 明度 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 顏色 [明度 v] :: #00A4E4)
let value = mbc.camColor(MbcCamColor.Brightness) // 明度:0~10004 動態 motion
| 項目 | 內容 |
|---|---|
| 用途 | 全畫面動態量 0~100(畫面變化越多越大) |
| 範圍 | 0~100 |
| I2C/mBlock 編號 | 04 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 1 🔒;模式 0 (toy) byte 0 🔒;模式 9 v[1] hi 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[1]
motion = ((w >> 8) & 0xFF) # 動態(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
motion = cam.motion()EV3
模式 1 · int8;模式 2 · int8(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
motion = sensor.read(1)[3] # 動態:0~100
motion = sensor.read(2)[3] # 動態:0~100' clev3r (BASIC)
Sensor.SetMode(1, 1)
motion = Sensor.ReadRawValue(1, 3)
Sensor.SetMode(1, 2)
motion = Sensor.ReadRawValue(1, 3)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t motion = mbcRead(0x4C, 0x04); // 動態:0~100mBlock
積木傳回 動態(0~100)。主機送 [04] → 回 [值低][值高][04 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 動態 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 動態 :: #00A4E4)
let motion = mbc.camMotion() // 動態:0~10005 色塊 X blobX
| 項目 | 內容 |
|---|---|
| 用途 | 色塊中心 X 0~100,左 = 0;沒找到 = 0 |
| 範圍 | 0~100 |
| I2C/mBlock 編號 | 05 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 2 🔒;模式 0 (toy) byte 2 🔒;模式 6 v[0];模式 7 v[2] 🔒;模式 9 v[2] lo 🔒。備註:byte 3 = 0; ×4 查表編碼(10-bit); #67 改:模式 6 = [X, Y, 面積](3×int16); X×100+Y → Pybricks ambient() 顯示 X.Y。Pybricks 4.1 起 ambient() 只剩 1 位小數,這個值的個位數讀不到:請改裝 MBC 函式庫(讀模式 9)
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[2]
blobX = (w & 0xFF) # 色塊 X(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobX = cam.blob_x()EV3
模式 1 · int8;模式 4 · int8 · IR-S-ALT [X, Y, W, H](已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
blobX = sensor.read(1)[4] # 色塊 X:0~100
blobX = sensor.read(4)[0] # 色塊 X:0~100' clev3r (BASIC)
Sensor.SetMode(1, 1)
blobX = Sensor.ReadRawValue(1, 4)
Sensor.SetMode(1, 4)
blobX = Sensor.ReadRawValue(1, 0)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t blobX = mbcRead(0x4C, 0x05); // 色塊 X:0~100mBlock
積木傳回 色塊 X(0~100)。主機送 [05] → 回 [值低][值高][05 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 色塊 X :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色塊 [X v] :: #00A4E4)
let blobX = mbc.camBlob(MbcCamBlob.X) // 色塊 X:0~10006 色塊 Y blobY
| 項目 | 內容 |
|---|---|
| 用途 | 色塊中心 Y 0~75,下 = 0、上 = 75;沒找到 = 0 |
| 範圍 | 0~75 |
| I2C/mBlock 編號 | 06 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 4 🔒;模式 0 (toy) byte 4 🔒;模式 6 v[1];模式 7 v[2] 🔒;模式 9 v[2] hi 🔒。備註:byte 5 = 0; ×4 查表編碼; X×100+Y 的個位/十位。Pybricks 4.1 起 ambient() 只剩 1 位小數,這個值的個位數讀不到:請改裝 MBC 函式庫(讀模式 9)
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[2]
blobY = ((w >> 8) & 0xFF) # 色塊 Y(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobY = cam.blob_y()EV3
模式 1 · int8;模式 4 · int8(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
blobY = sensor.read(1)[5] # 色塊 Y:0~75
blobY = sensor.read(4)[1] # 色塊 Y:0~75' clev3r (BASIC)
Sensor.SetMode(1, 1)
blobY = Sensor.ReadRawValue(1, 5)
Sensor.SetMode(1, 4)
blobY = Sensor.ReadRawValue(1, 1)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t blobY = mbcRead(0x4C, 0x06); // 色塊 Y:0~75mBlock
積木傳回 色塊 Y(0~75)。主機送 [06] → 回 [值低][值高][06 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 色塊 Y :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色塊 [Y v] :: #00A4E4)
let blobY = mbc.camBlob(MbcCamBlob.Y) // 色塊 Y:0~7507 色塊寬 blobW
| 項目 | 內容 |
|---|---|
| 用途 | 色塊寬 W 0~100;0 = 沒找到 |
| 範圍 | 0~100 |
| I2C/mBlock 編號 | 07 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[3] lo 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[3]
blobW = (w & 0xFF) # 色塊寬(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobW = cam.blob_w()EV3
模式 1 · int8;模式 4 · int8(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
blobW = sensor.read(1)[6] # 色塊寬:0~100
blobW = sensor.read(4)[2] # 色塊寬:0~100' clev3r (BASIC)
Sensor.SetMode(1, 1)
blobW = Sensor.ReadRawValue(1, 6)
Sensor.SetMode(1, 4)
blobW = Sensor.ReadRawValue(1, 2)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t blobW = mbcRead(0x4C, 0x07); // 色塊寬:0~100mBlock
積木傳回 色塊寬(0~100)。主機送 [07] → 回 [值低][值高][07 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 色塊寬 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色塊 [寬 v] :: #00A4E4)
let blobW = mbc.camBlob(MbcCamBlob.Width) // 色塊寬:0~10008 色塊高 blobH
| 項目 | 內容 |
|---|---|
| 用途 | 色塊高 H 0~75;沒找到 = 0 |
| 範圍 | 0~75 |
| I2C/mBlock 編號 | 08 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[3] hi 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[3]
blobH = ((w >> 8) & 0xFF) # 色塊高(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobH = cam.blob_h()EV3
模式 1 · int8;模式 4 · int8(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
blobH = sensor.read(1)[7] # 色塊高:0~75
blobH = sensor.read(4)[3] # 色塊高:0~75' clev3r (BASIC)
Sensor.SetMode(1, 1)
blobH = Sensor.ReadRawValue(1, 7)
Sensor.SetMode(1, 4)
blobH = Sensor.ReadRawValue(1, 3)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t blobH = mbcRead(0x4C, 0x08); // 色塊高:0~75mBlock
積木傳回 色塊高(0~75)。主機送 [08] → 回 [值低][值高][08 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 色塊高 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色塊 [高 v] :: #00A4E4)
let blobH = mbc.camBlob(MbcCamBlob.Height) // 色塊高:0~7509 色塊面積 blobArea
| 項目 | 內容 |
|---|---|
| 用途 | W×H(0~7500);沒找到 = 0 |
| 範圍 | 0~7500 |
| I2C/mBlock 編號 | 09 |
怎麼讀
SPIKE
模式 0 (edu) byte 6 🔒;模式 0 (toy) byte 6 🔒;模式 6 v[2];模式 9 v[4] 🔒。備註:鎖住:這裡是 map(像素面積, 05000, 0100),不是 W×H;byte 7 = 0; 同上 0100 再 ×4 查表編碼; W×H; #67 新增:byte 89 = W×H(原本 0);其餘 byte 不動
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
blobArea = dev.read(9)[4] # 色塊面積MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobArea = cam.area()EV3
EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。
Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t blobArea = mbcRead(0x4C, 0x09); // 色塊面積:0~7500mBlock
積木傳回 色塊面積(0~7500)。主機送 [09] → 回 [值低][值高][09 ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 色塊面積 :: sensing)
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(神攝手 色塊 [面積 v] :: #00A4E4)
let blobArea = mbc.camBlob(MbcCamBlob.Area) // 色塊面積:0~75000A 有找到色塊 found
| 項目 | 內容 |
|---|---|
| 用途 | 1 = 畫面裡有目標色的色塊(W > 0),0 = 沒有 |
| 範圍 | 0~1 |
| I2C/mBlock 編號 | 0A |
怎麼讀
SPIKE
SPIKE 模式沒有送這個值(已鎖住的模式不再改)。需要時改用 Arduino I2C/mBlock。
EV3
EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。
Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t found = mbcRead(0x4C, 0x0A); // 有找到色塊:0~1mBlock
積木傳回 有找到色塊(0~1)。主機送 [0A] → 回 [值低][值高][0A ^ 值低 ^ 值高],值 = int16 小端。
(神攝手舊版 連接埠 [1 v] 有找到色塊? :: sensing)
micro:bit
感應器沒接好(讀不到)時回「否」。
<神攝手 有找到色塊? :: #00A4E4>
let found = mbc.camFound() // 有找到色塊:0~1相關積木「當神攝手 色塊 [找到]」
mbc.onCamBlob(MbcCamEvent.Found, function () {
})狀態旗標 F3
F3 每個 bit 一個狀態;I2C、mBlock、micro:bit 直接讀。
| bit | 名稱 | 說明 |
|---|---|---|
| b0 | 就緒 (ready) |
恆 1(相機進選單時值不更新,但仍 1) |
| b1 | 有找到色塊 (found) |
= 值 0A |
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 # 1EV3
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 # 1Arduino I2C
int16_t st = mbcRead(0x4C, 0xF3);
bool ready = st & (1 << 0); // 就緒
bool found = st & (1 << 1); // 有找到色塊mBlock
狀態旗標 F3 的各 bit 由擴展拆成布林積木(就緒、校準中…)。
<神攝手舊版 連接埠 [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_school.json(單一真相來源,轉錄自 2026-10-21 協定定案)產生。
- hw0 = 1(共識 #6:神攝手 1 = 學校版);model 字串 CAMSCH 照任務指定(韌體原本沒有型號欄位)。
- D4:I2C 0x4C 用 SDA = IO3、SCL = IO1(沿 PS4 Wire.setPins 慣例),與 EV3/SPIKE 串口模式二選一編譯;ESP32 從機不能時脈延展,onReceive 預載 32 B;頁面標「硬體已確認,上機待測」。mBlock 用同一組腳 Serial.begin(38400, SERIAL_8N1, 3, 1)。
- EV3 六個模式全部鎖住照盤點(模式 3/5 的 −1 已在 #65 修成符號延伸);EV3 定案最後的 golden 備註把 cam_school 列進「模式 5 改 ID」是筆誤(定案表本身寫「—」;模式 5 仍是 [色相, 飽和]),所以 ev3IdMode = null。
- SPIKE 模式 9 鎖住,只有 byte 8
9(v[4])從 0 改成面積 W×H;模式 6 改 [X, Y, 面積];模式 8 = [0x4C | 1<<8, 2, 韌體版, 更新序號];模式 14 維持 0。 - SPIKE 模式 0 的「面積」是 map(像素面積 0
5000 → 0100),跟值表 09 的 W×H 不同,鎖住不改(照盤點)。 - mVision:N = 10(idx 0~9),色相 −1 送 255;每 20 ms 一包(B-6);不做 0x22(hosts.matrix = false)。
- 0A 有找到色塊 = W > 0(盤點:W 0 = 沒找到);F3 b1 同這個值。
- 值 05~08 的「沒找到 = 0」照盤點 §0;色塊 Y 下 = 0、上 = 75 照盤點(map(bestY,120,0,0,75))。
- 沒有寫入命令(韌體無法從程式改目標顏色/補光燈)。