這頁內容已整合到新的說明頁:測距者 8 路

測距者 8 路 指令參考

回到測距者 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

最近距離 cm
項目 內容
用途 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 cm
mBlock

積木傳回 最近距離 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~+8
mBlock

積木傳回 最近方向(-8~+8)。主機送 [02] → 回 [值低][值高][02 ^ 值低 ^ 值高],值 = int16 小端。

(測距者 8 路 連接埠 [1 v] 最近方向 :: sensing)
MATRIX

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

micro:bit

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

(測距者 8 路 最近方向 :: #00A4E4)
let nearDir = mbc.tof8NearestDirection()   // 最近方向:-8~+8

03 最空曠距離 cm farCm

最空曠距離 cm
項目 內容
用途 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 cm
mBlock

積木傳回 最空曠距離 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 cm

04 最空曠方向 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~+7
mBlock

積木傳回 最空曠方向(-7~+7)。主機送 [04] → 回 [值低][值高][04 ^ 值低 ^ 值高],值 = int16 小端。

(測距者 8 路 連接埠 [1 v] 最空曠方向 :: sensing)
MATRIX

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

micro:bit

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

(測距者 8 路 最空曠方向 :: #00A4E4)
let farDir = mbc.tof8OpenDirection()   // 最空曠方向:-7~+7

05 正前方 cm frontCm

正前方 cm
項目 內容
用途 第 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 cm
mBlock

積木傳回 正前方 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 cm

06 最近距離 mm nearMm

最近距離 mm
項目 內容
用途 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]   # 最近距離 mm

MBC 函式庫

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 mm
mBlock

積木傳回 最近距離 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 mm

07 初始化位元圖 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 bit
mBlock

積木傳回 初始化位元圖(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 bit

08 故障位元圖 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 bit
mBlock

積木傳回 故障位元圖(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 bit

09 正前方距離 mm frontMm

正前方距離 mm
項目 內容
用途 第 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]   # 正前方距離 mm

MBC 函式庫

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 mm
mBlock

積木傳回 正前方距離 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 mm

10~17 第 1~8 顆距離 cm distCm

第 1~8 顆距離 cm
項目 內容
用途 第 18 顆各自的距離 0120 cm(第 1 顆正左、第 4、5 顆正前、第 8 顆正右,每顆隔 30°);120 = 那個方向沒東西/那顆失效;編號 10~17
範圍 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 - 1
Arduino 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~8 顆距離 mm
項目 內容
用途 第 18 顆各自的距離 01200 mm,1200 = 那個方向沒東西/那顆失效;編號 18~1F
範圍 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      # 8
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             # 0x29
hw0 = id_word >> 8                # 8
Arduino 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 應有同一個值)。
LINE 詢價選購指南