树莓派3 B+Servoblaster 舵机控制

  • 内容
  • ....
  • 相关

Servoblaster介绍

利用树莓派的RPI.GPIO软件实现PWM通过GPIO接口(软件PWM控制直流电机,可查阅PWM控制直流电机)控制舵机有诸多问题,舵机控制信号极不稳定,抖动是一个让人恶心的问题。还好github开源社区提供了舵机控制神器Servoblaster,通过它我们可以用最方便的方式来控制舵机。

树莓派3B+ 安装Servoblaster

1、安装Git

sudo apt-get install git

2、使用Git从开源社区获取文件

git clone git://github.com/richardghirst/PiBits.git

3、cd到user文件夹

cd PiBits/ServoBlaster
cd user/

4、安装make

sudo make servod

5、启动servod库

sudo ./servod

安装完成后,检查/dev/servoblaster 目录是否存在,存在则安装成功。

6、Servoblaster测试,这里用到的GPIO接口是18,物理接口是12.(可参考:树莓派3 超声波测距代码中关于树莓派3B+ 的针脚定义图)

输入命令测试:

echo 2=100 > /dev/servoblaster

或者

echo P1-12=100 > /dev/servoblaster #这是另一种命令形式,效果和上面的命令相同,只是更直观.

可以看到舵机旋转了100度(度这个说法不太恰当,暂且都用度吧,具体原因请见下文),假设我们需要舵机旋转150度,则:echo 2=150 > /dev/servobblaster。命令行中,“echo”为输出命令;“2”可以理解为对应引脚需要,从上图中可以看出Servoblaster常规情况下可控制“0-7”的引脚,也就是8台舵机。

如果需要更精确的控制,你还可以通过“+”或“-”前缀对当前位置进行调整。例如,想让舵机在当前位置增加10度,可以这样做:

echo P1-12=+10 > /dev/servoblaster

减少10度,可以这样:

echo P1-12=-10 > /dev/servoblaster

参考:其它命令形式:

echo 0=150 > /dev/servoblaster        # 指定步数式;
echo 0=50% > /dev/servoblaster        # 指定百分比式;
echo 0=1500us > /dev/servoblaster     # 指定为微秒式;
echo P1-7=150 > /dev/servoblaster     # 使用针脚式.

7、解决舵机的抖动问题
命令执行后,就可以看到舵机转动了,但转到指定角度后让人恶心的抖动依然会存在,这是因为servoblaster会一直不停的给舵机发送信号,所以舵机即使到达了指定角度后也会抖动,这时我们可以通过

$ ./servod --idle-timeout 2

这个命令的目的是设置servoblaster停止发送给脉冲的时间,单位是毫秒,这样舵机抖动的问题可以得到有效扼制。设置的时间如果过短,会导致转动角度不够,最好的方法就是动态尝试设置最佳值。

8、检查servoblaster的运行状态

当我们不知道servoblaster是否仍在后台运行时,可以在命令提示符下通过 “ ps ax ” 命令来检查。如果你想要终止servod,最简单的方法是:

$ sudo killall servod

舵机角度与脉冲宽度


上面我们提到servoblaster输出 “echo 2=100 > /dev/servoblaster ” 命令来控制舵机角度,那”100″这个值真实的含义是什么呢?在servoblaster中默认步长是10us,”100″这个输入值表示舵机脉冲宽度是1000us,即 1ms,这就是如何控制舵机角度的本质,控制舵机角度实际上就是通过调整控制信号的脉冲宽度实现对转动角度的控制。

需要注意,在servoblaster中,舵机的位置和脉冲宽度调整都是默认四舍五入到最接近的步长,默认步长是10us。所以,如果你不断地发出“2=+1 us”类似的命令,因为”1 us”小于默认步长,舵机是不会移动的;如发送“2=-19”和发送“2=-10”的效果一样。所以,前面提到的度这个提法不准确,准确的提法应该是脉冲宽度或步长。

如何在Python代码中引入Servoblaster

在Python中使用Servoblaster需要引入subprocess库,如果没有安装subprocess库,可以在CMD命令行执行“pip install subprocess”命令进行安装。

import subprocess
subprocess.call("echo 2=100 > /dev/servoblaster", shell=True)

我们可以参照上图中的最小或最大值对代码输入值进行替换,看看效果。也许就能写出一个很棒的Servoblaster控制舵机脚本。