Arduino篇—车辆的避障功能

电子说

1.2w人已加入

描述

相关知识

常见的避障方式:

接触式:通过触碰开关来进行判断,经常应用在扫地机器人的挡板上。

非接触式:使用接近传感器实现功能,在没有物理接触的情况下检测物体的运动/存在并将捕获的信息传递为电信号的传感器。在避障小车的应用上,我们通常使用红外接近传感器或者超声波传感器。

超声波原理: 本节课我们主要使用超声波传感器来实现避障功能,这里针对超声波的原理再复习一下。

电信号

车辆避障功能设计模型:

电信号

电路搭建

所需材料

ArduinoUNO * 1
前两节课的车辆结构 * 1
超声波模块 *1
杜邦线若干

电路接线

电信号

程序编写

练习一:右转避障

小车在前行的过程中,20cm以内有障碍物,小车能自动右转避开,效果如下:

电信号

图形化方式:

具体右转时间可以根据实际情况进行调整。

电信号

代码方式:

/* 项目名称:右转避障车
 * 项目时间:2022.04.02
 * 项目作者:MRX
 */
int IN1 = 2;   // IN1 connected to pin 4
int IN2 = 4;   
int ENA = 3; 
int IN3 = 6;   // IN3 connected to pin 6
int IN4 = 7;   
int ENB = 5;  
int value = 255;   // the duty cycle
const int TrigPin = 12;//设置2号数字引脚为触发引脚
const int EchoPin = 13;//设置3号数字引脚为接收引脚
int distance = 0;


void Forward() {
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,value);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);
  analogWrite(ENB,value);
}


void Back() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,value);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,value);
}


void Right() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,value);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,0);
}


void Left() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,0);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,value);
}


void Stop() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,0);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,LOW);
  analogWrite(ENB,0);
}


void setup(){
  Serial.begin(9600);
  for (int i = 4;i <= 10;i++){
    pinMode(i, OUTPUT);
    }
  pinMode(TrigPin,OUTPUT);//12号脚为输出引脚
  pinMode(EchoPin,INPUT);//13号脚为输入状态
}

void loop(){
  digitalWrite(TrigPin,LOW);//先设置为低电平
  delayMicroseconds(2);//持续2微秒
  digitalWrite(TrigPin,HIGH);//设置为高电平
  delayMicroseconds(10);//持续10微秒
  digitalWrite(TrigPin,LOW);//再设置为低电平,这样模拟出了脉冲信号
  distance = pulseIn(EchoPin,HIGH)/58;//返回的是脉冲宽度/58得到实际距离
  if (distance <= 20) {
    Right();
    delay(1000);
  } else {
    Forward();
  }
}

练习二: 车辆自主避障

在前行的过程中,20cm以内有障碍物,小车自动绕开障碍物,然后继续前行,效果如下:

电信号

图形化方式:

延时时间数据需根据实际情况调试获得。

电信号

代码方式:

/* 项目名称:自动避障车
 * 项目时间:2022.04.02
 * 项目作者:MRX
 */
int IN1 = 2;   // IN1 connected to pin 4
int IN2 = 4;   
int ENA = 3; 
int IN3 = 6;   // IN3 connected to pin 6
int IN4 = 7;   
int ENB = 5;  
int value = 255;   // the duty cycle
const int TrigPin = 12;//设置2号数字引脚为触发引脚
const int EchoPin = 13;//设置3号数字引脚为接收引脚
int distance = 0;
int flag = 1;


void Forward() {
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,value);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);
  analogWrite(ENB,value);
}


void Back() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,value);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,value);
}


void Right() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,value);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,0);
}


void Left() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,0);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,value);
}


void Stop() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,0);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,LOW);
  analogWrite(ENB,0);
}


void setup(){
  Serial.begin(9600);
  for (int i = 4;i <= 10;i++){
    pinMode(i, OUTPUT);
    }
  pinMode(TrigPin,OUTPUT);//12号脚为输出引脚
  pinMode(EchoPin,INPUT);//13号脚为输入状态
}

void loop(){
  digitalWrite(TrigPin,LOW);//先设置为低电平
  delayMicroseconds(2);//持续2微秒
  digitalWrite(TrigPin,HIGH);//设置为高电平
  delayMicroseconds(10);//持续10微秒
  digitalWrite(TrigPin,LOW);//再设置为低电平,这样模拟出了脉冲信号
  distance = pulseIn(EchoPin,HIGH)/58;//返回的是脉冲宽度/58得到实际距离
  if (distance <= 20) {
    if (flag == 1) {
      Right();
      delay(500);
      flag = flag + 1;
    } else if (flag == 2) {
      Left();
      delay(500);
      Forward();
      delay(500);
      Stop();
      while(true);
    }
  } else {
    Forward();
  }
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分