MBC EXP6 六路馬達擴充器 × Pybricks 積木

三個步驟用 Pybricks 積木控制 EXP6

積木跟 MicroPython 一樣照這個順序:先在「set up」下面匯入函式庫,再建立物件、幫 EXP6 取名字,最後在「program」下面用這個名字呼叫功能(轉馬達、讀感應器)。左邊一步一步做,右邊的積木會跟著長出來;這些積木圖是直接從 Pybricks Code 拼好匯出的,跟你在畫面上看到的一樣。

先確認:Pybricks 的積木模式要授權碼或 Patreon 贊助才能用。沒有授權可以改寫 MicroPython,寫法一模一樣(右邊切到「對應的 MicroPython」就看得到)。EXP6 只能接 SPIKE Prime 主機,而且要接上 EXP6 自己的電池,馬達才會動。

1

匯入函式庫

積木程式的第一件事,是在黃色「set up」下面接一塊紅色的「from … import …」積木,告訴 Pybricks 要用 EXP6 的函式庫。只接樂高馬達和感應器時只要這一個;插 MBC 感應器時再多匯入產品檔(見下面「MBC 感應器插在 EXP6」)。

  1. 下載函式庫(存成檔案,檔名不要改):MBC_exp6_obj_Lib.py;檔名是 MBC_exp6_obj_Lib.py。
  2. 在 Pybricks Code 左邊檔案區按「Import a file」,把它匯入同一個專案,檔名不要改。
  3. 按「+」新增檔案,選用積木(blocks)寫。
  4. 從積木清單拖出紅色的「from … import …」,接在「set up」下面,前面選 MBC_exp6_obj_Lib、後面選 MBC_EXP6。

下載積木檔(完整範例):ex01 轉一圈、ex02 三顆馬達、ex03 光控開關、ex04 按鈕控制、ex05 走正方形。在 Pybricks Code 按「Import a file」匯入,跟 MBC_exp6_obj_Lib.py 放同一個專案,打開就是積木。範例裡有等待,所以都是多工(true),也多接了一塊「from MBC_exp6_obj_Lib import run_task」,等待時才會送心跳。

2

建立物件:幫 EXP6 取名字

再拖一塊紅色的「… is a …」積木接在匯入積木下面:最左邊是你幫 EXP6 取的名字,後面是主機的孔位和要不要多工。之後每次轉馬達、讀感應器,都是選這個名字。

EXP6 的 Host 線插在主機哪個孔?

幫它取名字(Pybricks 裡可以取任何英文名字,這裡用三個示範):

要不要開啟多工?(積木上綠色的 true/false)

孔位那格填的是主機的孔:SPIKE 1~6 = A~F,3 就是 C 埠。功能積木裡填的第一個數字,才是 EXP6 上的擴充孔 1~6,兩個不要搞混。

3

使用功能

在「program」下面放紅色的功能積木:第一格選名字 exp6,中間選 await,最後一格選功能,再按右邊的「>」多出格子填參數(第一個通常是擴充孔 1~6)。點一個功能,積木和輸出會換成它的範例。

模擬 EXP6(從上面看):選每個擴充孔接什麼,看馬達怎麼轉、右邊印出什麼

一開始孔 1、2 接馬達,孔 4 顏色、孔 5 超音波、孔 6 力量感應器,跟範例程式用的孔一樣。模擬畫面是示意:馬達速度 1% 當成每秒 10 度(實際要看馬達型號),感應器的數值也簡化過;紅色指針是轉軸的朝向,↻ = 順時針。拔掉擴充板時馬達會停,讀到的值都變成 0(不是上一次的值)。程式跑完後大約 0.5 秒,EXP6 的看門狗會讓馬達停下(轉角度還沒轉完的會先轉完)。

每個功能的積木範例

33 個功能,每個都有一組可以照著拼的積木(名字 exp6、多工 true)。轉馬達、停止這類動作多半放在 program 下面只做一次;讀值放進 repeat 迴圈一直讀。按「試試看」會切到第 3 步,右邊的積木和輸出會換成這個範例。

MBC 感應器插在 EXP6(循行者、測距者、掌控者、神攝手)

主機的孔不夠用時,MBC 感應器可以直接插在 EXP6 的 1~6 號孔,跟插在主機上一樣,插上就能用、不用另外設定。EXP6 韌體要 2026-11-03 以後。寫法跟上面一樣是三步:選感應器、選它插在 EXP6 的幾號孔、選功能,右邊的積木和程式會跟著換。積木都是從 Pybricks Code 拼好匯出的;積木版一律開多工(true)。

1

匯入:核心函式庫+這款的產品檔

插在 EXP6 上的是哪一款?

「set up」下面要接三塊紅色的「from … import …」:前兩塊從核心 MBC_exp6_obj_Lib 匯入 MBC_EXP6 和 run_task(run_task 是 EXP6 函式庫的,等待時會在背景送心跳),第三塊只匯入插上去那一款的產品檔。為什麼分成好幾個檔:Pybricks 主機的程式(你的程式加上全部函式庫)上限大約 52 KB,全部放進去會超過,所以用到哪款才載入哪款。

    2

    建立物件:先 EXP6,再感應器

    感應器插在 EXP6 的幾號孔?

    兩個數字不要搞混:MBC_EXP6 那塊的 3 是主機的孔(EXP6 的 Host 線插 C 孔,跟上面的教學一樣);感應器那塊的數字才是 EXP6 上的孔 1~6。

    3

    使用功能:名稱跟直插主機一樣

    完整範例:循行者 8 路插 EXP6 第 5 孔做 PD 循線

    PD 循線:積木與對應的 MicroPython

    函式名稱、回傳值都跟感應器直接插主機時一樣(例如循行者的 pos100()、width())。多工模式每個函式前面都要加 await,等待直接用 wait:匯入的 run_task 是 EXP6 函式庫的,會在背景送心跳,馬達不會被看門狗停掉。

    exp61truetrueline8awaitwidth5>exp610exp620awaitmotor_powerawaitmotor_powererrorline8awaitpos100PDerrorKP×errorlastError−KD×+exp61SPEEDPD+exp62SPEEDPD−lastErrorerrorset toawaitmotor_powerawaitmotor_powerset toset to10mswaitifelserepeatwhileawaitset_motor_inverted只匯入用到的產品檔:主機程式上限約 52 KB,循行者只要 MBC_exp6_line(EXP6_LINE8)。EXP6_LINE8(exp6...接線:EXP6 的 Host 線插主機 C 孔;循行者 8 路(SPIKE 模式)插 EXP6 第 5 孔;左馬達接 EXP6 擴充孔 1(反...program
    from pybricks.hubs import PrimeHub
    from pybricks.tools import multitask, run_task, wait
    
    from MBC_exp6_line import EXP6_LINE8
    from MBC_exp6_obj_Lib import MBC_EXP6, run_task
    
    # Set up.
    hub = PrimeHub()
    exp6 = MBC_EXP6(3, True)
    line8 = EXP6_LINE8(exp6, 5)
    SPEED = 50
    KP = 0.4
    KD = 1.5
    error = 0
    lastError = 0
    PD = 0
    
    async def main():
        global error, PD, lastError
        # 接線:EXP6 的 Host 線插主機 C 孔;循行者 8 路插 EXP6 第 5 孔;左馬達接 EXP6 擴充孔 1(反裝)、右馬達接擴充孔 2
        # 只匯入用到的產品檔:主機程式上限約 52 KB,循行者只要 MBC_exp6_line(EXP6_LINE8)。EXP6_LINE8(exp6, 5) = 插在 exp6 的 5 號孔
        await exp6.set_motor_inverted(1, True)
        while True:
            await wait(0)
            if await line8.width() > 5:
                await exp6.motor_power(1, 0)
                await exp6.motor_power(2, 0)
            else:
                error = await line8.pos100()
                PD = error * KP + (error - lastError) * KD
                await exp6.motor_power(1, SPEED + PD)
                await exp6.motor_power(2, SPEED - PD)
                lastError = error
            await wait(10)
    
    
    run_task(main())

    下載這個範例:積木檔 exp6_line8_pd_block.py、Python 檔 exp6_line8_pd_python.py(PD 循線:左馬達接擴充孔 1、右馬達接擴充孔 2;在 Pybricks Code 按「Import a file」匯入,跟 MBC_exp6_obj_Lib.py、MBC_exp6_mbc_common.py、MBC_exp6_line.py 放同一個專案)。

    使用注意

    1. 函式庫檔要先匯入專案。沒有匯入 MBC_exp6_obj_Lib.py,紅色積木裡選不到 MBC_EXP6。
    2. await 和 call 要跟多工一致:多工 true 就選 await,多工 false 就選 call。混著用,程式會在主機上出錯。
    3. 等待用 keep_alive_wait 功能,不要用 wait 積木等很久。EXP6 超過 0.5 秒沒收到主機的訊號,會讓馬達自己停下來(看門狗)。積木的多工版要在 set up 多拖一塊「from MBC_exp6_obj_Lib import run_task」(下載的積木範例檔都有):這樣用的是函式庫的 run_task,背景會自動送心跳,直接用 wait 積木就好,程式結束時馬達也會馬上停。沒有這塊時用的是 Pybricks 自己的 run_task,背景不送心跳,要等超過 0.5 秒就要改用功能積木 keep_alive_wait。
    4. 兩種孔號不要搞混:「is a」積木填的是主機的孔(1~6 = A~F);功能積木填的第一個數字是 EXP6 上的擴充孔。EXP6 的擴充孔可以接樂高馬達、樂高的顏色/超音波/力量感應器,也可以接 MBC 感應器(見上面「MBC 感應器插在 EXP6」)。
    5. 拔掉擴充板不會讓程式停:讀到的值變成 0(不是上一次的值),電腦畫面每秒最多印一行提醒,插回去自己重新連線。轉角度(motor_run_degrees、motor_track_target)送出就往下做,不會等轉完,後面要接 keep_alive_wait 等它轉完。積木沒辦法讀 connected 屬性,也不能呼叫物件的 run_task,要用請改寫 MicroPython。