查看: 1254|回复: 15

[教程] 基于L293D的蓝牙、寻迹、避障、四驱遥控小车

[复制链接]
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-12-27 14:20 | 显示全部楼层 |阅读模式
    本帖最后由 swztxy 于 2019-12-30 13:27 编辑

    链接外网的视频放不了,只好发链接了
    视频地址:https://v.youku.com/v_show/id_XNDQ4NDY2MDYxNg==.html

    也可以微信扫描:

    微信扫

    微信扫

    手机客户端界面

    手机客户端界面

    舵机加超声波探测

    舵机加超声波探测

    L293D控制板

    L293D控制板

    3节18650电池

    3节18650电池

    5路红外寻迹模块

    5路红外寻迹模块
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-27 14:29 | 显示全部楼层
    本帖最后由 swztxy 于 2019-12-30 10:41 编辑

    器材:ARDUINO UNO板,L293D电机板,小黄电机加轮四套,HC-05蓝牙模块,9g舵机,超声波距离模块,有源蜂鸣器,18650*3加电池盒,船形开关,杜邦线,红外寻迹模块*5,小车底板。

    接口:
    左前电机----L293d M1
    右前电机----L293d M2
    左后电机----L293d M3
    右后电机----L293d M4
    蓝牙hc05:TX--UNO RX     hc05:RX--UNO TX
    超声波分别接l293D,2口和13口,需要分别从L293d上重新焊出引脚。
    蜂鸣器接9号口,即l293D的srero0的s口
    舵机接l293D的srero1,即UNO的10号口
    五路寻迹从车头左边开始分别一一对应A0-A5,即左1--A0,左2--A1。。。。。(A1-A5引脚需要在l293d上自己焊出来,一一对应uno主板的,非常明确)
    三节18650给l293D供电,l293D插在uno上,即通过针脚给uno供电。

    需要实现的功能是:1、四驱,2、小车和蓝牙联接后,可以控制小车前进,后退,原地左右转,可以让小车一直前进,前进过程中控制左右转向,小车不停。鸣笛时暂停,执行完不影响小车执行下一步动作。3、手机蓝牙APP设置控制按扭,让小车避障。4、手机蓝牙APP中设置控制按扭,让小车寻迹。5、寻迹和避障中途可随时控制小车前进转向和鸣笛,执行完后继续执行寻迹或避障。6、车速调节按扭,随时加速或减速。



  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-27 14:58 | 显示全部楼层

    连线图

    本帖最后由 swztxy 于 2019-12-30 11:48 编辑

        本着人人为我,我为人人的精神,将这段时间以来做小车和感受作一个整理吧。
    2019年8月底,小孩学校要求做个科技小创作,然后交作业,从那时起接触了单片机,之前完全是门外汉。因为对这些电子器件非常感兴趣,所以打算动手先做一个玩玩,成不成都无所谓。
        上网看了很多大神的案例,有注释的比较好懂,没有注释的自己百度一条条的查含义。所以我的程序里代码的注释是非常全面的,基本有点基础都能看懂了。
        因为我之前上学时学的还是foxplus+还是basic+之类的数据库编程。C+完全没有接触过,但是逻辑上好像都能套得上,所以感觉上手还是挺快的。我的代码里的语句有些是很笨的办法,可以优化的地方太多,就目前这个水平,我估计这样也行了。
       以下的所谓经验,不一定对,欢迎指正。


    1、我按照网上教程,连线和代码也是一样的,为啥电机就是不转呢?估计很多新人经常有这样的问题,首先应该排除供电问题,我两节18650带两个电机,完全无压力,但四驱时,总是各种问题,要不是传感器信号不对,要不是电机不走,或是走一两个,另两个不走,当3节18650加入时,一节问题都没了。其次,连线的问题,线连上了不代表是通的,有次L298n带双电机,测试正反转里,正转没问题,反转就不行,代码和连线都查了,都没错,就是不转,简直要崩,后来突然灵机一动,两线一对调,能反转不能正转了,才发现其中一根杜邦线内部不通了。垃圾杜邦线8元钱20-30条的那种,你烧一下,里面的铜线都是分段的,没有一根是整的,后来有万用表,测断路就十分方便了。最后是代码了,下载的代码,自己要理解一下,特别是端口。曾经看过一个大神的代码,文字中标注连接的是2号口,代码中却是5号,如果一点不理解的,网上抄一抄,就能出来作品,那太难了、出了一点问题都解决不了。


    2、模块之间的冲突问题。一是物理冲突,比如5组红外寻迹,有大佬告诉我红外是漫反射,也就是说如果碍得近,会互相干扰,你一组发出的光给别一组接收了,那结果就不准了,所以要做物理隔离,我那个5路,中间一路是做了竖向的护板,贴上了黑色PVC胶带,最外面两组套上了黑色套筒,这样中间紧碍的两组就可以不用做陆离了,因为1,3,5已经陆离,2,4就安全了。二是单片机内部的冲突,我的代码 里有一组代码 是红外遥控的,我已经给注释掉了,红外的库,因为<AFMotor.h>和<IRremote.h>这两个库冲突,红外库需要使用timer2,而timer2是控制其中两个pwm口的空占比,所以会两个轮子不转,如果强行改到timer1,9-10口就有某名的问题,舵机在转向时出错。不确定解释清楚这个问题,如果碰到相关问题可以查查定时器相关方面的资料。之前有个贴子说的很透彻,可惜我搜不到了。
    另外注释掉红外遥控的原因,也是红外遥控没有啥意思,首先距离上要近,而且还要对准了,红外头偏了就接收不到,小车是行进的,很难保证完全对得上,所以全当做试验,真的做遥控小车没有利用价值。


    3、


    连线图

    连线图
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-27 15:44 | 显示全部楼层

    四楼占用,代码楼

    本帖最后由 swztxy 于 2019-12-31 10:29 编辑

    #include <AFMotor.h>                      //L293四驱  加5路寻迹
    #include <SoftwareSerial.h>                //蓝牙库
    //#include <IRremote.h>                  //红外库
    //#include <Servo.h>                       //引用servo超声波库文件,使得下面可以调用相关参数

    //const int irReceiverPin = 19;     // 红外接收器的 OUTPUT 引脚接在A6 接口 定义irReceiverPin变量为a6接口
    //IRrecv irrecv(irReceiverPin);      // 设置irReceiverPin定义的端口为红外信号接收端口
    //decode_results results;            // 定义results变量为红外结果存放位置
    //Servo s; //超声波转向舵机

    AF_DCMotor motorA(1,MOTOR12_64KHZ);   //L293四驱 四个电机运行频率
    AF_DCMotor motorB(2,MOTOR12_64KHZ);
    AF_DCMotor motorC(3,MOTOR34_64KHZ);
    AF_DCMotor motorD(4,MOTOR34_64KHZ);
    int cheSpeed;                          //小车的速度

    int trac1 = 14;                           //从车头方向的最左边开始排序接红外寻迹模块
    int trac2 = 15;
    int trac3 = 16;
    int trac4 = 17;
    int trac5 = 18;
    int val1;         //寻迹模块储存值
    int val2;
    int val3;
    int val4;
    int val5;
    int servopin = 10;    //定义舵机接口数字接口10 也就是舵机的橙色信号线。

    int bl;             //定义运行指针
    int bll;
    unsigned int L; //左距离存储
    unsigned int R; //右距离存储
    unsigned int S; //中距离存储

    int trig=2; //发射信号
    int echo=13; //接收信号
    int speker=9; //有源喇叭接口

    void setup() {
      digitalWrite(speker,HIGH);//有源喇叭拉高禁音
      Serial.begin(9600);
      pinMode(trac1, INPUT);  //寻迹模块引脚初始化
      pinMode(trac2, INPUT);
      pinMode(trac3, INPUT);
      pinMode(trac4, INPUT);
      pinMode(trac5, INPUT);
      //pinMode(irReceiverPin, INPUT); //红外引脚初始化
      pinMode(trig,OUTPUT); //超声波设置引脚模式
      pinMode(echo,INPUT);
      pinMode(speker,OUTPUT); //设置有源喇叭接口引脚模式
    cheSpeed=80;  //小车的速度80
    //irrecv.enableIRIn();   // 启动红外解码
    //tonee();// 蜂鸣器响
    //s.attach(10); //定义舵机所用引脚10-SER1
    pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
    //s.write(90);//定义舵机中位
    zw();//定义舵机中位
    //turn();
    delay(500); //开机延时
    bl=1;//定义运行指针值
    bll=1;//定义运行指针记忆值 //digitalWrite(speker,LOW);//有源喇叭开机响一声
    //delay(100);
    //digitalWrite(speker,HIGH);//有源喇叭拉高禁音
                  }

    void loop() {
    //range();       //超声波测距,可以加入超声波测距,将值加入寻迹和避障中使用
    /*if   (irrecv.decode(&results)) {   // 红外解码成功,把数据放入results.value变量中
                 bl=1;
                  chuspeed();  // 给小车速度赋值                    
                   hwtest();
                    // 运行红外解码判断
    }
    */

    if(Serial.available()>0){   // 蓝牙串口有数据
                  chuspeed();  // 给小车速度赋值
                  lytest();    // 运行蓝牙解码判断         
                  }   

    if(bl==2){                     
                    chuspeed(); // 给小车速度赋值
                    xunji();// 运行寻迹

                    }   

    if(bl==3){                  
                      chuspeed();// 给小车速度赋值
                      motorun();  // 小车前进不停

                      }
    if(bl==4){                  
                     chuspeed();// 给小车速度赋值
                      bz();  // 小车避障
                      }

    if(bl==5){                    
                      motostop();
                   digitalWrite(speker,LOW);// 喇叭响
                   delay(150);
                   digitalWrite(speker,HIGH);
                      if(bll==2){bl=2;}// 喇叭响完以后继续之前程序指针
                      else if(bll==3){bl=3;}
                      else if(bll==4){bl=4;}
                      else {
                            bll=1;
                            bl=1;}
                      }  



    else{ motostop();}  

    }


    void servopulse(int angle)//定义一个脉冲函数   舵机函数
    {
      int pulsewidth=(angle*11)+500;  //将角度转化为500-2480的脉宽值
      digitalWrite(servopin,HIGH);    //将舵机接口电平至高
      delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
      digitalWrite(servopin,LOW);     //将舵机接口电平至低
      delayMicroseconds(20000-pulsewidth);
    }





    void chuspeed(void){                  // 定义小车初始速度
    motorA.setSpeed(cheSpeed);   
    motorB.setSpeed(cheSpeed);
    motorC.setSpeed(cheSpeed);   
    motorD.setSpeed(cheSpeed);   
                     }

    /*void lj(void){
      if(cheSpeed>205){cheSpeed=205; }
      motorA.setSpeed( cheSpeed+30);   // 定义小车左加速1
      motorC.setSpeed( cheSpeed+30);
      motorB.setSpeed( cheSpeed);   
      motorD.setSpeed( cheSpeed);
      }

    void ljj(){
      if(cheSpeed>205){cheSpeed=205; }
      motorA.setSpeed( cheSpeed+50);   // 定义小车左加速2
      motorC.setSpeed( cheSpeed+50);
    motorB.setSpeed( cheSpeed);   
      motorD.setSpeed( cheSpeed);
      }

      void rj(){
      if(cheSpeed>205){cheSpeed=205; }
      motorB.setSpeed( cheSpeed+30);    // 定义小车右加速1
      motorD.setSpeed( cheSpeed+30);
      motorA.setSpeed( cheSpeed);   
      motorC.setSpeed( cheSpeed);

      }

    void rjj(){
      if(cheSpeed>205){cheSpeed=205; }
      motorB.setSpeed( cheSpeed+50);  // 定义小车右加速2  
    motorD.setSpeed( cheSpeed+50);
    motorA.setSpeed( cheSpeed);   
    motorC.setSpeed( cheSpeed);
    }  
    */

    void motostop(void){              // 定义小车停止  
                  motorA.run(RELEASE);
                  motorB.run(RELEASE);
                  motorC.run(RELEASE);
                  motorD.run(RELEASE);
                  }

    void motorun(void){              // 定义小车前进  
                  motorA.run(FORWARD);
                  motorB.run(FORWARD);
                  motorC.run(FORWARD);
                  motorD.run(FORWARD);}

    void motodown(void){              // 定义小车后退
                  motorA.run(BACKWARD);
                  motorB.run(BACKWARD);
                  motorC.run(BACKWARD);
                  motorD.run(BACKWARD);}

    void motoleft(void){              // 定义小车原地左拐
                  motorA.run(BACKWARD);
                  motorB.run(FORWARD);
                  motorC.run(BACKWARD);
                  motorD.run(FORWARD);}

    void motoright(void){              // 定义小车原地右拐
                  motorA.run(FORWARD);
                  motorB.run(BACKWARD);
                  motorC.run(FORWARD);
                  motorD.run(BACKWARD);}

    void motorle(void){              // 定义小车左拐
                  motorA.run(RELEASE);
                  motorB.run(FORWARD);
                  motorC.run(RELEASE);
                  motorD.run(FORWARD);}

    void motorri(void){              // 定义小车右拐
                  motorB.run(RELEASE);
                  motorA.run(FORWARD);
                  motorD.run(RELEASE);
                  motorC.run(FORWARD);}              




    /* void hwtest(){                  // 定义红外解码判断
          if((results.value==16718055)||(results.value==1153127340) )//向上
              { Serial.println("forest");
               motostop();         
                delay(50);
                motorun();
                delay(400);}


            else if((results.value==16734885)||(results.value==1153139580) )//向右
             { Serial.println("right");
                  motostop();               
                  delay(50);
                  motoright();
                  delay(200);  }


               else if((results.value==16716015)||(results.value==1153145190) )//向左
                { Serial.println("left");
                  motostop();               
                  delay(50);
                  motoleft();
                  delay(200);  }


                else if((results.value==16730805)||(results.value==1153125300) )//向下
                { Serial.println("down");
                  motostop();            
                  delay(50);
                  motodown();
                  delay(300);}



                else if((results.value==16726215)||(results.value==1153135500) )//停止
                 { Serial.println("stop");
                  motostop();            
                  delay(100); }


                 else if((results.value==16738455)||(results.value==1153122750) )//加速
                 { Serial.println("speed+");
                   cheSpeed+=5;
                  if(cheSpeed>255){cheSpeed=255; }
                  Serial.print("cheSpeed=");
                  Serial.println(cheSpeed);}



                 else if((results.value==16756815)||(results.value==1153110510) )//减速
                 { Serial.println("speed-");
                   cheSpeed-=5;
                   if(cheSpeed<0){cheSpeed=0;}
                  Serial.print("cheSpeed=");
                  Serial.println(cheSpeed);}


                 else if((results.value==16750695)||(results.value==1153163550) )//寻迹
                 { Serial.println("xunji");
                  bl=2;}
                 else if((results.value==16736925)||(results.value==1153157430) )//一直前
                 { Serial.println("line go on");
                 bl=3;}
                 else if((results.value==16753245)||(results.value==1153124790) )//一直左
                 { Serial.println("left go on");
                  bl=4;}
                 else if((results.value==16769565)||(results.value==1153119180) )//一直右
                 { Serial.println("right go on");
                 bl=5;}

                 else if (results.value==0x16){
                  Serial.println("error");
                 delay(200);} //延时200毫秒,做一个简单的消抖
                 delay(200);
                 irrecv.resume();    // 继续等待接收下一组红外信号               
          }
    */


    void lytest(){                     // 定义蓝牙串口解码判断
             int cmd = Serial.read();//读取蓝牙模块发送到串口的数据         
           //  Serial.print(cmd);// 显示输入值

              if(cmd==49){   // 手机蓝牙输出1,对应ascii数是49
               Serial.println("FORWARD"); //输出状态
                  motostop();  
                  delay(100);
                  motorun();
                  delay(400);
                         }

              if(cmd==50){  // 手机蓝牙输出2,对应ascii数是50,后面以此类推即加48
              Serial.println("BACKWARD"); //输出状态
                  motostop();              
                  delay(100);
                  motodown();
                  delay(300);
                           }

                   if(cmd==51){   
                     Serial.println("STOP"); //输出状态
                  motostop();
                  bl=1;
                  bll=1;            
                  delay(100);              
                             }

                    if(cmd==52){   
                  Serial.println("left"); //输出状态
                  motostop();               
                  delay(100);
                  motoleft();
                  delay(200);            
                           }
                      if(cmd==53){   
                  Serial.println("Right"); //输出状态
                  motostop();            
                  delay(100);
                  motoright();
                  delay(200);            
                      }
                     if(cmd==54){
                   //  Serial.println("cheSpeed+=5");
                     cheSpeed+=5;
                     if(cheSpeed>255){cheSpeed=255; } //不超过255最高值
                     Serial.print("cheSpeed=");
                     Serial.println(cheSpeed);
                             }
                       if(cmd==55){
                    // Serial.println("cheSpeed-=5");
                  cheSpeed-=5;
                   if(cheSpeed<0){cheSpeed=0;}//不低于0
                  Serial.print("cheSpeed=");
                  Serial.println(cheSpeed);
                                   }

                       if(cmd==56){ //指针寻迹
                       bl=2;
                       bll=2;
                       Serial.println("xunji"); }                       


                      if(cmd==57){  //指针一直进      
                      bl=3;
                      bll=3;
                      Serial.println("go line");  }                     


                     if(cmd==97){//按健a,对应ASCII码是97 指针避障
                     bl=4;
                     bll=4;
                     Serial.println("bizhang");}            


                     if(cmd==98){ //按健b,对应ASCII码是98  指针喇叭
                          bl=5;

                        Serial.println("tonee"); }
    }   



    void xunji(){         //寻迹主函数     
    val1 = digitalRead(trac1);
    val2 = digitalRead(trac2); //寻迹模块返回值
    val3 = digitalRead(trac3);
    val4 = digitalRead(trac4);
    val5 = digitalRead(trac5);

    /*Serial.print("tack1=");
    Serial.print(val1);
    Serial.print("`");
    Serial.print("tack2=");
    Serial.print(val2);
    Serial.print("`");
    Serial.print("tack3=");
    Serial.print(val3);
    Serial.print("`");
    Serial.print("tack4=");
    Serial.print(val4);
    Serial.print("`");
    Serial.print("tack5=");
    Serial.print(val5);
    */

    if(val1==1 && val2==1 && val3==0  && val4==1 && val5==1  )  //11011中间黑线,即0为黑线
    {
      motostop();
    //  Serial.println("go line");
    motorun();
    delay(20);
    }

    else if(val1==1 && val2==0 && val3==0  && val4==0 && val5==1  )  //10001中间三黑线,十字路
    {
      motostop();
    //  Serial.println("go line");
    motorun();
    delay(20);
    }

    else if(val1==0 && val2==0 && val3==0  && val4==0 && val5==0  )  //00000都检测到黑线
    {
    // Serial.println("stop");
    motostop();
    delay(50);
    }

    else if(val1==1 && val2==1 && val3==1  && val4==1 && val5==1  )  //11111都无检测到黑线
    {
    // Serial.println("go...");
      motostop();
    motorun();
    delay(20);
    }



    else if(val1==1 && val2==0 && val3==0  && val4==1 && val5==1  )  //10011
    {  
    motostop();
    delay(20);
    Serial.println("go left");
    //motorle();
    motoleft();
    delay(50);
    }

    else if(val1==0 && val2==1 && val3==0  && val4==1 && val5==1  )  //01011
    {
    motostop();
    delay(20);
    Serial.println("go left");
    motoleft();
    delay(100);
    }

    else if(val1==1 && val2==0 && val3==1  && val4==1 && val5==1  )  //10111
    {
    motostop();
    delay(20);
    Serial.println("go left");
    motoleft();
    //motorle();
    delay(50);
    }


    else if(val1==0 && val2==0 && val3==1  && val4==1 && val5==1  )  //00111
    {
    motostop();
    delay(20);
    Serial.println("go left");
    //motorle();
    motoleft();
    delay(100);
    }


    else if(val1==0 && val2==0 && val3==0  && val4==1 && val5==1  )  //00011
    {
    motostop();
    delay(20);
    Serial.println("go left");
    motoleft();
    delay(400);
    }


    else if(val1==0 && val2==1 && val3==1  && val4==1 && val5==1  )  //01111
    {
    motostop();
    delay(20);
    Serial.println("go left");
    motoleft();
    delay(150);
    }

    else if(val1==1 && val2==1 && val3==0  && val4==0 && val5==1  )  //11001
    {
    motostop();
    delay(20);
    Serial.println("go right");
    //motorri();
    motoright();
    delay(50);
    }

    else if(val1==1 && val2==1 && val3==0  && val4==1 && val5==0  )  //11010
    {
    motostop();
    delay(20);
    Serial.println("go right");
    motoright();
    delay(50);
    }

    else if(val1==1 && val2==1 && val3==1  && val4==0 && val5==1  )  //11101
    {
    motostop();
    delay(20);
    Serial.println("go right");
    //motorri();
    motoright();
    delay(50);
    }

    else if(val1==1 && val2==1 && val3==1  && val4==0 && val5==0  )  //11100
    {
    motostop();
    delay(20);
    Serial.println("go right");
    //motorri();
    motoright();
    delay(100);
    }

    else if(val1==1 && val2==1 && val3==0  && val4==0 && val5==0  )  //11000
    {
    motostop();
    delay(20);
    Serial.println("go right");
    motoright();
    delay(400);
    }

    else if(val1==1 && val2==1 && val3==1  && val4==1 && val5==0  )  //11110
    {
    motostop();
    delay(20);
    Serial.println("go right");
    //motorri();
    motoright();
    delay(150);
    }


    else if(val1==1 && val2==0 && val3==1  && val4==0 && val5==1  )  //10101
    {
    motostop();
    delay(20);
    Serial.println("go right");
    //motorri();
    motoright();
    delay(20);
    }

    else{
       motostop();
       // Serial.println("else go");
       motostop();
       delay(20);
      }

      }



    void range(){ //定义中间测距函数
    digitalWrite(trig,LOW); //测距
    delayMicroseconds(2); //延时2微秒
    digitalWrite(trig,HIGH);
    delayMicroseconds(20);
    digitalWrite(trig,LOW);
    int distance = pulseIn(echo,HIGH); //读取高电平时间
    distance = distance/58; //按照公式计算
    S = distance; //把值赋给S
    //Serial.println(S); //向串口发送S的值,可以在显示器上显示距离
    }

    void rangel(){ //定义左边测距函数
    digitalWrite(trig,LOW); //测距
    delayMicroseconds(2); //延时2微秒
    digitalWrite(trig,HIGH);
    delayMicroseconds(20);
    digitalWrite(trig,LOW);
    int distance = pulseIn(echo,HIGH); //读取高电平时间
    distance = distance/58; //按照公式计算
    L = distance; //把值赋给L
    //Serial.println(L); //向串口发送L的值,可以在显示器上显示距离
    }


    void ranger(){ //定义右边测距函数
    digitalWrite(trig,LOW); //测距
    delayMicroseconds(2); //延时2微秒
    digitalWrite(trig,HIGH);
    delayMicroseconds(20);
    digitalWrite(trig,LOW);
    int distance = pulseIn(echo,HIGH); //读取高电平时间
    distance = distance/58; //按照公式计算
    R = distance; //把值赋给R
    //Serial.println(R); //向串口发送R的值,可以在显示器上显示距离
    }

    /*void tonee(){//无源蜂鸣器  作用:使用 tone()函数产生声音,模拟防控警报的响声
    for(int i=200;i<=800;i++) //用循环的方式将频率从 200HZ 增加到 800HZ
    {
    pinMode(9,OUTPUT);
    tone(9,i); //在9号端口输出频率
    delay(5); //该频率维持 5 毫秒
    }
    delay(500); //最高频率下维持 4 秒钟
    for(int i=800;i>=200;i--) {
    pinMode(9,OUTPUT);
    tone(9,i);
    delay(10);
    }
    }
    */

    void turn(){      //左右探测距离函数
      motostop();
      delay(500);
        lw();     //舵机转到150度既左边(角度与安装方式有关)
       delay(800);     //留时间给舵机转向
       rangel();//左边测距值为L

       zw();    //测距完成,舵机回到中位
       delay(800);   //留时间给舵机转向
       range();//中间测距值为S

         rw(); //舵机转动到30度,测右边距离
        delay(800);//留时间给舵机转向
        ranger();   //右边测距值为R

        zw(); //回中位
         delay(800);//留时间给舵机转向
         }  


    void zw(){   //舵机中
       for(int i=0;i<50;i++)  //发送50个脉冲
            {
              servopulse(90);   //引用脉冲函数  舵机位置中
             }   
       }


    void lw(){  //舵机150度角
       for(int i=0;i<50;i++)  //发送50个脉冲
            {
              servopulse(150);   //引用脉冲函数 舵机150度角
             }   
       }


    void rw(){   //舵机30度角
       for(int i=0;i<50;i++)  //发送50个脉冲
            {
              servopulse(30);   //引用脉冲函数 舵机30度角
             }   
      }




    void bz(){//避障主程序
         motostop();              
         delay(20);
       range();     //先对中间测距值为S
      if (S>60){   // 如果S大于60cm
         motostop();              
         delay(20);
         Serial.println("run"); //输出状态
         motorun();//前进
         delay(80);   
        }

      else if(S<30){  // 如果S小于30cm
                  Serial.println("BACKWARD"); //输出状态
                  motostop();              
                  delay(200);
                  motodown();//后退
                  delay(200);
        }


      else{   // 即S小于60cm,大于30cm     
         Serial.println("turn"); //输出状态
        turn();                      //调出左右探测距离函数,判断左右距离值
        Serial.print("L="); //输出状态
       Serial.print(L); //输出状态
        Serial.print("--"); //输出状态
        Serial.print("R="); //输出状态
       Serial.print(R); //输出状态
       Serial.println(); //输出状态

                 if((L>R) && (L>S)){//左边比前方和右方距离大
                  Serial.println("GO LEFT"); //输出状态
                  motostop();               
                  delay(100);
                  motoleft();//左转
                  delay(300);      
                        }
                 else if ((R>L) && (R>S)){//右边比前方和左方距离大
                  Serial.println("GO RIGHT"); //输出状态
                  motostop();               
                  delay(100);
                  motoright();//右转
                  delay(300);
                   }

                  else if ((L>R) && (L<S)){   //左边比右方距离大,但是小于前方
                  Serial.println("GO RIGHT"); //输出状态
                  motostop();               
                  delay(100);
                  motoleft();   //从左边大转弯,相当于从左边调头
                  delay(600);
                   }

                  else if ((R>L) && (R<S)){   //右边比左方距离大,但是小于前方
                  Serial.println("GO RIGHT"); //输出状态
                  motostop();               
                  delay(100);
                  motoright();//从右边大转弯,相当于从右边调头
                  delay(600);
                   }


                 else{ motodown();
                  delay(100);    }      
        }
       }

  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-27 17:05 | 显示全部楼层
    本帖最后由 swztxy 于 2020-1-2 15:10 编辑

    重复了重复了重复了

    AFMotor.rar

    5.98 KB, 下载次数: 24

    L293D库文件

  • TA的每日心情
    开心
    2018-9-30 09:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-12-28 11:59 | 显示全部楼层
    打个你的电路图是用什么方法绘制的
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-28 12:42 来自手机 | 显示全部楼层
    a527440781 发表于 2019-12-28 11:59
    打个你的电路图是用什么方法绘制的

    PS
  • TA的每日心情
    开心
    2018-9-30 09:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-12-29 11:02 | 显示全部楼层

    可以。谢谢,我也ps哈哈
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-31 09:55 | 显示全部楼层
    本帖最后由 swztxy 于 2019-12-31 09:59 编辑

    以下是红外遥控的程序,修改第二行#define choose后面的值,1,即通过电脑串口记录你自己红外遥控器的编码,任何家用的遥控器,手机模拟的红外遥控器都可以,记录好以后,填入主程序函数即2,作为判断条件,在if 语句中使用,就可以执行自己想要的功能了。

    #include <IRremote.h>
    #define choose 2    //1为通过串口打印码值模式  
                        //2为主函数运行模式
                        
    const int irReceiverPin = 2;  // 红外接收器的 OUTPUT 引脚接在 PIN2 接口 定义irReceiverPin变量为PIN2接口
    IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
    decode_results results;    // 定义results变量为红外结果存放位置



    void setup() {
    Serial.begin(9600); //9600(PC端使用)
    irrecv.enableIRIn();   // 启动红外解码
    }

    void loop() {
      if(choose==1) scan();
      else if(choose==2) rev();
    }

    void rev(void){
      
      if   (irrecv.decode(&results)) {   // 解码成功,把数据放入results.value变量中
               if((results.value==16718055)||(results.value==1153127340) )//向上
                { Serial.println("forest"); }


               else if((results.value==16734885)||(results.value==1153139580) )//向右
                { Serial.println("right"); }


               else if((results.value==16716015)||(results.value==1153145190) )//向左
                { Serial.println("left"); }


                else if((results.value==16730805)||(results.value==1153125300) )//向下
                { Serial.println("down"); }



                else if((results.value==16726215)||(results.value==1153135500) )//停止
                 { Serial.println("stop"); }


                 else if((results.value==16738455)||(results.value==1153122750) )//加速
                 { Serial.println("speed+"); }

                

                 else if((results.value==16756815)||(results.value==1153110510) )//减速
                 { Serial.println("speed-"); }


                 else if((results.value==16750695)||(results.value==1153163550) )//寻迹
                 { Serial.println("xunji"); }


                 else if((results.value==16753245)||(results.value==1153124790) )//一直左
                 { Serial.println("left go on"); }



                 else if((results.value==16769565)||(results.value==1153119180) )//一直右
                 { Serial.println("right go on"); }



                 else if((results.value==16736925)||(results.value==1153157430) )//一直前
                 { Serial.println("line go on"); }


              delay(200); //延时600毫秒,做一个简单的消抖     
              irrecv.resume();    // 继续等待接收下一组信号
                                     }

      
      if(results.value==0x16){delay(600);} //延时600毫秒,做一个简单的消抖
    }

    void scan(void)
    {
    if (irrecv.decode(&results)) {   // 解码成功,把数据放入results变量中
        // 把数据输入到串口
        Serial.print("irCode: ");            
        Serial.println(results.value, DEC); // 显示红外编码
        Serial.println(results.value,HEX);//通过串口打印十六进制的键值 
        Serial.print(",  bits: ");           
        Serial.println(results.bits); // 显示红外编码位数
        delay(600);
        irrecv.resume();    // 继续等待接收下一组信号
      }if(results.value==0x16)
      delay(600); //延时600毫秒,做一个简单的消抖
    }
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-12-31 16:42 | 显示全部楼层
    本帖最后由 swztxy 于 2020-1-2 15:11 编辑

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

    本版积分规则

    热门推荐

    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    天猫精灵接入语音提示找不到该设备?
    天猫精灵接入语音提示找不
    今天又刷了一遍代码,天猫精灵提示 没有找到你要操作的设备! 怎么回事啊??? 折腾
    引入库的问题,不知道怎么叙述 看图吧
    引入库的问题,不知道怎么
    最左边的是主文件 也就是启动的文件 后边三个是引入的 在后边这个文件再引入库就报错
    blinker电源插座
    blinker电源插座
    这台blinker电源插座有blinker控制和手动控制两种工作方式. 1.blinker控制:滑条用于设
    blinker灯、环境传感器套件意见收集
    blinker灯、环境传感器套
    计划春节后推出blinker氛围灯和环境检测套件。 本帖收集相关建议,如若采纳,发红包(
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表