电子说
相关知识
常见的避障方式:
接触式:通过触碰开关来进行判断,经常应用在扫地机器人的挡板上。
非接触式:使用接近传感器实现功能,在没有物理接触的情况下检测物体的运动/存在并将捕获的信息传递为电信号的传感器。在避障小车的应用上,我们通常使用红外接近传感器或者超声波传感器。
超声波原理: 本节课我们主要使用超声波传感器来实现避障功能,这里针对超声波的原理再复习一下。
车辆避障功能设计模型:
电路搭建
所需材料
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();
}
}
全部0条评论
快来发表一下你的评论吧 !