您的位置:首页 > 产品设计 > UI/UE

通过串口传值给Arduino,再通过Arduino控制小车(直流电机)移动与二自由度云台转动角度

2017-05-31 21:57 525 查看
## 首先,先附上代码 ##

#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,不
9405
置0下次循环就会在运行 if(mark==1)....的程序段。
}
}


自己搭的Arduino小车



二自由度云台



直流电机驱动小车



上诉代码后面都有详细的解释了,就不再重复解释了。

然后,你可以通过串口监视器输入‘f’控制小车前进一段距离,同理输入‘b’控制小车后退一段距离。输入‘60,30’控制二自由度云台转动到(60°,30°)。注意‘,’为英文下的逗号。

也可以使用各种串口通信的方式,通过其他东西(如:树莓派)传值给Arduino的串口来控制他的直流电机与云台。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arduino