SPIKE 新手範例:神攝手 WRO 版(HUE12)
回到神攝手產品頁 | 手上是學校老師創意賽版?請看 學校版新手範例
WRO 版(HUE12)一次看 12 個點(12 格) 的顏色:你在畫面上指定 12 個位置,它就告訴你每個位置現在是什麼顏色。這一頁是寫給完全沒寫過程式的人,5 個範例從「看到一個數字」開始,一步一步做到「看物塊顏色決定從哪邊繞過」。每個範例都有 3 種寫法:
| 寫法 | 適合誰 | 怎麼打開範例檔 |
|---|---|---|
| 🟨 樂高官方 SPIKE App(Python) | 學校、只能用官方 App 的人 | 下載 .llsp3 → 打開 SPIKE App → 左上「檔案」→「開啟」→ 選檔案(打開後是 Python 程式) |
| 🟦 MBC 積木網站(中文積木) | 想用積木寫 HUE12 的人(最推薦新手) | 打開 MBC SPIKE 積木網站 → 上方選單「檔案 → 開啟」(或按 Ctrl+O)→ 選下載的 .abp |
| 🐍 Pybricks(Python 文字程式) | 想學打字寫程式的人 | 打開 code.pybricks.com → 左邊檔案區的「Import a file(匯入檔案)」→ 範例檔和 MBC_hue12_Lib.py 兩個都要匯入 → 點開範例 → 按 ▶ 執行 |
重要
- 樂高官方 App 沒有 HUE12 可以用的積木(HUE12 不是樂高的感應器),所以官方 App 的範例是 Python 程式(教育版 SPIKE 3 App 的 Python)。想用積木的話,請用 MBC 積木網站。
- MBC 積木網站與 Pybricks 要先把主機換成 Pybricks 韌體 v4.0.0b5 以上。MBC 積木網站上方選單「SPIKE 主機 → 安裝/更新 Pybricks 韌體」燒的是 v4.1.0,可以直接用(約 3 分鐘;之後也能用 SPIKE App 換回樂高原廠韌體)。官方 App 不用換。
開始之前:在感應器上設定 12 格的位置
每一格是畫面上的一個點。你要先用感應器機身的按鍵告訴它「第 1 格看哪裡、第 2 格看哪裡……」。設定會記在感應器裡,重新開機也還在。
先做這 2 件事
- 先把感應器插上主機、主機開機,感應器螢幕出現鏡頭畫面、上方顯示
RUN MODE才能設定。 - 按鍵:機身有 左、確認(中)、右 三顆,加上一顆側鍵。側鍵短按=進選單/回上一層。
設定第 1 格(其他格一樣)
RUN MODE畫面短按側鍵 → 上方出現SET MODE S1 [..]([ON]=這格已經設定過)。用 左/右 可以換成 S2~S12。- 按 確認 →
SET X:用 左/右 把紅色直線移到要看的位置(按住會快速移動)。 - 按 確認 →
SET Y:用 左/右 把綠色橫線移到要看的位置。 - 按 確認 →
TOL [Live]:畫面上跟這一點同色的地方會變綠色,用 左/右 調到只有你的物塊變綠。 - 按 確認 存好、回到
RUN MODE。畫面上這一點會出現一個小十字。 - 不要用的格子:在選單選到那一格,側鍵長按 1 秒就清掉。
提示
- 範例 1、2、4、5 只用第 1 格:請把第 1 格設在車子正前方、物塊會出現的位置。
- 範例 3 會檢查全部 12 格,多設幾格(例如排成一排)會比較好玩。
- 在選單裡的時候,12 格全部會變成 255(沒設定),程式會以為什麼都沒看到。設定完一定要回到
RUN MODE再跑程式。- 畫面上下顛倒:選單切到最後的
SET MODE CAM→ 按確認 → 用左右找到V-Flip,按確認切成 ON。補光燈是同一個選單的Flash LED,很亮、積木會反光,先不要開。
這頁會用到的數值
每一格都有 2 個數字:
| 名稱 | 範圍 | 意思 |
|---|---|---|
| 色相 | 0 ~ 255 | 0~239=彩色(紅 0 附近和 230~239、黃約 40、綠約 80、青約 120、藍約 160、洋紅約 200);240~245=白;246~250=黑;255=這一格沒設定 |
| 飽和度 | 0 ~ 255 | 顏色多鮮豔,越大越鮮豔 |
提示
紅色在色相的頭和尾(0 附近、230~239 也是紅),所以判斷紅色要寫成「色相 < 10 或 色相在 230~239」。240 以上不是紅,是白、黑或沒設定。
Pybricks 的函式庫還會直接給你顏色名稱:Red(紅)、Org(橘)、Yel(黃)、Lim(黃綠)、Grn(綠)、Mnt(薄荷綠)、Cyn(青)、Azr(天藍)、Blu(藍)、Prp(紫)、Mag(洋紅)、Pnk(粉紅)、Wht(白)、Blk(黑)、NONE(沒設定)。
範例 1:讀第 1 格的色相
這個範例會做什麼:主機螢幕一直顯示第 1 格看到的色相;電腦畫面也會印出色相和飽和度。
要準備什麼
- SPIKE 主機 1 台
- HUE12 1 個(已設定第 1 格)
- 紅、綠、藍、白、黑色的積木各一塊
怎麼接:HUE12 插 C 孔。
下載程式
| 樂高官方 App(Python) | MBC 積木網站 | Pybricks |
|---|---|---|
| ex01_show_slot1.llsp3 | ex01_show_slot1.abp | ex01_show_slot1.py+函式庫 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
from hub import light_matrix
cam = HUE12(port.C) # HUE12 插在 C 孔
while True:
cam.update() # 讀一次最新資料
hue = cam.hue(1) # 第 1 格的色相
print(hue, cam.sat(1)) # 電腦畫面印出 色相、飽和度
light_matrix.write(str(hue)) # 主機螢幕顯示色相
utime.sleep_ms(500) # 等 0.5 秒🟦 MBC 積木網站的積木

Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 1:讀第 1 格的色相(顯示在主機螢幕)
# 接線:HUE12 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Port
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C) # HUE12 插在 C 孔
while True:
cam.update() # 讀一次最新資料
name, hue, sat = cam.get_slot(1) # 第 1 格:顏色名稱、色相、飽和度
print(name, hue, sat) # 電腦畫面印出,例如 Red 5 200
hub.display.text(str(hue)) # 主機螢幕一個字一個字顯示色相
wait(500)一步一步看懂程式
- 讀資料:官方 App 和 Pybricks 先
cam.update()(讀一次最新的 12 格),再拿第 1 格;MBC 積木網站直接用「神攝手HUE12 C 第 1 格色相」積木。 - 顯示:主機螢幕一個字一個字顯示色相,電腦畫面也印出來。
- 等 0.5 秒再讀下一次。
- 官方 App 程式最上面那一大段是「讀 HUE12 的小工具」(官方 App 不能匯入別的檔案,所以每支程式都要帶著它),照抄就好,不用改。
跑起來應該看到什麼:紅色積木 0~9 或 230~239;綠色 80 左右;白紙 240~245;黑色 246~250;這一格沒設定是 255。
常見問題
- 一直是 255? → 第 1 格沒設定,或感應器還在選單裡(回到
RUN MODE)。 - Pybricks 一直顯示 255、印出
Connected to ID:後面不是 95? → 主機的 Pybricks 韌體太舊,請更新到 v4.0.0b5 以上。
範例 2:第 1 格是不是紅色
這個範例會做什麼:第 1 格看到紅色 → 主機中間的燈亮紅色並嗶一聲;其他顏色 → 關燈。
要準備什麼:同範例 1。 怎麼接:HUE12 插 C 孔。
下載程式
| 樂高官方 App(Python) | MBC 積木網站 | Pybricks |
|---|---|---|
| ex02_is_red.llsp3 | ex02_is_red.abp | ex02_is_red.py+函式庫 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
import color
from hub import light, sound
cam = HUE12(port.C)
while True:
cam.update()
hue = cam.hue(1)
if hue < 10 or (hue >= 230 and hue < 240): # 紅色在色相的兩端:0~9 和 230~239
light.color(light.POWER, color.RED) # 中間按鈕燈變紅
sound.beep(880, 100, 100) # 嗶一聲(880 Hz、0.1 秒、音量 100)
else:
light.color(light.POWER, color.BLACK) # 黑色 = 關燈
utime.sleep_ms(200)🟦 MBC 積木網站的積木

Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 2:第 1 格是紅色就亮紅燈、嗶一聲
# 接線:HUE12 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Color, Port
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C)
while True:
cam.update()
name, hue, sat = cam.get_slot(1)
if hue < 10 or 230 <= hue < 240: # 紅色在色相的兩端:0~9 和 230~239(240 以上是白、黑、沒設定)
hub.light.on(Color.RED)
hub.speaker.beep(880, 100)
else:
hub.light.off()
wait(200)一步一步看懂程式
- 讀第 1 格的色相。
- 如果 色相 < 10,或 色相在 230~239 之間 → 紅色:亮紅燈、嗶一聲。
- 否則 → 關燈。
- 等 0.2 秒再檢查。
跑起來應該看到什麼:紅色積木放到第 1 格的位置 → 紅燈+嗶;換成其他顏色 → 燈熄掉。
常見問題
- 橘色也會嗶? → 橘色約 10~30,把「10」改小一點(例如 6)。
- Pybricks 有沒有更簡單的寫法? → 有:
if name == "Red":,函式庫會幫你判斷(範圍跟上面一樣)。
範例 3:12 格裡有幾格看到顏色
這個範例會做什麼:一格一格檢查 12 格,數出有幾格看到彩色(不算白、黑、沒設定),把數字顯示在主機螢幕上。
要準備什麼:同範例 1,多設定幾格(例如第 1~4 格排成一排),再放幾塊彩色積木。
怎麼接:HUE12 插 C 孔。
下載程式
| 樂高官方 App(Python) | MBC 積木網站 | Pybricks |
|---|---|---|
| ex03_count_colors.llsp3 | ex03_count_colors.abp | ex03_count_colors.py+函式庫 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
from hub import light_matrix
cam = HUE12(port.C)
while True:
cam.update()
count = 0 # 先歸零
for slot in range(1, 13): # 第 1 格到第 12 格,一格一格檢查
if cam.hue(slot) < 240: # 小於 240 = 彩色(240 以上是白、黑、沒設定)
count = count + 1
print(count)
light_matrix.write(str(count)) # 主機螢幕顯示有幾格是彩色
utime.sleep_ms(500)🟦 MBC 積木網站的積木

Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 3:12 格裡有幾格看到顏色(彩色)
# 接線:HUE12 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Port
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C)
while True:
cam.update()
count = 0 # 先歸零
for slot in range(1, 13): # 第 1 格到第 12 格,一格一格檢查
name, hue, sat = cam.get_slot(slot)
if hue < 240: # 小於 240 = 彩色(240 以上是白、黑、沒設定)
count = count + 1
print(count)
hub.display.number(count) # 主機螢幕顯示有幾格是彩色(0~12)
wait(500)一步一步看懂程式
- 「彩色格數」先歸零。
- 重複 12 次,每次檢查一格:官方 App 和 Pybricks 用
for slot in range(1, 13)(slot 會依序是 1、2、……12);MBC 積木網站用變數「第幾格」從 1 開始,每做完一次加 1。 - 如果 這一格的色相 < 240(彩色)→ 彩色格數加 1。
- 12 格都看完 → 把彩色格數顯示在螢幕上。
跑起來應該看到什麼:4 格裡放 2 塊彩色積木 → 顯示 2;再放一塊 → 3。白紙、黑色積木不算。
常見問題
- 數字比我放的積木還多? → 有些格子看到的是彩色的背景(例如場地的彩色線);把那幾格清掉(選單裡側鍵長按 1 秒)。
- 為什麼用 240 當分界? → 240 以上是白(240~245)、黑(246~250)和沒設定(255),都不是彩色。
範例 4:依顏色轉向
這個範例會做什麼:第 1 格看到紅色 → 原地右轉;看到綠色 → 原地左轉;其他 → 停。
要準備什麼
- 範例 1 的東西,再加上兩輪小車(兩顆馬達當輪子),HUE12 裝在車頭、鏡頭朝前
- 紅色、綠色的物塊
怎麼接:HUE12 插 C 孔;左輪接 E、右輪接 F。
下載程式
| 樂高官方 App(Python) | MBC 積木網站 | Pybricks |
|---|---|---|
| ex04_turn_by_color.llsp3 | ex04_turn_by_color.abp | ex04_turn_by_color.py+函式庫 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
import motor_pair
cam = HUE12(port.C)
motor_pair.pair(motor_pair.PAIR_1, port.E, port.F) # 左輪 E、右輪 F 配成一組
while True:
cam.update()
hue = cam.hue(1)
if hue < 10 or (hue >= 230 and hue < 240): # 紅色 → 原地右轉
motor_pair.move(motor_pair.PAIR_1, 100, velocity=200)
elif hue >= 60 and hue <= 110: # 綠色 → 原地左轉
motor_pair.move(motor_pair.PAIR_1, -100, velocity=200)
else: # 其他 → 停
motor_pair.stop(motor_pair.PAIR_1)
utime.sleep_ms(50)🟦 MBC 積木網站的積木

Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 4:依顏色轉向(紅色右轉、綠色左轉、其他停)
# 接線:HUE12 → 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_hue12_Lib import HUE12Sensor
cam = HUE12Sensor(Port.C)
left = Motor(Port.E, Direction.COUNTERCLOCKWISE) # 左輪:反過來裝,所以設成逆時針才是往前
right = Motor(Port.F)
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)
while True:
cam.update()
name, hue, sat = cam.get_slot(1)
if hue < 10 or 230 <= hue < 240: # 紅色 → 原地右轉(每秒 60 度)
robot.drive(0, 60)
elif 60 <= hue <= 110: # 綠色 → 原地左轉
robot.drive(0, -60)
else: # 其他顏色、白、黑、沒設定 → 停
robot.stop()
wait(50)一步一步看懂程式
- 告訴主機輪子接在哪裡:官方 App 是
motor_pair.pair(…, port.E, port.F);MBC 積木網站和 Pybricks 是「移動底盤 左輪 E、右輪 F」。 - 讀第 1 格的色相。
- 如果 紅色 → 原地右轉(官方 App:steering 100、輪子每秒 200 度;另外兩種:車身每秒轉 60 度)。
- 否則如果 綠色(色相 60~110)→ 原地左轉。
- 否則 → 停。
跑起來應該看到什麼:紅色物塊放到車頭前 → 車子往右轉,轉到看不到紅色就停;綠色物塊 → 往左轉。
常見問題
- 綠色沒反應? → 先用範例 1 看你的綠色是多少,把「60~110」改成包含它的範圍。
- 轉的方向反了? → 馬達裝法跟樂高標準小車相反。官方 App:把 100 和 -100 對調;MBC 積木網站:「移動底盤」積木裡左右輪的「正轉」方向都換成另一個;Pybricks:左輪改成
Direction.CLOCKWISE、右輪改成Motor(Port.F, Direction.COUNTERCLOCKWISE)。
範例 5:看物塊顏色,決定從哪邊繞過(WRO 常見用法)
這個範例會做什麼:車子慢慢往前走。前面出現紅色物塊 → 從右邊繞過;綠色物塊 → 從左邊繞過;繞完繼續往前。WRO 很多題目都會用「看顏色決定走哪一邊」(例如未來工程師組的紅綠交通號誌柱),這是最基本的寫法。
要準備什麼:同範例 4,場地上放幾個紅色、綠色的物塊(間隔 40 公分以上)。
怎麼接:HUE12 插 C 孔(第 1 格設在車頭正前方、約 15 公分遠的地面高度);左輪接 E、右輪接 F。
下載程式
| 樂高官方 App(Python) | MBC 積木網站 | Pybricks |
|---|---|---|
| ex05_wro_bypass.llsp3 | ex05_wro_bypass.abp | ex05_wro_bypass.py+函式庫 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
import motor_pair
from hub import light_matrix
cam = HUE12(port.C)
motor_pair.pair(motor_pair.PAIR_1, port.E, port.F)
def go(steering, ms):
"""用 steering(-100 左轉 ~ 0 直走 ~ 100 右轉)走 ms 毫秒,然後停"""
motor_pair.move(motor_pair.PAIR_1, steering, velocity=200)
utime.sleep_ms(ms)
motor_pair.stop(motor_pair.PAIR_1)
while True:
cam.update()
hue = cam.hue(1)
if hue < 10 or (hue >= 230 and hue < 240): # 紅色物塊 → 從右邊繞過
light_matrix.write("R")
go(100, 450) # 右轉約 45 度
go(0, 1500) # 直走約 15 公分
go(-100, 450) # 左轉回來
elif hue >= 60 and hue <= 110: # 綠色物塊 → 從左邊繞過
light_matrix.write("G")
go(-100, 450)
go(0, 1500)
go(100, 450)
else: # 沒看到物塊 → 慢慢往前
motor_pair.move(motor_pair.PAIR_1, 0, velocity=150)
utime.sleep_ms(20)🟦 MBC 積木網站的積木

Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 5:看前面物塊的顏色,決定從哪一邊繞過
# 紅色 → 從右邊繞、綠色 → 從左邊繞、沒看到 → 直走
# 接線:HUE12 → C 埠(第 1 格對準車子正前方);左輪馬達 → 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_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C)
left = Motor(Port.E, Direction.COUNTERCLOCKWISE)
right = Motor(Port.F)
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)
while True:
cam.update()
name, hue, sat = cam.get_slot(1)
if hue < 10 or 230 <= hue < 240: # 紅色物塊 → 從右邊繞過
hub.display.char("R")
robot.turn(45) # 右轉 45 度(正數右轉)
robot.straight(150) # 直走 150 mm
robot.turn(-45) # 左轉 45 度,車頭轉回原來的方向
elif 60 <= hue <= 110: # 綠色物塊 → 從左邊繞過
hub.display.char("G")
robot.turn(-45)
robot.straight(150)
robot.turn(45)
else: # 沒看到物塊 → 每秒 100 mm 往前
robot.drive(100, 0)
wait(20)一步一步看懂程式
- 讀第 1 格的色相。
- 如果 紅色 → 螢幕顯示 R → 右轉 45 度 → 直走 15 公分 → 左轉 45 度(車頭轉回原來的方向)。
- 否則如果 綠色 → 螢幕顯示 G → 左右反過來做一次。
- 否則(沒看到物塊)→ 慢慢直走。
- MBC 積木網站和 Pybricks 用「轉幾度」「走幾 mm」,會自己算好;官方 App 這裡用「走幾毫秒」(
go(100, 450)=右轉 0.45 秒),所以角度要自己試著調。
跑起來應該看到什麼:車子往前走,遇到紅色物塊往右閃開、遇到綠色物塊往左閃開,繞過去後繼續走。
常見問題
- 還沒繞過去就轉回來、撞到物塊? → 把直走的距離調長(150 → 200;官方 App 1500 → 2000)。
- 官方 App 轉的角度不對? → 改
go(100, 450)和go(-100, 450)的 450:數字越大轉越多。電池電量不同也會差一點,所以比賽建議用 Pybricks 或 MBC 積木網站。 - 一直繞同一個物塊? → 繞完後鏡頭又看到同一塊。把第 1 格的位置設低一點(靠近車頭),或把轉的角度加大。
要注意的事(請先看)
- 官方 App 的 Python 程式只做過語法檢查:我們用電腦確認程式沒有打錯字,也用模擬的資料跑過邏輯,但還沒有在真的 SPIKE App+主機上逐支跑過。讀感應器的方法(
device.data)跟 MBC 提供的官方範例Hue12_demo_For_Spike_v3.4.3一樣;燈號、聲音、馬達的寫法如果在你的 App 版本跑出錯誤,請跟我們說。 - 在選單裡 12 格都會是 255:程式執行中不要按感應器的側鍵。
- 每一格看的是「那一點附近同顏色的一整塊」的平均顏色。那一點如果剛好在物塊邊緣,顏色會不穩,把點移到物塊中間。
- 換了場地或燈光,顏色會變:重新檢查每一格(必要時重新設定
TOL)。
下一步
- 想同時看左、中、右三個位置:把第 1、2、3 格設在畫面左、中、右,照範例 3 的方法一格一格判斷。
- 神攝手的完整說明:產品頁