## 首先,先附上代码 ##
#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); //下面的舵机附加到引脚9up.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的串口来控制他的直流电机与云台。