網際網路應用:一支搖桿如何可靠地控制一台 Q霸小車?
「遙控車」看似只是硬體活動,其實是一個縮小版的網際網路系統:裝置收集輸入、封裝成訊息、透過無線網路傳送、接收端解讀資料並做出行動。本教材從 Joystick:bit × Q霸小車 V1~V5,認識網際網路應用最重要的可靠性、安全性與多人協作問題。
一、學習目標
- 說明感測端、傳輸端、服務端與致動端的角色。
- 理解廣播群組、鍵值訊息、回覆確認與逾時處理。
- 以「安全優先」思維分析物聯網應用。
- 設計多人共用場域的一對一裝置配對方案。
二、一台遙控車就是一個網路應用
| 系統角色 | 本案例 | 網路概念 |
|---|---|---|
| 輸入端 | Joystick:bit x、y 軸與四鍵 | 資料產生者 |
| 傳輸端 | micro:bit Radio | 無線通道與群組 |
| 處理端 | 小車端 Python 程式 | 訊息解析、狀態機、規則 |
| 輸出端 | 馬達、燈號、蜂鳴器 | 服務回應與人機介面 |
三、V1~V5 對應的網路議題
- V1|訊息傳遞:搖桿將 x、y 值以鍵值訊息送出,小車依名稱接收。
- V2|可靠性:死區避免雜訊;超過 0.5 秒未收到訊息便停車,這就是逾時偵測。
- V3|邊緣運算:小車本地讀取超音波距離,快速做出降速或停止決策。
- V4|事件驅動:C、D、E、F 鍵不是持續輪詢,而是在按下事件發生時更新系統狀態。
- V5|識別與回覆:以
pairId選擇專屬群組,並用pair / ack做握手確認。
四、資料封包設計:不要只傳數字
有意義的訊息必須包含「名稱」與「值」。例如 ("x", 35) 表示向右 35,("stop", 1) 表示緊急停止。這種設計比只傳一串數字更容易除錯與擴充。
# 搖桿端
radio.send_value("x", x)
radio.send_value("y", y)
radio.send_value("stop", 1)
# 小車端
if name == "x":
xValue = value
elif name == "stop":
emergencyStop = value == 1
討論:如果未來要加入「車燈」、「任務開始」與「低電量」,應如何命名訊息?請提出一份小組通訊協定表。
五、可靠性與安全性:先判斷不能做什麼
真正的網路應用不能假設每個封包都會到達。小車端的決策順序應為:
未配對/緊急停止 → 斷線停車 → 避障 → 一般控制
if emergencyStop:
cuteBot.motors(0, 0)
elif control.millis() - lastControlTime > 500:
cuteBot.motors(0, 0)
elif yValue > 0 and distance <= 15:
cuteBot.motors(0, 0)
else:
cuteBot.motors(leftSpeed, rightSpeed)
六、多人同時使用:廣播群組就像班級頻道
若所有設備都使用群組 51,一位學生的搖桿可能控制全班的小車。V5 將每一組設備設為專屬頻道:
pairId = 3
radio.set_group(100 + pairId) # 第 3 組使用群組 103
radio.send_value("pair", pairId)
# 小車確認後:radio.send_value("ack", pairId)
這相當於網路上的「位址+連線確認」。雖然不是完整的 TCP/IP,卻已經具備辨識對象、建立關係與回覆確認的核心精神。
七、3 小時課堂任務
- 30 分鐘:畫出 V5 的資料流,標記每一種訊息與方向。
- 50 分鐘:完成兩組小車同時運作,驗證不互控。
- 40 分鐘:刻意關閉搖桿或遮住超音波,記錄安全機制的反應。
- 40 分鐘:設計一項新服務,例如車位預約、任務通知或低電量警示。
- 20 分鐘:用「問題、資料、規則、結果」分享設計。
沒有留言:
張貼留言