从零开始做一个红外避障小车:树莓派实战教学笔记

你有没有想过,自己动手做一辆能“看见”障碍、自动转弯的小车?听起来像是机器人比赛里的高级操作,其实用一块树莓派、几个传感器和几段代码,就能在几天内实现。这正是我在带学生做课程设计时最常推荐的入门项目—— 基于树莓派的红外避障小车基础版

这个项目看似简单,却把嵌入式系统开发的核心要素都串了起来:硬件连接、GPIO控制、电机驱动、程序逻辑判断……更重要的是,它能让抽象的代码“动起来”,让初学者第一次真切感受到“软硬结合”的魅力。

今天我就以一个过来人的视角,带你一步步拆解这个经典小车项目,不讲空话套话,只聊真实开发中的关键点、踩过的坑和值得优化的地方。


为什么选红外避障作为第一个项目?

在众多传感器方案中,红外避障是最适合新手“打怪升级”的第一关。

超声波测距精度高,但回波干扰多;激光雷达太贵还复杂;摄像头视觉需要算力支持……而 TCRT5000这类红外模块 ,成本不到五块钱,接线简单,输出就是高低电平,树莓派直接能读,简直是为教学量身定制。

它的原理也不难理解:
前端有个红外LED不断发射光线,后面跟着一个光电三极管负责接收。如果前面没东西,光跑掉了,接收端收不到信号;一旦有物体靠近(一般2~30cm),部分红外光被反射回来,接收管导通,模块就输出低电平——相当于告诉主控:“嘿,我看到东西了!”

当然,它也有短板。比如深色布料吸光严重,可能到10厘米才触发;强日光下环境红外噪声大,容易误判。所以建议在室内稳定光照环境下使用,避开窗户边或灯光直射位置。

不过对于教学来说,这些“不完美”反而是好事。学生会在调试中自然意识到: 传感器不是万能的,工程要面对现实世界的不确定性

✅ 小贴士:TCRT5000模块上通常有个蓝色电位器,旋转它可以调节灵敏度阈值。调得太敏感会误报,太迟钝又反应慢,这个过程本身就是一种实践学习。


电机怎么动起来?L298N不只是个“开关”

很多同学以为L298N只是一个让电机转停的模块,其实它是整个小车的“肌肉控制器”。

我们用的是常见的L298N双H桥驱动模块,它可以同时控制两个直流电机,正好满足两轮差速转向的需求。所谓“H桥”,指的是内部由四个晶体管组成的桥式电路,通过不同组合实现正转、反转、刹车等动作:

IN1 IN2 电机状态
0 0 刹车(制动)
0 1 反转
1 0 正转
1 1 刹车

注意看, 1-1和0-0都是刹车状态 ,这不是冗余设计,而是为了安全。万一程序出错导致两个输入同时为高或同时为低,电机也不会失控飞出去。

更关键的是,L298N支持PWM调速。只要给ENA(使能端)加一个可变占空比的方波信号,就能无级调节电机转速。这对于小车平稳启动、减速避障非常有用。

而且它的逻辑电平兼容3.3V,可以直接接到树莓派GPIO,省去了电平转换芯片。这一点对树莓派用户极其友好——毕竟谁也不想因为接错电压烧掉主控板。

⚠️ 血泪教训:虽然L298N模块标称最大电流2A,但长时间满负荷运行会严重发热,最好加上散热片,否则过热保护一启动,小车突然停机,排查起来很头疼。


树莓派如何掌控全局?GPIO不只是“读高低电平”

说到GPIO,很多人第一反应是“设输出、写高电平”。但在实际项目中,你要考虑的问题远不止这一句代码。

先说编号问题。树莓派有物理引脚编号(Pin Number)和BCM编号两种模式。强烈建议使用 GPIO.setmode(GPIO.BCM) ,因为这是官方文档和库函数的标准,避免混淆。

再来看电源管理。树莓派所有GPIO引脚总输出电流不能超过50mA,单脚不超过16mA。这意味着你不能直接用GPIO驱动电机或继电器,必须通过驱动模块隔离高压侧。好在L298N已经做了这件事,我们的GPIO只负责发送控制信号,属于“轻负载操作”。

还有一个容易忽略的细节: 内部上拉电阻

拿红外传感器来说,当没有障碍物时,模块输出高电平;遇到障碍则拉低。但如果线路接触不良或悬空,输入状态可能是浮动的,程序读到的就是随机值,造成误判。

解决办法是在初始化时启用上拉电阻:

GPIO.setup(IR_SENSOR, GPIO.IN, pull_up_down=GPIO.PUD_UP)

这样即使断线,默认也是高电平,系统只会认为“前方畅通”,不会莫名其妙急刹。

至于编程库的选择, RPi.GPIO 功能全面,适合深入教学; gpiozero 语法更简洁,适合快速原型验证。本项目采用前者,便于展示底层控制逻辑。


控制逻辑怎么写?别小看一个if-else

下面这段代码,是我带学生调试最多遍的部分:

import RPi.GPIO as GPIO
import time

# 引脚定义
IN1, IN2 = 17, 18  # 左电机
IN3, IN4 = 22, 23  # 右电机
ENA, ENB = 27, 24  # PWM使能
IR_SENSOR = 19     # 红外传感器

# 初始化
GPIO.setmode(GPIO.BCM)
GPIO.setup([IN1, IN2, IN3, IN4, ENA, ENB], GPIO.OUT)
pwm_left = GPIO.PWM(ENA, 1000)
pwm_right = GPIO.PWM(ENB, 1000)
pwm_left.start(0)
pwm_right.start(0)

def motor_forward(speed=60):
    GPIO.output([IN1, IN3], GPIO.HIGH)
    GPIO.output([IN2, IN4], GPIO.LOW)
    pwm_left.ChangeDutyCycle(speed)
    pwm_right.ChangeDutyCycle(speed)

def turn_right():
    GPIO.output(IN1, GPIO.HIGH)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.HIGH)
    pwm_left.ChangeDutyCycle(60)
    pwm_right.ChangeDutyCycle(60)

def stop():
    GPIO.output([IN1, IN2, IN3, IN4], GPIO.LOW)
    pwm_left.ChangeDutyCycle(0)
    pwm_right.ChangeDutyCycle(0)

# 主循环
try:
    while True:
        if GPIO.input(IR_SENSOR) == GPIO.LOW:  # 检测到障碍
            print("【避障】前方有障碍,右转")
            stop()
            time.sleep(0.3)
            turn_right()
            time.sleep(0.8)  # 转向时间视速度调整
        else:
            motor_forward(60)
        time.sleep(0.2)  # 检测周期
except KeyboardInterrupt:
    stop()
finally:
    pwm_left.stop()
    pwm_right.stop()
    GPIO.cleanup()

看起来很简单,但有几个隐藏知识点:

  1. 延时时间要实测调整 time.sleep(0.8) 是为了让小车完成一次有效转向。太快了转不到位,太久了影响效率。建议先用低速测试,观察实际转向角度后再定值。
  2. stop()之后一定要delay :电机有惯性,立即转向可能导致机械冲击或打滑。短暂停车缓冲更安全。
  3. 最后的 GPIO.cleanup() 不能少 :否则下次运行可能因引脚状态异常导致行为诡异。

如果你觉得每次撞墙才反应太被动,可以进阶改用 状态机模型 ,把小车分成“前进”、“避障”、“探索”等状态,逻辑更清晰,也更容易扩展功能。


实际搭建中的那些“坑”,教科书不会告诉你

理论讲得再清楚,真正动手时总会冒出新问题。以下是学生们常遇到的几类典型故障及应对方法:

❌ 小车不动?先查这几项

  • 电源是否正常?L298N有两个供电口:一个是7–12V的电机电源,另一个是5V逻辑电源。如果只接了电机电源,但没给逻辑部分供电(或未启用板载5V输出),控制信号传不进去。
  • 杜邦线松了?特别是震动环境下,经常出现“看着连上了,其实虚接”的情况。
  • 接线顺序错了?IN1/IN2对应左电机正反转,接反了就会原地打转。

📉 数据跳变严重?

可能是电源不稳定。电机启动瞬间电流骤增,导致电压跌落,树莓派可能重启。解决方案是 双电源独立供电 :锂电池一路经降压模块供树莓派5V,另一路直接供电机,中间用地线共地即可。

🔥 L298N发烫?

检查是否有短路,或者PWM频率设置过低(低于1kHz)。高频PWM能减少电机抖动和发热。另外加装金属散热片效果显著。


这个项目能走多远?从避障到智能机器人的跃迁路径

别看现在只是个简单的避障小车,它其实是通往更复杂系统的起点。只要你愿意继续深挖,每一步都能延伸出新的课题:

  • 加个蓝牙模块 → 手机遥控小车
  • 换成双红外传感器 → 实现边缘跟随或巡线
  • 接入超声波模块 → 多模态融合感知,提升可靠性
  • 安装摄像头 + OpenCV → 视觉识别目标、颜色追踪
  • 移植到ROS框架 → 构建SLAM地图、自主导航

甚至有学生在这个基础上做了“自动寻充电桩”功能:小车电量低时主动返回固定位置充电,完全自主闭环。

这才是“新工科”倡导的 做中学、学中创 的理念体现。


写在最后:教育的本质是点燃兴趣

这个红外避障小车项目,技术上并不炫酷,也没有AI大模型加持。但它有一个无可替代的价值: 让学生亲手把一行行代码变成看得见的动作

当你按下运行键,小车缓缓前行,突然前方出现一本书,它停下来,思考般顿了一下,然后优雅地右转绕开——那一刻,你会看到学生眼里闪过的光。

那不是成就感,是 对技术世界的好奇被真正点燃了

如果你正在寻找一个既能练手又能激发兴趣的树莓派项目,不妨就从这辆小小避障车开始。不需要昂贵设备,也不需要深厚基础,只要一块树莓派、几个模块和一点耐心,你就能迈出智能控制的第一步。

如果你在实现过程中遇到了其他挑战,欢迎在评论区分享讨论。

Logo

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

更多推荐