如何控制RC伺服器?


26

我想通过Python从GPIO引脚控制一个小型RC伺服器(5 V,500 mA)。

硬件

  • 所需的电气连接是什么?
  • 我可以将多个伺服器连接到Raspberry Pi吗?
  • 目前有任何限制吗?我需要用晶体管缓冲输出引脚吗?
  • 我可以直接从Raspberry Pi为伺服器供电,还是应该使用外部电源?我需要电容器来平滑伺服器的抽力吗?

软件

  • 我需要什么软件/ Python代码?我知道我需要20毫秒的脉冲,如何实现呢?
  • 通过这种方式使用Raspberry Pi,我可以期望什么样的CPU负载?

这是一个可以帮助你开始了一个类似的问题:raspberrypi.stackexchange.com/questions/27/...
安德鲁·拉尔森

Answers:


9

所需的电气连接取决于您所使用的伺服器。该GPIO提供3.3 V和高达16 mA的电流,这不足以为你伺服,所以你需要用一个晶体管来缓冲它。

扩展接头上8个GPIO引脚,但其他引脚也可以重新配置为总共17个GPIO引脚。如果需要更多,则必须添加某种多路复用器。

在Raspberry Pi或任何非实时操作系统上,获取精确定时的信号将非常棘手,因为中断和任务切换可以随时发生。您可能需要外部电子设备来提供准确定时的信号。

安德鲁已为您指出了一些软件。CPU负载将取决于您的工作,但是GPIO本身不会增加任何负载。


2
另一方面,即使对于Raspberry Pi的CPU而言,也是20毫秒的长时间。我不必担心RC伺服器的时间精度。

2
@Tibor:20毫秒是伺服脉冲的周期,而不是宽度en.wikipedia.org/wiki/Servo_control#Pulse_duration。而且分辨率要求比这差得多-要获得8位分辨率,您需要在2毫秒内执行256步,因此需要8us。
Martin Thompson 2012年

8

如果您在Raspberry Pi上运行实时操作系统,则确实可以实现。正如其他人已经说过的那样,您将需要一个外部电源给伺服器,但除此之外,您不需要任何其他附加硬件。

如果您正在运行Xenomai(Linux实时补丁),则可以运行一个完全熟悉的Linux系统,但是具有附加的实时功能。

我已经编写了一个微型C库,用于从Raspberry Pi控制伺服器。我曾尝试同时控制3个伺服器,但实际上没有理由不应该再使用它。

您可以在这里找到我的小程序库:https : //github.com/simonfi/pi-servo为此添加Python包装器应该很简单。可以在此处找到适用于Raspberry Pi的Xenomai:http//powet.eu/2012/07/25/raspberry-pi-xenomai/

生成三个伺服器所需的信号基本上消耗的CPU量可忽略不计。我尚未测试超过三个。


5

如果您不介意使用Linux Kernel驱动程序,则可以使用Servoblaster将伺服器公开为char设备。

https://github.com/richardghirst/PiBits

我创建了一个新版本,该版本不会消耗所有用于伺服器的gpio引脚。我目前正在使用小型伺服驱动的机器人,该机器人是我使用IPGamePad控制它为机器人俱乐部开发和演示的。

https://github.com/jronald/PiBits

另外,您确实不希望通过RPI为伺服器供电,而是使用单独的电源。当然,您需要将这些理由结合在一起。由于RPI输出到伺服系统,因此不需要任何电压偏移,但是您要非常小心,以免接线错误。


fyi-richartghrist回购似乎已得到维护,而jronald叉子似乎已过时且损坏。另外,我建议您阅读如何忽略除前两个伺服控件之外的所有控件,以及安装Servoblaster
cwd

3

通常,使用PWM信号来控制伺服。您应该将GPIO称为PWM输出

芯片上有PWM支持,因此我们将来应该可以使用它。基本上,所有软件所做的就是告诉硬件以一定频率产生脉冲。有些人已经在I2C上使用外部PWM控制器取得了成功。


3

有一个可用于树莓派的扩展板,称为gertboard,用于控制Pi自身无法驱动的伺服和其他负载。


我还要补充一点,由于该产品的受欢迎程度,我相信大多数提供树莓派和配件的站点都售罄。
布兰登·贝利

3

自问了这个问题以来,多年来如何在Pi上做事的知识已大大提高。

在不使用外部硬件的情况下,至少有四种方法可以在Pi的gpios上生成硬件定时PWM / Servo脉冲。

不建议使用内核模块来执行此操作。可以使用以下userland解决方案。

  • 我自己的pigpio将在gpios 0-31(C,Python,套接字,管道)中的任何一个上独立生成伺服脉冲和通用PWM脉冲。
  • Servoblaster将生成伺服和一般的PWM上高达21个的GPIO(管道)独立地脉冲。
  • RPIO将在gpios 0-31(Python)的任何一个上独立生成伺服和通用PWM脉冲。
  • 来自Servoblaster的pi-blaster(管道)

2

如果您在运行Linux来精确控制伺服器时能充分地安排输出时间,我会感到惊讶。

脉冲必须控制在2毫秒的范围内。即使调度程序刻度的分辨率为100us(正在推动它-通常为10ms),您也只能解决20个步骤。而且这无需考虑任务切换带来的抖动。

如果有另一个计时器可用,您可能会编写一个非常低级的驱动程序,该驱动程序甚至可以抢占操作系统,以使其计时准确。听起来很好玩!


2

我认为尝试直接从GPIO端口运行伺服将很困难,并且即使有可能也会导致大量CPU开销。我使用USB伺服控制器,它的工作原理很好,几乎不使用CPU,尽管设置起来有些棘手。我拥有的是24个频道,但它们确实制作了6个频道的版本。我还看到其他供应商的2通道和4通道控制器使用串行接口,如果您不需要控制那么多伺服器,它们将比USB更容易和便宜。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.