找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2030|回复: 0
打印 上一主题 下一主题
收起左侧

从其它地方找的arduino循迹小车源程序

[复制链接]
跳转到指定楼层
楼主
ID:338448 发表于 2018-5-25 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int led1=0,led2=0,led3=0,led4=0,led5=0,led6=0,led7=0;          //电压7.8V ;led1~7 分别用来接收七个探头检测回来的值
int in1=9,in2=3,in3=10,in4=11;                                 //数字IO9,3,10,11用来控制电机
int sum=0;
void setup()
{
  pinMode(0,INPUT);pinMode(7,INPUT);
  pinMode(1,INPUT);pinMode(8,INPUT);
  pinMode(2,INPUT);pinMode(3,OUTPUT);
  pinMode(6,INPUT);pinMode(9,OUTPUT);
  pinMode(4,INPUT);pinMode(10,OUTPUT);
  pinMode(13,INPUT);pinMode(11,OUTPUT);
  pinMode(12,INPUT);pinMode(5,INPUT);
  digitalWrite(in2,LOW);digitalWrite(in4,LOW);
}
void motor(char pwmpin,char pin,int val)              //给电机两个输入口赋PWM
{   
   pinMode(pin, OUTPUT);   
   analogWrite(pwmpin,val);
   digitalWrite(pin,LOW);
}
void turn_led1_0()                                    //in120in2给低电平
{                                                     //in3250in4给低电平
  motor(in1,in2,20);                                  //PWM满值255,差值决定转角度,大小决定速度
  motor(in3,in4,250);
}
void turn_led1_1()
{
  motor(in1,in2,20);
  motor(in3,in4,250);
}
void turn_led2_0()
{
   motor(in1,in2,70);
   motor(in3,in4,250);
}
void turn_led2_1()
{
  motor(in1,in2,130);
  motor(in3,in4,250);
}
void turn_led3_0()
{
  motor(in1,in2,180);
  motor(in3,in4,250);
}
void turn_led3_1()
{
  motor(in1,in2,250);
  motor(in3,in4,250);
}
void turn_led4_0()
{
  motor(in1,in2,250);
  motor(in3,in4,250);
}
void turn_led4_1()
{
  motor(in1,in2,250);
  motor(in3,in4,250);
}
void turn_led5_0()
{
  motor(in1,in2,250);
  motor(in3,in4,180);
}
void turn_led5_1()
{
  motor(in1,in2,250);
  motor(in3,in4,130);
}
void turn_led6_0()
{
  motor(in1,in2,250);
  motor(in3,in4,70);
}
void turn_led6_1()
{
  motor(in1,in2,250);
  motor(in3,in4,20);
}
void turn_led7_0()
{
   motor(in1,in2,250);
   motor(in3,in4,20);
}
void turn_stop()
{
  motor(in1,in2,0);
  motor(in1,in2,0);
}
void test()                              //检测光电管探头。是黑线返回高电平(1),白线返回低电平(0),这与实际电路相关
{                                        //0,1,2,6,4,7,8是数字IO口,读取检测值
  led1=digitalRead(0);
  led2=digitalRead(1);
  led3=digitalRead(2);
  led4=digitalRead(6);
  led5=digitalRead(4);
  led6=digitalRead(7);
  led7=digitalRead(8);
}
int deal()                            //对每个探头赋值:从左往右-6-4-2,0,2,4,6 记录检测到黑线的探头个数并将值相加
    {
      int a=0,b=0,c=0,d=0,e=0,f=0,g=0;
      int i=0,value=0;
      test();
      if(led1==1)
      {
         a=-6;
         i++;
       }
      if(led2==1)
     {
       b=-4;
       i++;
     }
      if(led3==1)
      {
        c=-2;
        i++;
      }
      if(led4==1)
      {
        d=0;
        i++;
      }
      if(led5==1)
     {
       e=2;
       i++;
     }
      if(led6==1)
     {
       f=4;
       i++;
     }
      if(led7==1)
      {
        g=6;
        i++;
      }
      sum=a+b+c+d+e+f+g;                  //求平均值,较精确的确定黑线位置               
      if(i==0) value=8;                   //分母不能为0,冲出跑道均没检测到的特殊情况,让小车保持上一次的状态
      else if(i<3) value=sum/i;           //一般的情况:1个或2个检测到黑线
      else
      {
        if(sum<0) value=-6;                //特殊情况:左急弯,右急弯,直道
        else if(sum>0) value=6;
        else value=0;
      }
      return value;
    }
void loop()
{
  static char a[5],j=0;                  //数组记录上次值
  if(j==5) j=0;
  if(deal()==8)
  {
    if(j==0) a[j]=a[4];
    else   a[j]=a[j-1];
  }
  switch(a[j])                            //对各种返回值的响应速度和转弯角度
  {
    case -6:turn_led1_0();break;
    case -5:turn_led1_1();break;
    case -4:turn_led2_0();break;
    case -3:turn_led2_1();break;
    case -2:turn_led3_0();break;
    case -1:turn_led3_1();break;
    case  0:turn_led4_0();break;
    case  1:turn_led4_1();break;
    case  2:turn_led5_0();break;
    case  3:turn_led5_1();break;
    case  4:turn_led6_0();break;
    case  5:turn_led6_1();break;
    case  6:turn_led7_0();break;
    default:turn_led4_0();break;
  }
  j++;
}
/*相比较于数字信号的话,这个处理程序应该比较好了。PWM值,角度,速度与实际情况有较大联系,车的配置,摩擦,电压,车重量,电机转速,轮子大小等,所以各位下载后还需细调。不过,这个程序就在于很好调,你只要改变上面的PWM值就可实现转弯与速度的实际搭配*/

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表