通过串口传值给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的串口来控制他的直流电机与云台。

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值