這一次我們要練習的是Arduino的藍牙模組,透過這個模組,我們就可以在不同的Arduino之間相互通訊,同時也可以使用手機的APP程式控制Arduino上的輸出裝置。如果同學們學會了這項技巧,就可以做出許多利用手機控制Arduino遙控車、家用電器以及任何其它使用Arduino連接的裝置。

這次要使用的模組是HC-06,正面如下所示:

它的背面有各個接腳的說明:

其中我們會使用到的是VCC、GND、TXD、以及RXD這幾個接腳。VCC當然是接5V,GND接GND,而TXD以及RXD分別是串列協定的傳送和接收,在這個例子中我們要分別把它們連接到Atduino的D10和D11這兩個GPIO接腳。連接之後的樣子如下所示:

為了示範可以透過手機控制Arduino,所以我們再加上了一個3色LED的模組(也可以用一般的LED,但是就要加上限流電阻),並把它接到D2上,如下所示:

此藍牙模組使用的是串列埠的操作方式,而且用SoftwareSerial這個類別來進行操作。在Arduino端的程式如下(參考網路文章修改:http://blog.cavedu.com/2013/11/08/appinventorandarduinowithbluetooth/):

#include <SoftwareSerial.h>
#include <Wire.h>

int LED = 2;
SoftwareSerial BT(10,11); 

void setup() {
  BT.begin(38400);
  pinMode(LED, OUTPUT);    
}

void loop() {
  byte cmd[20];
  int strsize;
  while(true){
    if ((strsize=(BT.available()))>0){
      for (int i=0; i<strsize; i++){
        cmd[i]=char(BT.read());
      }
    }
    if (cmd[0]=='a') {
      digitalWrite(LED, HIGH);
    } else {
      digitalWrite(LED, LOW);
    }
  } 
}

先來看執行的示範影片:

此程式主要是透過SoftwareSerial這個類別去啟用藍牙做為串列傳輸,一開始就要正確地設定TXD和RXD的腳位,在這裡我們使用的類別執行實例名稱為BT,接著在setup的函數中要指定正確的Baud Rate做為啟始,不同的模組的預設baud rate都不太一樣,筆者的例子是 38400,如果你發現程式無法正確接收字串的話,可以試試9600或是57600等等。

如果設定正確的話,使用一個無窮迴圈就去查詢BT.available(),看看在藍牙端是否有資料傳送進行,如果有的話,就透過BT.read()函數執行讀取資料的作業,一次讀取一個字元,讀取之後再逐一放入字元陣列中,之後再檢查其內容即可,在這個例子中,我們檢查第一個收到的字元,如果是’a’,就開啟LED,如果是其它的字元,則一律把LED關閉。

以上是藍牙端的接收程式,而發送端則是以APP Inventor來製作一支手機APP,建立藍牙連線並發射正確的字元。以下是APP的介面佈置:

以下是所有使用到的元件:

其中第一個是清單選擇器,中間三個是按鈕元件,最後一個則是藍牙客戶端。程式一開始執行的時候,先把各按鈕的可用不可用先處理好,如下所示,以確保一開始的時候一定要先按清單選擇器,進行藍牙裝置的搜尋和連線作業:

按下清單選擇器的時候,在選到項目之前就要先進行藍牙裝置的掃描作業,列出附件所有可以連線的裝置清單:

有了清單之後,即可選擇我們的藍牙模組( HC-06)進行連線,連線的作業如下:

完成連線之後,需要把其它的按鈕啟用,然後把清單選擇器的按鈕取消可用狀態。此時如果畫面沒有出現錯誤訊息的話,就可以開始透過按鈕來對Arduino進行操作。如果是第一次連線的話,你的手機還會有一個要求配對的功能,一般來說,預設的pin碼是1234或是0000。打開LED以及關閉LED的按鈕程式內容如下(其實就是送一個字元’a’或是’b’而已):

最後和藍牙斷線的按鈕程式如下:

除了執行斷線功能之外,還要把按鈕的可使用狀態再重新調整一下,方便接下來的操作。在操作的過程當中你還會發現,如果藍牙模組是處理未連線狀態,會有一個小燈不斷地閃爍,如果建立連線之後,該小燈號會變成是恆亮的情況喔。

(2025)