【Arduino】代码实现红外和超声波协同避障

    本文将给出一个实例,使用两个红外避障器和一个超声波避障器,实现物体在前进过程中对前方物体的识别(实体)和躲避。

    以移动小车为例,使用四电机驱动,搭配Arduino UNO板。

使用元器件和按照位置:

1.驱动电机:左电机接口为UNO板的M1,右电机为M2

        其中M1由数字引脚5控制PWM调速,数字引脚7控制电机正反转

               M2由数字引脚6控制PWM调速,数字引脚4控制电机正反转

2.红外传感器:左循迹传感器接AO,右循迹传感器接A1;左避障传感器接A4,右避障传感器接A5

3.红外接收模块:数字引脚2

4.超声波:驱动板URF,vcc接VCC,Trig接A2,Echo接A3,GND接GND

5.舵机:数字引脚9(没有舵机可无视)

#include <Servo.h>      //舵机驱动头文件

void goAhead()          //前进函数
{
  analogWrite(5,200);   //左电机PWM调速
  digitalWrite(7,HIGH); //左电机高电平前进

  analogWrite(6,200);   //右电机PWM调速
  digitalWrite(4,HIGH); //右电机高电平前进
}

void stop()             //停止函数
{
  analogWrite(5,0);     //左电机PWM调速为0
  digitalWrite(7,HIGH); //左电机高电平前进

  analogWrite(6,0);     //右电机PWM调速为0
  digitalWrite(4,HIGH); //右电机高电平前进
}

void Left()             //左转函数,左电机后退,右电机前进,实现原地电机驱动左转向
{
  analogWrite(5,225);  //加大左电机后退速度,有利于转向
  digitalWrite(7,LOW); //左电机低电平后退

  analogWrite(6,225);  //加大右电机前进速度,有利于转向
  digitalWrite(4,HIGH);//右电机高电平前进
}


void goBack()           //后退函数
{
  analogWrite(5,200);  //左电机PWM调速为200
  digitalWrite(7,LOW); //左电机低电平后退

  analogWrite(6,200);  //左电机PWM调速为200
  digitalWrite(4,LOW); //右电机低电平后退
}

void Right()           //右转函数,左电机前进,右电机后退,实现原地电机驱动右转向
{
  analogWrite(5,225);  //加大左电机前进速度,有利于转向
  digitalWrite(7,HIGH);//左电机高电平前进

  analogWrite(6,225);  //加大右电机后退速度,有利于转向
  digitalWrite(4,LOW); //右电机低电平后退
}



Servo servo_9;                                //定义数字引脚9为舵机驱动引脚
float checkdistance_A2_A3()                   //定义A2和A3为超声波传感器信号
{
  digitalWrite(A2, LOW);                      //开机超声波初始化保持低电平,2微秒
  delayMicroseconds(2);  

  digitalWrite(A2, HIGH);                     //超声波启动发射高电平信号,10微秒
  delayMicroseconds(10);

  digitalWrite(A2, LOW);                      //关闭超声波发射
  float distance = pulseIn(A3, HIGH) / 58.00; //A3口返回声波信号时间,计算障碍物距离
  
  delay(10);

  return distance; 
}



void setup()
{
  pinMode(7, OUTPUT);  //定义左电机驱动信号引脚
  pinMode(4, OUTPUT);  //定义右电机驱动信号引脚
  servo_9.attach(9);   //定义舵机信号引脚
  pinMode(A2, OUTPUT); //定义A2引脚超声波发射端
  pinMode(A3, INPUT);  //定义A3引脚超声波接收端
  Serial.begin(9600);  //串口打印超声波的距离值,波特率9600
  pinMode(A4, INPUT);  //定义A4引脚为左边红外避障传感器信号输入
  pinMode(A5, INPUT);  //定义A4引脚为右边红外避障传感器信号输入
}




void loop()
{
  servo_9.write(90);                       //开机舵机归中,保持朝车正前方
  delay(0);

  Serial.println(checkdistance_A2_A3());

  if (checkdistance_A2_A3() > 25)          //判断车子正前方障碍物距离,大于25厘米,小车前进
  {
    goAhead();                             //小车前进

  }

  if (checkdistance_A2_A3() < 24)          //判断车子正前方障碍物距离,小于25厘米,小车左转
  {
    Left();                                //小车左转
    delay(300);                            //左转延时

    stop();                                //车子左转一定角度后停止一点时间
    delay(50);

  }

  if (digitalRead(A4) == 0 && digitalRead(A5) == 1) //左边红外避障传感器感应到障碍物
  {
    Right();                               //小车右转一段时间
    delay(500);

  }

  if (digitalRead(A4) == 1 && digitalRead(A5) == 0) //右边红外避障传感器感应到障碍物
  {
    Left();                                //小车右转一段时间
    delay(500);

  }

  if (checkdistance_A2_A3() < 20 && digitalRead(A4) == 0) //左边红外避障传感器与超声波同时检测到障碍物,且距离小于20cm
  {
    Right();                               //小车右转一段时间
    delay(300);                            //右转延时

    stop();                                //车子右转一定角度后停止一点时间
    delay(50);

  }

  if (checkdistance_A2_A3() < 20 && digitalRead(A5) == 0) //右边红外避障传感器与超声波同时检测到障碍物,且距离小于20cm
  {
    Left();                                //小车左转一段时间
    delay(300);                            //左转延时

    stop();                                //车子左转一定角度后停止一点时间
    delay(50);

  }
  if (checkdistance_A2_A3() < 15 && (digitalRead(A5) == 0 && digitalRead(A4) == 0)) //左边和右边红外避障传感器与超声波同时检测到障碍物,且距离小于15cm
  {
    stop();                                //小车停止
    delay(50);

    goBack();                              //小车后退1秒
    delay(1000);

    Left();                                //小车左转
    delay(800);                            //左转延时

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值