使用python 控制G90舵机,RPI.GPIO 模块的脉宽调制(PWM)功能_g90舵机duty-CSDN博客

9 G 180°微型舵机。

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保存退出
————————————————

                    这部分代码不一定对,先保留吧,万一哪天博文不能看了呢
                        
原文链接:https://blog.csdn.net/wailaizhu/article/details/54666520

1、接线

SG90一共三根线,红线接5V电源,棕线GND。黄线为数据控制线,该线接到GPIO上,这里我们是BCM模式的pin 18。

黄------------ GBM 18;红-------------5V0;黑----------GND

2、程序

(1)正传180;反转180;ctr+c停止

#! /usr/bin/env python3
# encoding=utf-8   
 
import RPi.GPIO as GPIO
import time
import signal
import atexit
 
atexit.register(GPIO.cleanup)
 
servopin=18
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()

(2)慢慢转动,有点不理解,运动不流畅

#!/usr/bin/env python
 
import RPi.GPIO as GPIO
import time
import signal
import atexit
 
atexit.register(GPIO.cleanup)
 
servopin=18
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(0.02)
   for i in range(0,360,10):
        p.ChangeDutyCycle(7.5-5*i/360)
        time.sleep(0.02)
 
GPIO.cleanup()

(3)输入值制定电机角度 ,也不是很流程,le(3)不明白意思

#!/usr/bin/env python3 
import RPi.GPIO as GPIO
import time
def setServoAngle(angle):
   GPIO.setmode(GPIO.BCM)
   GPIO.setwarnings(False)
   GPIO.setup(18, GPIO.OUT)
   tilt = GPIO.PWM(18, 50)
   tilt.start(0)
   DutyCycle = angle/18 + 2
   tilt.ChangeDutyCycle(DutyCycle)
   time.sleep(1)
   tilt.stop()
c = input("If you want to continue, type 'c' please. Type 'e' to end.")
while c == 'c':
   angle = input('Please type an angle:')  # input输入的是字符串,需要用int()函数转化成数字。
   angle = int(angle)
   setServoAngle(angle)
   c = input("'c' or 'e'?") 
GPIO.cleanup()
exit()
le(3) # 通过输入不同的“占空比值”来观察舵机的位置变化,这里的“占空比”是3%。
time.sleep(1)
p.stop() # 停止PWM。
GPIO.cleanup() # 清理GPIO。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐