MBC Servo6 多路舵機擴充器 × Pybricks

三個步驟用 MicroPython 控制 6 顆舵機

寫 Pybricks 程式一定照這個順序:先匯入函式庫,再建立物件、幫擴充板取名字,最後才用這個名字去呼叫功能。左邊一步一步做,右邊的程式會跟著長出來;模擬擴充板上的舵臂會照程式轉動,也可以用滑鼠拖動舵臂,看程式會印出什麼。

你的主機:
這塊擴充板只能接 SPIKE Prime(Pybricks 韌體 v4.0 以上),EV3 不能用。
1

匯入函式庫

程式的第一件事是告訴 Pybricks「我要用 Servo6 的函式庫」。沒有這行,後面寫的 MBC_SERVO6 主機看不懂,會出現 NameError。

  1. 下載函式庫(存成檔案,檔名不要改):MBC_servo6_Lib.py;檔名是 MBC_servo6_Lib.py。
  2. 在 Pybricks Code 左邊檔案區按「Import a file」,把它匯入同一個專案。
  3. 檔名不要改,也不要放進子資料夾。
  4. 回到主程式,在最上面寫下面這幾行(右邊程式標 ① 的地方)。

主機的 Pybricks 韌體要 v4.0 以上,太舊的韌體沒辦法供電給舵機。函式庫檔案約 25 KB,按執行上傳要多等一下。

2

建立物件:幫擴充板取名字

一台車可能接好幾塊擴充板和感應器,所以要「建立一個物件」:告訴程式擴充板接在主機哪個孔,並幫它取個名字。之後每次要轉舵機、讀電流,都是叫這個名字。

擴充板接在主機哪個孔?

要不要開啟多工?

程式裡的 3 就是主機的孔位:SPIKE 1~6 = A~F,3 就是 C 埠。這裡只能寫數字,不能寫成 Port.C。

第一次執行時電腦畫面會問 Custom electronics may damage your LEGO hub ... Press Y to proceed.:按 Y(只要一次,主機會記住)。這是讓主機從孔位供電給舵機,按 N 舵機不會有電。

3

使用功能

寫法都是「servo6.功能名稱(孔, …)」:名字+小數點+功能。括號裡第一個數字是擴充板上的舵機孔 1 ~ 6(板子上印 CN1 ~ CN6),跟主機的孔位是兩回事。點一個功能,程式和輸出會換成它的範例。

模擬擴充板(6 個舵機孔各接一顆舵機):看程式怎麼轉舵臂,也可以用滑鼠拖舵臂

模擬畫面是示意:轉動速度、電流大小都簡化過,實際數字看舵機型號。1 號、3 ~ 6 號是一般 180 度舵機,2 號是 360 度連續旋轉舵機(這顆要 1520 µs 才會停)。舵臂橘色 = 有出力、灰色 = 放鬆、紅色 = 判定卡住。有出力時拖它,舵機會頂住、電流變大,放開會轉回去;放鬆時拖到哪就停在哪。

每個功能的範例

15 個功能,每個都有一段可以直接放進程式的範例。按「試試看」會切到第 3 步,右邊的程式和輸出會換成這個範例,模擬擴充板也會照著跑。

完整範例

夾子夾 3 次(1 號舵機當夾子)

        

!只改最上面「要改的地方」就好。夾不緊:把 CLOSE 調大;夾到東西時電流很大、舵機發燙:調小一點。一般寫法的程式最後一定要 stop_all()。

多工寫法(進階)

        

!建立物件時第 2 個參數寫 True,物件要放在 run_task() 外面;每個功能前面都要加 await。函式庫的 run_task 要寫在 pybricks.tools 那行下面,程式結束、出錯、按停止鍵時 6 顆舵機都會自動放鬆。

6 顆舵機輪流動

        

!一顆一顆輪流動,總電流比較不會一下衝太高(擴充板的電源保護大約在 750 mA 限流)。360 度舵機不要接在這個範例用到的孔:它收到角度指令會一直轉。

使用注意

  1. 拔線不會讓程式停。擴充板讀不到時,讀值的功能回傳 0 或 False(拔掉不到 0.4 秒還是上一次的值),轉舵機的指令會被略過;電腦畫面先印 [SERVO6] Port C(孔3)連線中斷 / Servo board disconnected,之後每秒最多印一次「未偵測到擴充板」。插回去會自動重新連線(印「已重新連線」),並重送 servo_calibrate()、servo_stall_config() 的設定。要知道有沒有連上,看 servo6.connected(True/False,後面不加括號,多工也不加 await)。只送指令、不讀值的程式也一樣:下指令前函式庫會確認擴充板還在,插回去會自動重新連線並重送設定;拔線時 servo_wait() 約 0.4 秒就往下,不會卡住。在右邊勾「拔掉擴充板」可以看到這些情形。
  2. 程式結束前要放鬆舵機。擴充板沒有看門狗,程式結束後舵機會停在最後的角度。一般寫法在程式最後呼叫 stop_all();多工寫法改成 from MBC_servo6_Lib import MBC_SERVO6, run_task(寫在 pybricks.tools 那行下面),結束、出錯、按停止鍵都會自動放鬆。
  3. 一模一樣的指令只算一次。擴充板會略過跟上一包完全相同的指令,所以迴圈裡一直送同一個角度不會怎樣。但舵機卡住、被自動放鬆之後,迴圈一直送同一個角度不會重新出力:要送一個不同的角度,或先 servo_release() 再送。
  4. 速度 1 ~ 99 才會「慢慢轉」。速度 = 每秒轉「速度 × 6」度;不寫或寫 100 就用舵機最快的速度直接轉過去。剛開始、或這個孔放鬆過之後的第一個角度指令,一律直接轉過去(擴充板不知道舵臂原本停在哪)。is_moving()、servo_wait() 看的是擴充板自己算的進度,舵機沒有位置感應器,被擋住了也不會知道。
  5. 電源:舵機的電從主機經過擴充板供應,6 顆加起來大約 750 mA 會限流。很多顆同時動、或有舵機卡住時,用 get_total_current()、is_power_fault() 看看。擴充板上 1 號在最左邊(模擬畫面也是)。