本篇實作,要瞭解如何將藍芽模組 HC05 連接 Pi Pico,再透過手機連接 HC05 藍芽模組,透過手機的 APP 開啟和關閉 LED 連線,讓 LED 亮起/熄滅。
使用 Pi Pico 連接 HC05 藍芽模組。
安裝好 CP2102後,要使用AT指令可以執行 Realterm 終端機,程式可以到 這裡 下載。下載後執行畫面如下:
設定時有幾個地方要注意:
按下右上方的「設定」,在綠色按鈕設定輸出為「y」,在紅色按鈕設定輸出為「n」,就可以按下圖示的按鈕當作 LED 的開關。
程式二的執行結果如下:
[材料]
- Raspberry Pi Pico x1
- HC05 無線藍芽模組 x1
- LED x1
- 電阻 220歐姆 x1
- 麵包板 x1
- 排線 n 條
[接線圖]
要設定HC-05,可以使用USB TO TTL模組,如 CP2102,也可以直接連接 Pi Pico,以下接線圖分別列出 HC-05 與 CP2102及 Pi Pico 的連接方式。使用 Pi Pico 連接 HC05 藍芽模組。
Pi Pico接腳 | HC05 | 其他 |
---|---|---|
Pin 38(3.3V) | VCC | - |
Pin 36(GND) | GND | - |
Pin 1(GP0) | RX | - |
Pin 2(GP1) | TX | - |
Pin 7(GP5) | - | 接220歐姆電阻,電阻另一端再接 LED 正極 |
[CP2102設定HC05]
• 先確定插上 CP2102 時,電腦是否能取得連接埠?可以找到電腦的 [控制台] →[硬體和音效]→[裝置管理員]→[連接埠],檢查一下是否有出現 COM 的號碼?安裝好 CP2102後,要使用AT指令可以執行 Realterm 終端機,程式可以到 這裡 下載。下載後執行畫面如下:
設定時有幾個地方要注意:
- 按下 [Display] 頁籤,使用 Ansi 方式呈現,就不會像使用 ASCII 每行最後有換行符號
- 按下 [Port] 頁籤,速率選定 HC-05 預設的 38400 Buads,Port 選擇跟裝置管理員使用的COM 埠號,如果選擇的速度不對,會無法回應,修改完成後,按下 [Change]儲存。
- 按下 [Send] 頁籤,EOL處按下+CR及+LF,此時可以在其左邊的地方輸入AT指令(如上圖)。
[手機藍芽連線與APP]
由於我的 iPhone 無法找到 HC05 的藍芽裝置,於是找了一部舊的 Android 手機,使用 Arduino 藍芽控制的 APP,來與 HC05 藍芽連線。可到 Google Play下載「Arduino bluetooth controller」使用,或到 Google Play下載類似的應用程式。執行 APP 後,選擇連線的裝置,再選擇「Switch Mode」開關按鈕。按下右上方的「設定」,在綠色按鈕設定輸出為「y」,在紅色按鈕設定輸出為「n」,就可以按下圖示的按鈕當作 LED 的開關。
[程式一]
程式中的 uos 模組,可以顯示目前開發板的狀況:import uos print(uos.uname())得到以下的結果:
(sysname='rp2', nodename='rp2', release='1.15.0', version='v1.15 on 2021-04-18 (GNU 10.2.0 MinSizeRel)', machine='Raspberry Pi Pico with RP2040')在開始前,可先用以下這段程式檢查連線狀況,如果有回應表示連線正常。
import uos import machine import utime print(uos.uname()) #列出開發板的資訊 uart0 = machine.UART(0,baudrate=38400) def sendCMD_waitResp(cmd, uart=uart0, timeout=2000): print("CMD: " + cmd) uart.write(cmd) waitResp(uart, timeout) print() def waitResp(uart=uart0, timeout=2000): prvMills = utime.ticks_ms() resp = b"" while (utime.ticks_ms()-prvMills)<timeout: if uart.any(): resp = b"".join([resp, uart.read(1)]) print(resp) print(uart0) print("- uart0 -") waitResp() sendCMD_waitResp("AT+VERSION\r\n") #顯示藍芽版本 sendCMD_waitResp("AT+UART?\r\n") #顯示設定速率 sendCMD_waitResp("AT+ROLE?\r\n") #顯示角色,0為Slave,1為Master sendCMD_waitResp("AT+CMODE?\r\n") #查詢目前工作模式 sendCMD_waitResp("AT+ADDR?\r\n") #顯示藍芽位址 print("Done")
[程式二]
這段程式判斷接收的字元,「y」則讓 LED 亮起,「n」讓 LED 熄滅。import uos import machine import utime led = machine.Pin(5, machine.Pin.OUT) print(uos.uname()) uart = machine.UART(0, baudrate=38400) #以 38400 bits/sec 進行通序 print(uart) def waitResp(uart=uart, timeout=500): prvMills = utime.ticks_ms() resp=b"" while(utime.ticks_ms()-prvMills)<timeout: if uart.any(): resp = b"".join([resp, uart.read(1)]) return(resp) while True: sg = waitResp() #等待傳輸字串 print(len(sg.decode()),sg.decode()) #列出輸入的字元長度 if(sg.startswith("y")): #檢查字串的第一個字元 led(1) elif(sg.startswith("n")): led(0) utime.sleep(0.5)
[結果]
程式一執行的結果如下:程式二的執行結果如下:
[參考資料]
- http://helloraspberrypi.blogspot.com/2021/02/raspberry-pi-picomicropython-pair-hc-05.html
- https://blog.naver.com/cosmosjs/222245240386
張貼留言