-
伺服电机(Servo Motor):
- 伺服电机确实是一个包含电机(直流、交流等)、传感器(如霍尔编码器或光电编码器)和控制器(如单片机)的系统。由于有传感器反馈(闭环系统),它可以精确知道电机转了多少圈,目前到什么角度,即使关机重启也能知道当前角度。
- 伺服电机通过编码器实时反馈位置信息,确保高精度和高响应性。
-
舵机:
- 舵机也是一种伺服电机,主要用于需要角度控制的应用,如航模、机器人等。它的名字来源于航模爱好者,因为他们在控制模型时需要精确的角度控制。
- 舵机通常使用PWM信号进行控制,具有较小的转角范围(通常为0-180度),并且内置位置反馈(如电位器),实现闭环控制。
-
步进电机(Stepping Motor):
- 步进电机通过定子线圈序列通电,顺次在不同的角度形成磁场,推拉定子旋转。由于没有测量电机转角的传感器反馈(开环系统),所以无法知道当前的角度,转了几圈。
- 步进电机可以通过加装编码器来实现闭环控制,达到精确控制角度的功能。这样,步进电机也可以具备类似伺服电机的高精度控制能力。
# 型号: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()