置頂文字

歡迎來訪 !! 如有任何問題歡迎一起討論或是 eMail 給我 legorunmail@Gmail.com

2015年11月25日 星期三

Android 手機與Arduino 藍芽HC-05 / 06 連結應用

讓Android、iPhone手機與Arduino連結交互應用是很有趣的程式設計,因此有些要注意的地方就留下紀錄

首先是Arduino部分

網路資源  搜尋藍芽裝置  網路資源   Arduino送資料給手機接收   收機接收資料

藍芽搜尋  藍芽傳送程式  透過藍芽上傳程式02

Arduino 資料型態   執行序資料傳遞  執行序Run與Start差異性

透過藍芽燒縙Arduino 程式取代USB


Part 1

#include
#include
#include 2C
.h>


#define MAX_BTCMDLEN 128

// 建立一個軟體模擬的序列埠
// HC-06    Arduino
// TX       RX/Pin10
// RX       TX/Pin11
SoftwareSerial BTSerial(10,11); // Arduino RX/TX

// Addr, En, Rw, Rs, d4,d5,d6,d7 backlight, polarity
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); 

byte cmd[MAX_BTCMDLEN]; // received 128 bytes from an Android system
int len = 0; // received command length

void setup() {
    Serial.begin(9600);   // Arduino起始鮑率:9600
    BTSerial.begin(9600); // HC-06 出廠的鮑率:每個藍牙晶片的鮑率都不太一樣,請務必確認
   
    // 初始化LCD1602
    lcd.begin(16, 2);
    lcd.clear();
    lcd.backlight();
}

void loop() {
    char str[MAX_BTCMDLEN];
    int insize, ii;  
    int tick=0;
    while ( tick// 因為包率同為9600, Android送過來的字元可能被切成數份
        if ( (insize=(BTSerial.available()))>0 ){  // 讀取藍牙訊息
            for ( ii=0; ii
                cmd[(len++)%MAX_BTCMDLEN]=char(BTSerial.read());
            }
        }
        else {
            tick++;
        }
    }
    if ( len ) { // LCD1602顯示從Android手機傳過來的訊息
        sprintf(str,"%s",cmd);
        // Serial.println(str);
        // 將對串列埠的輸出改為對LCD1602輸出
        lcd.clear();
        lcd.print(str);
        cmd[0] = '\0';
    }
    len = 0;
}

---------------------------------------------------------------------------------------------

Part 2
//-------------------------------------------------------------
// Controlling a servo position using serial port 
// Controlling a 360 continuous rotation servo using bluetooth
// 2015.02.04
// by gsyan  
//-------------------------------------------------------------
#include  

long serialBaudRate = 115200;         //藍牙(序列埠)通訊的速率(鮑率 baud rate)

int rightPin = 9; //右邊 servo 控制腳接在哪一個腳位
int leftPin = 10; //左邊 servo 控制腳接在哪一個腳位

//底下角度的值必須自行測試, 依 servo 來設定
int rightStopAngle = 95; //右邊 servo 停止轉動的值
int leftStopAngle = 106; //左邊 servo 停止轉動的值
int maxAngle = 75; //正轉、逆轉(加減)最大的值

const int delayMilliseconds = 20; // 每隔多少 MS 讀取一次資料

Servo rightServo;   // create servo object to control right servo 
Servo leftServo; // create servo object to control leftt servo 

int angle = 0; //記錄目前 servor 動力的值(真正給 servo 的值還會加上 rightStopAngle或leftStopAngle

//讓兩顆 servo 停止
void servoStop() {
  rightServo.write(rightStopAngle);
  leftServo.write(leftStopAngle);
//讓兩顆 servo 暫停指定的時間
void servoPause(int t) {
   servoStop();
   delay(t);
}  

//初始程序    
void setup() 
  Serial.begin(serialBaudRate); //Arduino起始鮑率:38400
  
  rightServo.attach(rightPin);  // attaches the servo on pin "rightPin" to the right servo object 
  leftServo.attach(leftPin); // attaches the servo on pin "leftPin" to the left servo object 
  angle = 0;
  servoStop();

//循環執行的程序
void loop() 
  byte inBytes[20]; //暫存所有外部傳來資料用
  byte inByte; //暫存用
  int inSize; //計算已取得多少資料用
    
  if ((inSize=(Serial.available()))>0){  //讀取藍牙訊息
    for (int i=0; i
      inByte = Serial.read();
      if(i<19 div="">
        inBytes[i] = inByte;
      }
    }
    //執行指定的動作 F(前進)、f(後退)、t(右轉)、T(左轉)和 S(停止)
    switch(char(inBytes[0])) {
      case 'F' :    //Forward
        if(angle > 0) {
          servoPause(500);
        }
        angle = -1*maxAngle;
        rightServo.write(rightStopAngle+angle);
        leftServo.write(leftStopAngle-angle);
        break;
      case 'f' :    //Backword
        if(angle < 0) {
          servoPause(500);
        }
        angle = maxAngle;
        rightServo.write(rightStopAngle+angle);
        leftServo.write(leftStopAngle-angle);
        break;
      case 'T' :    //Left turn
        servoPause(500);
        angle = -1*maxAngle;
        rightServo.write(rightStopAngle+angle);
        leftServo.write(leftStopAngle+angle);
        break;
      case 't' :    //Right turn
        servoPause(500);
        angle = maxAngle;
        rightServo.write(rightStopAngle+angle);
        leftServo.write(leftStopAngle+angle);
        break;
      case 'S' :    //stop
        servoStop();
        break;
      default :    //others: stop
        servoStop();
        break;
      
    }
  }  
  
  delay(delayMilliseconds);        // 暫停多少 MS 後繼續
  

沒有留言:

張貼留言