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


2016年10月25日 星期二

範例5


將程式改為

#include <IpoeA1.h>
IpoeMotor myMotor;  // 實體化馬達控制物件
int maxs=90;
int _ABVAR_1_dis = 0 ;
int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
{
  long duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  if ((duration < 2) || (duration > 300)) return false;
  return duration;
}


void setup()
{
 myMotor.motor_init(); // 進行馬達及編碼器腳位的初始化動作
  digitalWrite( 36 , LOW );

  Serial.begin(9600);
}

void loop()
{
  _ABVAR_1_dis = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 36 , 37 ) ;
  Serial.print("Dis=");
  Serial.print(_ABVAR_1_dis);
  Serial.println();
  if (_ABVAR_1_dis> 30)
  {
    myMotor.setSpeeds(maxs, maxs);
    delay(100);
  }
  else
  {
    myMotor.setSpeeds(-maxs, -maxs);
    delay(300);
    myMotor.setSpeeds(maxs, -maxs);
    delay(300);
  }
  delay( 100 );
}

範例4




範例3



範例2


範例1


ipoe A1腳位說明

 iPOE A1 數位腳位配置
 iPOE A1 類比腳位配置


ArduBlock

1.下載檔https://drive.google.com/file/d/0B2LyA_WkaWf8UUcyOGxoNWRoelE/view?usp=sharing
2. 因為ArduBlock是附屬在Arduino IDE 裡面,因此必須將剛剛下載下來的檔案放到Arduino IDE的工具(tools)資料夾內。
3. 若不知道Arduino IDE 路徑,可以先進入Arduino IDE 的「偏好設定」查看,並將路徑記起來。
4. ArduBlock 的 jar 檔必須放在Sketchbook 資料夾下的tools\ArduBlockTool\tool\ 內,因此必須在Sketchbook 資料夾下建立一個新的資料夾,再將jar 檔案放到這個資料夾內。

5. 重新啟動 Arduino IDE即可以在工具列上的「工具」找到 ArduBlock 這個選項。