基于Arduino UNO的红外循迹避障小车模拟:L298N驱动、超声波避障、Proteus仿真设计
项目:红外循迹避障小车模拟——基于Arduino uno的红外循迹,超声波避障,L298N驱动小车模拟 设计;proteus 仿真(版本8.9-可提供软件安装包) 主控:Arduino UNO 外设:L298N,电机,红外,超声波 程序:Arduino
这辆在Proteus里撒欢跑的小车有点意思——左边俩红外探头负责找黑线,脑门上顶着的超声波模块像根小天线,遇到障碍就急刹车转向。咱们今天不整虚的,直接扒代码看它怎么实现"又怂又稳"的跑路策略。
先看电机驱动的核心操作。L298N这老伙计得用PWM控制转速,数字引脚管转向。下面这段代码把电机操作打包成函数,比直接操作寄存器清爽多了:
void motorControl(int speedA, int speedB) {
// 左轮正转
digitalWrite(LEFT_MOTOR_PIN1, speedA > 0 ? HIGH : LOW);
digitalWrite(LEFT_MOTOR_PIN2, speedA > 0 ? LOW : HIGH);
// 右轮正转
digitalWrite(RIGHT_MOTOR_PIN1, speedB > 0 ? HIGH : LOW);
digitalWrite(RIGHT_MOTOR_PIN2, speedB > 0 ? LOW : HIGH);
// PWM调速
analogWrite(ENABLE_PIN_A, abs(speedA));
analogWrite(ENABLE_PIN_B, abs(speedB));
}
这里有个骚操作:用三元运算符替代if-else判断电机转向,代码瞬间紧凑。speed参数支持负数倒车,abs()取绝对值保证PWM值有效,这个设计让后续的转向控制变得灵活。
红外循迹部分特别像在玩节奏游戏——左右探头扫描到的黑白信号就像打点器。当右边探头检测到黑线时,说明车偏左了,得往右修正:
void trackLine() {
int leftSensor = digitalRead(IR_LEFT);
int rightSensor = digitalRead(IR_RIGHT);
if(leftSensor == LOW && rightSensor == LOW) {
motorControl(150, 150); // 直行
} else if(leftSensor == HIGH) {
motorControl(-100, 150); // 右转
delay(200); // 转向持续时间
} else if(rightSensor == HIGH) {
motorControl(150, -100); // 左转
delay(200);
}
}
注意这里的负速度参数让对应车轮反转产生转向力矩,比单纯降速转向更干脆。但delay()用多了会阻塞程序,实战中最好用非阻塞方式处理,仿真环境下倒是无所谓。
项目:红外循迹避障小车模拟——基于Arduino uno的红外循迹,超声波避障,L298N驱动小车模拟 设计;proteus 仿真(版本8.9-可提供软件安装包) 主控:Arduino UNO 外设:L298N,电机,红外,超声波 程序:Arduino
超声波模块的代码藏着个坑——测距函数必须控制好触发时序。很多人在这里翻车,测出来的距离值总抽风:
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2; // 换算成厘米
}
pulseIn()会卡住程序直到回波到来,这在需要快速反应的场景可能有问题。仿真时超声波反应比现实快得多,实测发现距离低于15cm时立即执行避障动作刚好合适。
主循环里的状态机才是精髓所在——既要盯着赛道又得防着障碍物,活像边走路边玩手机还躲着井盖:
void loop() {
float distance = getDistance();
if(distance < 15 && distance > 0) {
obstacleAvoidance(); // 优先处理障碍
} else {
trackLine(); // 没障碍才循迹
}
}
这个逻辑让避障拥有最高优先级,但实际测试发现有时超声波误检会导致小车抽搐。后来加了个三次检测的滤波机制才稳定,仿真里传感器数据太干净可能用不上。
Proteus里调这车的时候,L298N模块的使能端记得接上拉电阻,不然电机可能抽风。仿真文件里最好把红外传感器放在离地2-3mm的位置,太贴近地面会误判为持续黑线。最后吐槽下Proteus的电机模型——有时候明明代码没问题,车轮就是不动,重启仿真又好了,玄学程度堪比祖传代码突然跑通。

更多推荐
所有评论(0)