跑跑啦航模

您现在的位置是:首页>精采瞬间

精采瞬间

树莓派智能小车:第一次跑起来

paopaola2026-07-014636

前面花了三期时间从零开始,配件→接线→代码→底盘。这期就是验收成果的时候了——让你的小车真正跑起来!

👉 配合B站视频看更直观

跑跑啦航模 · 树莓派智能小车

一、通电前的最后检查

不急着上电,先过一遍这个清单:

  1. ✅ 树莓派TF卡已烧好系统(推荐Raspberry Pi OS)
  2. ✅ 电源接线确认无误(正负极没反)
  3. ✅ 所有杜邦线插紧了,没有半插半松
  4. ✅ 电机轮子没碰到底盘或线缆
  5. ✅ 树莓派已配好WiFi(或用网线直连)
  6. ✅ 已开启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)
  • 装舵机让超声波探头摇头扫描

一台树莓派小车能玩的花样远不止这些!

  • 如果你需要购买航模产品,可以通过扫码联系哦!

    • 微信联系
    • 淘宝联系
  • 个人微信扫码

    工作时间

    周一至周日 9:00-21:00

  • 如果你需要购买航模产品,可以通过扫码联系哦!

    • 微信联系
    • 淘宝联系