Arduino 小车避障循迹程序解析 - 自动导航与障碍物规避
这段代码是用来控制一个避障小车的行为的。首先定义了一些变量,包括'trace1'、'trace2'、'trace3' 表示三个循迹模块的输出信号,'Left1'、'Left2'、'Right1'、'Right2' 表示左右电机的控制信号,'Dist1'、'Dist2'、'Dist3' 表示三个超声波模块测得的距离。
在 'setup' 函数中,设置了各个引脚的输入输出模式。
在 'loop' 函数中,首先读取三个循迹模块的输出信号,并点亮 LED 灯。
然后通过调用 'checkdistance_0_0' 函数分别测量了三个超声波模块到障碍物的距离。
如果三个循迹模块都检测到黑线,说明小车正在沿着黑线行驶,根据不同的情况设置左右电机的控制信号,使小车可以继续沿着黑线行驶。
如果三个循迹模块都没有检测到黑线,说明小车遇到了障碍物,根据不同的情况设置左右电机的控制信号,使小车可以绕过障碍物。
通过不断的循环执行 'loop' 函数,实现了小车的自动避障和循迹功能。
代码示例:
volatile int trace1;
volatile int trace2;
volatile int trace3;
volatile int Left1;
volatile int Left2;
volatile int Right1;
volatile int Right2;
volatile float Dist1;
volatile float Dist2;
volatile float Dist3;
float checkdistance_0_0() {
digitalWrite(0, LOW);
delayMicroseconds(2);
digitalWrite(0, HIGH);
delayMicroseconds(10);
digitalWrite(0, LOW);
float distance = pulseIn(0, HIGH) / 58.00;
delay(10);
return distance;
}
void setup(){
trace1 = 0;
trace2 = 0;
trace3 = 0;
Left1 = 0;
Left2 = 0;
Right1 = 0;
Right2 = 0;
Dist1 = 0;
Dist2 = 0;
Dist3 = 0;
pinMode(23, INPUT);
pinMode(25, INPUT);
pinMode(27, INPUT);
pinMode(10, OUTPUT);
pinMode(0, INPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(5, OUTPUT);
}
void loop(){
trace1 = digitalRead(23);
trace2 = digitalRead(25);
trace3 = digitalRead(27);
digitalWrite(10,HIGH);
Dist1 = checkdistance_0_0();
Dist2 = checkdistance_0_0();
Dist3 = checkdistance_0_0();
if ((trace1 == 0 && trace2 == 0) && trace3 == 0) {
// 避障左转
if (Dist2 <= 25 && Dist3 <= 25) {
digitalWrite(9,HIGH);
digitalWrite(8,LOW);
analogWrite(3, 135);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
analogWrite(5, 135);
}
// 避障右转
if (Dist2 <= 25 && Dist1 <= 25) {
digitalWrite(9,LOW);
digitalWrite(8,HIGH);
analogWrite(3, 135);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
analogWrite(5, 135);
}
// 避障直走8低9高正转(右轮)
if (Dist3 >= 20 && Dist1 >= 20) {
digitalWrite(9,HIGH);
digitalWrite(8,LOW);
analogWrite(3, 140);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
analogWrite(5, 145);
}
// 向右调整
if (Dist1 <= 20) {
digitalWrite(9,LOW);
digitalWrite(8,HIGH);
analogWrite(3, 150);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
analogWrite(5, 150);
}
// 向左调整
if (Dist3 <= 20) {
digitalWrite(9,HIGH);
digitalWrite(8,LOW);
analogWrite(3, 135);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
analogWrite(5, 135);
}
// 避障后退
if (Dist2 <= 15 && (Dist1 >= 20 && Dist3 >= 20)) {
digitalWrite(9,LOW);
digitalWrite(8,HIGH);
analogWrite(3, 150);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
analogWrite(5, 145);
}
} else {
// 循迹左转
if (trace2 == 1 && (trace1 == 1 && trace3 == 0) || trace2 == 0 && (trace1 == 1 && trace3 == 0)) {
digitalWrite(9,HIGH);
digitalWrite(8,LOW);
analogWrite(3, 72);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
analogWrite(5, 40);
}
// 循迹右转
if (trace2 == 1 && (trace1 == 0 && trace3 == 1) || trace2 == 0 && (trace1 == 0 && trace3 == 1)) {
digitalWrite(9,LOW);
digitalWrite(8,HIGH);
analogWrite(3, 40);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
analogWrite(5, 80);
}
// 循迹直走
if (trace3 == 1 && (trace2 == 1 && trace1 == 1)) {
digitalWrite(9,HIGH);
digitalWrite(8,LOW);
analogWrite(3, 95);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
analogWrite(5, 90);
}
}
}
原文地址: https://www.cveoy.top/t/topic/bGMz 著作权归作者所有。请勿转载和采集!