🚗 树莓派5 + MX1508 双路电机驱动控制教程(含完整代码)

本文将手把手教你如何使用 树莓派5 + MX1508 电机驱动模块 实现双路电机正反转控制、PWM 调速,并提供控制台交互模式,轻松打造你的智能小车。

🧠 一、项目简介

MX1508 是一种常见的 双路直流电机驱动模块,内部集成了两个 H 桥,可以控制两个直流电机(M1、M2)正反转和速度。

我们将使用 Python + gpiozero 库 来控制电机,从而让小车实现:

  • 前进 / 后退

  • 左转 / 右转

  • 停止

  • 控制台输入速度调节

最终效果:在树莓派终端输入命令即可让小车运动。

🔌 二、硬件准备

设备数量说明
树莓派 51系统建议 Raspberry Pi OS 64位
MX1508 电机驱动模块1支持两路直流电机
直流电机2建议 6V~12V 小电机
外部电源1电机电源(建议独立供电)
杜邦线若干连接模块与树莓派

⚙️ 三、引脚连接示意

MX1508 引脚连接到树莓派 (BCM)说明
IN1GPIO17电机1 控制 A
IN2GPIO18电机1 控制 B
IN3GPIO22电机2 控制 A
IN4GPIO23电机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()交互控制台输入命令控制动作

🧰 八、常见问题

❓ 电机不转怎么办?

  1. 检查电机电源是否供电(VCC ≥ 6V)

  2. 检查 GND 是否与树莓派共地

  3. 确保 Python 运行权限足够(sudo python3

  4. 电机方向相反可交换 IN1/IN2、IN3/IN4 接线

🧠 九、进阶玩法

  • ✅ 加入 超声波避障 模块,实现自动避障行驶

  • ✅ 结合 摄像头识别 实现图像跟随或颜色跟踪

  • ✅ 通过 Flask + WebSocket 打造网页控制界面

  • ✅ 使用 蓝牙串口模块 HC-06 用手机蓝牙控制

🎯 十、总结

本教程完整实现了使用树莓派5 + MX1508 模块控制双路电机的基础功能。

优点:

  • 无需外部库,只依赖 gpiozero

  • 代码清晰,模块化设计

  • 支持命令行动态调速

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐