本文将给出一个实例,使用两个红外避障器和一个超声波避障器,实现物体在前进过程中对前方物体的识别(实体)和躲避。
以移动小车为例,使用四电机驱动,搭配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); //左转延时
}
}