使用树莓派控制sg90舵机

伺服电机通常被称为舵机,它是一种带有输出轴的装置,当向舵机发送一个控制信号时,输出轴转动某个角度到特定的位置上,通常用在遥控汽车、飞机以及机器人等领域。如下图为舵机的内部结构,它有控制电路、马达、一组减速齿轮和外壳组成:

本文将讲述如何使用树莓派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中的数值计算),可以通过如下图计算得出: