Android手機APP藍芽遙控ipoe A1輪型機器人
第一組
第二組
第三組
第四組
第五組
方式:Android 手機APP傳送字串至Arduino
手機APK下載
說明:
(1)使用藍芽,
(2)APP傳送不同按鍵所代表之字元、以及滑軌數值至Arduino
(3)使用SoftwareSerial,藍芽模組接pin16, 17,0,1留給Serial Monitor
(4)將欲傳送之字元與數值組成字串,並以逗點分開。例如傳送'a'和123,組成字串"a,123,"
(5)Arduino接收字串後,將字串分開成"a"和"123"二個字串,再分別轉成字元'a'和整數123
APP Inventor 2
宣告全域變數char_b儲存按鍵字元、整數num儲存滑軌數值、send儲存組合後字串
初始設定
藍芽選單
斷線設定
使用計時器 計時時間設為20ms
當滑桿位置改變時啟動計時器
計時時間到再傳送字串
這是將計時器作為延遲
避免滑軌移動太快,傳送字串太快,Arduino端接收字串太慢,會導致接收到2組甚至3組字串
按鈕3~按鈕11分別對應字元'a'~'i'
當按下按鍵時,同樣傳送組合字串,但不做延遲
上圖為按鈕3對應程式
當按鈕3按下,按鈕3不可用,其餘可用
char_b設為a,組合字串send,再以藍芽客戶端傳送字串send
其他按鈕4~11依照類似作法
Arduino程式
#include <IpoeA1.h>
IpoeMotor myMotor; // 實體化馬達控制物件
int maxs; // 最高速度 (PWM)
int inSlider=0;
int Position1,Position2;
char temp[]="e";
char button;
String myString,tempString;
void setup() {
myMotor.motor_init(); // 進行馬達及編碼器腳位的初始化動作
Serial.begin(9600); //Arduino與監控視窗鮑率:9600
Serial2.begin(57600);//Arduino與藍芽模組:57600
Serial2.setTimeout(20);
Serial.println("Hello");
}
void loop() {
// 檢查是否有資料可供讀取
while (Serial2.available()) {
myString=Serial2.readString();
split();
Serial.print(myString);
Serial.print(" ");
Serial.print(button);
Serial.print(" ");
Serial.println(inSlider);
maxs=inSlider;
switch (button) {
case 'a':
myMotor.setSpeeds(maxs/3, maxs);
break;
case 'b':
myMotor.setSpeeds(maxs, maxs);
break;
case 'c':
myMotor.setSpeeds(maxs, maxs/3);
break;
case 'd':
myMotor.setSpeeds(-maxs, maxs);
break;
case 'e':
myMotor.Brake();
break;
case 'f':
myMotor.setSpeeds(maxs, -maxs);
break;
case 'g':
myMotor.setSpeeds(-maxs, -maxs/3);
break;
case 'h':
myMotor.setSpeeds(-maxs, -maxs);
break;
case 'i':
myMotor.setSpeeds(-maxs/3, -maxs);
break;
}
}
}
void split(){
Position1=myString.indexOf(',');
Position2=myString.indexOf(',',Position1+1);
tempString=myString.substring(0,Position1);
strcpy(temp,tempString.c_str());
button=temp[0];
tempString=myString.substring(Position1+1,Position2);
inSlider=tempString.toInt();
}
參考藍芽傳送字串
此處仍然使用readString()來讀取字串
存放在myString
其資料型態是String
使用split()來分離字串
在split()中,採用indexOf()來找出逗點的位置
indexOf()是Arduino中String class的函數
Position1=myString.indexOf(',');找出第一個逗點的位置並存放在Position1
(註:位置編號是由0開始,即第一個字元是0,第二個字元是1.....)
Position2=myString.indexOf(',',Position1+1);找出第二個逗點的位置並存放在Position2
tempString=myString.substring(0,Position1);利用substring()分離出第一個逗點前的字串
並暫時存放tempString,此資料型態為String
strcpy(temp,tempString.c_str());利用c_str()將其由String轉為char[],並複製至temp[]
button=temp[0];字元button為temp[0]
tempString=myString.substring(Position1+1,Position2);
利用substring()分離出第一個逗點和第二個逗點間的字串
並暫時存放tempString,此資料型態為String
inSlider=tempString.toInt();利用toInt()將字串轉為整數
toInt()和c_str()都是Arduino中String class的函數
首先電池電源先不要要開啟
維持PC與Arduino連線
以Serial Monitor觀察正確性
沒有留言:
張貼留言