硬件选择与设计
不管是直流电机还是步进电机,如果想要让其进行正常的转动,必须需要驱动器进行驱动,所以我们在这里选择的步进电机和驱动板型号分别为28BYJ-48-5V和UL2003芯片的五线四相步进电机驱动板。
步进电机驱动原理
要想驱动步进电机进行正常的正反转,就必须要先了解步进电机的驱动时序,此次选择28BYJ-48-5V是四相的电机,按照通电顺序不同可分为以下三种:单四拍,双四拍,八拍三种工作方式,本次实验采取的是八拍的工作方式。下面将列出三种工作方式下的正反转时序:
单四拍:
正转:A - B - C - D 反转:D - C - B - A
双四拍:
正转:AB - BC - CD - DA 反转:DA - DC - BC - AB
八拍:
正转:A - AB - B - BC - C - CD - D - DA
反转:DA - D - CD - C - BC - B - AB - A
GPIO口选择与硬件连线
因为涉及到按键控制步进电机的正反转,所以需要提前准备好八个杜邦线,驱动控制板上有六个引脚,需要连接到Pi的GPIO口上,另外对于按键可以自行设计,我这里是利用杜邦线一段连到Pi上的GPIO口上,另一端接地,进行模拟按键低电平触发。下边将列出具体的连接引脚:
IN1 (GPIO17)
IN2 (GPIO18)
IN3 (GPIO21)
IN4 (GPIO22)
5 V (Pin02)
Ground (Pin39)
key1 (GPIO23) #正转
key2 (GPIO24) #反转
引脚分布与功能图:
程序源码
创建python脚本stepmotor.py
#!/usr/bin/env python
#调用所需要的库
import time
import RPi.GPIO as gpio
#设置为BCM模式
gpio.setmode(gpio.BCM)
#设置所选择的io口
stepPins = [17,18,21,22]
key1 = 23
key2 = 24
#设置所有的io口为输出模式
for pin in stepPins:
print ("Setup Pins")
gpio.setup(pin,gpio.OUT)
gpio.output(pin, False) #低电平触发
gpio.setup(key1, gpio.IN, gpio.PUD_UP)
gpio.setup(key2, gpio.IN, gpio.PUD_UP)
#定义变量
step1 = 0
step2 = 0
waittime = 0.005
#定义正转的序列
stepcount1 = 8
seq1 = []
seq1 = list(range(0, stepcount1))
seq1[0] = [1,0,0,0]
seq1[1] = [1,1,0,0]
seq1[2] = [0,1,0,0]
seq1[3] = [0,1,1,0]
seq1[4] = [0,0,1,0]
seq1[5] = [0,0,1,1]
seq1[6] = [0,0,0,1]
seq1[7] = [1,0,0,1]
#定义反转序列
stepcount2 = 8
seq2 = []
seq2 = list(range(0, stepcount2))
seq2[0] = [1,0,0,1]
seq2[1] = [0,0,0,1]
seq2[2] = [0,0,1,1]
seq2[3] = [1,0,1,0]
seq2[4] = [0,1,1,0]
seq2[5] = [0,1,0,0]
seq2[6] = [1,1,0,0]
seq2[7] = [1,0,0,0]
#开始进行循环转动
while True:
if gpio.input(key1) == 0:
for pin in range(0, 4):
xpin = stepPins[pin]
if seq1[step1][pin]!=0:
print ("step %i enable %i" %(step1,xpin))
gpio.output(xpin, True)
else:
gpio.output(xpin, False)
step1 += 1
#当序列要结束时,再一次循环序列
if (step1 == stepcount1):
step1 = 0
if (step1 < 0):
step1 = stepcount1
#延时等待时间
time.sleep(waittime)
if gpio.input(key2) == 0:
for pin in range(0, 4):
xpin = stepPins[pin]
if seq2[step2][pin]!=0:
print ("step %i enable %i" %(step2,xpin))
gpio.output(xpin, True)
else:
gpio.output(xpin, False)
step2 += 1
#当序列要结束时,再一次循环序列
if (step2 == stepcount2):
step2 = 0
if (step2 < 0):
step2 = stepcount2
#延时等待时间
time.sleep(waittime)
终端运行:
sudo python3 stepmotor.py
crtl + r 退出
waittime是默认等待时长,可以通过调节其数值,进行调整步进电机的转速。如果脚本运行得太快,电机控制器就跟不上了,可能会导致电机在运转,但是不会转动。这种性能可能取决于你的电机和它的控制器。
代码运行成功后,通过杜邦线一端接地,另一端去接GPIO23口进行模拟按键作用下的正转模式。同上GPIO24口可以进行模拟按键作用下的反转模式。