Arduino智能小車——藍牙小車
上一章我們完成了小車的運動控制,雖然小車已經可以運動,但是不能遠程遙控,不夠高大上。在這一篇,我們將嘗試用手機藍牙遙控小車。
藍牙模塊
藍牙( Bluetooth® ):是一種無線技術標準,可實現固定設備、移動設備和樓宇個人域網之間的短距離數據交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。
我們在此使用的藍牙模塊(HC-05)已經在內部實現了藍牙協議,不用我們再去自己開發調試協議。這類模塊一般都是藉助於串口協議通信,因此我們只需藉助串口將我們需要發送的數據發送給藍牙模塊,藍牙模塊會自動將數據通過藍牙協議發送給配對好的藍牙設備。
串口通信
由於要藉助串口實現藍牙通信功能,所以我們在此要先了解下Arduino的串口通信。
Arduino UNO開發板上的串口爲0->RX,1->TX,在開發板內部也已經配置好了串口的功能,我們只需調用函數借口即可。以下列出串口通信裏面常用的函數,並加以簡單解釋,詳細用法可在用到時自行查詢。
開啓串行通信接口並設置通信波特率
Serial.begin(speed);
關閉串口通信
Serial.end();
判斷串口緩衝器是否有數據寫入
Serial.available();
讀取串口數據
Serial.read();
返回下一字節(字符)輸入數據,但不刪除它
Serial.peek();
清空串口緩存
Serial.flush();
寫入字符串數據到串口
Serial.print();
寫入字符串數據+換行到串口
Serial.println();
寫入二進制數據到串口
Serial.write();
read時觸發的事件函數
Serial.SerialEvent();
讀取固定長度的二進制流
Serial.readBytes(buffer,length);
打印接到數據十進制表示的ascii碼
Serial.println(incomingByte, DEC);
藍牙模塊連接
TX: 接Arduino UNO開發板"RX"引腳
RX: 接Arduino UNO開發板"TX"引腳
GND: 接Arduino UNO開發板"GND"引腳
VCC: 接Arduino UNO開發板"5V"或"3.3V"引腳
手機藍牙助手
想實現手機藍牙遙控小車,手機APP是必不可少的,目前網上有很多藍牙串口助手,省去了我們自己寫APP的時間,當然如果朋友你有能力或者想自己DIY的話也可以嘗試自己寫APP,在這裏我推薦大家用這款手機藍牙助手(百度上搜手機藍牙串口助手就可以搜到,挺好用的)
下載並安裝後打開APP,在這裏可能會提示你有新版本請求更新,建議點擊以後再說(暫時不更新),以我的經驗,一般點擊立即更新都會更新失敗。
點擊自定義按鍵[2],將其“顯示名稱”屬性改爲“前進”,“點擊發送”屬性改爲“01”,並點擊“確定”保存
點擊自定義按鍵[4],將其“顯示名稱”屬性改爲“左轉”,“點擊發送”屬性改爲“03”,並點擊“確定”保存
點擊自定義按鍵[5],將其“顯示名稱”屬性改爲“後退”,“點擊發送”屬性改爲“02”,並點擊“確定”保存
點擊自定義按鍵[6],將其“顯示名稱”屬性改爲“右轉”,“點擊發送”屬性改爲“04”,並點擊“確定”保存
以上修改的屬性值即爲我們點擊對應按鍵之後,藍牙串口助手自動通過藍牙發送的數據,與上一篇所定義的小車的幾個狀態一致,這樣方便在Arduino在接收到藍牙模塊的數據後對小車的狀態進行控制。
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
修改後屬性如下圖
下面就來看看我們修改的效果吧,點擊“模式切換”
小科普:
藍牙模塊上電(只簡單連接"VCC"和"GND"引腳)之後,其他藍牙設備即可與其連接,一般藍牙模塊默認初始連接密碼爲"0000"或"1234",如果連接不上藍牙,請儘快與廠商或者店家聯繫。藍牙模塊上電後LED指示燈不斷閃亮,當有設備連接預期連接之後會隔一段閃兩下,藍牙串口助手也會有相應已連接的提示。
##Arduino代碼編寫
新建一個工程,將下面代碼複製到工程內
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
int leftMotor1 = 4;
int leftMotor2 = 5;
int rightMotor1 = 6;
int rightMotor2 = 7;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(leftMotor1, OUTPUT);
pinMode(leftMotor2, OUTPUT);
pinMode(rightMotor1, OUTPUT);
pinMode(rightMotor2, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
//usart read
if(Serial.available()>0)
{
char cmd = Serial.read();//讀取藍牙模塊發送到串口的數據
Serial.print(cmd);
motorRun(cmd);
}
}
void motorRun(int cmd)
{
switch(cmd){
case FORWARD:
Serial.println("FORWARD"); //輸出狀態
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
break;
case BACKWARD:
Serial.println("BACKWARD"); //輸出狀態
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
case TURNLEFT:
Serial.println("TURN LEFT"); //輸出狀態
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
case TURNRIGHT:
Serial.println("TURN RIGHT"); //輸出狀態
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
break;
default:
Serial.println("STOP"); //輸出狀態
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
}
}
朋友們大概也發現了,這個代碼和上一篇的代碼基本上相同,只不過增加了串口的內容。
##代碼詳解
串口初始化函數,想要通過串口的庫函數對串口進行操作,必須在void set_up()
函數中對其進行初始化。
Serial.begin(9600);
在void loop()函數內,加入了檢測串口接收內容的函數,並將接收到的命令輸入到 void motorRun(int cmd)函數中控制小車運動。
if(Serial.available()>0)
{
char cmd = Serial.read();
Serial.print(cmd);
motorRun(cmd);
}
藍牙小車測試
下載程序之後,重新連接藍牙模塊,切換到我們自定義的按鍵界面,快試試藍牙遙控小車吧。
附件
安卓手機藍牙串口點擊下載,也可以複製鏈接 https://download.csdn.net/download/qq_16775293/11165678 到瀏覽器下載。
歡迎各位有興趣的朋友加入Q羣1:511385161 點評、交流(已滿,請大家移步2羣)
歡迎各位有興趣的朋友加入Q羣2:638346596 點評、交流