伺服电机通常被称为舵机,它是一种带有输出轴的装置,当向舵机发送一个控制信号时,输出轴转动某个角度到特定的位置上,通常用在遥控汽车、飞机以及机器人等领域。如下图为舵机的内部结构,它有控制电路、马达、一组减速齿轮和外壳组成:
本文将讲述如何使用树莓派3b+来控制sg90舵机。舵机有3个输入引脚,分别是GDN、VCC和Signal,VCC使用5V直流电压,signal通过PWM(脉冲宽度调制)信号来控制。以下是sg90的规格说明:
1 2 3 4 5 6 7 8 9 10 11 Weight: 9g Dimension: 23×12.2x29mm Stall torque: 1.8kg/cm(4.8v) Gear type: POM gear set Operating speed: 0.1sec/60degree(4.8v) Operating voltage: 4.8v Temperature range: 0℃_ 55℃ Dead band width: 1us Power Supply: Through External Adapter servo wire length: 25 cm Servo Plug: JR (Fits JR and Futaba)
引脚接线:
Sg90尺寸:
attribute
value
Weight(g)
9
Torque(kg)(4.8v)
1.8
Speed(sec/60deg)
0.1
A(mm)
34.5
B(mm)
22.8
C(mm)
26.7
D(mm)
12.6
E(mm)
32.5
F(mm)
16
假如我们使用的PWM频率为50Hz,对应周期T=20ms,脉冲长度t和转动方向之间的关系是线性的,如下图,其中Duty Cycle是占空比:
有了以上信息,那如何使用树莓派来控制舵机呢?
在实验中,为了方便,可以把舵机的5V引脚接在树莓派的5V输出上(可能会引起树莓派供电不稳),信号引脚接在树莓派的GPIO引脚上,通过python PRi.GPIO库来生成PWM的方式来控制舵机。这里我们把舵机的信号引脚接在树莓派的GPIO 26引脚上,python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import RPi.GPIO as GPIO import time GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) class Servo(object): def __init__(self, channel): self.channel = channel GPIO.setup(self.channel, GPIO.OUT, initial=GPIO.LOW) self.pwm=GPIO.PWM(self.channel, 50) self.pwm.start(0) def duty_cycle(self, angle): self.pwm.ChangeDutyCycle(2+angle/18) if __name__ == "__main__": servo = Servo(26) try: while True: angle = input("Please enter a integer [0,180]:") if angle == "q": break if not angle.isdigit(): print("angle must be integer") continue if int(angle) < 0 or int(angle) > 180: print("angle must be [0,180]") continue servo.duty_cycle(angle) time.sleep(0.02) except KeyboardInterrupt: pass servo.pwm.stop() GPIO.cleanup()
其中,转动角度转换成占空比算式(方法duty_cycle中的数值计算),可以通过如下图计算得出: