精华内容
下载资源
问答
  • Arduino智能小车——超声波避障

    万次阅读 多人点赞 2017-09-01 21:17:36
    Arduino智能小车——超声波避障  经过这几篇的测试大家应该对小车有一定的认识了,在实际的操作过程中经常会由于操作不当各种碰壁吧?那这次我们将给小车装上一只“眼睛”,让小车看到障碍,躲避障碍。准备材料...

    Arduino智能小车——超声波避障

    Arduino智能小车系列教程时空门:

    1. Arduino智能小车——拼装篇 点击跳转
    2. Arduino智能小车——测试篇 点击跳转
    3. Arduino智能小车——调速篇 点击跳转
    4. Arduino智能小车——超声波避障 点击跳转
    5. Arduino智能小车——蓝牙小车 点击跳转
    6. Arduino智能小车——循迹篇 点击跳转
    7. Arduino智能小车——小车测速 点击跳转

      经过前几篇的测试大家应该对小车有一定的认识了,在实际的操作过程中经常会由于操作不当各种碰壁吧?那这次我们将给小车装上一只“眼睛”,让小车看到障碍,躲避障碍。

    准备材料

    超声波模块HC-SR04

      在这里简单说下超声波测距的原理,相信大家也都知道。超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

    1. 采用Trig引脚触发,给至少10us的高电平脉冲信号
    2. 模块自动发送8个40kHz的方波,自动检测是否有信号返回
    3. 有信号返回,通过Echo引脚输出一个高电平脉冲,高电平脉冲持续的时间就是超声波从发射到反射返回的时间。距离=(高电平脉冲时间*340)/2。(声音在空气中传播速度为340m/s)
    主要技术参数
    工作电压DC5V
    静态电流<2mA
    输出电平0-5V
    感应角度≤15度
    探测距离2cm-450cm
    最高精度0.3cm

    ###舵机
      在这里推荐9G舵机SG90,或者其他类似的舵机,这种舵机体积比较小,扭矩虽然不是大, 但是足够带动简易云台,很方便在小车上使用,大家购买时注意舵机的转动角度,有55度的,180度的等等,大家可以根据需要购买。

    舵机固定架

      舵机固定架的购买一定要配合舵机,所以大家购买的时候注意尺寸哦!!~

    舵机安装

      舵机在安装之前大家一定要记得校准,为什么要校准那,这个跟舵机的工作原理有关。控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
      舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

    高电平时间对应位置
    0.5ms0度
    1.0ms45度
    1.5ms90度
    2.0ms135度
    2.5ms180度

      也就是说当对舵机输入相同控制信号时,舵机会运动到固定位置,他的动作不是做圆周运动,而是在运动范围内,每一个位置对应一个控制信号。

      因此我们需要在将舵机安装在固定架上之前,需要先将舵机初始化好,舵机一般为三根线:棕色——GND,红色——VCC,橙色——控制信号。因此我们将棕色线接到GND,红色线接到“+5V”引脚,橙色线接到“9”引脚,初始化程序如下:

    #include <Servo.h>  //加入含有舵机控制库的头文件
    
    #define PIN_SERVO 9  //舵机信号控制引脚
    Servo myservo;  
      
    void setup()  
    {  
      myservo.attach(PIN_SERVO);  //舵机初始化
    }  
      
    void loop()  
    {  
      myservo.write(90);  //PWM输出
    } 
    

      在舵机初始化好之后将其安装在固定架上,然后装配在小车上,此时保证超声波模块超前。

    超声波接线

      估计不少朋友早已经发现板子上的“+5V”和“GND”引脚已经不够用了,这个时候你们可以向我这样焊一个扩展板出来,上面固定两排排针,一排用来扩展“+5V”,一边用来扩展“GND”引脚。

      超声波模块有四个引脚,“VCC”接到Arduino UNO开发板的“+5V”引脚,“GND”接到开发板“GND”引脚,“Trig”引脚接到开发板“8”引脚,“Echo”引脚接到开发板“7”引脚

      线太乱了,真的没办法整理,我自己都没眼看。

    代码测试

    #include <Servo.h>
    
    #define STOP      0
    #define FORWARD   1
    #define BACKWARD  2
    #define TURNLEFT  3
    #define TURNRIGHT 4
    
    int leftMotor1 = 16;
    int leftMotor2 = 17;
    int rightMotor1 = 18;
    int rightMotor2 = 19;
    
    int leftPWM = 5;
    int rightPWM = 6;
    
    Servo myServo;  //舵机
    
    int inputPin=7;   // 定义超声波信号接收接口
    int outputPin=8;  // 定义超声波信号发出接口
    
    void setup() {
      // put your setup code here, to run once:
      //串口初始化
      Serial.begin(9600); 
      //舵机引脚初始化
      myServo.attach(9);
      //测速引脚初始化
      pinMode(leftMotor1, OUTPUT);
      pinMode(leftMotor2, OUTPUT);
      pinMode(rightMotor1, OUTPUT);
      pinMode(rightMotor2, OUTPUT);
      pinMode(leftPWM, OUTPUT);
      pinMode(rightPWM, OUTPUT);
      //超声波控制引脚初始化
      pinMode(inputPin, INPUT);
      pinMode(outputPin, OUTPUT);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      avoidance();
    }
    void motorRun(int cmd,int value)
    {
      analogWrite(leftPWM, value);  //设置PWM输出,即设置速度
      analogWrite(rightPWM, value);
      switch(cmd){
        case FORWARD:
          Serial.println("FORWARD"); //输出状态
          digitalWrite(leftMotor1, HIGH);
          digitalWrite(leftMotor2, LOW);
          digitalWrite(rightMotor1, HIGH);
          digitalWrite(rightMotor2, LOW);
          break;
         case BACKWARD:
          Serial.println("BACKWARD"); //输出状态
          digitalWrite(leftMotor1, LOW);
          digitalWrite(leftMotor2, HIGH);
          digitalWrite(rightMotor1, LOW);
          digitalWrite(rightMotor2, HIGH);
          break;
         case TURNLEFT:
          Serial.println("TURN  LEFT"); //输出状态
          digitalWrite(leftMotor1, HIGH);
          digitalWrite(leftMotor2, LOW);
          digitalWrite(rightMotor1, LOW);
          digitalWrite(rightMotor2, HIGH);
          break;
         case TURNRIGHT:
          Serial.println("TURN  RIGHT"); //输出状态
          digitalWrite(leftMotor1, LOW);
          digitalWrite(leftMotor2, HIGH);
          digitalWrite(rightMotor1, HIGH);
          digitalWrite(rightMotor2, LOW);
          break;
         default:
          Serial.println("STOP"); //输出状态
          digitalWrite(leftMotor1, LOW);
          digitalWrite(leftMotor2, LOW);
          digitalWrite(rightMotor1, LOW);
          digitalWrite(rightMotor2, LOW);
      }
    }
    void avoidance()
    {
      int pos;
      int dis[3];//距离
      motorRun(FORWARD,200);
      myServo.write(90);
      dis[1]=getDistance(); //中间
      
      if(dis[1]<30)
      {
        motorRun(STOP,0);
        for (pos = 90; pos <= 150; pos += 1) 
        {
          myServo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(15);                       // waits 15ms for the servo to reach the position
        }
        dis[2]=getDistance(); //左边
        for (pos = 150; pos >= 30; pos -= 1) 
        {
          myServo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(15);                       // waits 15ms for the servo to reach the position
          if(pos==90)
            dis[1]=getDistance(); //中间
        }
        dis[0]=getDistance();  //右边
        for (pos = 30; pos <= 90; pos += 1) 
        {
          myServo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(15);                       // waits 15ms for the servo to reach the position
        }
        if(dis[0]<dis[2]) //右边距离障碍的距离比左边近
        {
          //左转
          motorRun(TURNLEFT,250);
          delay(500);
        }
        else  //右边距离障碍的距离比左边远
        {
          //右转
          motorRun(TURNRIGHT,250);
          delay(500);
        } 
      }
    }
    int getDistance()
    {
      digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2μs
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平
      int distance = pulseIn(inputPin, HIGH); // 读出脉冲时间
      distance= distance/58; // 将脉冲时间转化为距离(单位:厘米)
      Serial.println(distance); //输出距离值
     
      if (distance >=50)
      {
        //如果距离小于50厘米返回数据
        return 50;
      }//如果距离小于50厘米小灯熄灭
      else
        return distance;
    }
    

    代码详解

    “Trig”引脚控制超声波发出声波,对应int outputPin=8;
    “Echo”引脚反应接收到返回声波,对应int inputPin=7;

    int inputPin=7;   // 定义超声波信号接收接口
    int outputPin=8;  // 定义超声波信号发出接口
    

    int getDistance()函数解析

    超声波发出引脚“Trig”为高时对外发出超声波,为保证发出10μs声波,因此在发送之前需要将该引脚拉低,并给他一定反应时间。

    digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2μs
    delayMicroseconds(2);
    

    之后发送10μs超声波

    digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
    

    声波发送之后禁止其继续发送,同时开始检测是否反射回来的声波

    digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平
      int distance = pulseIn(inputPin, HIGH); // 读出脉冲时间
    

    pulseIn()单位为微秒,声速344m/s,所以距离cm=344100/1000000pulseIn()/2约等于pulseIn()/58.0distance= distance/58; // 将脉冲时间转化为距离(单位:厘米)
    超声波模块工作受物体表面反射程度影响,并且在传播过程中信号强度容易衰减,因此该模块适用的检测距离有限,一般在50cm以内相对正确,而且我们在避障时不需要检测太远的距离,因此超过50cm以上的都按50cm计算

    if (distance >=50)
      {
        //如果距离小于50厘米返回数据
        return 50;
      }//如果距离小于50厘米小灯熄灭
      else
        return distance;
    

    void avoidance()函数解析

    小车前进过程中只检测前方距离障碍的距离,并且控制舵机,保持超声波模块位于正前方。

    motorRun(FORWARD,200);
      myServo.write(90);
      dis[1]=getDistance(); //中间
    

    当检测到小车前方距离障碍距离小于30cm时停车,检测两边距离。

    motorRun(STOP,0);
    

    控制舵机每次运动一个周期后都返回正前方位置。由于舵机运动需要一定的时间,因此在每转过一个角度的时候都延时delay(15),供其运动。

    for (pos = 90; pos <= 150; pos += 1) 
    {
          myServo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(15);                       // waits 15ms for the servo to reach the position
    }
    

    当运动到最左边时检测小车左边距离障碍的距离

    dis[2]=getDistance(); //左边
    

    向右边运动,检测右边距离

    for (pos = 150; pos >= 30; pos -= 1) 
    {
      myServo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(15);                       // waits 15ms for the servo to reach the position
      if(pos==90)
        dis[1]=getDistance(); //中间
    }
    dis[0]=getDistance();  //右边
    

    将前边、左边、右边距离障碍的距离都检测结束之后,舵机回到最初位置。

    for (pos = 30; pos <= 90; pos += 1) 
    {
      myServo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(15);                       // waits 15ms for the servo to reach the position
    }
    

    注意事项

    1.舵机使用时要防止其堵转,因为点击堵转时电流会增大,很容易烧坏舵机。
    2.舵机的红色电源线接入电压一般要大于等于其工作电压,供电不足会导致舵机不停自传。
    3.Arduino 《Servo.h》库里提供的write()函数输出的PWM即为舵机专用的20ms为周期的PWM波,如果使用其他开发板或者函数的话,请务必保证输出方波周期为20ms,否则舵机不会受控制

    总结

      这一篇讲解了舵机和超声波模块的使用方法,舵机在大家以后的开发生涯中应该会经常用到,因此舵机的使用规则(控制周期为20ms)请大家一定要记清楚,在舵机不受控制的时候建议大家可以购买一个舵机测试仪来测试舵机。

    欢迎各位有兴趣的朋友加入Q群1:789127261 点评、交流

    展开全文
  • 基于arduino的智能小车超声波避障小车实验,适合初学arduino的新手,使用了超声波模块,蜂鸣器,液晶屏,代码注释非常清楚。
  • 基于arduino的智能小车超声波避障实验,带舵机,舵机可以控制超声波模块旋转,从而扫描小车周围环境,代码注释清晰,很适合新手。
  • 基于Arduino超声波避障小车

    万次阅读 多人点赞 2019-03-17 12:03:41
    基于Arduino超声波避障小车 利用超声波,判断前方是否有障碍物,如果有小车转向,没有小车直行 所需材料 小车车架及车轮(可以用sw建模然后利用3D打印机打印,也可以在网上直接购买小车地板,用纸板最廉价O...

    基于Arduino的超声波避障小车

    利用超声波,判断前方是否有障碍物,如果有小车转向,没有小车直行

    所需材料

    1. 小车车架及车轮(可以用sw建模然后利用3D打印机打印,也可以在网上直接购买小车地板,用纸板最廉价O(∩_∩)O哈哈~)
    2. Arduino开发板及扩展板
    3. 两个360度舵机(我是以舵机为驱动的,也可以用电机)
    4. 杜邦线若干
    5. 超声波模块
    6. 锂电池

    组装小车及模块调试

    舵机调试利用代码使舵机前传后传停止

    参考代码如下:

    #include <Servo.h>
    Servo servo;  //定义舵机
    void setup()
    {
      servo.attach(2);//舵机串口设为2
    }
    void loop()
    {
        servo.write( 360 );//舵机前转
        delay(1000);
        servo.write( -360 );//舵机后转
        delay(1000);
        servo.write( 90 );//舵机停止
        delay(1000);
    }
    

    超声波模块调试:

    int Ecoh=A6;//Ecoh为回声脚
    int Trig=A7;//Trig为触发脚
    int Distance; 
    void setup()
    {
      Serial.begin(9600);//初始化串口
      pinMode(Ecoh,INPUT);//定义超声波输入脚
      pinMode(Trig,OUTPUT);//定义超声波输出脚 
    }
    void loop()//距离测试
    {
        digitalWrite(Trig,LOW);//给触发脚低电平2微妙
        delayMicroseconds(2);
        digitalWrite(Trig,HIGH);//给触发脚高电平10微妙
        delayMicroseconds(10);
        digitalWrite(Trig,LOW);//给触发脚持续低电平
        float Fdistance=pulseIn(Ecoh,HIGH);//读取高电平时间
        Fdistance=Fdistance/58;//L(m)=t(s)*344/2
        Distance=Fdistance;
        if(Fdistance<400)
        {
          Serial.print("Distance:");//输出距离
          Serial.print(Fdistance);//距离
          Serial.print("cm\n");
        }
        else
          Serial.print("!!!out of range!!!\n");
           
    }
    

    小车避障代码.

    #include <Servo.h>
    Servo servo_pin_right;  //定义右驱动
    Servo servo_pin_left;  //定义左驱动
    int Ecoh=A6;//Ecoh为回声脚
    int Trig=A7;//Trig为触发脚
    int Distance; 
    void setup()
    {
      Serial.begin(9600);//初始化串口
      pinMode(Ecoh,INPUT);//定义超声波输入脚
      pinMode(Trig,OUTPUT);//定义超声波输出脚 
      servo_pin_right.attach(9);//右驱动串口设为9
      servo_pin_left.attach(10);//左驱动串口设为10 
    }
    //===========小车基本运动===============
    //void car_go(int time)//小车直行
    void car_go()
    {
      servo_pin_left.write( 360 );//左轮前进
      servo_pin_right.write( -360);//右轮前进
      //delay( 100*time );//执行时间
    }
    void car_left(int time)//小车左转
    {
      servo_pin_left.write( 90);//左轮后退
      servo_pin_right.write( -360 );//右轮前进
      delay( 100*time );//执行时间
    }
    void car_back(int time)//小车后退
    {
      servo_pin_left.write( -360 );//左轮后退
      servo_pin_right.write(360 );//右轮后退
      delay( 100*time );//执行时间
    }
    void car_right(int time)//小车右转
    {
      servo_pin_left.write( 360 );//左轮前进
      servo_pin_right.write( 90);//右轮后退
      delay( 100*time );//执行时间
    }
    void car_stop(int time)//小车停止
    {
      servo_pin_left.write( 90 );//左轮停止
      servo_pin_right.write(90 );//右轮停止
      delay( 100*time );//执行时间
    }
    void Distance_test()//距离测试
    {
        digitalWrite(Trig,LOW);//给触发脚低电平2微妙
        delayMicroseconds(2);
        digitalWrite(Trig,HIGH);//给触发脚高电平10微妙
        delayMicroseconds(10);
        digitalWrite(Trig,LOW);//给触发脚持续低电平
        float Fdistance=pulseIn(Ecoh,HIGH);//读取高电平时间
        Fdistance=Fdistance/58;//L(m)=t(s)*344/2
        Distance=Fdistance;
        if(Fdistance<400)
        {
          Serial.print("Distance:");//输出距离
          Serial.print(Fdistance);//距离
          Serial.print("cm\n");
        }
        else
          Serial.print("!!!out of range!!!\n");
           
    }
    void loop()
    {
      while(1)
      {
        Distance_test();
        if(Distance<24)
        {
          while(Distance<24)
          {   
            car_right(2);
            car_stop(1);
            Distance_test();
          }
        }
         else
      	  car_go();
      }
       
    }
    

    在这里插入图片描述

    展开全文
  • 小车底板,L298N电机驱动模块,arduino板子,两个电机,超声波模块,杜邦线若干(公对公,公对母,母对母都要用到),胶带(用于固定元器件,当然胶水也可以,有螺丝固定最好),5V电池及电池盒(用于板子供电),12...

    1.元器件
    小车底板,L298N电机驱动模块,arduino板子,两个电机,超声波模块,杜邦线若干(公对公,公对母,母对母都要用到),胶带(用于固定元器件,当然胶水也可以,有螺丝固定最好),5V电池及电池盒(用于板子供电),12V电池及电池盒,用于L298N和电机供电,电烙铁及焊锡丝;
    2.安装步骤
    (1)硬件连接
    用L298N模块的out1,2连接一个电机,out2,3连接剩下一个,然后用12V电源给L298N模块供电,用5V给板子供电,当然用L298N的5V给板子供电也可以,但建议分开供电,然后就是L298N和板子连接,以下是我的连接方式:
    ENA:2;ENB:8;
    IN3:5;IN1:9;
    IN4:6;IN2:10;
    每一列控制一个电机;注意连接时要连接在PWM一侧,并且IN1~4连接的端口前要有 ~ 标志,例如 ~ 5,如果没连接到这个上面,电机就不能进行正传及小车后退操作;

    然后就是超声波模块连接,将其trag连接到A0端,其为发射端,Echo连接到A1端,为接收端,VCC,GND,连接电源和接地;
    以上就是硬件的连接;
    (2)代码实现
    
    int i;
    int s;
    
    void setup() {
      for(i=2;i<=10;i++){
        pinMode(i,INPUT);
      }
      pinMode(A1,INPUT);
      pinMode(A0,OUTPUT);
    }
    
    void run(int time){	//前进函数
      digitalWrite(8,HIGH);//ENBzuo
      digitalWrite(9,HIGH);//IN1
      digitalWrite(10,LOW);//IN2
      analogWrite(9,80);
      analogWrite(10,0);
    
      digitalWrite(2,HIGH);//ENAyou
      digitalWrite(5,HIGH);//IN3
      digitalWrite(6,LOW);//IN4
      analogWrite(5,80);
      analogWrite(6,0);
      
      delay(time*100);
    }
    
    void back(int time){ //后退
      digitalWrite(8,HIGH);//ENBzuo
      digitalWrite(10,HIGH);//IN1
      digitalWrite(9,LOW);//IN2
      analogWrite(10,80);
      analogWrite(9,0);
      
      
       digitalWrite(2,HIGH);//ENAyou
      digitalWrite(6,HIGH);//IN3
      digitalWrite(5,LOW);//IN4
      analogWrite(6,80);
      analogWrite(5,0);
    
      delay(time*100);
    }
    void right(int time){	//右转
      digitalWrite(8,HIGH);//ENBzuo
      digitalWrite(9,HIGH);//IN1
      digitalWrite(10,LOW);//IN2
      analogWrite(9,80);
      analogWrite(10,0);
    
      digitalWrite(2,LOW);//ENA
      digitalWrite(5,LOW);//IN3
      digitalWrite(6,LOW);//IN4
      analogWrite(5,0);
      analogWrite(6,0);
     
      delay(time*100);
    }
    
    void left(int time){	//左转
    
      digitalWrite(8,LOW);//ENBzuo
      digitalWrite(9,LOW);//IN1
      digitalWrite(10,LOW);//IN2
      analogWrite(9,0);
      analogWrite(10,0);
      
      digitalWrite(2,HIGH);//ENAyou
      digitalWrite(5,HIGH);//IN3
      digitalWrite(6,LOW);//IN4
      analogWrite(5,80);
      analogWrite(6,0);
    
      delay(time*100);
    }
    
    int distance(){		//测距函数
      digitalWrite(A0,LOW);
      delayMicroseconds(2);
      digitalWrite(A0,HIGH);
      delayMicroseconds(15);
      digitalWrite(A0,LOW);
      
      int m = pulseIn(A1,HIGH);
      s=m/58;
    
      return s;
    }
    
    void loop() {	//主循环
      s=distance();
      if(s>=50){
        run(15);
      }
      else{
        back(10);
        right(5);
      }
      //left(15);
    }
    
    咋说里,这个代码其实差东西,但条件有限,没有舵机,所有只能判断前方是否有障碍物,因此这里的代码左转是没用的,哈哈,望各位见谅见谅,如果有机会的话,啥时候回补充一下舵机连接和代码。
    
    看到这里,能不能给小友点个赞里。
    
    展开全文
  • arduino超声波避障小车

    2014-06-28 10:20:54
    arduino超声波避障小车,里面有proteus仿真文件,,,以及写好的文档,,
  • 亚博智能小车避障实验,arduino,嵌入式,当前方有障碍物时判断左边,若左边无障碍物直接左转。
  • Arduino学习笔记 超声波避障小车

    千次阅读 多人点赞 2019-05-23 22:43:44
    学习完了诸多模块,终于可以把它们凑在一起撺一台超声笔避障寻迹小车了 那咱们就先将超声波避障和红外线寻迹分成两个部分来讲! 先讲超声波避障部分吧! 超声波避障,自然少不了超声波模块和舵机模块还有TB6612FNG的...

    学习完了诸多模块,终于可以把它们凑在一起撺一台超声笔避障寻迹小车了
    那咱们就先将超声波避障和红外线寻迹分成两个部分来讲!

    先讲超声波避障部分吧!

    超声波避障,自然少不了超声波模块和舵机模块还有TB6612FNG的使用,在此再讲了,之前的博客已经较为详细具体讲解过这三个模块了,有需要的可以再看一看复习。
    直接上代码,拿代码来讲!(完整代码见文章末尾)

    1.要探测不同方向,自然就要用到舵机所以第一步要先调用函数

    而且为了方便描述小车进行何种运动,所以事先用几个宏定义来描述

    #include<Servo.h>
    #define STOP  0
    #define GO    1
    #define RIGHT 2
    #define LIFT  3
    #define BACK  4
    

    将前进,后退,左转,右转,停止宏定义

    2.接下来就是马达,超声波模块,舵机模块的接口定义了
    //马达转动
    int    lift1=2;
    int    lift2=3;
    int   right1=4;
    int   right2=7;
    int liftpwmA =5;
    int rightpwmB=6;
    //超声波
    int superout=10;
    int superin= 11;
    float cm1;//第一次测得的距离
    float cm2;//第二次测得的距离
    float cm3;//第三次测得的距离
    //控制舵机
    Servo myservo;
    
    3.第三步就是steup了
    void setup() 
    {
      Serial.begin(9600); //设置波特率
      myservo.attach(12); //舵机的信号控制针脚为十二号针脚
      //设置超声波
      pinMode(superout, OUTPUT);  //设置超声波接口为输出
      pinMode(superin,   INPUT);  //设置另一个超声波接口为输入
      //设置马达
      pinMode(lift1,OUTPUT);
      pinMode(lift2,OUTPUT);
      pinMode(right1,OUTPUT);
      pinMode(right2,OUTPUT);
      pinMode(liftpwmA ,OUTPUT);
      pinMode(rightpwmB,OUTPUT);
    }
    
    4.让车动起来!(移动函数)

    就拿直行做例子吧,当使用这个函数的时候,收到两个参数,一个就是控制运动状态的,另一个是控制车轮转速的,开始先定义两个轮子的转速,然后使用switch case,当运动模式为直行时,让两个轮子都正转,完成直行,其他运动模式可以自行推导。【例:左转左轮不动(或反转)右轮正转】

    void move1(int kind,int speed1)//移动,参数:1.运动模式,2.速度
    {
      analogWrite(liftpwmA ,speed1); //左轮转速
      analogWrite(rightpwmB,speed1); //右轮转速
      switch(kind)
      {
        case GO:
          Serial.println("向前");
          digitalWrite(lift1,HIGH);
          digitalWrite(lift2,LOW);
          digitalWrite(right1,HIGH);
          digitalWrite(right2,LOW);
          break;
        case RIGHT:
          break;
        case LIFT:
          break;
        case BACK:
          break;
        default://STOP
      }
    }
    
    5.超声波接收信号

    这是基本的超声波接收信号操作,在超声波模块进行过讲解,就不多做解释了

    int superread()//超声波读取数据
    {
        digitalWrite(superout,LOW);
        delayMicroseconds(2);
        digitalWrite(superout,HIGH);
        delayMicroseconds(10);
        digitalWrite(superout,LOW);
        int date=pulseIn(superin,HIGH)/58;
        return date;
    }
    

    6.最后一步整合代码

    #include<Servo.h>
    #define STOP  0
    #define GO    1
    #define RIGHT 2
    #define LIFT  3
    #define BACK  4
    
    //马达转动
    int    lift1=2;
    int    lift2=3;
    int   right1=4;
    int   right2=7;
    int liftpwmA =5;
    int rightpwmB=6;
    
    //超声波
    int superout=10;
    int superin= 11;
    float cm1;//第一次测得的距离
    float cm2;//第二次测得的距离
    float cm3;//第三次测得的距离
    
    Servo myservo;//控制舵机
    
    void setup() 
    {
      Serial.begin(9600); //设置波特率
      myservo.attach(12);//舵机的信号控制针脚为九号针脚
      
      //设置超声波
      pinMode(superout, OUTPUT); //设置超声波接口为输出
      pinMode(superin, INPUT);   //设置另一个超声波接口为输入
      
      //设置马达
      pinMode(lift1,OUTPUT);
      pinMode(lift2,OUTPUT);
      pinMode(right1,OUTPUT);
      pinMode(right2,OUTPUT);
      pinMode(liftpwmA ,OUTPUT);
      pinMode(rightpwmB,OUTPUT);
    }
    
    void loop() 
    {
      servo(90);  //让舵机转到90°
      supermove();//超声波行驶
    }
    
    void move1(int kind,int speed1)//移动,参数:1.运动模式,2.速度
    {
      analogWrite(liftpwmA ,speed1);
      analogWrite(rightpwmB,speed1);
      switch(kind)
      {
        case GO:
          Serial.println("向前");
          digitalWrite(lift1,HIGH);
          digitalWrite(lift2,LOW);
          digitalWrite(right1,HIGH);
          digitalWrite(right2,LOW);
          break;
        case RIGHT:
          Serial.println("右转");
          digitalWrite(lift1,HIGH);
          digitalWrite(lift2,LOW);
          digitalWrite(right1,LOW);
          digitalWrite(right2,HIGH);
          break;
        case LIFT:
          Serial.println("左转");
          digitalWrite(lift1,LOW);
          digitalWrite(lift2,HIGH);
          digitalWrite(right1,HIGH);
          digitalWrite(right2,LOW);
          break;
        case BACK:
          Serial.println("后退");
          digitalWrite(lift1,LOW);
          digitalWrite(lift2,HIGH);
          digitalWrite(right1,LOW);
          digitalWrite(right2,HIGH);
          break;
        default:
          Serial.println("停"); //输出状态
          digitalWrite(lift1, LOW);
          digitalWrite(lift2, LOW);
          digitalWrite(right1, LOW);
          digitalWrite(right2, LOW);
          break;
      }
    }
    
    void servo(int x)//舵机
    {
      myservo.write(x);//让舵机直接转到x°
      delay(200);
    }
    
    void supermove()//超声波行驶
    {
      move1(GO,200);//前进
      servo(90);
      cm1=superread();    //让超声波探测正前方的距离
      if(cm1<=30)         //如果距离小于30cm停止运动
      {
        move1(STOP,0);
        while(1)
        {
          cm1=superread();
          Serial.println(cm1);
          if(cm1<=50)    //距离小于50cm持续后退
          move1(BACK,200);//后退
          else 
              break;
        }
        servo(30);        //让超声波探测左前方的距离
        cm2=superread();
        delay(100);
        servo(150);       // 让超声波探测右前方的距离  
        cm3=superread();
        delay(100);
        servo(90);        //让超声回到正面
        if(cm2<=cm3 && cm1<cm3)  //如果右前方较空旷
        move1(RIGHT,250);        //右转
        if(cm2>cm3  && cm2>cm1)  //如果左前方较空旷
        move1(LIFT,250);         //左转
      }
    }
    
    int superread()//超声波读取数据
    {
        digitalWrite(superout,LOW);
        delayMicroseconds(2);
        digitalWrite(superout,HIGH);
        delayMicroseconds(10);
        digitalWrite(superout,LOW);
        int date=pulseIn(superin,HIGH)/58;
        return date;
    }
    

    以上就是对超声波避障小车的讲解了,下次讲解红外寻迹小车

    展开全文
  • 基于Arduino超声波智能避障小车

    万次阅读 多人点赞 2019-06-05 00:20:49
    依赖库的安装方法,如不清楚,可以参考官方文档《安装其他的Arduino库》 实物图: 程序如下: #include <Servo.h> #include <stdlib.h> #define speed1 5 //定义EA(PWM调速)接口 #define IN1 6 #...
  • 小车超声波避障

    2019-01-02 22:42:39
    小车程序,stm32超声波避障
  • 基于arduino的智能小车红外避障实验(带后退掉头避障),使用了超声波等模块,代码写得很详细,适合新手学习arduino
  • Arduino超声波智能避障小车 完整代码

    千次阅读 2019-11-22 11:58:13
    // Arduino超声波智能避障小车(不含舵机) #include <LiquidCrystal.h> //申明1602液晶的函数库 LiquidCrystal lcd(11,2,3,4,7,8); //4数据口模式连线声明, //==========================================...
  • Arduino智能小车超声波测距避障基本思路总结

    万次阅读 多人点赞 2018-06-15 13:36:27
    前几天已经实现了小车的循迹功能,下面是通过写避障的一些想法:   超声波原理:超声波传感器先发送一个信号,信号遇到障碍物后就会被反弹回来再被超声波传感器接收,接收到的高电平持续的时间就是超声波从发射到...
  • Arduino超声波智能避障小车+舵机 完整代码

    千次阅读 多人点赞 2019-11-22 11:50:45
    //===================================...//arduino超声波智能避障小车源码(含舵机) // 本实验控制速度的pwm值和延时均有调节,自己视实际情况调节。 //=========================================================...
  • arduino小车(二):超声波避障

    千次阅读 2019-05-09 20:09:46
    超声波避障

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 272
精华内容 108
关键字:

arduino小车超声波避障