瓦力机器人-编码电机控制(基于树莓派5)
·
🚗 树莓派5 + MX1508 双路电机驱动控制教程(含完整代码)
本文将手把手教你如何使用 树莓派5 + MX1508 电机驱动模块 实现双路电机正反转控制、PWM 调速,并提供控制台交互模式,轻松打造你的智能小车。
🧠 一、项目简介
MX1508 是一种常见的 双路直流电机驱动模块,内部集成了两个 H 桥,可以控制两个直流电机(M1、M2)正反转和速度。
我们将使用 Python + gpiozero 库 来控制电机,从而让小车实现:
-
前进 / 后退
-
左转 / 右转
-
停止
-
控制台输入速度调节
最终效果:在树莓派终端输入命令即可让小车运动。
🔌 二、硬件准备
| 设备 | 数量 | 说明 |
|---|---|---|
| 树莓派 5 | 1 | 系统建议 Raspberry Pi OS 64位 |
| MX1508 电机驱动模块 | 1 | 支持两路直流电机 |
| 直流电机 | 2 | 建议 6V~12V 小电机 |
| 外部电源 | 1 | 电机电源(建议独立供电) |
| 杜邦线 | 若干 | 连接模块与树莓派 |
⚙️ 三、引脚连接示意
| MX1508 引脚 | 连接到树莓派 (BCM) | 说明 |
|---|---|---|
| IN1 | GPIO17 | 电机1 控制 A |
| IN2 | GPIO18 | 电机1 控制 B |
| IN3 | GPIO22 | 电机2 控制 A |
| IN4 | GPIO23 | 电机2 控制 B |
| VCC | 电机电源正极 | 6~12V |
| GND | 树莓派 GND | 共地 |
⚠️ 一定要保证 电机电源与树莓派共地(GND相连),否则无法正常工作。
💻 四、安装依赖
在树莓派终端中运行以下命令:
sudo apt update sudo apt install python3-gpiozero
gpiozero 是官方推荐的 Raspberry Pi 控制 GPIO 的 Python 库,语法简洁,支持 PWM 输出。
🧩 五、完整代码
保存为 mx1508_car.py:
from gpiozero import PWMOutputDevice
import time
class MX1508_MotorDriver_RPi5:
def __init__(self):
# 电机引脚定义 (BCM编号)
self.MOTOR1_PIN1 = 17 # IN1
self.MOTOR1_PIN2 = 18 # IN2
self.MOTOR2_PIN1 = 22 # IN3
self.MOTOR2_PIN2 = 23 # IN4
# 初始化电机
self.setup_motors()
def setup_motors(self):
"""使用gpiozero初始化电机"""
self.motor1_in1 = PWMOutputDevice(self.MOTOR1_PIN1, frequency=1000)
self.motor1_in2 = PWMOutputDevice(self.MOTOR1_PIN2, frequency=1000)
self.motor2_in1 = PWMOutputDevice(self.MOTOR2_PIN1, frequency=1000)
self.motor2_in2 = PWMOutputDevice(self.MOTOR2_PIN2, frequency=1000)
print("✅ MX1508电机驱动器初始化完成 (树莓派5)")
def motor1_control(self, speed):
"""控制电机1"""
self._motor_control(self.motor1_in1, self.motor1_in2, speed)
def motor2_control(self, speed):
"""控制电机2"""
self._motor_control(self.motor2_in1, self.motor2_in2, speed)
def _motor_control(self, in1, in2, speed):
"""内部电机控制方法"""
speed = max(-1.0, min(1.0, speed / 100.0)) # 转换为-1到1范围
if speed > 0:
in1.value = speed
in2.value = 0
elif speed < 0:
in1.value = 0
in2.value = abs(speed)
else:
in1.value = 0
in2.value = 0
def car_forward(self, speed=50):
"""小车前进"""
self.motor1_control(speed)
self.motor2_control(speed)
print(f"🚗 前进 - 速度: {speed}%")
def car_backward(self, speed=50):
"""小车后退"""
self.motor1_control(-speed)
self.motor2_control(-speed)
print(f"🚙 后退 - 速度: {speed}%")
def car_turn_left(self, speed=50):
"""小车左转"""
self.motor1_control(-speed)
self.motor2_control(speed)
print(f"↩️ 左转 - 速度: {speed}%")
def car_turn_right(self, speed=50):
"""小车右转"""
self.motor1_control(speed)
self.motor2_control(-speed)
print(f"↪️ 右转 - 速度: {speed}%")
def car_stop(self):
"""小车停止"""
self.motor1_control(0)
self.motor2_control(0)
print("🛑 停止")
def cleanup(self):
"""清理资源"""
self.car_stop()
self.motor1_in1.close()
self.motor1_in2.close()
self.motor2_in1.close()
self.motor2_in2.close()
print("🔚 资源已清理")
# 控制台调试接口
def console_control():
motor_driver = MX1508_MotorDriver_RPi5()
print("\n==== MX1508 控制台模式 ====")
print(" forward <速度> → 前进")
print(" backward <速度> → 后退")
print(" left <速度> → 左转")
print(" right <速度> → 右转")
print(" stop → 停止")
print(" exit → 退出程序")
print("===========================\n")
try:
while True:
cmd = input("请输入命令 > ").strip().lower()
if not cmd:
continue
parts = cmd.split()
action = parts[0]
speed = int(parts[1]) if len(parts) > 1 else 50
if action == "forward":
motor_driver.car_forward(speed)
elif action == "backward":
motor_driver.car_backward(speed)
elif action == "left":
motor_driver.car_turn_left(speed)
elif action == "right":
motor_driver.car_turn_right(speed)
elif action == "stop":
motor_driver.car_stop()
elif action == "exit":
print("🧹 退出程序...")
break
else:
print("❌ 无效命令,请重新输入")
except KeyboardInterrupt:
print("\n⏹ 手动中断")
finally:
motor_driver.cleanup()
if __name__ == "__main__":
console_control()
🧭 六、运行效果
执行:
python3 mx1508_car.py
终端输出:

🧩 七、代码结构讲解
| 方法 | 功能 | 说明 |
|---|---|---|
setup_motors() | 初始化 PWM 引脚 | 频率设置为 1000Hz |
_motor_control() | 电机基础控制 | 速度范围 -100~100 |
car_forward() | 前进 | 两个电机同向转动 |
car_turn_left() | 左转 | 左电机反转,右电机正转 |
car_stop() | 停止所有电机 | 输出置 0 |
console_control() | 交互控制台 | 输入命令控制动作 |
🧰 八、常见问题
❓ 电机不转怎么办?
-
检查电机电源是否供电(VCC ≥ 6V)
-
检查 GND 是否与树莓派共地
-
确保 Python 运行权限足够(
sudo python3) -
电机方向相反可交换 IN1/IN2、IN3/IN4 接线
🧠 九、进阶玩法
-
✅ 加入 超声波避障 模块,实现自动避障行驶
-
✅ 结合 摄像头识别 实现图像跟随或颜色跟踪
-
✅ 通过 Flask + WebSocket 打造网页控制界面
-
✅ 使用 蓝牙串口模块 HC-06 用手机蓝牙控制
🎯 十、总结
本教程完整实现了使用树莓派5 + MX1508 模块控制双路电机的基础功能。
优点:
-
无需外部库,只依赖
gpiozero -
代码清晰,模块化设计
-
支持命令行动态调速
更多推荐

所有评论(0)