經過前面幾篇教學,大家應該已能完全控制Arduino小車了,恭喜!接下來我們就要進入這個套件最有挑戰的一個功能,就是藍牙遙控!
傑森必須說在最前面,因為這個範例用的是HC-05,所以只支援Android手機,iPhone不行哦!
購買智慧車套件:
https://www.jmaker.com.tw/products/arduino-car
首先我們準備好了一個預先寫好的APP給大家,這是用App Inventor開發的,在這裡提供UI和程式方塊,有興趣的朋友可以參考然後自行再修改。
Android手機APP安裝檔APK下載:
http://jmaker.banner.tw/doc/test_blue.apk
如果是第一次按裝APK的檔案,手機會詢問你是不是要開啟權限,啟用就可以了。
接下來就是接線囉,L298N部份和之前的範相同,若還不熟的朋友可以回頭去看教學。
L298N入門:
https://blog.jmaker.com.tw/arduino-car-l298n/
剩下的就只有HC-05的接線了,只有4條線,VCC接5V,GND接GND,RXD接PIN3,TXD接PIN2,就完成了。
程式部份蠻簡單的,先用SoftwareSerial建立BT物件,利用它來和我們的HC-05溝通。再來就是讓UNO讀取從APP傳過去的訊息,APP基本上就是傳出w,x,a,d,s,分別代表前進,後退,左轉,右轉,停止。
讀到訊息後,用swtich case去依讀到的指令讓車子運作,L298N的副程式我們早就寫好了,所以這部份真的很簡單是吧!
//本範例用在傑森創工的智慧車套件上。
//讓車子可以利用HC-05藍牙模組和手機上的APP結合,可以用手機控制智慧車。
//套件購買網址:https://www.jmaker.com.tw/products/arduino-car
#include <SoftwareSerial.h>
SoftwareSerial BT(2, 3); // RX | TX 這裡是指UNO板上的RX和TX,所以和HC-05的RX TX相反哦!
//若一直測試都收到不訊號,可以試著這裡相反試試,可能是接錯了。
char cmd;
//左馬達控制設定
const byte LEFT1 = 8; //IN1
const byte LEFT2 = 9; //IN2
const byte LEFT_PWM = 10;
//右馬達控制設定
const byte RIGHT1 = 7; //IN3
const byte RIGHT2 = 6; //IN4
const byte RIGHT_PWM = 5;
//設定PWM輸出值(代表的是車子的速度)
byte motorspeed = 130;
void forward(){
digitalWrite(LEFT1, HIGH);
digitalWrite(LEFT2, LOW);
analogWrite(LEFT_PWM, motorspeed);
//右輪·因在小車上馬達安装方向左右兩個是相
digitalWrite(RIGHT1, LOW);
digitalWrite (RIGHT2, HIGH);
analogWrite(RIGHT_PWM, motorspeed);
}
void backward(){ //後退
digitalWrite(LEFT1, LOW);
digitalWrite (LEFT2, HIGH);
analogWrite(LEFT_PWM, motorspeed);
digitalWrite(RIGHT1, HIGH);
digitalWrite(RIGHT2, LOW);
analogWrite(RIGHT_PWM, motorspeed);
}
void turnLeft(){//左轉
//左輪不動,右輪動(速度為0)
analogWrite(LEFT_PWM, 0);
digitalWrite(RIGHT1, LOW);
digitalWrite (RIGHT2, HIGH);
analogWrite(RIGHT_PWM, motorspeed);
}
void turnRight(){//右轉
//右輪不動,左輪動(速度為0)
digitalWrite(LEFT1, HIGH);
digitalWrite(LEFT2, LOW);
analogWrite(LEFT_PWM, motorspeed);
analogWrite(RIGHT_PWM, 0);
}
void stopMotor() {
analogWrite(LEFT_PWM, 0);
analogWrite(RIGHT_PWM, 0);
}
void setup(){
Serial.begin(9600);
BT.begin(38400); //依藍牙模組的baud rate設定, HC-05一般是38400,但有些批號也可能是9600
//設定每一個PIN的模式
pinMode(LEFT1, OUTPUT);
pinMode(LEFT2, OUTPUT);
pinMode(LEFT_PWM, OUTPUT);
pinMode(RIGHT1, OUTPUT);
pinMode(RIGHT2, OUTPUT);
pinMode(RIGHT_PWM, OUTPUT);
}
void loop() {
if(BT.available()) {
//讀取APP傳來的資料
cmd = BT.read();
switch(cmd) {
case 'w': //接收到w,前進
forward();
break;
case 'x': //接收到x,後退
backward();
break;
case 'a': //接收到a,左轉
turnLeft();
break;
case 'd': //接收到d,右轉
turnRight();
break;
case 's': //接收到s,停止
stopMotor();
break;
}
}
}