2026年9月3日 星期四

使用 Joystick:bit 擴充搖桿遙控 Q霸小車 V2

使用 Joystick:bit 擴充搖桿遙控 Q霸小車 V2

本實作使用兩片 micro:bit 進行無線通訊:一片裝在 Joystick:bit2 擴充搖桿,負責讀取搖桿方向;另一片安裝在 Q霸小車(CuteBot) 上,接收訊號後控制左右輪馬達。V2 再加入搖桿死區、斷線自動停車與三段速度,讓小車操作更穩定也更安全。

學習目標
了解 micro:bit 廣播通訊、類比搖桿讀值與雙輪差速控制,完成具備安全保護與速度切換功能的 Q霸小車。

一、材料準備

  • Q霸小車套件(CuteBot)× 1
  • Joystick:bit2 擴充搖桿 × 1
  • micro:bit × 2
  • 電池盒與電池 × 2

二、操作前準備

  1. 開啟 Microsoft MakeCode for micro:bit,分別建立「搖桿端」與「小車端」兩個專案。
  2. 在兩個專案中加入 Radio(廣播) 功能;搖桿端另加入 Joystick:bit 擴充功能,小車端加入 CuteBot 擴充功能。
  3. 兩端的廣播群組都設定為 51。群組號碼必須相同,才能互相通訊。
  4. 分別下載程式到兩片 micro:bit,再接上電池並開機。

三、搖桿端編程:死區、三段速度與訊號發送

搖桿的原始讀值介於 0~1023。本程式利用「對應」積木將數值換算為 -100~100,並先判斷搖桿是否落在中央的死區範圍,再依速度模式縮放輸出值,最後以廣播鍵值送出 xy

  • x 軸:控制左右轉向。
  • y 軸:控制前進與後退。
  • 死區 -10~10:數值位於此區間時歸零,避免小車自己緩慢移動。
  • 三段速度:按 A 鍵為慢速 40%、按 B 鍵為一般 70%、同時按 A+B 為快速 100%。
  • 廣播群組 51:作為搖桿與小車共用的無線頻道。
圖1 Joystick:bit 搖桿端積木程式(可依下列 V2 邏輯補強)

搖桿端 V2 積木邏輯

  1. 建立變數:xyspeed
  2. 啟動時設定 speed = 70,廣播群組設為 51。
  3. 按下 A:設定 speed = 40 並顯示 1;按下 B:設定 speed = 70 並顯示 2;按下 A+B:設定 speed = 100 並顯示 3。
  4. 重複無限次:讀取並對應 x、y 軸;若 x 或 y 介於 -10~10,將該值設為 0;最後分別將 x、y 乘以 speed ÷ 100 後廣播。

四、Q霸小車端編程:斷線自動停車與馬達控制

小車端收到廣播鍵值後,依名稱將數值分別存入 xValueyValue,同時記錄最後一次收到訊號的時間。若超過 500 毫秒沒有收到新訊號,便立刻停止兩輪馬達。

左輪速度 = yValue + xValue
右輪速度 = yValue − xValue

當搖桿向前推時,兩輪同向前轉;向右推時,左輪速度增加、右輪速度降低,小車便向右轉。向左、向後的原理相同。斷線停車能避免電池沒電、搖桿關機或超出廣播距離時,小車仍維持原方向行駛。

圖2 Q霸小車端積木程式

小車端 V2 積木邏輯

  1. 建立變數:xValueyValuelastReceiveTime
  2. 啟動時將廣播群組設為 51,並讓兩輪馬達停止。
  3. 當收到廣播鍵值:名稱為 x 時更新 xValue;名稱為 y 時更新 yValue;每次收到訊號都將 lastReceiveTime 設為「運行時間(毫秒)」。
  4. 重複無限次:若「運行時間 − lastReceiveTime」大於 500,設定左右輪速度都為 0;否則以 yValue + xValueyValue − xValue 控制左右輪。

五、MakeCode Python 程式碼

若要使用 Python 模式,請在 MakeCode 先加入 Joystick:bit 與 CuteBot 擴充功能,再分別建立兩個專案並貼上以下程式。

(一)Joystick:bit 搖桿端

x = 0
y = 0
speed = 70

radio.set_group(51)
basic.show_number(2)  # 開機預設為一般速度

def on_button_pressed_a():
    global speed
    speed = 40
    basic.show_number(1)  # 慢速
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
    global speed
    speed = 70
    basic.show_number(2)  # 一般速度
input.on_button_pressed(Button.B, on_button_pressed_b)

def on_button_pressed_ab():
    global speed
    speed = 100
    basic.show_number(3)  # 快速
input.on_button_pressed(Button.AB, on_button_pressed_ab)

def on_forever():
    global x, y

    x = Math.map(joystickbit.get_rocker_value(joystickbit.rockerType.X),
        0, 1023, -100, 100)
    y = Math.map(joystickbit.get_rocker_value(joystickbit.rockerType.Y),
        0, 1023, -100, 100)

    # 搖桿死區:回到中央時停止
    if x >= -10 and x <= 10:
        x = 0
    if y >= -10 and y <= 10:
        y = 0

    # 依速度模式縮放輸出值
    x = x * speed / 100
    y = y * speed / 100

    radio.send_value("x", x)
    radio.send_value("y", y)
    basic.pause(50)

basic.forever(on_forever)

(二)Q霸小車端

xValue = 0
yValue = 0
lastReceiveTime = -1000

radio.set_group(51)
basic.show_number(51)
cuteBot.motors(0, 0)

def on_received_value(name, value):
    global xValue, yValue, lastReceiveTime

    if name == "x":
        xValue = value
    elif name == "y":
        yValue = value

    # 每收到一筆資料就刷新最後接收時間
    lastReceiveTime = control.millis()

radio.on_received_value(on_received_value)

def on_forever():
    # 逾 0.5 秒未收到訊號,立即停車
    if control.millis() - lastReceiveTime > 500:
        cuteBot.motors(0, 0)
    else:
        leftSpeed = Math.constrain(yValue + xValue, -100, 100)
        rightSpeed = Math.constrain(yValue - xValue, -100, 100)
        cuteBot.motors(leftSpeed, rightSpeed)

basic.forever(on_forever)

測試提示:如果前後方向相反,將搖桿端 y 軸的對應範圍由 -100, 100 改為 100, -100;若左右相反,則反轉 x 軸範圍。

六、完成後的操作方式

圖3 Q霸小車與 Joystick:bit 擴充搖桿實體外觀
搖桿操作小車動作
向前推前進
向後拉後退
向左推左轉
向右推右轉
回到中央停止(死區保護)
按 A/B/A+B切換慢速/一般/快速模式
搖桿關機或超出距離0.5 秒後自動停車

七、除錯小提醒

  1. 小車沒有反應:先確認兩端廣播群組是否都為 51,以及兩片 micro:bit 是否都有供電。
  2. 前後方向相反:將 y 軸對應範圍由 -100~100 改為 100~-100,或將馬達速度乘以 -1。
  3. 左右方向相反:將 x 軸對應範圍反向,或在小車端交換加、減的運算方向。
  4. 停下仍會緩慢移動:先確認死區已設定為 -10~10;若仍有誤差,可加大為 -15~15。
  5. 小車經常自動停車:確認兩端群組號相同、電池電力充足,並將斷線判斷時間由 500 毫秒調整為 800 毫秒。

八、延伸挑戰

  • 按下搖桿按鍵時,讓小車發出聲音或亮起車燈。
  • 加入超音波避障:前方太近時,即使搖桿要求前進也自動停車。
  • 將小車改造成校園導覽車、農場巡檢車或智慧物流車,設計任務關卡。
教學重點:這個作品不是只讓小車「動起來」,而是把感測輸入、無線傳輸與馬達輸出串成完整的智慧控制系統。學生可從中理解物聯網裝置如何把人的操作,轉換成真實世界的行動。

沒有留言:

張貼留言