树莓派智能小车:让电机转起来
paopaola2026-07-014636
接线接好了,这期开始写代码。我们用Python控制树莓派的GPIO,让电机按我们的指令转动。
👉 配合B站视频看更直观

一、准备工作
在树莓派终端里先安装RPi.GPIO库(大部分系统已预装):
sudo apt update
sudo apt install python3-rpi.gpio -y
二、基础驱动代码
新建一个Python文件 car.py,写入以下代码:
import RPi.GPIO as GPIO
import time
# 引脚定义(用BCM编号)
IN1 = 17 # 左电机方向1
IN2 = 18 # 左电机方向2
IN3 = 22 # 右电机方向1
IN4 = 23 # 右电机方向2
ENA = 27 # 左电机PWM使能
ENB = 24 # 右电机PWM使能
# 初始化
GPIO.setmode(GPIO.BCM)
GPIO.setup([IN1, IN2, IN3, IN4, ENA, ENB], GPIO.OUT)
# 设置PWM(频率100Hz)
pwmA = GPIO.PWM(ENA, 100)
pwmB = GPIO.PWM(ENB, 100)
pwmA.start(0)
pwmB.start(0)
def forward(speed=80):
"""前进"""
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
pwmA.ChangeDutyCycle(speed)
pwmB.ChangeDutyCycle(speed)
def backward(speed=80):
"""后退"""
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)
pwmA.ChangeDutyCycle(speed)
pwmB.ChangeDutyCycle(speed)
def turn_left(speed=60):
"""左转(左轮慢/右转,右轮快/前进)"""
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
pwmA.ChangeDutyCycle(speed)
pwmB.ChangeDutyCycle(speed)
def turn_right(speed=60):
"""右转"""
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)
pwmA.ChangeDutyCycle(speed)
pwmB.ChangeDutyCycle(speed)
def stop():
"""停止"""
GPIO.output([IN1, IN2, IN3, IN4], GPIO.LOW)
pwmA.ChangeDutyCycle(0)
pwmB.ChangeDutyCycle(0)
# 测试运行
if __name__ == "__main__":
try:
print("前进 2秒")
forward()
time.sleep(2)
print("后退 2秒")
backward()
time.sleep(2)
print("左转 1秒")
turn_left()
time.sleep(1)
print("右转 1秒")
turn_right()
time.sleep(1)
print("停止")
stop()
finally:
GPIO.cleanup() # 清理GPIO状态
三、运行测试
python3 car.py
小车应该会先前进2秒、后退2秒、左转1秒、右转1秒、然后停止。
四、PWM调速说明
speed参数范围0~100,数值越大电机转得越快。
- 30~50:慢速(适合精确控制)
- 60~80:中速(日常行驶)
- 90~100:全速前进
如果左右电机速度不一致(小车走不直),可以分别给pwmA和pwmB不同的值来补偿。
五、常见问题
Q:运行报错"RuntimeError: No access to /dev/mem"
→ 需要用sudo运行:sudo python3 car.py
Q:电机只有一个转
→ 检查不转那个电机的接线,或者交换OUT1/OUT2和OUT3/OUT4测试是不是电机本身坏了。
Q:电机反了(前进变后退)
→ 在代码里把IN1和IN2的HIGH/LOW对调就行,不用拆线重接。
下一期我们装底盘,把电路板固定到车架上,小车就有"身体"了!


微信联系
淘宝联系