树莓派使用python 控制G90舵机

来源:互联网 发布:上海交大网络教育网 编辑:程序博客网 时间:2024/05/04 11:42

辉盛SG90 <wbr>9G舵机接线与驱动

SG90 一共三根线,红线接5v电源,棕线gnd,黄线为数据控制线,该线接到GPIO上,这里使用BCM模式下的21引脚

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.ChangeCutyCycle(7.5-5*i/360)
        time.sleep(1)

注意:
1.在python 语言下  for 里面的两条语句   必须对齐
          如:
    p.ChangeDutyCycle(12.5-5*i/360)
       time.sleep(1)          (N)

    p.ChangeDutyCycle(12.5-5*i/360)
   time.sleep(1)              (Y)

2.程序中 p.ChangeCutyCycle()是指占空比
    通过改变占空比  使得舵机可以“缓慢的”接近最终的角度。

    实质上还是利用占空比对应角度,占空比++    =》角度++


________________________________________________________

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度的线性分割。


下面的代码可以看到舵机不停的从0度转到180度,再转回来到0度。


[python] view plain copy
  1. #!/usr/bin/env python    
  2.   
  3.   
  4. import RPi.GPIO as GPIO  
  5. import time  
  6. import signal  
  7. import atexit  
  8.   
  9. atexit.register(GPIO.cleanup)    
  10.   
  11. servopin = 21  
  12. GPIO.setmode(GPIO.BCM)  
  13. GPIO.setup(servopin, GPIO.OUT, initial=False)  
  14. p = GPIO.PWM(servopin,50#50HZ  
  15. p.start(0)  
  16. time.sleep(2)  
  17.   
  18. while(True):  
  19.   for i in range(0,181,10):  
  20.     p.ChangeDutyCycle(2.5 + 10 * i / 180#设置转动角度  
  21.     time.sleep(0.02)                      #等该20ms周期结束  
  22.     p.ChangeDutyCycle(0)                  #归零信号  
  23.     time.sleep(0.2)  
  24.     
  25.   for i in range(181,0,-10):  
  26.     p.ChangeDutyCycle(2.5 + 10 * i / 180)  
  27.     time.sleep(0.02)  
  28.     p.ChangeDutyCycle(0)  
  29.     time.sleep(0.2)  

//  注

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个周期.

0 0