# Adafruit的树莓派教程第八课：使用伺服马达

- URL: https://wuming.si/blog/680/
- Author: Aaron
- Published: 2014-05-29
- Language: zh-Hans
- Categories: Uncategorized
- Originally published at: https://blog.wo.ai/archives/680

#### 概览

这节课我们来学习如何使用Python来控制一个伺服马达。

[![lesson8_1](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/e3978d0a68_cf1c81f29704917b20e806fc378589bd.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/e3978d0a68_cf1c81f29704917b20e806fc378589bd.jpg "Adafruit的树莓派教程第八课：使用伺服马达")

伺服马达受不同长度的脉冲控制。这需要相当准确的定时。树莓派上有一针能通过硬件产生脉冲，而不需要依靠操作系统。Occidentalis系统有一个界面可以使用这一针来控制伺服马达。

#### 你需要的：

  * 1个树莓派  
[![lesson8_2](http://www.geekfan.net/images/8c589e7e46d7208c2f6665958099776d.jpg)](http://www.geekfan.net/images/8c589e7e46d7208c2f6665958099776d.jpg "Adafruit的树莓派教程第八课：使用伺服马达")
  * 1个扩展板和1条26针的IDC电缆  
[![lesson8_3](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/c70e4239cd_45e337430b0536fc2f7c63383405ead1.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/c70e4239cd_45e337430b0536fc2f7c63383405ead1.jpg "Adafruit的树莓派教程第八课：使用伺服马达")
  * 1把公对公的跳线  
[![lesson8_4](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ddfebf1314_f64ff426c56d7e5b999714c308a910e6.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ddfebf1314_f64ff426c56d7e5b999714c308a910e6.jpg "Adafruit的树莓派教程第八课：使用伺服马达")
  * 1块小型面包板  
[![lesson8_5](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5b70734d09_4af56d1ed03705283151ed9878a43023.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5b70734d09_4af56d1ed03705283151ed9878a43023.jpg "Adafruit的树莓派教程第八课：使用伺服马达")
  * 1个伺服马达  
[![lesson8_6](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/8cadee5d8a_7c87ebe67e19d5cb7b957e725d0d8f08.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/8cadee5d8a_7c87ebe67e19d5cb7b957e725d0d8f08.jpg "Adafruit的树莓派教程第八课：使用伺服马达")
  * Adafruit Occidentalis 0.2或之后版本的操作系统发行版  
[![lesson8_7](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/651aa65df0_4dc3e252ef4003722893b0f14830997c.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/651aa65df0_4dc3e252ef4003722893b0f14830997c.png "Adafruit的树莓派教程第八课：使用伺服马达")
  * 5号或7号电池座及4节电池  
[![lesson8_8](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6a87a550b4_fdc37e246354f0b2234d47f151b1cea0.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6a87a550b4_fdc37e246354f0b2234d47f151b1cea0.jpg "Adafruit的树莓派教程第八课：使用伺服马达")

#### 伺服马达

伺服马达的状态由脉冲的长度控制。伺服马达预期每20毫秒接受一次脉冲。如果脉冲的高电平持续1毫秒，那么伺服马达不会转动，如果是1.5毫秒，那它将会转过90度，如果高电平持续2毫秒，那它将会转动180度。

[![lesson8_9](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/d41fea882a_6d42d7b8c4a150fff224aa9e18f67880.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/d41fea882a_6d42d7b8c4a150fff224aa9e18f67880.png "Adafruit的树莓派教程第八课：使用伺服马达")

伺服马达的终点位置可能不同，许多伺服马达只能转动大约170度。你也可以购买能”连续”旋转360度的伺服马达。

#### PWM与伺服马达核心模块(The PWM and Servo Kernel Module)

Adafruit与Sean Cross一起编写了一个核心模块被包含在了[Occidentalis](http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/occidentalis-v0-dot-2)发行版里。更多的细节请参照[这篇教程](http://www.geekfan.net/8808/)。如果你想在Raspbian或者其他发行版上使用这个模块，参考[这里](http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/occidentalis-v0-dot-2)来把模块安装到你的环境里。

这个模块被称为**PWM** 与伺服马达(PWM and Servo)因为在控制伺服马达的同时该模块可以产生PWM(Pulse Width Modulation，脉冲宽度调制)信号，(与额外电源配合)可被用于控制马达的功率或灯光亮度。这节课我们不会使用PWM。

PWM与伺服马达模块使用一种文件类型的接口，你可以通过读取和写入特殊的文件来控制输出针脚和伺服马达的行为。这使得使用Python或者其他语言来编写该接口十分容易。

用于驱动伺服马达的所涉及到的文件列在下方。所有文件可以在树莓派的/sys/class/rpi-pwm/pwm0/目录下找到。

**文件 – 描述**  
active – 1为激活，0为未激活。你可以通过读取它来查找输出针是否被激活，或者通过改写控制它的激活或未激活。  
delayed – 如果设置为1，你对其他文件的改动不会起作用直到你使用上面的active来激活输出针。  
mode – 改写文件来设置针脚是pwm，servo(伺服马达)还是audio(音频)。显然这里我们要设置为servo。注意这些针也会被小派的音频输出使用，所以你不能在使用声音的同时控制一个伺服马达。  
servo_max – 改写这个文件来设置伺服马达的最大角度。我们把它设置为180这样我们就可以很容易的把伺服马达置成0到180度之间的位置了。  
servo – 改写这个文件将会设置伺服马达的脉冲长度到一个与servo_max有关的值。比如我们把它设置为90，servo_max的值为180，那伺服马达会保持在中间位置。

#### 硬件

在小派上只有一个针脚能够产生这样的脉冲(GPIO 18针)。它将与伺服马达的控制针脚相连。伺服马达的电源由外接电池控制，因为使用小派的电源可能会在伺服马达开始转动的瞬间产生巨大的电流，导致小派崩溃。伺服马达需要4.8-6V的直流电来驱动马达，但是信号的逻辑电平(脉冲输出)可以是3.3V，所以可以直接把信号线直接连到GPIO的输出针上。

[![lesson8_10](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/92b202ebc0_905eb86a9bdb132736140388de7bf5af.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/92b202ebc0_905eb86a9bdb132736140388de7bf5af.png "Adafruit的树莓派教程第八课：使用伺服马达")

小派扩展板用于连接树莓派和面包板，如果你之前没有使用过扩展板，你可以参考这个系列教程的[第四节](http://www.geekfan.net/8972/)。

伺服马达通常有一个三针的插座。红色和棕色用于供电(红色为正极)并且第三针黄色或橘黄色的用于控制信号。要把插座连接到面包板上，你需要使用公对公的跳线。

[![lesson8_11](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5b7194214e_95bcadced01a46f8eaad5825a7d8b9e3.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5b7194214e_95bcadced01a46f8eaad5825a7d8b9e3.jpg "Adafruit的树莓派教程第八课：使用伺服马达")

#### 软件

这个项目不需要安装任何Python库。

下面列出的程序使伺服马达前后摆动：
    
    
    # Servo Control
    import time
    def set(property, value):
    	try:
    		f = open("/sys/class/rpi-pwm/pwm0/" + property, 'w')
    		f.write(value)
    		f.close()	
    	except:
    		print("Error writing to: " + property + " value: " + value)
    
    def setServo(angle):
    	set("servo", str(angle))
    
    set("delayed", "0")
    set("mode", "servo")
    set("servo_max", "180")
    set("active", "1")
    
    delay_period = 0.01
    
    while True:
    	for angle in range(0, 180):
    		setServo(angle)
    		time.sleep(delay_period)
    	for angle in range(0, 180):
    		setServo(180 - angle)
    		time.sleep(delay_period)

为了写文件方便，我写了一个工具方法叫做”set”。第一个参数是要被写入的文件名(属性名)，第二个参数是要被写入的值。

在程序的开始部分写入了几个文件来关闭delay模式，设置mode为’servo’，设置伺服马达的最大角度为180度最后把输出针设置为激活状态。

一个叫做delay_period的变量用于存储伺服马达每一步的间隔秒数。

while循环会一直进行直到按下CTRL+C终止。在while循环中有两个相似的for循环，第一个从0到180度递增旋转角度，第二个刚好相反，从180到0度递减。

要安装个软件，使用SSH连接到小派上然后输入下面的命令：
    
    
    nano servo.py

粘贴上面的代码然后使用CTRL+X然后按一下Y保存。

[![lesson8_12](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/928c1001e2_2cb51c3be5b8edf924a4c666b50be73e.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/928c1001e2_2cb51c3be5b8edf924a4c666b50be73e.png "Adafruit的树莓派教程第八课：使用伺服马达")

然后在SSH窗口里输入下面的命令来使程序运行：
    
    
    python servo.py

然后伺服马达就开始转动啦。

#### 测试&配置

如果你想让马达转快一些，尝试改变delay_period到一个更小的值，例如0.001，如果想慢一些，把它增大到0.1.

如果你想控制多个伺服马达，像[Adafruit I2C 16 channel servo / pwm controller](http://www.adafruit.com/products/815)里一样。你可以通过[这篇教程](http://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/overview)来进行了解。

[Adafruit的树莓派教程第八课：使用伺服马达](http://www.geekfan.net/9507/)，首发于[极客范 – GeekFan.net](http://www.geekfan.net)。
