You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Raspberry Pi 3 B+同时独立控制4台及以上步进电机?

树莓派3 B+控制多台28BYJ-48步进电机的解决方案

核心结论

树莓派3 B+完全可以同时独立控制4台甚至更多的28BYJ-48步进电机(搭配ULN2003驱动板),只要解决GPIO引脚不足的问题,同时完成正确的接线和控制逻辑即可。


基础接线逻辑(单台电机)

28BYJ-48搭配ULN2003驱动板的接线非常直接:

  • 驱动板VCC接树莓派5V引脚(必须用5V,3.3V带不动电机)
  • 驱动板GND接树莓派GND引脚
  • 驱动板IN1-IN4分别接树莓派的4个空闲GPIO引脚(比如GPIO17、27、22、10)

解决GPIO引脚不足的方案

单台电机需要4个GPIO,4台就是16个,树莓派3 B+的GPIO虽然够,但如果后续要扩展其他模块,用IO扩展芯片是更高效的选择,推荐两种:

  • PCF8574:I2C接口,单芯片扩展8个GPIO,仅占用树莓派的SDA(GPIO2)和SCL(GPIO3)两个引脚,4台电机需要2个PCF8574就能提供16个控制引脚。
  • MCP23017:I2C接口,单芯片直接扩展16个GPIO,一个芯片就能搞定4台电机的控制需求,更适合你的多电机场景。

MCP23017接线示例

  • MCP23017的VDD接树莓派3.3V,VSS接GND
  • SDA接GPIO2,SCL接GPIO3
  • A0-A2全部接地(设置I2C地址为0x20)
  • 4台电机的IN1-IN4分别接到MCP23017的引脚:
    • 第一台:GPA0-GPA3
    • 第二台:GPA4-GPA7
    • 第三台:GPB0-GPB3
    • 第四台:GPB4-GPB7

控制代码示例(Python)

用smbus2库控制MCP23017,实现多电机独立控制:
首先安装依赖:

sudo apt-get install python3-smbus2

示例代码:

from smbus2 import SMBus
import time

# MCP23017 I2C地址(A0-A2接地时为0x20)
MCP_ADDR = 0x20
# 寄存器地址定义
IODIRA = 0x00  # 端口A方向寄存器(0=输出)
IODIRB = 0x01  # 端口B方向寄存器
GPIOA = 0x12   # 端口A数据寄存器
GPIOB = 0x13   # 端口B数据寄存器

# 28BYJ-48单四拍步进序列
STEP_SEQ = [0x01, 0x02, 0x04, 0x08]

# 初始化I2C总线(树莓派3 B+用总线1)
bus = SMBus(1)

# 设置端口A、B为输出模式
bus.write_byte_data(MCP_ADDR, IODIRA, 0x00)
bus.write_byte_data(MCP_ADDR, IODIRB, 0x00)

def rotate_motor(motor_id, steps):
    """
    控制指定电机旋转指定步数
    motor_id: 0-3,对应4台电机
    steps: 旋转步数(28BYJ-48一圈约4096步,八角转盘转一面需要512步)
    """
    seq_idx = 0
    for _ in range(steps):
        if motor_id == 0:
            bus.write_byte_data(MCP_ADDR, GPIOA, STEP_SEQ[seq_idx])
        elif motor_id == 1:
            bus.write_byte_data(MCP_ADDR, GPIOA, STEP_SEQ[seq_idx] << 4)
        elif motor_id == 2:
            bus.write_byte_data(MCP_ADDR, GPIOB, STEP_SEQ[seq_idx])
        elif motor_id == 3:
            bus.write_byte_data(MCP_ADDR, GPIOB, STEP_SEQ[seq_idx] << 4)
        seq_idx = (seq_idx + 1) % 4
        time.sleep(0.001)  # 调整转速,值越小越快,避免丢步

# 测试:让第1台电机转半圈
rotate_motor(0, 2048)
# 测试:让第4台电机转一个八角面(1/8圈)
rotate_motor(3, 512)

# 关闭总线
bus.close()

关键注意事项

  • 供电问题:4台28BYJ-48同时工作时总电流接近1A,树莓派自身5V引脚可能供电不稳,建议用外部5V电源给所有电机驱动板供电,树莓派和驱动板共地即可。
  • 转速与丢步:代码中的time.sleep(0.001)可以调整,过快会导致电机丢步,建议测试后找到适合的延迟值。
  • 盲文映射:八角转盘每面对应一个盲文字符,可预先把字符和电机需要旋转的步数(比如512步/面)做成字典,方便快速调用。

内容的提问来源于stack exchange,提问作者Joti Gokaraju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:16:07