MBC EXP6 六路馬達擴充器(適用 SPIKE™) × SPIKE × Pybricks

互動教學SPIKE

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

這一頁只講 Pybricks(Python):在 SPIKE Prime/Robot Inventor 上用它讀MBC EXP6 六路馬達擴充器(適用 SPIKE™)的安裝步驟、每個值怎麼讀與範例。要換產品、主機或軟體,用上方的切換列。

安裝與設定

你需要

  • 感應器:MBC EXP6 六路馬達擴充器(適用 SPIKE™)(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_exp6_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_exp6_obj_Lib.py,拿到高解析位置、全部通道等更多資料。

匯入函式庫的步驟:

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

重要

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

提示

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

提示

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

接線

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

接線與供電

  1. 主機通訊線:把擴充器的 Host 通訊線插進 SPIKE 主機任一孔(Port A~F)。
  2. 獨立電源:擴充器一定要接 2S 鋰電池(7.4 V,充飽 8.4 V,XT30 接頭),馬達和樂高感應器都靠它供電;馬達電流不會從主機抽,主機訊號線也經過隔離晶片。不要接 3S 以上:超過 9 V 時,EXP6 會停止供電給樂高顏色/超音波感應器。
  3. 接裝置:樂高感應器(顏色、超音波、力量)與馬達,任意接在擴充器的 1~6 號孔。

警告

這個寫法的 EXP6 只支援 SPIKE Prime 主機(Robot Inventor(51515)主機請用 Robot Inventor App 的 Python;不支援 EV3)。換另一種寫法之前,先讓 EXP6 斷電一次(關主機或拔掉 Host 線):EXP6 一旦跑過 Pybricks 程式,就會一直用 Pybricks 的方式溝通,直到重新開機,這時候官方 App 會連不上。

匯入 EXP6 函式庫

  1. 下載 Pybricks 函式庫+範例(.zip)。EXP6 韌體要 2026-11-03 以後;主機用 Pybricks 韌體 v4.1。函式說明在包裡的 EXP6_Library_Manual.pdf。
  2. 把用得到的檔案放進同一個 Pybricks 專案,檔名不用改:
    • 一定要放:MBC_exp6_obj_Lib.py(EXP6、馬達、樂高感應器)。包裡的範例寫的就是 from MBC_exp6_obj_Lib import MBC_EXP6。
    • 有插 MBC 感應器才放:MBC_exp6_mbc_common.py(共用檔,會被下面的產品檔自動載入),再加上用到的產品檔:MBC_exp6_line.py(循行者 8/16 路)、MBC_exp6_laser.py(測距者 2/8 路)、MBC_exp6_pad.py(掌控者 PS2/PS4)、MBC_exp6_unicam.py(神攝手)。
    • 用不到的不要放:Pybricks 主機的程式(你的程式加上全部函式庫)上限大約 52 KB,全部放進去會超過。
    • 用 Pybricks 圖形積木:下載包的 beginner_examples/ 有 5 個積木範例,也可以單獨下載:ex01 轉一圈、ex02 三顆馬達、ex03 光控開關、ex04 按鈕控制、ex05 走正方形。在 Pybricks Code 按「匯入檔案」選這個檔,跟 MBC_exp6_obj_Lib.py 放同一個專案,打開就是積木。積木裡只要有等待就會變成多工(MBC_EXP6(3, True)、每個指令都 await),所以多拖了一塊「from MBC_exp6_obj_Lib import run_task」:等待的時候由它在背景送心跳,馬達才不會被看門狗停掉。

EXP6 Pybricks 範例

一般模式與多工模式

假設擴充器接在主機的 Port C(孔 3):

# 一般模式:一行一行執行
from MBC_exp6_obj_Lib import MBC_EXP6
exp6 = MBC_EXP6(3, False)
exp6.motor_power(6, 100)
exp6.keep_alive_wait(5000)
# 多工模式:每個指令前加 await,要用函式庫的 run_task
from pybricks.tools import multitask, run_task, wait
from MBC_exp6_obj_Lib import MBC_EXP6, run_task
exp6 = MBC_EXP6(3, True)

async def main():
    await exp6.motor_power(6, 100)
    await exp6.keep_alive_wait(5000)

run_task(main())

重要

Pybricks 有看門狗:擴充器約 0.5 秒沒收到主機訊號(斷線或程式當掉)就讓馬達滑行停止。多工模式的 run_task 會在背景自動送心跳;一般模式等待時要用 exp6.keep_alive_wait(毫秒) 取代 wait,耗時的迴圈裡要呼叫 exp6.keep_alive()。

MBC 感應器插在 EXP6 上

主機的孔不夠用時,MBC 感應器可以插在 EXP6 的 1~6 號孔:循行者 8/16 路、測距者 2/8 路、掌控者 PS2/PS4、神攝手。函式名稱和回傳值都跟感應器直接插主機時一樣。

  • 感應器直接插上就能用,跟插在主機上一樣,不用另外設定。
  • EXP6 韌體要是 2026-11-03 以後的版本。舊韌體請跟我們聯絡更新。

1. 一般模式:先宣告每一孔接什麼。 建立 EXP6 物件時寫 p5=LINE16(5 號孔接循行者 16 路),神攝手寫 (UNICAM, 相機模式),接著用 exp6.sensor(孔號) 拿到感應器物件。程式一開始就會核對每一孔插的是不是宣告的那一款。插錯了會直接停下,並告訴你讀到的是哪一款,例如「5 號孔要接「循行者 16 路」,讀到的是「測距者 2 路」」。神攝手在宣告時就會自動切到你寫的相機模式。

from MBC_exp6_obj_Lib import MBC_EXP6
from MBC_exp6_line import *       # 循行者 LINE8、LINE16
from MBC_exp6_unicam import *     # 神攝手 UNICAM

# EXP6 插主機 C 孔(3);EXP6 的 5 號孔插循行者 16 路、6 號孔插神攝手(相機模式 51 物體偵測)
exp6 = MBC_EXP6(3, False, p5=LINE16, p6=(UNICAM, 51))
line = exp6.sensor(5)
cam = exp6.sensor(6)

while True:
    print("pos100 =", line.pos100(), " 物體數 =", cam.object_count())
    exp6.keep_alive_wait(100)     # 一般模式等待要用 keep_alive_wait

2. 多工模式。 宣告的寫法一樣,exp6.sensor() 不用加 await,但要寫在 run_task 之前。多工模式宣告時不會核對插的是哪一款。

  • 神攝手要在 main() 裡用 await cam.set_mode(模式) 自己切一次相機模式。
  • 感應器的每個函式前面都要加 await。
  • 掌控者每一圈都要先 pad.update() 讀一次,這一圈的按鍵和搖桿都用這次讀到的資料,跟直接插主機時一樣。
  • buttons() 的排法跟直接插主機時一樣。以前的 PSX 排法改名叫 buttons_psx()。
from pybricks.tools import multitask, run_task, wait
from MBC_exp6_obj_Lib import MBC_EXP6, run_task
from MBC_exp6_pad import *        # 掌控者 PS2、PS4
from MBC_exp6_unicam import *     # 神攝手 UNICAM

exp6 = MBC_EXP6(3, True, p4=PS4, p6=(UNICAM, 13))   # EXP6 插主機 C 孔(3)
pad = exp6.sensor(4)              # 拿物件不用 await,但要寫在 run_task 之前
cam = exp6.sensor(6)

async def main():
    await cam.set_mode(13)        # 多工寫法:相機模式要自己切一次
    while True:
        await pad.update()        # 每一圈先讀一次手把,下面的按鍵、搖桿都用這一次的資料
        if await pad.pressed("CROSS"):
            break
        print("LX =", await pad.lx(), " 色 1 位置 =", await cam.xy(1))
        await wait(50)
    print("結束")

run_task(main())

3. 舊寫法也能用。 exp6.line16(5)、exp6.laser8(3)、exp6.ps2(4)、exp6.unicam(5, 13) 照樣可以用,只是不會核對插的是哪一款。舊程式只要在上面加一行 import 產品檔,例如 from MBC_exp6_line import *。沒有加這一行,程式會提示你要補哪一行。

完整範例在下載包的 examples/11_MBC_Sensors.py,示範循行者 8 路、測距者 8 路、掌控者 PS2 和神攝手一起用。

4. 積木寫法。 積木只能照順序填參數,所以用 EXP6_LINE8(exp6, 5) 這種寫法建立感應器物件(第一格放 EXP6 物件、第二格是 EXP6 的孔號),用到的產品檔要多拖一塊匯入積木。範例:循行者 8 路插 EXP6 第 5 孔的 PD 循線,積木檔、Python 檔(左馬達接擴充孔 1、右馬達接擴充孔 2),一步一步的說明在 EXP6 Pybricks 積木互動教學。

注意

2026-11-03 實機驗證過:EXP6 範例 P1~P5、範例 11、MBC 積木網站範例 M1~M5,11 個全部通過。

第一次測試

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

常見問題

  • 出現 ImportError? 函式庫沒有匯入到同一個專案,或檔名跟 import 的名字不同。把檔名改成 MBC_exp6_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 換回樂高原廠韌體。

範例

範例 1:一顆馬達轉一圈

這個範例會做什麼:擴充孔 1 的馬達轉一圈(360 度),螢幕顯示角度;再反方向轉一圈回到原位,螢幕顯示 0 左右。

要準備什麼

  • SPIKE 主機 1 台、EXP6 1 片(接好電池)
  • 樂高馬達 1 顆

怎麼接:EXP6 Host 線 → 主機 C 孔;馬達 → EXP6 擴充孔 1。

下載程式

Pybricks
ex01_one_turn.py+函式庫
Pybricks 程式碼
# EXP6 範例 1:一顆馬達轉一圈再轉回來(Pybricks)
# 接線:EXP6 的 Host 線 → 主機 C 孔;馬達 → EXP6 擴充孔 1;EXP6 接上電池
from pybricks.hubs import PrimeHub
from MBC_exp6_obj_Lib import MBC_EXP6

hub = PrimeHub()
exp6 = MBC_EXP6(3, False)    # 3 = C 孔(1=A、2=B、3=C、4=D、5=E、6=F);False = 一般寫法

while exp6.get_device_id(1) != 5:        # 等擴充孔 1 的馬達準備好(5 = 馬達,開機大約 1 秒)
    exp6.keep_alive_wait(100)

exp6.motor_run_degrees(1, 50, 360, 2)    # 擴充孔 1:速度 50%,轉 360 度(一圈),到了就煞車(2)
exp6.keep_alive_wait(1500)               # 等它轉完。等待一律用 keep_alive_wait,不要用 wait
hub.display.number(exp6.get_motor_angle(1))   # 螢幕顯示現在的角度(大約 360)
exp6.keep_alive_wait(2000)

exp6.motor_run_degrees(1, 50, -360, 2)   # 角度寫負的 = 反方向轉一圈,回到原來的位置
exp6.keep_alive_wait(1500)
hub.display.number(exp6.get_motor_angle(1))   # 大約 0
exp6.keep_alive_wait(2000)

exp6.stop_all(1)             # 最後全部停止(1 = 滑行)

一步一步看懂程式

  1. 連上 EXP6:告訴主機 EXP6 接在 C 孔。官方 App 寫 port.C;Pybricks 寫 3(1=A、2=B、3=C…);MBC 積木網站是「C 接 MBC EXP6六路馬達擴充」積木。
  2. 等馬達準備好(規則 ①)。
  3. 轉 360 度:「擴充孔 1,速度 50,轉 360 度,到位後煞車」。
  4. 等 1.5 秒讓它轉完(規則 ②),再把角度顯示在螢幕上。
  5. 轉 -360 度:角度寫負的=反方向,回到原來的位置。
  6. 全部停止(規則 ③)。

跑起來應該看到什麼:馬達轉一圈停住,螢幕顯示 360 左右;過 2 秒反轉一圈回來,螢幕顯示 0 左右(差幾度是正常的)。

常見問題

  • 馬達完全不動? → ① 電池有沒有接、有沒有電;② 馬達是不是插在 1 號孔;③ Host 線是不是插主機 C 孔。
  • 只轉了第一圈,第二圈沒轉? → 中間等待太短,第一圈還沒轉完。把「等 1.5 秒」改長一點。
  • 想反方向轉? → 把角度改成負的。官方 App 的函式庫只看角度的正負,速度寫負的沒有用;為了三種寫法結果一樣,這頁的速度一律寫正的。

範例 2:三顆馬達一起轉

這個範例會做什麼:3 顆馬達同時用不同速度轉 3 秒(慢、中、快),再一起反轉 3 秒,最後全部煞車、嗶一聲。

要準備什麼:範例 1 的東西,馬達改成 3 顆。

怎麼接:EXP6 Host 線 → 主機 C 孔;馬達 → EXP6 擴充孔 1、2、3。

下載程式

Pybricks
ex02_three_motors.py+函式庫
Pybricks 程式碼
# EXP6 範例 2:三顆馬達一起轉(Pybricks)
# 接線:EXP6 的 Host 線 → 主機 C 孔;馬達 → EXP6 擴充孔 1、2、3;EXP6 接上電池
from pybricks.hubs import PrimeHub
from MBC_exp6_obj_Lib import MBC_EXP6

hub = PrimeHub()
exp6 = MBC_EXP6(3, False)    # 3 = C 孔

for m in (1, 2, 3):          # 三顆馬達都要準備好(5 = 馬達)
    while exp6.get_device_id(m) != 5:
        exp6.keep_alive_wait(100)

exp6.motor_run(1, 30)        # 擴充孔 1:速度 30%(慢)
exp6.motor_run(2, 50)        # 擴充孔 2:速度 50%
exp6.motor_run(3, 70)        # 擴充孔 3:速度 70%(快)
exp6.keep_alive_wait(3000)   # 一起轉 3 秒

exp6.motor_run(1, -30)       # 速度寫負的 = 反轉
exp6.motor_run(2, -50)
exp6.motor_run(3, -70)
exp6.keep_alive_wait(3000)

exp6.stop_all(2)             # 全部停止(2 = 煞車,馬上停)
hub.speaker.beep(880, 200)

一步一步看懂程式

  1. 等 3 顆馬達都準備好:MBC 積木網站和 Pybricks 一顆一顆檢查「裝置代碼 = 5」。
  2. 持續轉:「擴充孔 1 速度 30」「擴充孔 2 速度 50」「擴充孔 3 速度 70」。持續轉的指令送出後馬達會一直轉,程式直接往下做,所以 3 顆幾乎同時開始。
  3. 等 3 秒。
  4. 速度改成負的 → 3 顆一起反轉,再等 3 秒。
  5. 全部停止,2 = 煞車,最後嗶一聲。

跑起來應該看到什麼:3 顆馬達一慢、一中、一快一起轉,3 秒後一起反過來轉,再 3 秒全部停住、主機嗶一聲。

常見問題

  • 有一顆不會轉? → 那一顆的號碼插錯孔,或沒插緊。把它換到別的孔試試,就知道是馬達還是孔的問題。
  • 速度 100 很快、很用力? → EXP6 直接用電池的電推馬達,速度太快、裝在機構上容易撞壞,先用 50 以下。

範例 3:光控開關(顏色感應器控制馬達)

這個範例會做什麼:顏色感應器前面放一張白紙(亮)→ 馬達轉、主機燈變綠;拿開(暗)→ 馬達停、燈變紅。左右鍵一起按住就結束。

要準備什麼

  • 範例 1 的東西,再加上
  • SPIKE 顏色感應器 1 個、白紙 1 張

怎麼接:EXP6 Host 線 → 主機 C 孔;馬達 → 擴充孔 1;顏色感應器 → 擴充孔 4。

下載程式

Pybricks
ex03_light_switch.py+函式庫
Pybricks 程式碼
# EXP6 範例 3:光控開關(Pybricks)
# 感應器前面亮(放一張白紙)→ 馬達轉、主機燈變綠;暗 → 馬達停、燈變紅
# 接線:EXP6 的 Host 線 → 主機 C 孔;馬達 → 擴充孔 1;顏色感應器 → 擴充孔 4;EXP6 接上電池
from pybricks.hubs import PrimeHub
from pybricks.parameters import Button, Color
from MBC_exp6_obj_Lib import MBC_EXP6

hub = PrimeHub()
exp6 = MBC_EXP6(3, False)    # 3 = C 孔

while exp6.get_device_id(1) != 5:        # 等擴充孔 1 的馬達準備好
    exp6.keep_alive_wait(100)

while not (Button.LEFT in hub.buttons.pressed() and Button.RIGHT in hub.buttons.pressed()):   # 左右鍵一起按住 → 結束
    bright = exp6.get_color_reflection(4)    # 擴充孔 4 的顏色感應器:反射光 0~100(越亮越大)
    print(bright)
    if bright > 50:                          # 亮 → 馬達轉
        exp6.motor_run(1, 50)
        hub.light.on(Color.GREEN)
    else:                                    # 暗 → 馬達停
        exp6.motor_stop(1, 2)
        hub.light.on(Color.RED)
    exp6.keep_alive_wait(100)

exp6.stop_all(1)

一步一步看懂程式

  1. 重複,直到左右鍵一起按住:裡面的事情會一直做;兩個鍵一起按下去就跳出來。
  2. 讀反射光:擴充孔 4 的顏色感應器有多亮(0~100,越亮越大),存進「亮度」這個變數(變數=有名字的盒子,可以放一個數字),也印在電腦畫面上。
  3. 如果 亮度 > 50 → 馬達轉、燈變綠。
  4. 否則 → 馬達停(煞車)、燈變紅。
  5. 等 0.1 秒再檢查一次。
  6. 跳出來之後 → 全部停止。

跑起來應該看到什麼:感應器前面什麼都沒有:紅燈、馬達不動。把白紙靠近感應器(1~2 公分):綠燈、馬達轉。拿開又停。左右鍵一起按住:程式結束、馬達停。

常見問題

  • 一直是紅燈 / 一直是綠燈? → 看電腦畫面印出來的數字:放白紙和拿開時各是多少,把「50」改成兩個數字中間的值。
  • 官方 App 的數字跟另外兩種不一樣? → 正常。官方 App 的函式庫是用感應器的紅、綠、藍三個顏色估算亮度,Pybricks 和 MBC 積木網站讀的是感應器真正的反射光,所以同一張紙讀到的數字會差一點。
  • 讀到的一直是 0? → 顏色感應器有沒有插在 4 號孔;EXP6 只認得樂高 SPIKE 顏色感應器。

範例 4:用主機按鈕控制馬達

這個範例會做什麼:按住左鍵 → 馬達正轉;按住右鍵 → 反轉;放開 → 停。左右鍵一起按住就結束。

要準備什麼:同範例 1。

怎麼接:EXP6 Host 線 → 主機 C 孔;馬達 → 擴充孔 1。

下載程式

Pybricks
ex04_button_motor.py+函式庫
Pybricks 程式碼
# EXP6 範例 4:用主機按鈕控制馬達(Pybricks)
# 按住左鍵 → 正轉;按住右鍵 → 反轉;放開 → 停;左右鍵一起按 → 結束
# 接線:EXP6 的 Host 線 → 主機 C 孔;馬達 → EXP6 擴充孔 1;EXP6 接上電池
from pybricks.hubs import PrimeHub
from pybricks.parameters import Button
from MBC_exp6_obj_Lib import MBC_EXP6

hub = PrimeHub()
exp6 = MBC_EXP6(3, False)    # 3 = C 孔

while exp6.get_device_id(1) != 5:        # 等擴充孔 1 的馬達準備好
    exp6.keep_alive_wait(100)

while not (Button.LEFT in hub.buttons.pressed() and Button.RIGHT in hub.buttons.pressed()):   # 左右鍵一起按住 → 結束
    if Button.LEFT in hub.buttons.pressed():         # 按住左鍵
        exp6.motor_run(1, 50)                        # 正轉,速度 50%
    elif Button.RIGHT in hub.buttons.pressed():      # 按住右鍵
        exp6.motor_run(1, -50)                       # 反轉
    else:                                            # 都沒按
        exp6.motor_stop(1, 2)                        # 停止(2 = 煞車)
    exp6.keep_alive_wait(50)

exp6.stop_all(1)

一步一步看懂程式

  1. 重複,直到左右鍵一起按住(跟範例 3 一樣)。
  2. 如果 左鍵被按住 → 擴充孔 1 速度 50(正轉)。
  3. 否則,如果 右鍵被按住 → 速度 -50(反轉)。
  4. 都沒按 → 停止(煞車)。
  5. 等 0.05 秒再檢查一次按鈕。
  6. 跳出來之後 → 全部停止。

跑起來應該看到什麼:按住左鍵馬達轉、放開就停;按住右鍵往另一邊轉。兩個一起按住,程式結束。

常見問題

  • 為什麼不用中間的按鈕? → 中間的按鈕是主機的開關,也是停止程式的按鈕,這頁的範例不拿它來控制馬達。
  • 按了要等一下才轉? → 程式每 0.05 秒檢查一次按鈕,官方 App 送指令也要一點時間,慢一點點是正常的。
  • 官方 App 按停止鍵,馬達還在轉? → 規則 ③:官方 App 沒有自動保護。用「左右鍵一起按住」結束程式;真的停不下來就關主機。

範例 5:兩輪小車走正方形

這個範例會做什麼:兩輪小車直走約 35 公分 → 原地右轉 90 度,重複 4 次,走出一個正方形回到起點。

要準備什麼

  • 範例 1 的東西,再加上
  • 兩輪小車(兩顆馬達當輪子,輪子直徑 56 mm、兩輪距離 112 mm,就是樂高標準小車)
  • 一塊平坦的地面(大約 50 × 50 公分)

怎麼接:EXP6 Host 線 → 主機 C 孔;左輪馬達 → 擴充孔 1、右輪馬達 → 擴充孔 2。

下載程式

Pybricks
ex05_square.py+函式庫
Pybricks 程式碼
# EXP6 範例 5:兩輪小車走正方形(Pybricks)
# 接線:EXP6 的 Host 線 → 主機 C 孔;左輪馬達 → 擴充孔 1;右輪馬達 → 擴充孔 2;EXP6 接上電池
# 小車:輪子直徑 56 mm、兩輪距離 112 mm(樂高標準小車)
from pybricks.hubs import PrimeHub
from MBC_exp6_obj_Lib import MBC_EXP6

hub = PrimeHub()
exp6 = MBC_EXP6(3, False)          # 3 = C 孔
exp6.set_motor_inverted(1, True)   # 左輪是反過來裝的:設成「反裝」,速度正的才會往前

for m in (1, 2):                   # 兩顆馬達都要準備好
    while exp6.get_device_id(m) != 5:
        exp6.keep_alive_wait(100)
exp6.keep_alive_wait(300)

for side in range(4):              # 正方形有 4 個邊
    exp6.reset_angle(2)                        # 右輪角度歸零,用來量走了多遠
    exp6.drive(1, 2, 40, 40)                   # 左輪孔 1、右輪孔 2,兩輪都 40% → 直走
    while exp6.get_motor_angle(2) < 720:       # 右輪轉滿 720 度(2 圈,大約 35 公分)
        exp6.keep_alive_wait(10)
    exp6.stop_all(2)                           # 煞車
    exp6.keep_alive_wait(300)

    exp6.reset_angle(2)
    exp6.drive(1, 2, 30, -30)                  # 左輪往前、右輪往後 → 原地右轉
    while exp6.get_motor_angle(2) > -180:      # 右輪倒轉 180 度 ≈ 車子轉 90 度
        exp6.keep_alive_wait(10)
    exp6.stop_all(2)
    exp6.keep_alive_wait(300)

exp6.stop_all(1)

一步一步看懂程式

  1. 左輪設成「反裝」:小車的兩顆馬達是左右對稱裝的,左輪轉的方向跟右輪相反。設成反裝之後,兩輪都是「速度正的 = 往前」。
  2. 等兩顆馬達準備好。
  3. 重複 4 次(正方形 4 個邊):
    1. 右輪角度歸零:等一下用它來量走了多遠。
    2. 雙輪一起走:「左輪孔 1、右輪孔 2,左 40、右 40」→ 直走。EXP6 會讓兩輪同步,走得比較直。
    3. 等到右輪轉滿 720 度(2 圈 ≈ 35 公分)→ 全部停止(煞車),停 0.3 秒。
    4. 右輪角度再歸零,「左 30、右 -30」→ 左輪往前、右輪往後 → 原地右轉。
    5. 等到右輪倒轉 180 度 → 車子剛好轉 90 度(輪子轉 180 度 × 輪徑 56 ÷ 輪距 112 = 90 度)→ 停止。
  4. 全部停止(滑行)。

跑起來應該看到什麼:小車走一段、右轉、走一段、右轉…走完 4 個邊,大約回到出發的位置。

常見問題

  • 小車原地打轉,不會往前? → 左輪沒有設成反裝,或兩顆馬達插反了(左輪要在 1 號孔)。
  • 小車往後退? → 馬達的裝法跟樂高標準小車相反:改成「擴充孔 2」設反裝(官方 App/Pybricks 把 set_motor_inverted(1, True) 的 1 改成 2;MBC 積木網站把「安裝方向」積木的擴充孔改成 2),接線不用動。
  • 轉不到 90 度 / 轉超過? → 地面打滑或輪子大小不一樣。把 180 改大一點(轉不夠)或改小一點(轉太多),一次改 5~10。
  • 邊長不一樣長? → 把 720 改大或改小。720 度 ≈ 35 公分,每 100 度大約 5 公分。

其他問題

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

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

下載

本頁依據

  • 主機與軟體清單:_build/guides.json
  • 安裝與設定:_build/guides/software/spike-pybricks.zh.md、_build/guides/product/exp6/spike-pybricks.zh.md
  • 範例:sensors/exp6/spike-examples.md
LINE 詢價選購指南