python-树莓派通过按键控制步进电机正反转

硬件选择与设计
不管是直流电机还是步进电机,如果想要让其进行正常的转动,必须需要驱动器进行驱动,所以我们在这里选择的步进电机和驱动板型号分别为28BYJ-48-5VUL2003芯片的五线四相步进电机驱动板。

步进电机驱动原理
要想驱动步进电机进行正常的正反转,就必须要先了解步进电机的驱动时序,此次选择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口可以进行模拟按键作用下的反转模式。

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值