瓦力机器人-编码电机控制(基于树莓派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 timeclass MX1508_MotorDriver_RPi5:def __init__(self):# 电机引脚定义 (BCM编号)self.MOTOR1_PIN1 = 17 # IN1self.MOTOR1_PIN2 = 18 # IN2self.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 = speedin2.value = 0elif speed < 0:in1.value = 0in2.value = abs(speed)else:in1.value = 0in2.value = 0def 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:continueparts = cmd.split()action = parts[0]speed = int(parts[1]) if len(parts) > 1 else 50if 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("🧹 退出程序...")breakelse: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 -
代码清晰,模块化设计
-
支持命令行动态调速
