树莓派驱动28BYJ-48步进电机
# 型号: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()