树莓派智能小车:第一次跑起来
paopaola2026-07-014636
前面花了三期时间从零开始,配件→接线→代码→底盘。这期就是验收成果的时候了——让你的小车真正跑起来!
👉 配合B站视频看更直观

一、通电前的最后检查
不急着上电,先过一遍这个清单:
- ✅ 树莓派TF卡已烧好系统(推荐Raspberry Pi OS)
- ✅ 电源接线确认无误(正负极没反)
- ✅ 所有杜邦线插紧了,没有半插半松
- ✅ 电机轮子没碰到底盘或线缆
- ✅ 树莓派已配好WiFi(或用网线直连)
- ✅ 已开启SSH(方便远程调试)
二、首次通电
接通电池电源,观察树莓派指示灯:
- 红灯常亮 → 供电正常
- 绿灯闪烁 → 正在启动系统
- 绿灯常亮或慢闪 → 启动完成
用SSH连上树莓派:
ssh pi@raspberrypi.local
# 默认密码:raspberry
三、电机方向测试
运行上一期写的car.py:
sudo python3 car.py
观察小车运动:
- 前进:小车向前走 → 正确
- 前进变后退:把代码里IN1/IN2的HIGH/LOW对调
- 原地打转:一个轮子前进、一个轮子后退 → 交换其中一个电机的OUT1/OUT2接线
- 不走直线 → 左右电机转速不同,在代码里分别调整pwmA和pwmB
四、超声波避障功能集成
把前面的代码升级一下,加上超声波避障:
import RPi.GPIO as GPIO
import time
# 电机引脚
IN1, IN2, IN3, IN4 = 17, 18, 22, 23
ENA, ENB = 27, 24
# 超声波引脚
TRIG = 5
ECHO = 6
GPIO.setmode(GPIO.BCM)
GPIO.setup([IN1, IN2, IN3, IN4, ENA, ENB], GPIO.OUT)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
pwmA = GPIO.PWM(ENA, 100)
pwmB = GPIO.PWM(ENB, 100)
pwmA.start(0)
pwmB.start(0)
def forward(s=80):
GPIO.output(IN1, GPIO.HIGH); GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH); GPIO.output(IN4, GPIO.LOW)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def backward(s=60):
GPIO.output(IN1, GPIO.LOW); GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW); GPIO.output(IN4, GPIO.HIGH)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def turn_left(s=60):
GPIO.output(IN1, GPIO.LOW); GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH); GPIO.output(IN4, GPIO.LOW)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def turn_right(s=60):
GPIO.output(IN1, GPIO.HIGH); GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW); GPIO.output(IN4, GPIO.HIGH)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def stop():
GPIO.output([IN1, IN2, IN3, IN4], GPIO.LOW)
pwmA.ChangeDutyCycle(0); pwmB.ChangeDutyCycle(0)
def get_distance():
"""超声波测距(cm)"""
GPIO.output(TRIG, False)
time.sleep(0.000002)
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
pulse_start = time.time()
timeout = pulse_start + 0.05
while GPIO.input(ECHO) == 0 and time.time() < timeout:
pulse_start = time.time()
pulse_end = time.time()
timeout = pulse_end + 0.05
while GPIO.input(ECHO) == 1 and time.time() < timeout:
pulse_end = time.time()
distance = (pulse_end - pulse_start) * 17150
return round(distance, 2)
try:
while True:
dist = get_distance()
print(f"距离: {dist} cm")
if dist < 20 and dist > 0:
# 有障碍物: 后退→右转
stop(); time.sleep(0.2)
backward(60); time.sleep(0.5)
stop(); time.sleep(0.2)
turn_right(60); time.sleep(0.3)
else:
forward(70)
time.sleep(0.05)
except KeyboardInterrupt:
stop()
GPIO.cleanup()
五、调试技巧
小车走不直怎么办?
左右电机不可能100%一致,代码里分别调速:
pwmA.ChangeDutyCycle(75) # 左轮
pwmB.ChangeDutyCycle(80) # 右轮(偏慢的一边给大一点)
超声波数据乱跳?
检查Echo引脚的分压电路,或者换一个3.3V版的超声波模块。另一个常见问题是超声波前面有遮挡(比如线缆晃来晃去)。
避障太灵敏或太迟钝?
调整代码里的距离阈值(目前设为20cm),数值越大越早避让。同时可以调小forward的speed,让小车慢一点反应时间更充裕。
六、成功后做什么?
小车顺利跑起来之后,可以尝试:
- 加蓝牙模块(HC-05)实现手机遥控 → 下期教程
- 加红外循迹传感器自动巡线
- 加摄像头做视觉追踪(OpenCV)
- 装舵机让超声波探头摇头扫描
一台树莓派小车能玩的花样远不止这些!


微信联系
淘宝联系