树莓派驱动28BYJ-48步进电机

发布时间 2023-11-15 18:58:15作者: JeasonBoy
# 型号:28BYJ-48
# 驱动:ULN2003
# 减速比:1/64(即内部马达转64圈,经过减速齿轮后外部的连接杆转一圈)
# 步进角度:0.088°(内部转64圈外部转一圈,那么内部转一圈外部转360/64=5.625°,而内部转1圈需要64个步进,则一步进就是5.625/64=0.088°
# 5线四相8拍(即内部马达,8个脉冲一个循环)
# 速度:1000步/s(极限每运动一步需要0.001s)
# 参考:https://blog.csdn.net/qq_41328470/article/details/125171300

import RPi.GPIO as GPIO
import time
import random

# 设置GPIO模式
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

# 定义步进电机连接的BCM引脚
IN1 = 25
IN2 = 8
IN3 = 7
IN4 = 1

# 设置引脚为输出
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)

# 定义步进电机的8个控制顺序(1拍为一个步进,一个步进角为电机运动的最小单位,8个拍为一个循环,内机转一圈需要8个循环,即64拍)
# 此序列为逆时针,顺时针的话数组倒序
sequence = [
    # [IN1,IN2,IN3,IN4]
    [1, 0, 0, 0],
    [1, 1, 0, 0],
    [0, 1, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 1, 0],
    [0, 0, 1, 1],
    [0, 0, 0, 1],
    [1, 0, 0, 1]
]
sequenceRV = list(reversed(sequence))

def rotate(angle):
    seq = sequence if angle >= 0 else sequenceRV
    # 因传动比是1/64,所以外机转一圈,需要内机转64圈,而内机转一圈需要64个步进,所以外机转一圈内机需要64*64=4096步
    stepNum = (int)(abs(angle) / 360 * 4096)
    for i in range(stepNum):
        # 8步一个序列循环
        step = seq[i % 8]
        GPIO.output(IN1, step[0])
        GPIO.output(IN2, step[1])
        GPIO.output(IN3, step[2])
        GPIO.output(IN4, step[3])
        # 调整步进电机的速度
        time.sleep(0.001)
    return

i = 20
while(i > 0):
    angle = random.randint(10, 90)
    rotate(angle)
    #time.sleep(1)
    rotate(-angle)
    i = i - 1

# 清理GPIO引脚,全部置零,防止电机一直有输入导致发烫
GPIO.cleanup()