牟曉東
在數(shù)據(jù)通信方面,Arduino UNO通常情況下是通過(guò)數(shù)據(jù)線與計(jì)算機(jī)的USB接口相連,比如從Arduino IDE中上傳編譯好的程序代碼;而位于數(shù)字引腳0(RX)和1(TX)的串口通信,一般是通過(guò)Serial.println()函數(shù)在串口監(jiān)視器中進(jìn)行提示信息或傳感器所讀取數(shù)據(jù)的實(shí)時(shí)顯示。如何進(jìn)行數(shù)據(jù)的無(wú)線通訊呢?以藍(lán)牙傳輸為例,借助于HC-05藍(lán)牙模塊,我們可以實(shí)現(xiàn)手機(jī)操控Arduino的功能,比如控制LED燈的亮與滅、風(fēng)扇模塊的“無(wú)級(jí)變速”。
實(shí)驗(yàn)器材包括:Arduino UNO主板一個(gè),面包板一個(gè),HC-05藍(lán)牙模塊一個(gè),藍(lán)色LED燈一支,10kΩ和20kΩ的色環(huán)電阻各一個(gè),杜邦線若干。
對(duì)照設(shè)計(jì)好的電路接線圖(如圖1),進(jìn)行元器件的連接。首先,將Arduino的5V引腳和GND接地引腳通過(guò)紅色和黑色杜邦線分別與面包板的紅色、藍(lán)色側(cè)邊線槽連接;接著,將藍(lán)色LED燈插接到面包板上,負(fù)極(短腿)接入藍(lán)色線槽,正極(長(zhǎng)腿)通過(guò)杜邦線(藍(lán)線)連接至Arduino的13號(hào)數(shù)字引腳;HC-05藍(lán)牙模塊共有六個(gè)引腳(僅使用其中的四個(gè)),先將VCC端和GND端分別接入面包板的紅色和藍(lán)色線槽,由于藍(lán)牙模塊的標(biāo)準(zhǔn)工作電源是3.3V,因此需要借助兩個(gè)電阻進(jìn)行“分壓”——從藍(lán)牙模塊的RXD端通過(guò)杜邦線(黃色)插接至面包板,其中的一端經(jīng)10kΩ的電阻與Arduino的TXD(1號(hào))連接,另一端經(jīng)20kΩ的電阻與面包板的藍(lán)色線槽(GND)連接;藍(lán)牙模塊的TXD端,則通過(guò)杜邦線(綠色)與Arduino的RXD(0號(hào))進(jìn)行連接;最后,通過(guò)數(shù)據(jù)線將Arduino與計(jì)算機(jī)的USB接口進(jìn)行連接。
在Arduino IDE中進(jìn)行程序代碼的編寫:
首先進(jìn)行變量的定義,語(yǔ)句“int BlueLED = 13;”的作用是聲明藍(lán)色LED燈的連接引腳是13號(hào),并且通過(guò)語(yǔ)句“char serialBlueLED;”來(lái)定義一個(gè)字符型的變量,其作用是用來(lái)存儲(chǔ)藍(lán)牙串口數(shù)據(jù);在setup()函數(shù)中,先通過(guò)語(yǔ)句 “Serial.begin(9600);”來(lái)設(shè)置串口監(jiān)視器的波特率為9600bps,再通過(guò)語(yǔ)句“pinMode(BlueLED, OUTPUT);”將藍(lán)色LED燈的引腳設(shè)置為輸出工作模式;在loop()函數(shù)中,建立一個(gè)實(shí)時(shí)檢測(cè)是否有串口數(shù)據(jù)傳輸?shù)膚hile()循環(huán):“while (Serial.available() > 0)”,通過(guò)語(yǔ)句“serialBlueLED = Serial.read();”將讀取到的藍(lán)牙串口傳輸數(shù)據(jù)賦值給變量serialBlueLED;然后建立“if…else if…”雙分支選擇結(jié)構(gòu),對(duì)變量serialBlueLED的值進(jìn)行是否為“1”或“0”(均為字符型)的判斷,是“1”的話,執(zhí)行兩個(gè)“動(dòng)作”:“Serial.println("收到指令:點(diǎn)亮13號(hào)藍(lán)色LED燈!");”(在串口監(jiān)視器顯示提示信息)、“digitalWrite(BlueLED, HIGH);”(控制藍(lán)色LED燈發(fā)光);是“0”的話,則執(zhí)行另外兩個(gè)“動(dòng)作”:“Serial.println("收到指令:熄滅13號(hào)藍(lán)色LED燈!");”、“digitalWrite(BlueLED, LOW);”(熄滅藍(lán)色LED燈);最后添加一個(gè)2秒鐘的延遲語(yǔ)句:“delay(2000);”,將程序保存為BlueToothLED(如圖2)。
注意,程序編譯后不要直接上傳至Arduino,因?yàn)樗{(lán)牙模塊占用了Arduino的RX(0號(hào))和TX(1號(hào)),直接上傳會(huì)出現(xiàn)“Problem uploading to board”錯(cuò)誤。解決方法是暫時(shí)將兩條杜邦線從Arduino上拔出后再進(jìn)行上傳,上傳成功后再原樣插回即可,此時(shí)藍(lán)牙模塊的紅色LED燈就會(huì)一直閃爍,處于等待連接狀態(tài)中;在手機(jī)中下載并安裝Arduino bluetooth controller_v1.apk(apk文件可掃碼關(guān)注“壹零社”在編程相關(guān)中下載),運(yùn)行程序進(jìn)行藍(lán)牙連接(首次使用時(shí)會(huì)先進(jìn)行“配對(duì)”),點(diǎn)擊“HC-05”項(xiàng)后會(huì)彈出四個(gè)連接選項(xiàng),選擇其中的第二項(xiàng)“Switch mode”(開(kāi)關(guān)模式),接著點(diǎn)擊彈出按鈕右上角的“齒輪”設(shè)置項(xiàng),將綠色和紅色兩個(gè)開(kāi)關(guān)的值分別設(shè)置為“1”和“0”(如圖3)。
打開(kāi)Arduino程序的串口監(jiān)視器,然后在手機(jī)中就可以不斷點(diǎn)擊兩個(gè)開(kāi)關(guān)按鈕進(jìn)行LED燈的控制了,同時(shí)會(huì)在串口監(jiān)視器中對(duì)應(yīng)出現(xiàn)“收到指令:點(diǎn)亮13號(hào)藍(lán)色LED燈!”或“收到指令:熄滅13號(hào)藍(lán)色LED燈!”的提示(如圖4)。
在藍(lán)牙LED燈的電路接線圖中稍作改動(dòng)(如圖5),將LED燈及對(duì)應(yīng)的杜邦線拆除,保持藍(lán)牙模塊和分壓電路不變,將風(fēng)扇模塊接入:VCC和GND端分別接入面包板的紅色和藍(lán)色線槽,信號(hào)控制端通過(guò)杜邦線連接至Arduino的3號(hào)數(shù)字引腳。