SG90舵机官方数据
尺寸:21.5mmX11.8mmX22.7mm
重量:9克 (1kg=1公斤=2斤)
无负载速度:0.12秒/60度(4.8V) 0.002s/度
堵转扭矩:1.2-1.4公斤/厘米(4.8V)
使用温度:-30~~+60摄氏度
死区设定:7us (7MHZ)
工作电压:4.8V-6V
位置等级:1024级
脉冲控制精度为2us
操作说明
1.采用PWM控制的方式来进行舵机的操纵
2.舵机的控制需要MCU产生一个20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度
3.查看SG90的文档可以看见其占空比与转动角度的关系:
舵机控制系统工作稳定,PWM占空比 (0.5~2.5ms 的正脉冲宽度)和舵机的转角(-90°~90°)线性度较好
舵机的控制需要一个20ms左右的时基脉冲(1/0.020s=50HZ),该脉冲的高电平部分为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是:
脉冲 角度 占空比
0.5ms-------------0度; 2.5%
1.0ms------------45度; 5.0%
1.5ms------------90度; 7.5%
2.0ms-----------135度; 10.0%
2.5ms-----------180度; 12.5%
SG90一共三根线,红线接5V电源,棕线GND。黄线为数据控制线,该线接到GPIO上,这里我们是BCM模式的pin 21.
SG90 脉冲周期为20毫秒(millisecond) 不是20微秒(Microsecond),两者差1000倍呢!也就是说最多1秒钟内可以转动50次,但是考虑到每次转动还要耗时,所以实际达不到50次。PWM控制信号周期20ms,脉宽0.5ms-2.5ms对应的角度-90到+90度,范围180度(3度左右偏差),当脉宽1.5ms时舵机在中立点(0度),我们直接用Python的GPIO提供的PWM控制。脉宽0.5ms-2.5ms 对应的占空比为2.5% - 12.5% (脉宽/周期=0.5/20-2.5/20). 理论上,10%的空间可以提供180度的线性分割(12.5%-2.5%)。
SG90 脉冲周期为20ms,脉宽0.5ms-2.5ms对应的角度-90到+90,对应的占空比为2.5%-12.5%
注意:(在规定范围内) 给多少占空比 有且只有一个角度和它对应
1.首先安装python库和gpio库
(1) 安装python库
sudo apt-get install python-dev
(2)执行更新
sudo easy_install -U distribute
(3)安装python-pip
sudo apt-get install python-pip
(4)安装pythond 的GPIO库
sudo pip install rpi.gpio
2.基于python 的编程,编写sg90.py
(1)执行 cd ~
(2)执行 sudo mkdir SG90
(3)执行 cd SG90
(4)执行 nano sg90.py
(5)复制以下代码,并按ctl+x 选择Y保存退出
#!/usr/bin/env python
import RPI.GPIO as GPIO
import time
import signal
import atexit
atexit.register(GPIO.cleanup)
servopin=21
GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin,GPIO.OUT,initial=False)
p=GPIO.PWM(servopin,50)
p.start(0)
time.sleep(2)
while(True):
for i in range(0,360,10):
p.ChangeDutyCycle(12.5-5*i/360)
time.sleep(1)
for i in range(0,360,10):
p.ChangeDutyCycle(7.5-5*i/360)
time.sleep(1)
GPIO.cleanup()
注意:
1.程序中 p.ChangeDutyCycle() 是指占空比
通过改变占空比 使得舵机可以“缓慢的”接近最终的角度。
2.python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。 atexit 按注册的相反顺序执行这些函数; 例如注册A、B、C,在解释器终止时按顺序C,B,A运行。
Note:如果程序是非正常crash,或者通过os._exit()退出,注册的退出函数将不会被调用。
实质上还是利用占空比对应角度,占空比++=》角度
例:这里SG90舵机的参考周期是20ms,也就是50KHZ。那么按照这个方法我们可以写出如下代码:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
Vcc_Pin=37
In_Pin=35 #操控线(黄线)
GPIO.setup(Vcc_Pin,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(In_Pin,GPIO.OUT,initial=GPIO.LOW)
p=GPIO.PWM(In_Pin,50) #设置频率为50KHz,20ms左右的时基脉冲(1/0.020s=50HZ)
p.start(0)
str1="please input the degree(0<=a<=120)\nor press q to quit\n"
r=input(str1)
try:
while not r=="q":
if r.isdigit(): #判断输入的字符串是不是数字
r=int(r) #是数字转换成数字
else:
print("please input a number(0<=num<=120)")
continue
if r<0 or r>180: #越界提示
print("a must be [0,120]")
continue
p.ChangeDutyCycle(2.5+r/360*20) #通过用户输入的角度来改变舵机的角度
time.sleep(0.02)
r=str(input(str1))
except KeyboardInterrupt:
pass
p.stop()
GPIO.cleanup()
这个程序根据用户输入舵机转动的角度,转动舵机到相应的角度。
这里的p.ChangeDutyCycle(2.5+r/360*20)中的2.5+r/360*20是推导的公式,用于转动舵机到指定的角度。
_______________________________________________________
下面的代码可以看到舵机不停的从0度转到180度,再转回来到0度。
#! /usr/bin/env python3
# encoding=utf-8
import RPi.GPIO as GPIO
import time
import signal
import atexit
atexit.register(GPIO.cleanup)
servopin=4
GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin,GPIO.OUT,initial=False)
p=GPIO.PWM(servopin,50) #50HZ:频率就是周期脉冲的周期的倒数
p.start(0) #start(initdutycycle):占空比0-100间,0表示暂不输出
time.sleep(2)
while(True):
for i in range(0,181,10):
p.ChangeDutyCycle(2.5+10*i/180) #设置转动角度
time.sleep(0.02) #等该20ms周期结束
p.ChangeDutyCycle(0) #归零信号
time.sleep(0.2)
for i in range(181,0,-10):
p.ChangeDutyCycle(2.5+10*i/180)
time.sleep(0.02)
p.ChangeDutyCycle(0)
time.sleep(0.2)
GPIO.cleanup()
// 注
1.时间单位换算时间单位还有: 毫秒(ms)、微秒 (μ s)、纳秒(ns)、皮秒(ps)、飞秒(fs)、阿秒、渺秒 1 s = 10^3 ms = 10^6 us = 10^9 ns = 10^...
2.PWM就是脉冲宽度调制的英文缩写,方波高电平时间跟周期的比例叫占空比,例如1秒高电平1秒低电平的PWM波占空比是50%
3.占空比是指高电平在一个周期之内所占的时间比率.方波的占空比为50%,占空比为0.5,说明正电平所占时间为0.5个周期.
-----------------------------------
扩展:使用 RPI.GPIO 模块的脉宽调制(PWM)功能
使用 RPI.GPIO 模块的脉宽调制(PWM)功能
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过对GPIO的编程来实现PWM。
创建一个 PWM 实例:
p=GPIO.PWM(channel, frequency)
启用 PWM:
p.start(dc)# dc 代表占空比(范围:0.0 <= dc >= 100.0)
更改频率:
p.ChangeFrequency(freq)# freq 为设置的新频率,单位为 Hz
更改占空比,如:占空比为2.5% - 12.5% (脉宽/周期=0.5/20-2.5/20):
p.ChangeDutyCycle(dc)# 范围:0.0 <= dc >= 100.0
停止 PWM:
p.stop()
注意,如果实例中的变量“p”超出范围,也会导致 PWM 停止。
以下为使 LED 每两秒钟闪烁一次的示例:
importRPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
p=GPIO.PWM(12,0.5) #12号pin,o.5Hz
p.start(1)
input('点击回车停止:') #在 Python 2中需要使用 raw_input
p.stop()
GPIO.cleanup()