1、步进电机
步进电机是一种旋转电机,通过在特定的步进角度内进行转动来实现精确的定位控制。步进电机通常由电磁线圈和磁轴组成,线圈通过电流激励产生磁场,而磁轴则受到线圈所产生的磁场的作用而转动。
步进电机的运动是离散的,每个步进角度对应着一个固定的位置。所以步进电机可通过逐步增加或减小线圈的电流来实现精确的位置控制。由于其特殊的工作方式,步进电机具有以下优点:
(1)精确的位置控制:步进电机能够以非常小的步进角度进行精确的定位,并且能够重复地回到相同的位置。
(2)无需反馈装置:相比于其他类型的电机,步进电机无需使用编码器或传感器等反馈装置来实现位置控制,从而降低了成本和复杂性。
(3)高扭矩输出:步进电机在低速和停止状态下具有很高的静态扭矩,使其在许多应用中能够承受较大的负载。
步进电机广泛应用于精密仪器、机器人、数控设备、打印机、纺织机械等领域。
2、28BYJ-48
(1)实物图
(2)型号含义
28:步进电机的有效最大外径是28毫米
B:表示是步进电机
Y:表示是永磁式
J:表示是减速型(减速比1:64)
48:可以四拍、八拍运行
(3)接线图
(4)电机参数
(5)内部结构
(6)工作原理
永磁转子上N极和S极各8个;
爪极式定子产生磁极8组ABCD,也就是32个磁极;
整步 = 360 ÷ 32 = 11.25度;
半步 = 360÷32÷2 = 5.625度;
(7)励磁相序八拍(编程时使用)
步进角:5.625度,就是1个脉冲信号转5.625度,64个信号转360度。
减速比:1/64,电机壳里边的电机转64圈,电机壳外边的部分转1圈。
四相:ABCD四相(电机定子上有8个齿,相对的2个齿是1相),
八拍:(A-AB-B-BC-C-CD-D-DA-A)。
一拍就是一个脉冲信号,完成一个循环用8个脉冲信号。
当通电状态的改变完成一个循环时,转子转过一个齿距。转8个齿距就是一圈,8×8=64
64拍,64个脉冲信号转一圈360度。
3、ULN2003
树莓派4B端口的电流很小对于驱动电流大的外设需要驱动板(放大电流)。
ULN2003是大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003A由7组达林顿晶体管阵列和相应的电阻网络以及钳位二极管网络构成,具有同时驱动7组负载的能力,为单片双极型大功率高速集成电路。ULN2003可用于小型步进电机驱动。
4、电机与驱动板与树莓派接线
电机的红橙黄粉蓝5根线已经接好,插入驱动板,这里有防呆设计,不用担心插反。那么就看驱动板怎么接树莓派4B。
(1)VCC+:由于电机驱动板供电为5-12v,至少需要5V供电,这里接树莓派5V供电引脚。
(2)—:这里接面包板的GND。
(3)IN1--IN4:找到树莓派4B的GPIO引脚,随便都可以,记住编号哈。
5、实验代码
# 引入RPi.GPIO库函数命名为GPIO
import RPi.GPIO as GPIO
import time# BOARD编号方式
GPIO.setmode(GPIO.BOARD)
# 定义接口
IN1 = 32
IN2 = 36
IN3 = 38
IN4 = 40def GPIO_init():# 设置输出模式GPIO.setup(IN1, GPIO.OUT)GPIO.setup(IN2, GPIO.OUT)GPIO.setup(IN3, GPIO.OUT)GPIO.setup(IN4, GPIO.OUT)def Ground(Step_Index,Timer):if Step_Index == 0:GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)time.sleep(Timer)elif Step_Index == 1:GPIO.output(IN1, GPIO.HIGH)GPIO.output(IN2, GPIO.HIGH)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)time.sleep(Timer)elif Step_Index == 2:GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.HIGH)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)time.sleep(Timer)elif Step_Index == 3:GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.HIGH)GPIO.output(IN3, GPIO.HIGH)GPIO.output(IN4, GPIO.LOW)time.sleep(Timer)elif Step_Index == 4:GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.HIGH)GPIO.output(IN4, GPIO.LOW)time.sleep(Timer)elif Step_Index == 5:GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.HIGH)GPIO.output(IN4, GPIO.HIGH)time.sleep(Timer)elif Step_Index == 6:GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.HIGH)time.sleep(Timer)elif Step_Index == 7:GPIO.output(IN1, GPIO.HIGH)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.HIGH)time.sleep(Timer)def main():Step_Index=0try:while True:Ground(Step_Index,0.01)Step_Index=Step_Index+1if Step_Index==8:Step_Index=0except Exception as e:print(e)finally:GPIO.cleanup()exit()if __name__=='__main__':GPIO_init()main()
正转让step_index的值增加,加到8回0。如果是反转,让step_index的值减少,减到小于0的时候回到7。这个延时函数用来控制电机的转速,延时时间越长,转速慢,可以明显看出指示灯的闪烁。延时时间短,指示灯常量。