前言
树莓派控制例如9g系列舵机,当到达指定位置时舵机会出现在此位置抖动情况,这应该是PWM信号谐波导致。当舵机到达指定位置后可以采取关闭GPIO口消除PWM信号,或者清除占空比实现,但这两种方式仅限于执行舵机后并关掉,无法保持舵机位置。
一、通过清除占空比实现
此方法仅限于不需要保持舵机固有角度的情况
1.代码示例
代码如下:
import RPi.GPIO as GPIO
import time
#设置舵机引脚
right_hand = 24
#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)
#忽略警告信息
GPIO.setwarnings(False)
#声明两个全局变量
global G90_right_hand
global i
GPIO.setup(right_hand, GPIO.OUT)
#设置频率为50
G90_right_hand = GPIO.PWM(right_hand, 50)
# 在引脚上设置一个初始PWM信号
G90_right_hand.start(0)
def MG90_right_hand(i):
G90_right_hand.ChangeDutyCycle(2.5+i/360*20)#通过计算求出角度换算占空比
time.sleep(0.5)
G90_right_hand.ChangeDutyCycle(0)#设置为0,清除占空白,以此句消除舵机抖动
while True:
MG90_right_hand(90)
G90_right_hand.stop() # 停止PWM。
GPIO.cleanup() # 清理GPIO。
二、使用pigpio库解决抖动问题
pigpio是一个用于树莓派的库,它允许控制树莓派的通用输入输出(GPIO)引脚。它提供了c语言与python语言的库函数,我们可以调用相关的库函数实现跟GPIO相关的操作。以pigpio来使用GPIO引脚输出PWM信号控制舵机。
1.pigpio库下载
使用python直接下载
sudo apt-get install pigpio python-pigpio python3-pigpio
下载完成后并不能直接调用该库,否者运行程序会报错。
在运行编写好的代码之前,需要先执行以下命令
sudo pigpiod
这样做是为了开启一个线程用于该库的运行,如果不这么做,在运行代码时会提示错误。这里需要你知道的是,pigpio程序在你开启守护进程后会一直运行,直到你关机,或者结束守护进程。如果你运行完了程序,想要关闭该库,可以使用如下命令
sudo killall pigpiod
该指令需要在每次开机后执行,所以我们最后将其设置为开机自启。这里我采用树莓派官方系统Raspbian OS进行演示操作。
sudo nano /etc/rc.local
打开文档后在exit 0前输入sudo pigpiod,Ctrl+O、回车保存,Ctrl+X推出编辑器即可完成。
2.代码示例
代码如下:
import time
import pigpio
#设置舵机引脚
right_hand = 24
#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)
#声明两个全局变量
global G90_right_hand
global i
# pigpio的初始化
G90_right_hand = pigpio.pi()
# pigpio低电平
G90_right_hand.write(right_hand, 0)
# pigpio24号地址高低电平读取
G90_right_hand.read(right_hand)
# pigpio设置频率
G90_right_hand.set_PWM_frequency(right_hand, 50)
# pigpio设置周期为4000
G90_right_hand.set_PWM_range(right_hand, 4000)
def MG90_right_hand(i):
G90_left_hand.set_PWM_dutycycle(left_hand,80+(400/180)*i)#通过计算求出角度换算占空比
time.sleep(0.5)
while True:
MG90_right_hand(90) #给出一个角度
这里我用了一个算式来换算角度值与需要的占空比,换算方式如下:
总结
方法一适用于转动舵机后就关闭,方法二适用于需要保持舵机角度的情景。