项目:红外循迹避障小车模拟——基于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的电机模型——有时候明明代码没问题,车轮就是不动,重启仿真又好了,玄学程度堪比祖传代码突然跑通。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐