Pi Stepper Motor HAT教程

一、概述

这是基于树莓派制作运动机器人非常完美的解决方案,这款电机驱动器足够强大,可以驱动4个直流电机或2个步进电机,并且额外提供4路全速PWM控制,可以控制4路舵机。自带稳压电路,直接为树莓派提供稳定的供电电源。


树莓派(Raspberry Pi)没有足够的PWM引脚,使用基于I2C通讯的专用PWM驱动芯片(PCA9685)控制电机的速度和方向可以节省更多的树莓派资源。只用2根GPIO引脚(SDA&SCL)就可以驱动多个电机,也可以多个驱动器叠加使用(可级联),并且不干扰其他I2C设备的使用。


参数说明:

  • 每路2.5A(3.6A峰值)输出,可运行4.5-13.5V直流电机;
  • 可以驱动4个直流电机或2路步进电机;
  • 额外提供8路PWM输出,可以控制8路舵机;
  • 自带稳压电路,直接为树莓派提供稳定5V电源;
  • 可自定义I2C地址,支持多个驱动器叠加级联;
  • 提供完整的代码库和丰富示例程序(Python),简单易用。

二、电源说明

  • 因为驱动器需要同时为电机和树莓派提供电源,建议使用动力电池作为电源。供电电压为6-12V;
  • 电机通过供电电源直接供电,所以电机的输入电压等于外接电源电压;
  • 驱动器内置稳压模块,输出5V2A为树莓派和4路PWM(舵机)供电;
  • 可以通过跳线选择不同的供电方式。

三、软件安装与说明

驱动器是基于树莓派运行在linux环境,驱动器提供Python类库(Python library)和相关示例代码。

首先需要使树莓派的I2C处于Enable(详细配置请参考网上资料)

*运行 apt-get install python-smbus git 安装smbus库

将代码上传到树莓派(比如 “/home/pi”),再尝试运行examples目录下的示例。

*如果提示没有找到类库,请配置相关的库文件,或者直接拷贝列库文件到当前目录下。

1、控制直流电机(DC motor)

a)连接电机

驱动板上 有4组电机接线柱分别为M1, M2, M3, 和 M4。如果运行DCTest.py示例,请将电机连接到M3接口。然后运行如下命令:

sudo python DCTest.py

#!/usr/bin/python
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor
import time
import atexit
# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT(addr=0x60)
# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE)
atexit.register(turnOffMotors)
################################# DC motor test!
myMotor = mh.getMotor(3)
# set the speed to start, from 0 (off) to 255 (max speed)
myMotor.setSpeed(150)
myMotor.run(Adafruit_MotorHAT.FORWARD);
# turn on motor
myMotor.run(Adafruit_MotorHAT.RELEASE);
while (True):
print "Forward! "
myMotor.run(Adafruit_MotorHAT.FORWARD)
print "\tSpeed up..."
for i in range(255):
myMotor.setSpeed(i)
time.sleep(0.01)
print "\tSlow down..."
for i in reversed(range(255)):
myMotor.setSpeed(i)
time.sleep(0.01)
print "Backward! "
myMotor.run(Adafruit_MotorHAT.BACKWARD)
print "\tSpeed up..."
for i in range(255):
myMotor.setSpeed(i)
time.sleep(0.01)
print "\tSlow down..."
for i in reversed(range(255)):
myMotor.setSpeed(i)
time.sleep(0.01)
print "Release"
myMotor.run(Adafruit_MotorHAT.RELEASE)
time.sleep(1.0)

b)DC motor 示例详解

创建MotorHAT对象,并设置I2C的地址,默认地址是0x60(详细设置地址参考后面的内容)

mh = Adafruit_MotorHAT(addr=0x60)

创建 DC motor 对象

MotorHAT 有一个 getMotor(num)方法,num为1~4。

myMotor = mh.getMotor(3)

设置电机旋转速度

myMotor.setSpeed(150)

setSpeed(speed)

speed :0 (off)~ 255 (maximum!).

*speed取值是0到255,速度是个相对值,跟供电电压有关。

设置DC Motor 方向

myMotor.run(Adafruit_MotorHAT.FORWARD)

 run(direction)

direction 定义如下:

  • Adafruit_MotorHAT.FORWARD – DC motor spins forward
  • Adafruit_MotorHAT.BACKWARD – DC motor spins forward
  • Adafruit_MotorHAT.RELEASE – DC motor is ‘off’, not spinning but will also not hold its place.

2、使用步进电机(Stepper Motors)(V5版暂未更新,不支持步进电机)

驱动板可以同时接2个步进电机,单极和双极都可适用。RaspberryPi HAT树莓派电机驱动板

a)连接电机Stepper Motors


上图中左为双极驱动Bipolar stepper motors(4线),右为单极驱动Unipolar Stepper Motor(6线)

  • 单极驱动Unipolar Stepper Motor(6线): 首先需要知道哪根线是中心线,然后将中心线都接到接线柱的GND(右图白色和黄色),剩下的两组端线(黑和绿,红和蓝)分别接到M1、M2或M3、M4。
  • 双极驱动Bipolar stepper motors(4线): 跟单极驱动类似,GND留空不接就可以。

StepperTest.py 示例

将步进电机连接到 M1、M2,在examples目录下运行:

#!/usr/bin/python
#import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_Stepper
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor
import time
import atexit
# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT()
# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE)
atexit.register(turnOffMotors)
myStepper = mh.getStepper(200, 1) # 200 steps/rev, motor port #1
myStepper.setSpeed(30) # 30 RPM
while (True):
print("Single coil steps")
myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.SINGLE)
myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.SINGLE)
print("Double coil steps")
myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.DOUBLE)
myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.DOUBLE)
print("Interleaved coil steps")
myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.INTERLEAVE)
myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.INTERLEAVE)
print("Microsteps")
myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.MICROSTEP)
myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.MICROSTEP)

b)示例详解

创建MotorHAT对象,并设置I2C的地址,默认地址是0x60(详细设置地址参考后面的内容)

mh = Adafruit_MotorHAT(addr=0x60)

创建 Stepper motor object

myStepper = mh.getStepper(200, 1) # 200 steps/rev, motor port #1

getStepper(steps, portnum)

steps :每一转多少步(通常35~200之间)

portnum :1~2,Port #1 is M1 and M2, port #2 is M3 and M4

设置速度,每分钟转速(RPM)

myStepper.setSpeed(30) # 30 RPM

setSpeed() 设置速度,每分钟转速(RPM)

step() – blocking steps

stepper1.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.SINGLE)

step(numberofsteps, direction, type)

numbersteps:步数

direction:FORWARD or BACKWARD

type:SINGLE, DOUBLE, INTERLEAVE or MICROSTEP

*关于步进电机工作特性请参考网上资料。

Using “Non-blocking” oneStep()

oneStep(direction, stepstyle) 单步执行

3、舵机控制

驱动板的舵机控制通过PWM专用芯片PCA9685实现,对应的编号分别为0-7。由于市面上普通舵机通常只支持50Hz的信号,所以pwm.setPWMFreq(50)频率控制在50左右。

from Adafruit_PWM_Servo_Driver import PWM
import time
# Initialise the PWM device using the default address
pwm = PWM(0x60,debug = False)
servoMin = 150 # Min pulse length out of 4096
servoMax = 600 # Max pulse length out of 4096
def setServoPulse(channel, pulse):
pulseLength = 1000000.0 # 1,000,000 us per second
pulseLength /= 50.0 # 50 Hz
print "%d us per period" % pulseLength
pulseLength /= 4096.0 # 12 bits of resolution
print "%d us per bit" % pulseLength
pulse *= 1000.0
pulse /= (pulseLength*1.0)
# pwmV=int(pluse)
print "pluse: %f " % (pulse)
pwm.setPWM(channel, 0, int(pulse))
# Angle to PWM
def write(servonum,x):
y=x/90.0+0.5
y=max(y,0.5)
y=min(y,2.5)
setServoPulse(servonum,y)
pwm.setPWMFreq(50) # Set frequency to 60 Hz
write(0, 90)
write(14, 120)

四、叠加级联

当觉得电机接口不够用时,可以多个驱动板级联使用。我们最多支持 4个驱动器叠加使用。

多个驱动器级联需要为每个驱动器设置唯一的I2C地址,默认地址是0x60。地址范围从0x60~0x63总共4个地址。

驱动板上有A0~A4总共5个跳线,焊接不同的跳线可以设置不同的地址。规则如下

Board 0: Address = 0x60 Offset = binary 0000 (默认全部为空)
Board 1: Address = 0x61 Offset = binary 0001 (只焊接A0)
Board 2: Address = 0x62 Offset = binary 0010 (只焊接A1)
Board 3: Address = 0x63 Offset = binary 0011 (同时焊接A0 & A1)

StackingTest.py是级联叠加的代码示例,关键部分是创建2个MotorHAT对象:

# bottom hat is default address 0x60
bottomhat = Adafruit_MotorHAT(addr=0x60)
# top hat has A0 jumper closed, so its address 0x61
tophat = Adafruit_MotorHAT(addr=0x61)

五、原理图和库程序下载


TAG: 树莓派3.5寸LCD电阻触摸显示屏ST7796 320x480 高速60fps适用于Arduino/Pico2/ESP32/RP2040/RP2350开发板 电子眼睛0.71寸圆形LCD显示屏液晶屏适用于Arduino/树莓派/PICO/STM32 ESP32-S3 4.3寸LCD电容触控显示屏(B)板载CAN/I2C/RS485/传感器 树莓派5 RTC电池 ESP32-S3开发板3.16寸LCD显示屏 SD卡槽 320×820 RGB LED ST7701 QMI8658六轴加速度陀螺仪 ESP32 工业级串口服务器 RP2040开发板 斑梨 Modbus POE ETH Relay MQTT 工业级双ETH以太网RJ45转8路继电器模块Modbus PoE供电 4寸圆形LCD电容触摸HDMI显示屏适用于mini PC树莓派Jetson CAN FD逻辑分析仪 工业级USB转2路RS485隔离转换器原装FT2232HL X1009树莓派5 PCIe转5端口SATA硬盘扩展板5个SATA3.0 树莓派5散热器 27W X1012树莓派5 POE PCIE转M.2 NVME SSD固态硬盘扩展Pi5以太网供电 2.13寸电子墨水屏 串行总线电机