首先是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="">19>
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 後繼續
}
沒有留言:
張貼留言