循行者 16 路 (Line16) × SPIKE × Pybricks

互動教學SPIKE

第一次用?先跟著互動教學在網頁上做一遍,再照下面的步驟接主機。

這一頁只講 Pybricks(Python):在 SPIKE Prime/Robot Inventor 上用它讀循行者 16 路 (Line16)的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。

安裝與設定

你需要

  • 感應器:循行者 16 路 (Line16)(SPIKE 版)。
  • 主機:SPIKE Prime 或 Robot Inventor。
  • 電腦:Chrome 瀏覽器,打開 code.pybricks.com 就能寫,不用安裝。
  • 主機韌體:要先換成 Pybricks 韌體 v4.1(code.pybricks.com 正式版是 v4.1.1;MBC SPIKE 積木網站燒的 v4.1.0 也可以)。本站範例都照 v4.1 寫。
  • 函式庫:MBC_line16_obj_Lib.py(要用「匯入函式庫」的寫法才需要)。自己寫新程式只要匯入 MBC_sensors.py,一個檔適用全部 MBC 感應器。

注意

Pybricks 3.6.1 版的函式庫與範例已不再更新(2026 年新款 SPIKE Prime 也不能用 3.6.1)。還沒升級的主機,舊檔放在下載專區的「舊版(不再更新)」。

安裝軟體

  1. 用 Chrome 打開 code.pybricks.com。
  2. 主機換成 Pybricks 韌體:最簡單的方法是到 MBC SPIKE 積木網站 上方選單「SPIKE 主機 → 安裝/更新 Pybricks 韌體」,約 3 分鐘。
  3. 之後想回到樂高官方 App,用 SPIKE App 就能換回樂高原廠韌體。

讓軟體認得感應器

Pybricks 有兩種讀法,挑一種就好:

  1. 內建指令(不用函式庫):直接用 Pybricks 內建的感應器指令讀,不用載入額外檔案,最快上手。
  2. 匯入函式庫:下載 MBC_line16_obj_Lib.py,拿到高解析位置、全部通道等更多資料。

匯入函式庫的步驟:

  1. 在 code.pybricks.com 左邊檔案區按「Import a file(匯入檔案)」。
  2. 範例檔和 MBC_line16_obj_Lib.py 兩個都要匯入,放在同一個專案列表裡。
  3. 點開範例,按 ▶ 執行。

重要

新專案用 MBC_sensors.py;舊專案只換掉原本那一個檔。 MBC_sensors.py 一個檔適用全部 MBC 感應器(EXP6、Servo6 擴充器的函式庫另外下載),寫法是 from MBC_sensors import MBC_LINE8,類別名稱跟舊檔名裡的一樣。舊檔名(例如本頁範例用的 MBC_line16_obj_Lib.py)保留給舊程式:用新版的同名檔換掉原本那個檔就好,程式不用改。但每個舊檔名都是整份共用檔,一個程式匯入 3 個以上舊檔名,會超過 SPIKE 程式槽約 51 KB 的上限;要混用多款感應器,就只匯入 MBC_sensors.py。

提示

檔名要跟程式裡 import 的名字完全一樣,函式庫才載得進來,否則會出現 ImportError。本站下載的函式庫檔名都沒有版本字尾,不用改名。

提示

函式庫建立物件時大多有 multitask 參數:填 False 是一般模式,一行一行執行;填 True 是多工模式,每個呼叫前要加 await,可以同時做很多件事。

接線

  1. 用連接線把感應器插在主機的 C 孔(A~F 任一孔都可以)。
  2. 程式裡的孔要選同一個:內建指令用 Port.A~Port.F;函式庫的 port 參數多半是 1~6,對應 A~F。
  3. 接頭卡榫朝上,輕輕推進去。

先校準(只要做一次)

循行者要先「認識」你場地上的黑色和白色,數值才會準。校準完會記在感應器裡,重新開機也還在(除非換場地)。

  1. 感應器插好、主機開機(感應器的燈亮起來)。
  2. 按住感應器上的校準按鈕約 0.5 秒再放開(不要一直按著,按著不放會一直重新校準)。
  3. 綠色校準指示燈(靠近校準按鈕)亮起後,5 秒內把感應器在黑線和白色地面之間來回掃幾次,16 個感應點都要掃過最黑的黑線和最白的白色區域。
  4. 掃的時候感應器離地 3~12 mm,太高會讀不準。
  5. 綠燈熄滅=校準完成,數值自動存進感應器。

怎麼知道校準好了? 放在白色地面時「線寬」是 0,壓在一般黑線上是 3~5。

函式庫與範例下載

主機要是 Pybricks 韌體 v4.1(2026-10-29~11-01 在 Pybricks 4.1.2 實測通過:函式庫、內建 ColorSensor、Pybricks Code 積木、下命令範例都在主機上跑過)。zip 裡有 MBC_sensors.py、MBC_line16_obj_Lib.py 和 4 支範例:

單獨下載函式庫:MBC_sensors.py(新專案用這個,一個檔適用全部 MBC 感應器)・MBC_line16_obj_Lib.py(本頁範例與舊程式用)

重要

範例程式寫的是 from MBC_line16_obj_Lib import MBC_LINE16,所以要匯入 MBC_line16_obj_Lib.py(檔名不用改)。自己寫新程式改成 from MBC_sensors import MBC_LINE16,只匯入 MBC_sensors.py。函式庫要跟主程式放在同一個專案列表裡。

警告

2026-10-29 以前下載的 MBC 函式庫,在 Pybricks 4.1.2 一匯入就出現 NameError: name 'property' isn't defined(4.1.2 主機沒有 property)。請重新下載本頁的檔案(已修好,4.1.2 實測通過)。

注意

Pybricks 3.6.1 版已不再更新,舊檔放在下載專區的「舊版(不再更新)」。3.6.1 的內建讀法範例只適用 2026-10-30 以前的感應器韌體(新韌體用舊拆法,線寬會讀成 ×10)。

把函式庫匯入 Pybricks 專案

方式一:內建感應器指令(不用函式庫)

直接用 Pybricks 內建的 ColorSensor 指令讀,不用載入額外檔案。下面的值是用內建指令算出來的:

組合 函數 範圍 說明
基礎(比較不挑校準品質,但還是要先校準一次) getLinePos16() -16 ~ +16 循線位置(整數),0 正中央,負偏左、正偏右
getLineWidth16() 0 ~ 16 特徵線寬(觸發的感測器數量),偵測十字、T 字路口
高精度(建議先確實校準) getLinePos100() -100 ~ +100 高解析插值位置,適合高階 PID
getLineWidth100() 0 ~ 9 高精度模式的線寬,跟 getLinePos100() 同步

提示

位置和線寬要用同一組:getLinePos16() 配 getLineWidth16(),getLinePos100() 配 getLineWidth100(),讀到的才是同一刻的資料。

範例:積木版 line16_block_native.py;Python 版 line16_python_native.py

重要

Pybricks 4.1 的拆法(上面的範例已經照這樣寫)

  • reflection()(模式 5)=粗位置+線寬。一律先用 int() 取整數再拆:r = int(line.reflection());16 路:讀到負數先 +6399(線位置 +16 時數字超過 3199,Pybricks 會顯示成負數),位置=r // 100 - 16(−16~+16)、線寬=r % 100。
    • 要用 int()(往 0 截斷),不能用 floor:舊韌體帶小數時,負數那段用 floor 會少 1(實測 floor 拆成位置 15、線寬 99,int() 才是正確的 16、0)。
    • 2026-11-01 以後的感應器韌體(出貨版 v1.0-261101)送出的剛好是整數;更舊的韌體在 Pybricks 4.x 上會帶 1 位小數。留著 int(),新舊韌體都對。
    • 積木版沒有「取整數」積木:≥ 0 用「無條件捨去」、負數用「無條件進位」,結果跟 int() 一樣(上面的積木範例已經這樣包)。
  • ambient()(模式 7)=「細位置+100 . 線寬」,線寬在小數第 1 位:細位置=整數部分 − 100,線寬=round(line.ambient() * 10) % 10(16 路最多顯示 9=9 以上)。要 2026-10-30 以後的感應器韌體;舊韌體線寬會是 0(細位置照常)。舊韌體要線寬,改用反射光的線寬,或改裝 MBC 函式庫(讀模式 9,新舊韌體都讀得到全部的值)。
  • 位置都是「加偏移量送出、讀了再減」,不會直接送負數。
  • 方向:位置 −16~+16,線在左=負、在右=正(從車子後面往前看)。
  • 進階(只有 Python):line.hsv(surface=False).h=(細位置+100)×100+線寬,可以拿到完整的線寬。

方式二:匯入專屬函式庫

函數 範圍 說明
line_init_port_multitask(port, multitask) — 初始化。port = 16 對應 AF;multitask=True 啟用非同步模式(搭配 await)
line_pos16() -16 ~ +16 整數循線位置,比較不挑校準品質(沒校準時每一路都會被當成黑色)
line_pos100() -100 ~ +100 高解析插值位置,最佳 PID 選擇,要確實校準
line_width() 0 ~ 16 特徵線寬,兩種位置函數都適用
line_ir_calibration() list[16] 16 路校正後光值陣列(每值 0 ~ 15)。從車子後面往前看:index 0 = 最左(ch1)
line_ir_ch(ch) 0 ~ 15 單一通道校正光值,ch = 1~16,可連續呼叫(共用快取)
line_junction() 0, 1, 2+ 線群數量:0 無線、1 單線、2 以上路口分叉
line_junction_name() str "none"、"line"、"junction"
line_bin_raw() 0 ~ 65535 16 位元觸發遮罩,bit0 = ch1,1 = 偵測到線
line_on_sensors() list[int] 偵測到線的通道編號,例如 [7, 8, 9]
line_read_all() dict 一次讀全部:ir_calibration、line_pos16、line_pos100、line_width、bin_raw、on_sensors、junction、junction_name

範例:積木版 line16_block_with_lib.py;Python 版 line16_python_with_lib.py

下命令範例(校準、左右反向)

用 MBC 統一函式庫下命令(寫法和每個命令的說明見本頁下方「命令」段)。先把 MBC_sensors.py 上傳到 Pybricks Code,跟範例放在同一個專案列表;感應器接 C 埠;照輸出區的提示按主機左鍵進下一步(中間鍵照常是停止程式)。要 2026-10 以後的感應器韌體。3 支都在主機上跑過。

範例 做什麼 怎麼確認成功
line16_cmd_calib_bw.py 黑白校準(E2 黑、E3 白):整排放在黑色上按左鍵,再整排放在白紙上按左鍵(高度固定) 黑色光值全 0;白紙光值(ir_calibration(),0~15)13 以上
line16_cmd_calib_auto.py E7 5 秒自動校準:5 秒內把感應器在黑線和白底之間來回掃(高度固定、不要傾斜) 狀態從「執行中」變「完成」;白紙光值 11 以上(校準品質看手掃的高度)
line16_cmd_reverse.py E9 左右反向,也示範送錯參數會回「失敗」 線位置正負號對調(例如 −15 → +15,再送 0 換回來);送 5 回「失敗」
  • 校準時感應器要固定高度(裝在車上或墊積木,離紙約 5~10 mm),手掃也要平推、不要傾斜。手拿著校準,白紙光值會偏低。實測(2026-10-29):靜置黑白校準(E3)白紙 13~15,門檻 ≥ 13;手掃 E7 白紙 11 以上就可以用。

PD 循線示範(速度 50)

同一套 PD 循線邏輯,4 種讀法各有積木版和 Python 版,共 8 支;看到十字路口(整排踩到線)會停車。8 支都在 Pybricks 主機上跑過。

讀法 讀什麼 建議 KP/KD 十字路口停車 積木版 Python 版
內建反射光(模式 5) ColorSensor.reflection():粗位置+線寬 2.5/10 線寬 > 10 mode5_block mode5_python
內建環境光(模式 7) ColorSensor.ambient():細位置+線寬(要 2026-10-30 以後的韌體) 0.4/1.5 線寬 > 8 mode7_block mode7_python
專屬函式庫 MBC_line16_obj_Lib:pos100()+width()(模式 9) 0.4/1.5 線寬 > 10 lib_block lib_python
統一函式庫 MBC_sensors:同上 0.4/1.5 線寬 > 10 sensors_block sensors_python
  • 接線:感應器 C 埠、左馬達 E 埠(程式設成反轉 COUNTERCLOCKWISE)、右馬達 F 埠。
  • 速度 50(功率 %)。KP、KD 是建議值,要在自己的車上調:車子左右甩就調小 KP,轉彎太慢就調小 KD。
  • 用函式庫的兩種,要先把 MBC_line16_obj_Lib.py 或 MBC_sensors.py 上傳到 Pybricks Code,跟主程式放在同一個專案列表(zip 裡有附)。
  • 積木版打開就是 Pybricks 積木畫面;第一行是積木資料,請整個檔案匯入,不要只複製下面的 Python。

想學更厲害的循線方法?

可以找這幾位有豐富比賽與教學經驗的教練:LegoLauXiao 教練(示範影片)、legolaumo 教練(示範影片)。

第一次測試

  1. 主機開機,在 code.pybricks.com 連上主機。
  2. 匯入並打開本頁的範例 1,按 ▶。
  3. 主控台印出的數字跟著感應器前方的東西變化,就是接好了。

常見問題

  • 出現 ImportError? 函式庫沒有匯入到同一個專案,或檔名跟 import 的名字不同。把檔名改成 MBC_line16_obj_Lib.py 再匯入一次。
  • 範例跑不起來、指令不認得? 主機韌體太舊:本站範例照 Pybricks v4.1 寫,先把主機更新到 v4.1。3.6.1 已不再更新,舊版檔案在下載專區。
  • 感應器拔線(或線鬆了)怎麼辦? 程式不會停下來:函式庫會回傳上一次讀到的值,並在主控台印一次提醒(中英並列:MBC: Port C 讀不到感應器,先回傳上一次的值 / no sensor, using the last value);開機時就沒接上的話回傳 None。要在程式裡檢查,用物件的 sensor_ok():最近一次有讀到是 True,讀不到是 False(多工模式要寫 await)。插回去後函式庫會繼續讀;如果是開機時就沒接上、又用多工模式,要重新執行程式。
  • 標「只有 Pybricks 版」的範例讀到怪數字? 那個範例用的是感應器 2026-10 以後韌體的新模式,舊韌體讀到的會是別的數字。
  • 換回官方 App 後連不上? 主機現在是 Pybricks 韌體:用 SPIKE App 換回樂高原廠韌體。

讀值

程式假設感應器插 A 孔。「MBC 函式庫」寫法要先把函式庫 .py 一起匯入 Pybricks。

線位置 linePos

線位置
範圍 意思
-16~+16 線在哪一路:−16(最左)~+16(最右),0 = 正中間;站在車後往前看,負 = 線在左(平常 ±15,±16 只在最外側掉線後 200 ms 內)
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port

dev = PUPDevice(Port.A)   # 感應器插 A 孔

w = dev.read(9)[4]
linePos = (w & 0xFF) - 16   # 線位置(低 byte)

MBC 函式庫

from pybricks.parameters import Port
from MBC_line16_obj_Lib import MBC_LINE16

line = MBC_LINE16(Port.A)
linePos = line.pos16()

模式 0 (edu) byte 1 −16 🔒;模式 0 (toy) byte 0 −16 🔒;模式 1 byte 0 −16;模式 5 v[0] 🔒;模式 9 v[4] lo −16 🔒。備註:Pybricks reflection() 編碼:X = (線位置+16)×100 + 線寬,共用核心 mbcReflFill8 送出:2026-11-01 以後的韌體 reflection() 剛好是整數(3.x、4.x 都是);舊韌體(R=G=B=a×256+b)在 4.x 帶小數,先 int();X ≥ 3200 時讀到負數 X−6399(F16:905)

細位置 linePosFine

細位置
範圍 意思
-100~+100 線位置的細分:−100 ~ +100,0 = 正中間,負 = 線在左(與線位置同號)
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port

dev = PUPDevice(Port.A)   # 感應器插 A 孔

w = dev.read(9)[5]
linePosFine = (w & 0xFF) - 100   # 細位置(低 byte)

MBC 函式庫

from pybricks.parameters import Port
from MBC_line16_obj_Lib import MBC_LINE16

line = MBC_LINE16(Port.A)
linePosFine = line.pos100()

模式 0 (edu) byte 2 −100 🔒;模式 0 (toy) byte 2 −100 🔒;模式 3 byte 0 −100;模式 4 v[0] −100;模式 7 v[0] 🔒;模式 9 v[5] lo −100 🔒。備註:byte2 = 細位置+100(0~200)、byte3 = 0;App 原始紅讀成 int16; 細位置+100 經玩具版查表編碼成 byte2~3; 4 個 int16:第 1、2、4 格 = (細位置+100)×100 + 線寬(0~20016;Pybricks hsv(surface=False).h 讀第 1 格,原封不動);第 3 格 = (細位置+100)×100 + min(線寬,9)×10(Pybricks ambient() 讀這格:4.1.2 先 ÷10 去尾再 ÷10、3.6.1/4.0.0 ÷100,都得到 細位置+100 . 線寬,線寬最多顯示 9)。2026-10-30 起第 3 格改這個編碼

線寬 lineWidth

線寬
範圍 意思
0~16 路 壓到線的路數 0~16,0 = 找不到線
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port

dev = PUPDevice(Port.A)   # 感應器插 A 孔

w = dev.read(9)[4]
lineWidth = ((w >> 8) & 0xFF)   # 線寬(高 byte)

MBC 函式庫

from pybricks.parameters import Port
from MBC_line16_obj_Lib import MBC_LINE16

line = MBC_LINE16(Port.A)
lineWidth = line.width()

模式 0 (edu) byte 0 🔒;模式 0 (toy) byte 1 🔒;模式 2 byte 0;模式 3 byte 1;模式 9 v[4] hi 🔒。備註:min(線寬, 10)

線段數 groupCount

線段數
範圍 意思
0~8 看到幾段線:0 丟線、1 一條線、2 以上 = 分岔/十字
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port

dev = PUPDevice(Port.A)   # 感應器插 A 孔

w = dev.read(9)[5]
groupCount = ((w >> 8) & 0xFF)   # 線段數(高 byte)

MBC 函式庫

from pybricks.parameters import Port
from MBC_line16_obj_Lib import MBC_LINE16

line = MBC_LINE16(Port.A)
groupCount = line.junction()

模式 9 v[5] hi 🔒

壓線位元圖 bitmap

壓線位元圖
範圍 意思
0~65535 bit bit0 = 第 1 路(最左)… bit15 = 第 16 路,1 = 那一路在線上
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port

dev = PUPDevice(Port.A)   # 感應器插 A 孔

bitmap = dev.read(9)[6]   # 壓線位元圖

MBC 函式庫

from pybricks.parameters import Port
from MBC_line16_obj_Lib import MBC_LINE16

line = MBC_LINE16(Port.A)
bitmap = line.bin_raw()

模式 4 v[1];模式 9 v[6] 🔒。備註:binRaw 16 bit(byte2 低、byte3 高); byte12 低、byte13 高

第 1~16 路光值 light

第 1~16 路光值
範圍 意思
0~100 第 116 路校準後光值 0100(第 1 路最左);編號 10~1F
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port

dev = PUPDevice(Port.A)   # 感應器插 A 孔

words = dev.read(9)[0:4]
light = []
for w in words:
    for k in range(4):
        light.append((w >> (4 * k)) & 0x0F)   # 低位元在前

MBC 函式庫

from pybricks.parameters import Port
from MBC_line16_obj_Lib import MBC_LINE16

line = MBC_LINE16(Port.A)
light = line.ir_calibration()   # list,第 1 路 = [0]

模式 0 (edu) byte 4 🔒;模式 0 (toy) byte 4 🔒;模式 3 byte 2;模式 6 v[0];模式 8 v[0];模式 9 v[0] 🔒。備註:每路 2 bit((v×10)>>8:0~25→0、26~51→1、52~76→2、77~100→3);byte4 = 第 5~8 路(第 5 路在 bit7-6)、byte5 = 第 1~4 路、byte6 = 第 13~16 路、byte7 = 第 9~12 路 → App 原始綠 = 第 1~8 路(bit15-14 = 第 1 路)、原始藍 = 第 9~16 路;byte 8~15 = 0; 每路 1 bit(光值 ≥ 門檻(值 07,預設 40)= 1 亮,跟二值化判白同一個判斷;2026-11-03 以前的韌體是光值 > 50):第 1~8 路合成 1 byte(第 1 路在 bit7)經玩具版查表編碼成 byte4~5;第 9~16 路 → byte6~7; byte2 = 第 1 路、byte3 = 第 16 路(描述表只宣告 3×int8,第 4 byte 主機可能砍掉); byte0~5 = 第 6~11 路光值 → 3×int16,每個 lo = 前一路、hi = 後一路; byte0~3 = 第 7~10 路(只送 4 B); 每 int16 四路 4-bit((v×5)>>5,0~15):bit0-3 = 第 1 路、bit4-7 = 第 2 路、bit8-11 = 第 3 路、bit12-15 = 第 4 路;v0~v3 = 第 1~16 路

這個軟體讀不到:最後離線方向、二值化門檻、校準完成次數。要用這些值請改用 Arduino/mBlock/micro:bit。

命令

下命令要用 MBC 函式庫(2026-10 以後的版本)和 2026-10 以後的感應器韌體:cmd(命令碼, 參數…) 送出,wait_done() 等它做完(回 True=完成;False=失敗、拒絕或逾時)。感應器回的狀態:0 完成、1 執行中、2 失敗(例如參數超出範圍)、3 拒絕(不認得的命令,或校準中又送別的命令)。

  • 舊韌體呼叫 cmd() 會顯示「韌體太舊」,讀值照常。
  • 同一個命令+同樣參數再呼叫不會重做(放在迴圈裡也只做一次),要再做一次寫 cmd(…, again=True)。
  • wait_done() 每次多 40~60 ms,只在校準這類「停下來做」的命令用,不要放在循線迴圈裡。
  • 官方 SPIKE App 3、Pybricks 內建 ColorSensor 積木送不了命令。

切黑線 blackLine

追黑線(預設);存 RAM,重開機回預設

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE0)   # 切黑線
ok = line.wait_done()   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

切白線 whiteLine

追白線(F3 b1 = 1);存 RAM,重開機回預設

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE1)   # 切白線
ok = line.wait_done()   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

黑色校準 calibBlack

把目前讀值記為黑(感應器壓在黑線上),約 50 ms;寫入 EEPROM

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE2)   # 黑色校準
ok = line.wait_done()   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

白色校準 calibWhite

把目前讀值記為白(感應器壓在白底上),約 50 ms;寫入 EEPROM

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE3)   # 白色校準
ok = line.wait_done()   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

設定門檻 setThreshold

二值化門檻 1~99(RAM,重開機回預設 40);SPIKE 參數超出範圍回失敗(狀態 2)

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE4, 50)   # 設定門檻(門檻 1~99)
ok = line.wait_done()   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

5 秒動態校準 calibAuto

5 秒內把感應器在黑線與白底上來回掃,取極值當黑白參考(共識 B-12,= v1 的 0x20=0x01);期間 F3 b2 = 1

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE7)   # 5 秒動態校準
ok = line.wait_done(8000)   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

左右反向 reverse

[0 正常/1 左右反向]:感應器反裝時用,通道順序與線位置左右對調;校準值照實體通道存,切換不用重校;存 RAM,重開機回 0(舊 mBlock 沒有);SPIKE 參數超出範圍回失敗(狀態 2)

from pybricks.parameters import Port
from MBC_sensors import MBC_LINE16

line = MBC_LINE16(Port.A)
line.cmd(0xE9, 1)   # 左右反向(反向 0~1)
ok = line.wait_done()   # True=做完;False=失敗/拒絕/逾時

Pybricks+MBC 函式庫才送得了(官方 App、內建 ColorSensor 積木不行);要 2026-10 以後的感應器韌體。

範例

範例 1:看見黑線

這個範例會做什麼:主機螢幕一直顯示線的位置(-16 ~ 16)。把黑線從左邊慢慢移到右邊,數字會從負的變成正的。

要準備什麼

  • SPIKE 主機 1 台
  • 循行者 16 路 1 個(已校準)
  • 一張白紙畫一條黑線(或比賽地圖)

怎麼接:循行者插 C 孔。

下載程式

Pybricks
ex01_show_position.py+函式庫
Pybricks 程式碼
# 循行者 16 路 範例 1:看見黑線(顯示線位置)
# 接線:循行者 16 路 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.tools import wait
from MBC_line16_obj_Lib import MBC_LINE16

hub = PrimeHub()
line16 = MBC_LINE16(3)        # 3 = C 埠(1=A、2=B、3=C、4=D、5=E、6=F)

while True:
    pos = line16.pos16()      # 線位置:-16(線在左)~ 0(中間)~ 16(線在右)
    hub.display.number(pos)   # 主機螢幕顯示這個數字
    print(pos)                # 電腦畫面也印出來
    wait(200)                 # 等 0.2 秒再讀下一次

一步一步看懂程式

  1. 一直重複:下面的積木會一直做,直到你按停止。
  2. 讀線位置:官方 App 是「反射光 減 16」;MBC 積木網站和 Pybricks 直接有「線位置(-16~16)」。
  3. 顯示在螢幕上:官方 App 用「write(寫字)」,MBC 積木網站用「螢幕顯示數字」,Pybricks 用 hub.display.number()。
  4. 等 0.2 秒:讓數字停一下,眼睛才看得清楚。

跑起來應該看到什麼

  • 線在感應器正下方:螢幕顯示 0 附近(-2 ~ 2 都算中間)。
  • 把黑線往左移:數字變成 負的,越左越接近 -16。
  • 往右移:變成 正的,越右越接近 16。

常見問題

  • 數字一直是 0,不會變? → 先跑範例 2 看看:放在白紙上還是綠燈,代表每一點都以為是黑色,還沒校準,回到上面「先校準」。
  • 左右相反? → 先確認感應器沒有裝反(元件那一面要朝下、朝向地面)。裝對了還是相反,就把後面範例裡「左轉」「右轉」的數字正負對調。
  • 官方 App 顯示 16 而不是 0? → 忘了「減 16」。

範例 2:黑線警報

這個範例會做什麼:有看到黑線,主機中間的燈亮綠色;找不到線,燈變紅色並且嗶嗶叫。

要準備什麼:同範例 1。

怎麼接:循行者插 C 孔。

下載程式

Pybricks
ex02_line_alarm.py+函式庫
Pybricks 程式碼
# 循行者 16 路 範例 2:黑線警報(壓到線亮綠燈;找不到線亮紅燈並嗶一聲)
# 接線:循行者 16 路 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Color
from pybricks.tools import wait
from MBC_line16_obj_Lib import MBC_LINE16

hub = PrimeHub()
line16 = MBC_LINE16(3)                # 3 = C 埠

while True:
    if line16.width() > 0:            # 線寬 = 有幾路踩在黑線上;大於 0 就是有看到線
        hub.light.on(Color.GREEN)
    else:                             # 線寬 = 0:16 路都沒踩到 → 找不到線
        hub.light.on(Color.RED)
        hub.speaker.beep(880, 100)    # 頻率 880 Hz,響 0.1 秒
    wait(100)

一步一步看懂程式

  1. 讀線寬:官方 App 用「color(顏色)」積木,讀到的就是線寬。
  2. 如果 線寬 > 0 就…:16 個感應點裡有任何一個踩到黑線 → 亮綠燈。
  3. 否則…:線寬是 0,代表一點都沒踩到 → 亮紅燈、嗶一聲。
  4. 等 0.1 秒再檢查一次。

跑起來應該看到什麼

  • 感應器放在黑線上:綠燈。
  • 移到白色地面:紅燈+一直嗶嗶叫。

常見問題

  • 一直是綠燈,放在白紙上也是? → 還沒校準(每一點都被當成黑色)。
  • 官方 App 的燈號顏色怎麼選? → 點「set Power Button light to」積木上的顏色圓點就能換。

範例 3:路口在哪一邊(16 路專屬)

這個範例會做什麼:16 路的感應點排得又寬又密,碰到路口時看得出「黑色那一大塊在哪裡」。主機螢幕會告訴你:

  • 一般的線 → ⬆
  • 左邊有岔路(T 字往左)→ ⬅
  • 右邊有岔路(T 字往右)→ ➡
  • 十字路口 → +
  • 找不到線 → ✕

要準備什麼:同範例 1,再用黑膠帶或筆畫出「往左的 T 字」「往右的 T 字」「十字」三種路口。

怎麼接:循行者插 C 孔。

下載程式

Pybricks
ex03_junction_side.py+函式庫
Pybricks 程式碼
# 循行者 16 路 範例 3:路口在哪一邊(左邊有岔路、右邊有岔路,還是十字路口)
# 接線:循行者 16 路 → C 埠
# 想法:一般的線只有幾路踩到;碰到路口時黑色會變很寬(線寬變大),
#       再看這一大塊黑色偏左、偏右還是在中間,就知道岔路在哪一邊。
from pybricks.hubs import PrimeHub
from pybricks.parameters import Icon
from pybricks.tools import wait
from MBC_line16_obj_Lib import MBC_LINE16

hub = PrimeHub()
line16 = MBC_LINE16(3)                    # 3 = C 埠

while True:
    pos = line16.pos16()                  # 黑色那一塊的中心:負 = 偏左,正 = 偏右
    width = line16.width()                # 有幾路踩到黑色(0 ~ 16)
    if width == 0:                        # 沒看到線(這時位置會停在最後一次的值,不能拿來判斷)
        hub.display.icon(Icon.FALSE)      # 顯示 ✕
    elif width < 6:                       # 窄窄的一條 → 一般的線
        hub.display.icon(Icon.ARROW_UP)
    elif pos < -3:                        # 很寬而且偏左 → 左邊有岔路
        hub.display.icon(Icon.ARROW_LEFT)
    elif pos > 3:                         # 很寬而且偏右 → 右邊有岔路
        hub.display.icon(Icon.ARROW_RIGHT)
    else:                                 # 很寬又在中間 → 十字路口
        hub.display.char('+')
    wait(100)

一步一步看懂程式

  1. 先讀線位置和線寬,存進兩個「變數」(變數=有名字的盒子,可以放一個數字)。
  2. 如果 線寬 = 0 → 顯示 ✕(找不到線,這時線位置不準,所以要最先檢查)。
  3. 否則,如果 線寬 < 6 → 只有窄窄的一條,是一般的線 → 顯示 ⬆。
  4. 否則(線寬 6 以上=黑色變很寬,碰到路口了),再看黑色那一塊的中心「線位置」:
    • 線位置 < -3:黑色偏左 → 左邊有岔路 → ⬅
    • 線位置 > 3:黑色偏右 → 右邊有岔路 → ➡
    • 都不是:黑色在正中間、左右一樣寬 → 十字路口 → +

跑起來應該看到什麼:把感應器慢慢推過三種路口。經過往左的 T 字時會閃一下 ⬅,往右的 T 字閃 ➡,十字閃 +,其他時候是 ⬆。

常見問題

  • 一直顯示 ⬆,路口認不出來? → 推慢一點;或岔路的線太細,把「6」改成 5。
  • 一般的彎道也被當成路口? → 線太粗,把「6」改成 7。
  • 官方 App 為什麼沒有「+」符號? → 官方 App 用自己畫的 5×5 圖案(中間一橫一豎);MBC 積木網站和 Pybricks 直接顯示「+」這個字。
  • 官方 App 的圖案要怎麼改? → 點「turn on」積木上的小方格圖,就能自己點亮想要的格子。

範例 4:最簡單的循線

這個範例會做什麼:機器人自己沿著黑線走。線在左邊就往左轉、在右邊就往右轉、在中間就直走。

要準備什麼

  • 範例 1 的東西,再加上
  • 兩輪小車(兩顆馬達當輪子)
  • 一圈黑線(寬約 2 公分,轉彎不要太急)

怎麼接

  • 循行者插 C 孔,裝在車頭、離地約 0.5~1 公分
  • 左輪接 E、右輪接 F

下載程式

Pybricks
ex04_simple_follow.py+函式庫
Pybricks 程式碼
# 循行者 16 路 範例 4:最簡單的循線(線在左就左轉、線在右就右轉、中間就直走)
# 接線:循行者 16 路 → C 埠;左輪馬達 → E 埠;右輪馬達 → F 埠
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
from pybricks.tools import wait
from MBC_line16_obj_Lib import MBC_LINE16

line16 = MBC_LINE16(3)                                 # 3 = C 埠
left = Motor(Port.E, Direction.COUNTERCLOCKWISE)       # 左輪:反過來裝,所以設成逆時針才是往前
right = Motor(Port.F)                                  # 右輪
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)   # 輪子直徑 56 mm、兩輪距離 112 mm

while True:
    pos = line16.pos16()
    if pos < -2:                  # 線在左邊 → 一邊前進一邊左轉
        robot.drive(100, -60)     # 速度 100 mm/秒,每秒左轉 60 度
    elif pos > 2:                 # 線在右邊 → 右轉
        robot.drive(100, 60)
    else:                         # 線在中間(-2 ~ 2)→ 直走
        robot.drive(100, 0)
    wait(10)

一步一步看懂程式

  1. 告訴主機輪子接在哪裡:官方 App 是「set movement motors to E+F」;MBC 積木網站和 Pybricks 是「移動底盤 左輪 E、右輪 F」。
  2. 設定速度:官方 App 速度 30%;另外兩種是每秒 100 mm。先慢慢來,成功了再加快。
  3. 一直重複:讀線位置。
  4. 如果 線位置 < -2(線在左)→ 一邊走一邊左轉。
  5. 否則如果 線位置 > 2(線在右)→ 右轉。
  6. 否則(-2 ~ 2)→ 直走。

跑起來應該看到什麼:小車沿著線走,走起來會左右搖擺(這是正常的,範例 5 會改善)。

常見問題

  • 一開就往外衝、離線越來越遠? → 轉彎方向反了:把左右兩個轉彎的數字正負對調(官方 App:-40 和 40 對調;另外兩種:-60 和 60 對調)。
  • 小車往後退? → 馬達的裝法跟樂高標準小車相反。官方 App:請照樂高「標準驅動底盤」的方向裝馬達;MBC 積木網站:「移動底盤」積木裡左右輪的「正轉」方向都換成另一個;Pybricks:左輪改成 Direction.CLOCKWISE、右輪改成 Motor(Port.F, Direction.COUNTERCLOCKWISE)。
  • 轉彎太急衝出去? → 把速度調低。
  • 為什麼中間是 -2 ~ 2? → 16 路分得比較細,線稍微偏一點數字就會動,留一點範圍車子才不會一直扭來扭去。

範例 5:平順循線+十字路口停車

這個範例會做什麼:用「偏多少就轉多少」的方法循線,走得比範例 4 平順;遇到十字路口(整排感應點幾乎都踩到黑色)就停車並嗶一聲。經過 T 字岔路不會停,會繼續往前走。

要準備什麼:同範例 4,黑線上要有一個十字路口。

怎麼接:循行者插 C 孔;左輪接 E、右輪接 F。

下載程式

Pybricks
ex05_smooth_follow_stop.py+函式庫
Pybricks 程式碼
# 循行者 16 路 範例 5:平順循線,遇到十字路口就停車
# 接線:循行者 16 路 → C 埠;左輪馬達 → E 埠;右輪馬達 → F 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
from pybricks.tools import wait
from MBC_line16_obj_Lib import MBC_LINE16

hub = PrimeHub()
line16 = MBC_LINE16(3)                                 # 3 = C 埠
left = Motor(Port.E, Direction.COUNTERCLOCKWISE)
right = Motor(Port.F)
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)

while True:
    if line16.width() >= 11:      # 11 路以上同時踩到黑線 → 十字路口(整排 16 路幾乎全黑)
        robot.stop()
        hub.speaker.beep(880, 500)
        break                     # 跳出迴圈,程式結束
    pos = line16.pos100()         # 更精細的位置:-100 ~ 100
    robot.drive(120, pos * 1.5)   # 偏多少就轉多少:偏越多轉越快
    wait(10)

一步一步看懂程式

  1. 讀細的線位置(-100 ~ 100):官方 App 是「raw red(原始紅色)減 100」。
  2. 讀線寬。
  3. 如果 線寬 ≥ 11(官方 App 寫成「線寬 > 10」,意思一樣)→ 十字路口:停車 → 嗶一聲 → 結束程式。
  4. 否則 → 轉彎的力道=線位置 × 一個數字(官方 App 乘 0.5,另外兩種乘 1.5)。偏得越多轉得越大,偏一點點就只轉一點點,所以不會左右亂晃。

跑起來應該看到什麼:小車順順地沿線走,經過 T 字岔路繼續走,到十字路口停下來嗶一聲。

常見問題

  • 還是左右搖晃? → 把「乘的數字」調小一點(例如 0.5 → 0.3)。
  • 轉彎跟不上、衝出線外? → 「乘的數字」調大一點,或把速度調低。
  • 到了十字路口沒停? → 車子太快、一下就衝過去了,把速度調低;或把「11」改成 10。
  • 還沒到十字路口,在 T 字岔路就停了? → 線太粗,把「11」改成 12 或 13(最大是 16)。
  • 官方 App 版到十字路口都不停? → 2026-10 上機時,教育版 SPIKE App 3 的「color(顏色)」積木在線寬超過 10 時,儀表板顯示 NaN,16 路積木的十字路口停車我們還在重測(同一台主機用官方 App 的 Python 讀得到線寬 16、會停車)。家用版(Robot Inventor)的「顏色」最多只到 10,十字路口一律用「> 9」。請把範例 1 的「反射光 減 16」換成「color」,把感應器放在十字路口上看螢幕的數字;如果最多只到 10,就把範例 5 的「> 10」改成「> 9」。
  • 官方 App 找不到「raw red」積木? → 開檔後會自動加上「更多感應器(More Sensors)」積木區;如果沒有,點左下角積木區的「+」加入「More Sensors」。

其他問題

  • 主機認不到感應器? 拔掉重插一次,等 2 秒;換一個孔試試。官方 App 會把它顯示成「顏色感應器」,這是正常的。
  • 可以同時用官方 App 和 Pybricks 嗎? 一次只能裝一種韌體:Pybricks 與 MBC 積木網站用 Pybricks 韌體,官方 App 用樂高原廠韌體;隨時可以用 SPIKE App 換回原廠韌體。

還有問題?到 聯絡我們 附上你用的軟體和程式截圖。

下載

本頁依據

  • 主機與軟體清單:_build/guides.json
  • 值與命令:_build/protocol/line16.json(單一真相來源)
  • 安裝與設定:_build/guides/software/spike-pybricks.zh.md、_build/guides/product/line16/spike-pybricks.zh.md
  • 範例:sensors/line16/spike-examples.md
LINE 詢價選購指南