測距者 8 路 指令參考
這一頁列出測距者 8 路送給每個上位機的每一個值、每一個命令:它是什麼意思、範圍多少、在 SPIKE/EV3/Arduino I2C/mBlock/MATRIX/micro:bit 各要怎麼讀。網址加 ?host=spike(或 ev3、arduino、mblock、matrix、microbit)會直接展開那個平台。
SPIKEEV3Arduino I2CmBlockMATRIXmicro:bit
| 項目 | 內容 |
|---|---|
| I2C 出廠位址 | 0x29 |
| hw[0] | 8(F0 高 byte、SPIKE 模式 8/EV3 模式 5 ID 高 byte) |
| 型號 | LASER8 |
| 協議版本 | 2 |
| 支援平台 | SPIKE、EV3、Arduino I2C、mBlock、MATRIX、micro:bit |
值一覽
| 編號 | 值 | 範圍 | SPIKE | EV3 | Arduino I2C | mBlock | MATRIX | micro:bit |
|---|---|---|---|---|---|---|---|---|
01 |
最近距離 cm | 0~120 cm | ✓ | ✓ | ✓ | ✓ | — | ✓ |
02 |
最近方向 | -8~+8 | ✓ | ✓ | ✓ | ✓ | — | ✓ |
03 |
最空曠距離 cm | 0~120 cm | ✓ | ✓ | ✓ | ✓ | — | ✓ |
04 |
最空曠方向 | -7~+7 | ✓ | ✓ | ✓ | ✓ | — | ✓ |
05 |
正前方 cm | 0~120 cm | — | ✓ | ✓ | ✓ | — | ✓ |
06 |
最近距離 mm | 0~1200 mm | ✓ | ✓ | ✓ | ✓ | — | ✓ |
07 |
初始化位元圖 | 0~255 bit | ✓ | — | ✓ | ✓ | — | ✓ |
08 |
故障位元圖 | 0~255 bit | ✓ | — | ✓ | ✓ | — | ✓ |
09 |
正前方距離 mm | 0~1200 mm | ✓ | ✓ | ✓ | ✓ | — | ✓ |
10~17 |
第 1~8 顆距離 cm | 0~120 cm | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
18~1F |
第 1~8 顆距離 mm | 0~1200 mm | — | — | ✓ | ✓ | — | ✓ |
✓ = 這個平台有這個值;— = 沒有(表格裡的平台欄位只列產品支援的平台)。
每個值怎麼讀
01 最近距離 cm nearCm
| 項目 | 內容 |
|---|---|
| 用途 | 8 顆裡最小的距離 0~120 cm(失效那顆以 120 參與),120 = 四周沒東西 |
| 範圍 | 0~120 cm |
| I2C/mBlock 編號 | 01 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 2 byte 0;模式 3 byte 1;模式 4 v[0] hi;模式 7 v[2] 🔒;模式 9 v[4] hi 🔒。備註:[最近方向, 最近距離, 第 1 顆](第 4 byte 第 8 顆被描述表砍掉); Pybricks ambient() = int16[2]/100 = 最近 cm(INO:348-361)
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[4]
nearCm = ((w >> 8) & 0xFF) # 最近距離 cm(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
nearCm = laser.min_distance()EV3
模式 2 · int8 · IR-REMOTE [最近方向−8, 最近', 最空曠方向−8, 最空曠'](INO:154-159)(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
nearCm = sensor.read(2)[1] # 最近距離 cm:cm×100/120(0~100)' clev3r (BASIC)
Sensor.SetMode(1, 2)
nearCm = Sensor.ReadRawValue(1, 1)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t nearCm = mbcRead(0x29, 0x01); // 最近距離 cm:0~120 cmmBlock
積木傳回 最近距離 cm(0~120 cm)。主機送 [01] → 回 [值低][值高][01 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 最近距離 cm :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 最近距離([公分 v]) :: #00A4E4)
let nearCm = mbc.tof8Nearest(MbcDistUnit.Cm) // 最近距離 cm:0~120 cm相關積木「當測距者 8 路 距離小於 10 公分」
mbc.onTof8Near(10, function () {
})02 最近方向 nearDir
| 項目 | 內容 |
|---|---|
| 用途 | 最近目標在哪個方向:−7(正左)~ +7(正右),0 = 正前方,負 = 左;±8 = 四周沒東西(沿用上次偏向側) |
| 範圍 | -8~+8 |
| I2C/mBlock 編號 | 02 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 1 byte 0 −8;模式 3 byte 0 −8;模式 4 v[0] lo −8;模式 5 v[0] 🔒;模式 6 v[2];模式 9 v[4] lo −8 🔒。備註:原始方位 016(8 = 正前); Pybricks reflection() 編碼:x = 方位−8,負數 +6399,a = x/25、b = 10×(x mod 25)+9,3 個 int16 = a×256+b → reflection() 向零截斷 = −8+8(INO:319-336); #67 新:HSV 3×int16 = [最近 mm, 正前方 mm, 最近方向 −8~+8]
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[4]
nearDir = (w & 0xFF) - 8 # 最近方向(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
nearDir = laser.min_direction()EV3
模式 2 · int8 · int8 二補數(方位−8);模式 5 · int16 · #67 新:IR-CAL 2×int16 = [最近 mm, 最近方向 −8~+8](原本 = 前 4 顆兩兩合併)(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
nearDir = sensor.read(2)[0] # 最近方向:-8~+8
nearDir = sensor.read(5)[1] # 最近方向:-8~+8' clev3r (BASIC)
Sensor.SetMode(1, 2)
nearDir = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 5)
nearDir = Sensor.ReadRawValue(1, 1)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t nearDir = mbcRead(0x29, 0x02); // 最近方向:-8~+8mBlock
積木傳回 最近方向(-8~+8)。主機送 [02] → 回 [值低][值高][02 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 最近方向 :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 最近方向 :: #00A4E4)
let nearDir = mbc.tof8NearestDirection() // 最近方向:-8~+803 最空曠距離 cm farCm
| 項目 | 內容 |
|---|---|
| 用途 | 8 顆裡最大的距離 0~120 cm(壞掉那顆永遠 120,會被當成最空曠) |
| 範圍 | 0~120 cm |
| I2C/mBlock 編號 | 03 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[5] hi 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[5]
farCm = ((w >> 8) & 0xFF) # 最空曠距離 cm(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
farCm = laser.max_distance()EV3
模式 2 · int8(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
farCm = sensor.read(2)[3] # 最空曠距離 cm:cm×100/120(0~100)' clev3r (BASIC)
Sensor.SetMode(1, 2)
farCm = Sensor.ReadRawValue(1, 3)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t farCm = mbcRead(0x29, 0x03); // 最空曠距離 cm:0~120 cmmBlock
積木傳回 最空曠距離 cm(0~120 cm)。主機送 [03] → 回 [值低][值高][03 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 最空曠距離 cm :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 最空曠距離(公分) :: #00A4E4)
let farCm = mbc.tof8OpenCm() // 最空曠距離 cm:0~120 cm04 最空曠方向 farDir
| 項目 | 內容 |
|---|---|
| 用途 | 最遠(最空曠)在哪個方向:−7 ~ +7,0 = 正前方,負 = 左;8 顆全 120 時 = 0 |
| 範圍 | -7~+7 |
| I2C/mBlock 編號 | 04 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[5] lo −8 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[5]
farDir = (w & 0xFF) - 8 # 最空曠方向(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
farDir = laser.max_direction()EV3
模式 2 · int8 · int8 二補數(方位−8)(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
farDir = sensor.read(2)[2] # 最空曠方向:-7~+7' clev3r (BASIC)
Sensor.SetMode(1, 2)
farDir = Sensor.ReadRawValue(1, 2)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t farDir = mbcRead(0x29, 0x04); // 最空曠方向:-7~+7mBlock
積木傳回 最空曠方向(-7~+7)。主機送 [04] → 回 [值低][值高][04 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 最空曠方向 :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 最空曠方向 :: #00A4E4)
let farDir = mbc.tof8OpenDirection() // 最空曠方向:-7~+705 正前方 cm frontCm
| 項目 | 內容 |
|---|---|
| 用途 | 第 4、5 顆(兩顆平行朝前)平均 0~120 cm;EV3 模式 3、SPIKE 模式 6 給的是同一個值的 mm;0x22 的 C 是 min(第 4, 第 5 顆) 不是平均(見 10) |
| 範圍 | 0~120 cm |
| I2C/mBlock 編號 | 05 |
怎麼讀
SPIKE
SPIKE 模式沒有送這個值(已鎖住的模式不再改)。需要時改用 Arduino I2C/mBlock。
EV3
模式 0 · int8 · IR-PROX = (第 4'+第 5')>>1(鎖住,INO:148-150)(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
frontCm = sensor.read(0)[0] # 正前方 cm:cm×100/120(0~100)' clev3r (BASIC)
Sensor.SetMode(1, 0)
frontCm = Sensor.ReadRawValue(1, 0)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t frontCm = mbcRead(0x29, 0x05); // 正前方 cm:0~120 cmmBlock
積木傳回 正前方 cm(0~120 cm)。主機送 [05] → 回 [值低][值高][05 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 正前方距離 cm :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 正前方距離([公分 v]) :: #00A4E4)
let frontCm = mbc.tof8Front(MbcDistUnit.Cm) // 正前方 cm:0~120 cm06 最近距離 mm nearMm
| 項目 | 內容 |
|---|---|
| 用途 | 8 顆 mm 的最小值 0~1200(失效那顆以 1200 參與),1200 = 四周沒東西 |
| 範圍 | 0~1200 mm |
| I2C/mBlock 編號 | 06 |
怎麼讀
SPIKE
模式 6 v[0]。備註:#67 新:[最近 mm, 正前方 mm, 方向]
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
nearMm = dev.read(6)[0] # 最近距離 mmMBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
nearMm = laser.nearest_mm()EV3
模式 5 · int16 · #67 新:[最近 mm, 最近方向]
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
nearMm = sensor.read(5)[0] # 最近距離 mm:0~1200 mm' clev3r (BASIC)
Sensor.SetMode(1, 5)
nearMm = Sensor.ReadRawValue(1, 0)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t nearMm = mbcRead(0x29, 0x06); // 最近距離 mm:0~1200 mmmBlock
積木傳回 最近距離 mm(0~1200 mm)。主機送 [06] → 回 [值低][值高][06 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 最近距離 mm :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 最近距離([公釐 v]) :: #00A4E4)
let nearMm = mbc.tof8Nearest(MbcDistUnit.Mm) // 最近距離 mm:0~1200 mm07 初始化位元圖 initOk
| 項目 | 內容 |
|---|---|
| 用途 | bit0 = 第 1 顆(最左)… bit7 = 第 8 顆,1 = 那顆開機初始化成功(8 顆約 2~4 秒,失敗不重試);255 = 全部好 |
| 範圍 | 0~255 bit |
| I2C/mBlock 編號 | 07 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[6] lo 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[6]
initOk = (w & 0xFF) # 初始化位元圖(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
initOk = laser.is_ok(1)EV3
EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。
Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t initOk = mbcRead(0x29, 0x07); // 初始化位元圖:0~255 bitmBlock
積木傳回 初始化位元圖(0~255 bit)。主機送 [07] → 回 [值低][值高][07 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 初始化位元圖 :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
擴充沒有這顆積木;在 JavaScript 用 mbc.readValue(位址, 編號) 讀(讀不到 = −32768)。相關積木:「測距者 8 路 第 1 顆正常?」。
let initOk = mbc.readValue(0x29, 0x07) // 初始化位元圖:0~255 bit08 故障位元圖 fault
| 項目 | 內容 |
|---|---|
| 用途 | bit0 = 第 1 顆 … bit7 = 第 8 顆,1 = 那顆目前失效(I2C 讀失敗或 200 ms 沒更新);失效那顆距離回 120/1200 |
| 範圍 | 0~255 bit |
| I2C/mBlock 編號 | 08 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 9 v[6] hi 🔒
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[6]
fault = ((w >> 8) & 0xFF) # 故障位元圖(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
fault = laser.is_ok(1)EV3
EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。
Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t fault = mbcRead(0x29, 0x08); // 故障位元圖:0~255 bitmBlock
積木傳回 故障位元圖(0~255 bit)。主機送 [08] → 回 [值低][值高][08 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 故障位元圖 :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
擴充沒有這顆積木;在 JavaScript 用 mbc.readValue(位址, 編號) 讀(讀不到 = −32768)。相關積木:「測距者 8 路 第 1 顆正常?」。
let fault = mbc.readValue(0x29, 0x08) // 故障位元圖:0~255 bit09 正前方距離 mm frontMm
| 項目 | 內容 |
|---|---|
| 用途 | 第 4、5 顆(正前方兩顆)平均,0~1200 mm;1200 = 前面沒東西。cm 版是 05 |
| 範圍 | 0~1200 mm |
| I2C/mBlock 編號 | 09 |
怎麼讀
SPIKE
模式 6 v[1]。備註:#67 新:正前方 mm
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
frontMm = dev.read(6)[1] # 正前方距離 mmMBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
frontMm = laser.front_mm()EV3
模式 3 · int16 · #67 新:IR-REM-A 1×int16 = 正前方(第 4、5 顆平均)mm(原本 = 第 1 顆 0~100)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
frontMm = sensor.read(3)[0] # 正前方距離 mm:mm(0~1200)' clev3r (BASIC)
Sensor.SetMode(1, 3)
frontMm = Sensor.ReadRawValue(1, 0)Arduino I2C
讀不到(沒接、位址錯)時回 MBC_NONE(−32768)。
int16_t frontMm = mbcRead(0x29, 0x09); // 正前方距離 mm:0~1200 mmmBlock
積木傳回 正前方距離 mm(0~1200 mm)。主機送 [09] → 回 [值低][值高][09 ^ 值低 ^ 值高],值 = int16 小端。
(測距者 8 路 連接埠 [1 v] 正前方距離 mm :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 正前方距離([公釐 v]) :: #00A4E4)
let frontMm = mbc.tof8Front(MbcDistUnit.Mm) // 正前方距離 mm:0~1200 mm10~17 第 1~8 顆距離 cm distCm
| 項目 | 內容 |
|---|---|
| 用途 | 第 1 |
| 範圍 | 0~120 cm |
| I2C/mBlock 編號 | 10~17 |
| 鎖住 | 🔒 已鎖住的樂高模式排法不再改 |
怎麼讀
SPIKE
模式 0 (edu) byte 0 🔒;模式 0 (toy) byte 0 🔒;模式 3 byte 2;模式 4 v[1];模式 8 v[0];模式 9 v[0] 🔒。備註:16 B = [第 18 顆, 0×8]:App 顏色 = 第 1 顆、反射光 = 第 2 顆、原始紅 = 第 3+256×第 4 …; byte0/1 = 第 1、2 顆 ×10/120(010);byte27 = 第 38 顆兩顆一組 4-bit 再查表編碼(spikeEncodeU8,INO:259-284); byte2 = 第 1 顆(byte3 = 第 8 顆被描述表砍掉); v1 = 第 1 顆 + 256×第 8 顆; 只送 4 B:v0 = 第 1+256×第 2、v1 = 第 3+256×第 4; 每 int16 兩顆:lo = 第 2k+1 顆、hi = 第 2k+2 顆(v0v3 = 第 18 顆)
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
words = dev.read(9)[0:4]
distCm = []
for w in words:
distCm.append(w & 0xFF) # 奇數路
distCm.append((w >> 8) & 0xFF) # 偶數路MBC 函式庫
from pybricks.parameters import Port
from MBC_laser8_obj_Lib import MBC_LASER8
laser = MBC_LASER8(Port.A)
distCm = laser.distances() # list,第 1 路 = [0]EV3
模式 1 · int8 · IR-SEEK 8×int8 = 第 18 顆(EV3 視為頻道 14 的〈方位,距離〉);模式 4 · int8 · IR-S-ALT = 前 4 顆(已鎖住的模式,韌體與主機端都不再改)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
distCm = sensor.read(1)[0:8] # 第 1~8 顆距離 cm
distCm = sensor.read(4)[0:4] # 第 1~8 顆距離 cm' clev3r (BASIC)
Sensor.SetMode(1, 1)
distCm1 = Sensor.ReadRawValue(1, 0) ' 第 1 筆;第 N 筆改成 0 + N - 1
Sensor.SetMode(1, 4)
distCm1 = Sensor.ReadRawValue(1, 0) ' 第 1 筆;第 N 筆改成 0 + N - 1Arduino I2C
編號 0x10~0x17 連號,一次 mbcReadMany 讀完保證同一瞬間。
int16_t distCm[8];
mbcReadMany(0x29, 0x10, 8, distCm); // 第 1~8 顆距離 cm:0~120 cm
for (uint8_t i = 0; i < 8; i++) { Serial.print(distCm[i]); Serial.print(' '); }
Serial.println();mBlock
積木傳回 第 18 顆距離 cm(0120 cm)。主機送 [10] → 回 [值低][值高][10 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x10 + (N − 1)。
(測距者 8 路 連接埠 [1 v] 第 [1 v] 顆距離 cm :: sensing)
MATRIX
0x22 R~K。
// A. 原廠 0x22 積木:R~K = 第 1~8 顆距離 cm(#67 改(使用者最終定案):R、G、B = 第 1、2、3 顆;C = min(第 4, 第 5 顆)(正前方取較近);M、Y、K = 第 6、7、8 顆;全部 cm 0~120;11、12 = 0)
int raw = MiniR4.I2C1.MXColor.getColor(R); // 第 1 組micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 第 (1) 顆距離([公分 v]) :: #00A4E4)
let distCm = mbc.tof8Sensor(1, MbcDistUnit.Cm) // 第 1~8 顆距離 cm:0~120 cm(N = 1~8)18~1F 第 1~8 顆距離 mm distMm
| 項目 | 內容 |
|---|---|
| 用途 | 第 1 |
| 範圍 | 0~1200 mm |
| I2C/mBlock 編號 | 18~1F |
怎麼讀
SPIKE
SPIKE 模式沒有送這個值(已鎖住的模式不再改)。需要時改用 Arduino I2C/mBlock。
EV3
EV3 模式沒有送這個值(EV3 封包以已鎖住的模式為準)。需要時改用 Arduino I2C/mBlock。
Arduino I2C
編號 0x18~0x1F 連號,一次 mbcReadMany 讀完保證同一瞬間。
int16_t distMm[8];
mbcReadMany(0x29, 0x18, 8, distMm); // 第 1~8 顆距離 mm:0~1200 mm
for (uint8_t i = 0; i < 8; i++) { Serial.print(distMm[i]); Serial.print(' '); }
Serial.println();mBlock
積木傳回 第 18 顆距離 mm(01200 mm)。主機送 [18] → 回 [值低][值高][18 ^ 值低 ^ 值高],值 = int16 小端;第 N 路的編號 = 0x18 + (N − 1)。
(測距者 8 路 連接埠 [1 v] 第 [1 v] 顆距離 mm :: sensing)
MATRIX
MATRIX 原廠 0x22 積木沒有這個值。
micro:bit
感應器沒接好(讀不到)時回 0,先用「位址 … 的裝置就緒?」確認接線。
(測距者 8 路 第 (1) 顆距離([公釐 v]) :: #00A4E4)
let distMm = mbc.tof8Sensor(1, MbcDistUnit.Mm) // 第 1~8 顆距離 mm:0~1200 mm(N = 1~8)狀態旗標 F3
F3 每個 bit 一個狀態;I2C、mBlock、micro:bit 直接讀。
| bit | 名稱 | 說明 |
|---|---|---|
| b0 | 就緒 (ready) |
8 顆都初始化完(開機約 2~4 秒)、快照開始更新後恆 1 |
| b1 | 任一顆失效 (fault) |
初始化失敗、I2C 讀失敗或 200 ms 沒更新,任一顆就是 1(= 08 ≠ 0 或 07 ≠ 255) |
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 # 0x29
hw0 = id_word >> 8 # 8EV3
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 # 0x29
hw0 = id_word >> 8 # 8Arduino I2C
int16_t st = mbcRead(0x29, 0xF3);
bool ready = st & (1 << 0); // 就緒
bool fault = st & (1 << 1); // 任一顆失效mBlock
狀態旗標 F3 的各 bit 由擴展拆成布林積木(就緒、校準中…)。
<測距者 8 路 連接埠 [1 v] 連線正常? :: sensing>
MATRIX
MATRIX 原廠 0x22 積木讀不到狀態旗標。
micro:bit
<位址 (0x29 v) 的裝置就緒? :: #00A4E4>
let ready = mbc.deviceReady(0x29) // F3 bit0;沒接 = false
let st = mbc.status(0x29) // 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/tof8.json(單一真相來源,轉錄自 2026-10-21 協定定案)產生。
- 正前方 mm(EV3 模式 3、SPIKE 模式 6 v[1])在定案 §5 沒有獨立 I2C 編號 → 掛在 05 正前方 cm 底下,用 scale:mm 標示,不自己加編號。
- 0x22(使用者 2026-10-21 最終定案):只用一個位址,R~K 由左到右 7 個 cm:第 1、2、3 顆、min(第 4, 第 5)、第 6、7、8 顆;11、12 不放資料;最近距離/方向由主機自己比較。此排法只用在 0x22,EV3/SPIKE不動。
- SPIKE:0/5/7/9 鎖住,1、2、3、4、8 維持不動;模式 6 改 [最近 mm, 正前方 mm, 最近方向 −8
+8](原本 = 第 27 顆兩兩合併);模式 8 v[0] 改 ID|hw[0]<<8。 - 最空曠方向 04 範圍 −7~+7(maxDirection 永遠不會是 0/16,盤點 INO:1086-1088);最近方向 02 ±8 = 沒目標、沿用上次偏向側,開機預設 −8。
- 沒有寫入命令;F8 換位址/EF 重開機用共用的。
- 主對話 2026-10-21:補 09 正前方 mm(定案 §5 只有 05 正前方 cm,但 EV3 模式 3、SPIKE 模式 6 都送 mm,I2C/mBlock 應有同一個值)。