通過串列埠傳值給Arduino,再通過Arduino控制小車(直流電機)移動與二自由度雲臺轉動角度
阿新 • • 發佈:2019-01-08
## 首先,先附上程式碼 ##
#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小車
二自由度雲臺
直流電機驅動小車
上訴程式碼後面都有詳細的解釋了,就不再重複解釋了。
然後,你可以通過串列埠監視器輸入‘f’控制小車前進一段距離,同理輸入‘b’控制小車後退一段距離。輸入‘60,30’控制二自由度雲臺轉動到(60°,30°)。注意‘,’為英文下的逗號。
也可以使用各種串列埠通訊的方式,通過其他東西(如:樹莓派)傳值給Arduino的串列埠來控制他的直流電機與雲臺。