Python示例程序和类库下载:Motor-HAT-Python3-Library-V5
一、概述
这是基于树莓派制作运动机器人非常完美的解决方案,这款电机驱动器足够强大,可以驱动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=0x50) # 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的地址,默认地址是0x50(详细设置地址参考后面的内容)
mh = Adafruit_MotorHAT(addr=0x50)
创建 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个步进电机,单极和双极都可适用。
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的地址,默认地址是0x50(详细设置地址参考后面的内容)
mh = Adafruit_MotorHAT(addr=0x50)
创建 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(0x50,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地址,默认地址是0x50。地址范围从0x50~0x53总共4个地址。
驱动板上有A0~A4总共5个跳线,焊接不同的跳线可以设置不同的地址。规则如下
Board 0: Address = 0x50 Offset = binary 0000 (默认全部为空)
Board 1: Address = 0x51 Offset = binary 0001 (只焊接A0)
Board 2: Address = 0x52 Offset = binary 0010 (只焊接A1)
Board 3: Address = 0x53 Offset = binary 0011 (同时焊接A0 & A1)
StackingTest.py是级联叠加的代码示例,关键部分是创建2个MotorHAT对象:
# bottom hat is default address 0x50 bottomhat = Adafruit_MotorHAT(addr=0x50) # top hat has A0 jumper closed, so its address 0x61 tophat = Adafruit_MotorHAT(addr=0x61)
五、原理图和库程序下载
Python示例程序和类库下载:Motor-HAT-Python3-Library-V5
原创文章,作者:奇果派工坊,如若转载,请注明出处:https://www.7gp.cn/archives/329