查看: 919|回复: 6

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

[复制链接]
  • TA的每日心情
    擦汗
    2020-1-9 22:50
  • 签到天数: 21 天

    [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的每日心情
    擦汗
    2020-1-9 22:50
  • 签到天数: 21 天

    [LV.4]偶尔看看III

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

    多谢,用的4节干电池给L293D供电,现在改成6节再试试
  • TA的每日心情
    擦汗
    2020-1-9 22:50
  • 签到天数: 21 天

    [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个传感器就足够了,你可以试试。
  • TA的每日心情
    郁闷
    2019-10-29 19:07
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-10-13 21:10 | 显示全部楼层
    小白来学习
  • TA的每日心情
    擦汗
    2020-1-9 22:50
  • 签到天数: 21 天

    [LV.4]偶尔看看III

     楼主| 发表于 2019-11-4 11:59 | 显示全部楼层
    skyhome 发表于 2019-8-24 20:20
    1.L293D单独接每个电机,测试一下,确保电机能正常工作;
    2.你地面的轨迹线有多宽?在前进时能确保中间两个 ...

    最近在忙其他事情。才看到您的回复,多谢。这就试试
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    ESP32能烧录程序但是不能启动
    ESP32能烧录程序但是不能
    电路图3如下1,能烧录程序但是不能启动,3.3V供电正常
    SpiderRobot 蜘蛛
    SpiderRobot 蜘蛛
    关于SpiderRobot 项目实行方案 之前有人推荐我做这个项目,于是乎就有了这个 h
    点灯·blinker-app智动化设置不工作,还需设置那些?
    点灯·blinker-app智动化
    void loop() { Blinker.run(); // Blinker.delay(100); if (read_time ==
    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表