如何通过pHAT Stack单独控制多个Motor Bonnet驱动步进电机?
解决Raspberry Pi多Motor Bonnet单独控制步进电机的问题
问题根源
所有Motor Bonnet默认使用相同的I2C地址(0x60),树莓派发送的指令会被所有bonnet同时响应,导致同编号电机同步动作。
硬件修改:修改每块Bonnet的I2C地址
Adafruit Motor Bonnet基于PCA9685芯片,板上带有地址选择焊盘(标记为A0、A1、A2),通过焊接短路焊盘可修改地址:
- 不焊接任何焊盘:默认地址
0x60 - 焊接A0:地址变为
0x61 - 焊接A1:地址变为
0x62 - 焊接A0+A1:地址变为
0x63(如需更多设备可使用)
操作步骤:
- 断开树莓派所有电源,取下所有Motor Bonnet
- 给每块bonnet焊接对应焊盘(比如3块分别用
0x60、0x61、0x62) - 用pHAT Stack重新堆叠bonnet和树莓派,确保连接牢固
验证地址修改成功
通电后在树莓派终端执行命令:
i2cdetect -y 1
终端会显示所有已连接的I2C设备地址,确认0x60、0x61、0x62均存在即可。
软件实现:用Adafruit MotorKit库单独控制
首先确保库已安装:
pip3 install adafruit-circuitpython-motorkit
示例代码(单独控制6台步进电机):
from adafruit_motorkit import MotorKit # 初始化三个不同地址的MotorKit实例 kit_default = MotorKit(address=0x60) # 第一块bonnet(默认地址) kit_a0 = MotorKit(address=0x61) # 第二块bonnet(焊了A0) kit_a1 = MotorKit(address=0x62) # 第三块bonnet(焊了A1) # 单独控制每台电机 # 第一块bonnet的stepper1正转一步 kit_default.stepper1.onestep() # 第一块bonnet的stepper2反转一步 kit_default.stepper2.onestep(direction=False) # 第二块bonnet的stepper1用双步模式正转 kit_a0.stepper1.onestep(style="double") # 第二块bonnet的stepper2连续转动 kit_a0.stepper2.throttle = 0.5 # 第三块bonnet的stepper1反转连续转动 kit_a1.stepper1.throttle = -0.5 # 第三块bonnet的stepper2停止 kit_a1.stepper2.throttle = 0
注意事项
- 焊接焊盘时使用细焊锡丝,避免短路其他引脚
- 所有硬件操作必须在断电状态下进行,防止损坏设备
- 如果使用非Adafruit品牌的Motor Bonnet,地址焊盘标记可能不同,但核心都是通过修改PCA9685芯片的ADDR引脚电平来改变I2C地址
内容的提问来源于stack exchange,提问作者nnahmed2
相关产品推荐
相关产品推荐

