1. 程式人生 > >通過串列埠傳值給Arduino,再通過Arduino控制小車(直流電機)移動與二自由度雲臺轉動角度

通過串列埠傳值給Arduino,再通過Arduino控制小車(直流電機)移動與二自由度雲臺轉動角度

## 首先,先附上程式碼 ##

#include<Servo.h>

Servo up,down;      
String comdata="";         //用於接收串列埠資料
int numdata[2]={0,0};      //numdata陣列用於儲存串列埠傳來的角度
int mark=0;           //標誌位,1表示有資料進來

//使用數字埠4,5,6,7控制電機(4,5為一組;6,7為一組)
int IN1=4;        
int IN2=5;
int IN3=6;
int IN4=7;

void sport(int direction,int del){
  int
i=0; if(direction=='f'){ //串列埠輸入一個‘f’前進一次 while(i<del){ //執行次數受del控制 digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); i++; } Serial.println("前進..."); stopp(); } else if(direction=='b'){ //串列埠輸入一個‘b’後退一次
while(i<del){ digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); i++; } Serial.println("後退..."); stopp(); } else if(direction=='l'){ //串列埠輸入一個‘l’左轉一次 while(i<del){ digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); i++; } Serial.println("左轉..."
); stopp(); } else if(direction=='r'){ //串列埠輸入一個‘r’右轉一次 while(i<del){ digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); i++; } Serial.println("右轉..."); stopp(); } } void stopp(){ //停止 digitalWrite(IN1,LOW); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,LOW); } void setup() //初始化 { for (int i=4;i<=7;i++) { pinMode(i,OUTPUT); //設定數字埠4,5,6,7為輸出模式 digitalWrite(i,HIGH); //設定數字埠4,5,6,7為HIGH,電機保持不動 } up.attach(10,1000,2000); //上面的舵機附加到引腳10 down.attach(9,1000,2000); //下面的舵機附加到引腳9 up.write(60); //上面的舵機初始角度為60° (個人專案需要) down.write(30); //下面的舵機初始角度為30° Serial.begin(9600); } void loop() { int j = 0; while(Serial.available() > 0) //當Serial.available()>0時,說明串列埠接收到了資料,可以讀取。 { char flag=Serial.read(); //如果串列埠傳值進來為‘f,b,l,r’則執行sport函式(控制小車移動) if(flag=='f'||flag=='b'||flag=='l'||flag=='r') { sport(flag,5000); } //否則就控制雲臺轉動 else { comdata += flag; delay(2); mark=1; //標誌位置1,標明有值傳入 } } if(mark==1) //當標誌位為1時,才執行 { numdata[0]=0; //此時numdata陣列應該置0,重新賦予傳來的值 numdata[1]=0; Serial.println(comdata); for(int i=0;i<comdata.length();i++) { //逐個分析comdata[i]字串的文字,如果碰到文字是分隔符(這裡選擇逗號分割)則將comdata陣列下標下移一位 //即比如: 120,60 開始的120記到numdata[0];碰到逗號j等於1了 //如果沒有逗號的話,就將讀到的數字*10加上以前讀入的數字 //並且(comdata[i] - '0')就是將字元'0'的ASCII碼轉換成數字0 //因此可以將字串變成數字儲存起來 if(comdata[i]==',') { j++; } else { numdata[j] += numdata[j]*10 + (comdata[i]-'0'); } } up.write(numdata[0]); //上舵機轉到numdata[0]所記錄的角度 down.write(numdata[1]); //下舵機轉到numdata[1]所記錄的角度 comdata=String(""); //comdata的字串已經全部轉換到numdata了,清空comdata以便下一次使用 mark=0; //將標誌位mark置0,不置0下次迴圈就會在執行 if(mark==1)....的程式段。 } }

自己搭的Arduino小車

自己搭的Arduino小車

二自由度雲臺

二自由度雲臺

直流電機驅動小車

直流電機

上訴程式碼後面都有詳細的解釋了,就不再重複解釋了。

然後,你可以通過串列埠監視器輸入‘f’控制小車前進一段距離,同理輸入‘b’控制小車後退一段距離。輸入‘60,30’控制二自由度雲臺轉動到(60°,30°)。注意‘,’為英文下的逗號。
也可以使用各種串列埠通訊的方式,通過其他東西(如:樹莓派)傳值給Arduino的串列埠來控制他的直流電機與雲臺。