2015年6月9日 星期二

藍芽遙控車 Arduino實作

  兒子遙控車的遙控器不見了,剛好最近在研究Arduino ,所以就來實作一下,如何將現有的車子改裝,用Arduino來控制,並由Ardroid手機來操作。

一、拆設備

其實內裝就一個有無線裝置的IC板,去控制二顆直流馬達的前進/後退,左轉/右轉。就把它拆了。


















二、建置Arduino

Arduino只是一個微電腦控制器,為了控制2顆直流馬達,因此需要 IC L293D,無線傳輸的部份我選擇了藍芽模組HC05

接線:

接線接完後就要寫Artduino程式,透過程式來控制馬達的作動。

三、通訊協定(Protocol)

預期想法是如此,手機會經由藍芽發出一些字串,讓車子能透過這些字串來作動。

因為通訊協定是這樣

起始字元  控制碼 結束字元

起始字元
0: stop car
1: 讀取控制碼

控制碼
3:前進
4:後退
5:左轉
6:右轉

結束字元 e


因此彷照上述協定,所撰寫的程式如下:


#include <SoftwareSerial.h>
SoftwareSerial BT(10, 9); // BT TX->D10 , BT RX->D9
const byte ledPin = 13;
char val;     // 儲存接收資料的變數

const int motor1a = 4;
const int motor2a = 5;
const int EA = 3;

const int EB = 6;
const int motor3a = 7;
const int motor4a = 8;
const byte speed=150;

int mode;
char totalcommand[16];
int state;
int index;

void setup()
{
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  BT.begin(9600);
  // 藍牙連線成功後,發佈「準備好了」訊息。
  BT.println("BT is ready!");

  pinMode(motor1a,OUTPUT);
  pinMode(motor2a,OUTPUT);
  pinMode(EA,OUTPUT);
  pinMode(motor3a,OUTPUT);
  pinMode(motor4a,OUTPUT);
  pinMode(EB,OUTPUT);


}

void loop()
{
   if(BT.available() )
   {
     val = BT.read();
   
     switch(state)
     {
      case 0:
              if(val=='0')
              {
               analogWrite(EA,0);
               analogWrite(EB,0);              
               Serial.println("stop car");
              }
              else if(val=='1')
              {
               analogWrite(EA,0);
               Serial.println("stop carX");
              }
              else if(val=='2')
              {
               analogWrite(EB,0);
               Serial.println("stop carY");
              }
              else if(val=='3') //forward
              {
                state=1;
                mode=3;
                index=0;
                for( int i = 0; i < sizeof(tcmd);  ++i )
                {
                  tcmd[i] = (char)0;
                }
              }
              else if(val=='4')//back
              {
                state=1;
                mode=4;
                index=0;
                for( int i = 0; i < sizeof(tcmd);  ++i )
                {
                  tcmd[i] = (char)0;
                }
             
              }
              else if(val=='5')//left
              {
                state=1;
                mode=5;
                index=0;
                for( int i = 0; i < sizeof(tcmd);  ++i )
                {
                  tcmd[i] = (char)0;
                }
             
              }
              else if(val=='6')//right
              {
                state=1;
                mode=6;
                index=0;
                for( int i = 0; i < sizeof(tcmd);  ++i )
                {
                  tcmd[i] = (char)0;
                }
             
              }
   
      break;
      case 1:

              if(val=='e')
              {
                switch(mode)
                 {
                  case 3:
                         Serial.println("foward");
                         analogWrite(EB,speed);
                         digitalWrite(motor3a,LOW);
                        digitalWrite(motor4a,HIGH);
               
                  break;
                  case 4:
                         Serial.println("Back");
                         analogWrite(EB,speed);
                         digitalWrite(motor3a,HIGH);
                        digitalWrite(motor4a,LOW);
               
                  break;
                  case 5:
                         Serial.println("left");
                       analogWrite(EA,speed);
                       digitalWrite(motor1a,LOW);
                       digitalWrite(motor2a,HIGH);
               
                  break;
                  case 6:
                         Serial.println("right");
                     analogWrite(EA,speed);
                     digitalWrite(motor1a,HIGH);
                     digitalWrite(motor2a,LOW);
               
                  break;
             
                 }
                state=0;
                mode=0;
              }
              else
              {
                tcmd[index]=val;
                index++;
              }

      break;
     }
   }
}

四、當我用Arduino UNO作完實驗後,確定可行後,就銲電路,並使用Arduino pro板,用雙面膠裝在車上。



試跑後,發現3顆AA電池跑不動,故改裝用行動電源來控制。Pretty Good。


五、硬體完成後,開始要寫Android App,使用的開發環境是App Inventor 2。參考網路用APP Inventro藍芽溝通教學後,立馬自已寫一個。


這在裡推薦一下,MIT AI2 Companion這個APP,當電腦開發完,只要你手機路電腦網路有連結,它會直接將最後更改完的結果傳送到您的手機,方便你測試。

六、完成囉! Enjoy it !!

  我兒子很愛。







2 則留言: