查看: 252|回复: 4

[未解决] 四路红外寻迹小车不走,请求帮忙

[复制链接]
  • TA的每日心情
    擦汗
    2019-8-24 15:34
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-8-21 16:52 | 显示全部楼层 |阅读模式
    本帖最后由 zlione 于 2019-8-21 16:56 编辑

    做的四路寻迹小车,没有动静,电机不转。请求大神帮忙看看什么问题:(

    #include <AFMotor.h>
    
    const int SensorRight1 = 14; //A0  定义右1的循迹传感器引脚
    const int SensorRight2 = 15; //A1  定义右2的循迹传感器引脚
    const int SensorLeft2 = 16; //A2  定义左2的循迹传感器引脚
    const int SensorLeft1 = 17; //A3  定义左1的循迹传感器引脚
    int SL1; //定义左1的循迹传感器状态
    int SL2; //定义左2的循迹传感器状态
    int SR1; //定义右1的循迹传感器状态
    int SR2; //定义右2的循迹传感器状态
    
    AF_DCMotor motorLeftfront(1,MOTOR12_64KHZ);//创建电机左前1号,速度64KHz pwm
    AF_DCMotor motorLeftback(2,MOTOR12_64KHZ);//创建电机左后2号,速度64KHz pwm
    AF_DCMotor motorRightfront(3,MOTOR12_64KHZ);//创建电机右前3号,速度64KHz pwm
    AF_DCMotor motorRightback(4,MOTOR12_64KHZ);//创建电机右后4号,速度64KHz pwm
    
    void setup()
    {
      Serial.begin(9600);
      
      pinMode(14, INPUT);  //右1的循迹传感器
      pinMode(15, INPUT);  //右2的循迹传感器
      pinMode(16, INPUT);  //左2的循迹传感器
      pinMode(17, INPUT);  //左1的循迹传感器
    
      Serial.println("Motor test!");
      
      delay(1000);
    }
    
    void loop()
    {
      int SL1=digitalRead(SensorLeft1);
      int SL2=digitalRead(SensorLeft2);
      int SR1=digitalRead(SensorRight1);
      int SR2=digitalRead(SensorRight2);
    
      if(SL1==0&&SL2==1&&SR2==1&&SR1==0)
        {
          front();   //检测到中间传感器遇到黑线,说明小车正常,前行
          delay(2);
          while(1){
            SL2 = digitalRead(SensorLeft2);  //循环判断中间传感器读数
            SR2 = digitalRead(SensorRight2);
            if(SL2==1&&SR2==1)
            {   front();      //如果中间传感器仍在黑线,继续前行
                delay(2);}
                else
                break;    //检测到num2==0说明转过头了,跳出循环,检测三个传感器的状态再做出相应动作
                }                        //后面道理相同
          }
          else if(SL1==0&&SL2==0&&SR2==1&&SR1==0)
          {
            turnright();
            delay(2);
            while(1){
              SL2 = digitalRead(SensorLeft2);  
              SR2 = digitalRead(SensorRight2);
              if(SL2==0&&SR2==1)
              {  turnright();
                 delay(2);}
                 else
                 break;
            }
          }
          else if(SL1==0&&SL2==1&&SR2==0&&SR1==0)
          {
            turnleft();
            delay(2);
            while(1){
              SL2 = digitalRead(SensorLeft2);  
              SR2 = digitalRead(SensorRight2);
              if(SL2==1&&SR2==0)
              {  turnleft();
                 delay(2);}
                 else
                 break;
               }
            }
            
          else if((SL1==1)&&SL2&&SR2&&SR1)
          {
            turnleftquickly();
            delay(2);
            while(1){
            SL2 = digitalRead(SensorLeft2);  
            SR2 = digitalRead(SensorRight2);
            if(SL2==1&&SR2==1)
            {   front();     
                delay(2);}
                else
                break;  
                }                        
             }
          else if(SL1&&SL2&&SR2&&(SR1==1))
          {
            turnleftquickly();
            delay(2);
            while(1){
            SL2 = digitalRead(SensorLeft2);  
            SR2 = digitalRead(SensorRight2);
            if(SL2==1&&SR2==1)
            {   front();     
                delay(2);}
                else
                break;  
                }                        
             }
             else // 都是白色停止
             {
               stop();
              
             }
    }
    
    void front()  //前进速度
    {
       motorLeftfront.setSpeed(100);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
       motorLeftback.setSpeed(100);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
       motorRightfront.setSpeed(100);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
       motorRightback.setSpeed(100);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
    }
    void back()  //后退速度
    {
       motorLeftfront.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
       motorLeftback.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
       motorRightfront.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
       motorRightback.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
    }
    void turnleft()  //小幅度左转
    {
      motorLeftfront.setSpeed(0);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorLeftback.setSpeed(0);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightfront.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightback.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
    }
    
    void turnleftquickly()  //大幅度左转
    {
      motorLeftfront.setSpeed(20);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorLeftback.setSpeed(20);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightfront.setSpeed(150);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightback.setSpeed(150);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
    }
    
    void turnright()  //小幅度右转
    {
      motorLeftfront.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorLeftback.setSpeed(80);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightfront.setSpeed(0);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightback.setSpeed(0);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
    }
    
    void turnrightuickly()  //大幅度右转
    {
      motorLeftfront.setSpeed(150);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorLeftback.setSpeed(150);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightfront.setSpeed(20);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
      motorRightback.setSpeed(20);//设置电机速度,从0-255之间任意值(0代表停止,255代表全速)
    }
    
    void stop()
    {
      motorLeftfront.run(RELEASE);//停止
      motorLeftback.run(RELEASE);//停止
      motorRightfront.run(RELEASE);//停止
      motorRightback.run(RELEASE);//停止  
    }
  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2019-8-21 22:05 | 显示全部楼层
    先确定下硬件和供电有无问题
    如果你觉得以上内容帮到了你,你可以打赏支持作者
  • TA的每日心情
    擦汗
    2019-8-24 15:34
  • 签到天数: 18 天

    [LV.4]偶尔看看III

     楼主| 发表于 2019-8-22 20:02 | 显示全部楼层
    coloz 发表于 2019-8-21 22:05
    先确定下硬件和供电有无问题

    多谢,用的4节干电池给L293D供电,现在改成6节再试试
  • TA的每日心情
    擦汗
    2019-8-24 15:34
  • 签到天数: 18 天

    [LV.4]偶尔看看III

     楼主| 发表于 2019-8-24 15:35 | 显示全部楼层
    coloz 发表于 2019-8-21 22:05
    先确定下硬件和供电有无问题

    供电没问题,硬件也没问题,就是不动啊
  • TA的每日心情
    无聊
    2016-12-23 16:50
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-8-24 20:20 | 显示全部楼层
    1.L293D单独接每个电机,测试一下,确保电机能正常工作;
    2.你地面的轨迹线有多宽?在前进时能确保中间两个传感器同时感应到轨迹吗?
      实际上,我的建议是中间两个传感器只要有一个感应到轨迹就可以判断为直行状态,等到两个边缘的传感器检测到轨迹的时候,再进行方向修正。
    所以,判断是否前进的代码中:
    if(SL1==0&&SL2==1&&SR2==1&&SR1==0)  改为
    if(SL2==1 || SR2==1) 试试,只要中间的传感器有一个检测到轨迹就前进,边缘的两个传感器管他作甚。
    其他地方也是如此修改。

    最后,我认为只要3个传感器就足够了,你可以试试。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    求ESP8266+0.96oled的天气代码
    求ESP8266+0.96oled的天气
    新人求助
    新人求助
    仿真出错!显示原因是这个,但是找不到该出错文件
    用Arduino制作支持ROS机器人操作系统的7轴机械臂
    用Arduino制作支持ROS机器
    参赛项目:[/backcolor] 用Arduino制作支持ROS机器人操作系统的7轴机械臂[/backcolor
    为拍月亮而生的便携望远镜系统。
    为拍月亮而生的便携望远镜
    参赛项目: 便携望远镜系统 参赛组员: 1人 布丁:嵌入式软件、上位机软件、电路、结
    光敏电阻检测环境光实验
    光敏电阻检测环境光实验
    本文节选自《Arduino程序设计基础》 一些简单的电子元件就可以做传感器使用,例如我
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表