2016年10月29日 星期六

手機APP藍芽遙控ipoe A1

105.11.2
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觀察正確性


沒有留言:

張貼留言