使用 Joystick:bit 擴充搖桿遙控 Q霸小車 V3
本實作使用兩片 micro:bit 進行無線通訊:一片裝在 Joystick:bit2 擴充搖桿,負責讀取搖桿方向;另一片安裝在 Q霸小車(CuteBot) 上,接收訊號後控制左右輪馬達。V3 保留搖桿死區、斷線自動停車與三段速度,再加入超音波安全避障,讓小車接近前方障礙物時能自動降速或停止。
了解 micro:bit 廣播通訊、類比搖桿讀值、超音波感測與雙輪差速控制,完成具備安全保護與速度切換功能的 Q霸小車。
一、材料準備
- Q霸小車套件(CuteBot)× 1
- Joystick:bit2 擴充搖桿 × 1
- micro:bit × 2
- 電池盒與電池 × 2
二、操作前準備
- 開啟 Microsoft MakeCode for micro:bit,分別建立「搖桿端」與「小車端」兩個專案。
- 在兩個專案中加入 Radio(廣播) 功能;搖桿端另加入 Joystick:bit 擴充功能,小車端加入 CuteBot 擴充功能。
- 兩端的廣播群組都設定為 51。群組號碼必須相同,才能互相通訊。
- 分別下載程式到兩片 micro:bit,再接上電池並開機。
三、搖桿端編程:死區、三段速度與訊號發送
搖桿的原始讀值介於 0~1023。本程式利用「對應」積木將數值換算為 -100~100,並先判斷搖桿是否落在中央的死區範圍,再依速度模式縮放輸出值,最後以廣播鍵值送出 x 與 y。
- x 軸:控制左右轉向。
- y 軸:控制前進與後退。
- 死區 -10~10:數值位於此區間時歸零,避免小車自己緩慢移動。
- 三段速度:按 A 鍵為慢速 40%、按 B 鍵為一般 70%、同時按 A+B 為快速 100%。
- 廣播群組 51:作為搖桿與小車共用的無線頻道。
搖桿端 V2 積木邏輯
- 建立變數:
x、y、speed。 - 啟動時設定
speed = 70,廣播群組設為 51。 - 按下 A:設定
speed = 40並顯示 1;按下 B:設定speed = 70並顯示 2;按下 A+B:設定speed = 100並顯示 3。 - 重複無限次:讀取並對應 x、y 軸;若 x 或 y 介於 -10~10,將該值設為 0;最後分別將 x、y 乘以
speed ÷ 100後廣播。
四、Q霸小車端編程:超音波安全避障、斷線停車與馬達控制
小車端收到廣播鍵值後,依名稱將數值分別存入 xValue、yValue,同時記錄最後一次收到訊號的時間。若超過 500 毫秒沒有收到新訊號,便立刻停止兩輪馬達;向前行駛時,超音波感測器會依前方距離自動降速或停車。
右輪速度 = yValue − xValue
當搖桿向前推時,兩輪同向前轉;向右推時,左輪速度增加、右輪速度降低,小車便向右轉。向左、向後的原理相同。斷線停車能避免電池沒電、搖桿關機或超出廣播距離時,小車仍維持原方向行駛。
小車端 V3 積木邏輯
- 建立變數:
xValue、yValue、lastReceiveTime。 - 啟動時將廣播群組設為 51,並讓兩輪馬達停止。
- 當收到廣播鍵值:名稱為 x 時更新
xValue;名稱為 y 時更新yValue;每次收到訊號都將lastReceiveTime設為「運行時間(毫秒)」。 - 重複無限次:若「運行時間 − lastReceiveTime」大於 500,設定左右輪速度都為 0;否則讀取超音波距離。
- 前方距離為 15~30 cm 時,向前行駛自動降為 40% 速度;距離小於等於 15 cm 時,向前行駛立即停止。
五、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霸小車端:V3 超音波安全避障
xValue = 0
yValue = 0
lastReceiveTime = -1000
distance = 0
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():
global distance
# 優先保護 1:逾 0.5 秒未收到訊號,立即停車
if control.millis() - lastReceiveTime > 500:
cuteBot.motors(0, 0)
else:
distance = cuteBot.ultrasonic(cuteBot.SonarUnit.Centimeters)
leftSpeed = Math.constrain(yValue + xValue, -100, 100)
rightSpeed = Math.constrain(yValue - xValue, -100, 100)
# 優先保護 2:僅在向前時啟用前方避障
if yValue > 0 and distance > 0 and distance <= 15:
cuteBot.motors(0, 0)
basic.show_icon(IconNames.NO)
elif yValue > 0 and distance > 15 and distance <= 30:
cuteBot.motors(leftSpeed * 0.4, rightSpeed * 0.4)
basic.show_icon(IconNames.SMALL_DIAMOND)
else:
cuteBot.motors(leftSpeed, rightSpeed)
basic.clear_screen()
basic.pause(30)
basic.forever(on_forever)
測試提示:本程式假設 yValue > 0 是前進。如果實測發現前進方向相反,請把小車端的兩個 yValue > 0 改為 yValue < 0。
六、完成後的操作方式
| 搖桿操作 | 小車動作 |
|---|---|
| 向前推 | 前進 |
| 向後拉 | 後退 |
| 向左推 | 左轉 |
| 向右推 | 右轉 |
| 回到中央 | 停止(死區保護) |
| 按 A/B/A+B | 切換慢速/一般/快速模式 |
| 搖桿關機或超出距離 | 0.5 秒後自動停車 |
七、除錯小提醒
- 小車沒有反應:先確認兩端廣播群組是否都為 51,以及兩片 micro:bit 是否都有供電。
- 前後方向相反:將 y 軸對應範圍由 -100~100 改為 100~-100,或將馬達速度乘以 -1。
- 左右方向相反:將 x 軸對應範圍反向,或在小車端交換加、減的運算方向。
- 停下仍會緩慢移動:先確認死區已設定為 -10~10;若仍有誤差,可加大為 -15~15。
- 小車經常自動停車:確認兩端群組號相同、電池電力充足,並將斷線判斷時間由 500 毫秒調整為 800 毫秒。
八、延伸挑戰
- 按下搖桿按鍵時,讓小車發出聲音或亮起車燈。
- 加入超音波避障:前方太近時,即使搖桿要求前進也自動停車。
- 將小車改造成校園導覽車、農場巡檢車或智慧物流車,設計任務關卡。
.png)
.png)

沒有留言:
張貼留言