# Adafruit的树莓派教程第十课：步进电机

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

#### 概览

步进电机介于常规的直流电机([第九课](http://www.geekfan.net/9786/ "Adafruit的树莓派教程第九课：控制一个直流电机"))和伺服马达([第八课](http://www.geekfan.net/9507/ "Adafruit的树莓派教程第八课：使用伺服马达"))之间。步进电机的优点在于它能够被精确定位，正向或反向一次性转动”一步”，并且也能够连续转动。

[![lesson10_1](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/224a7a1046_010a199f3f98b24d1d0ef491eb6c67ff.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/224a7a1046_010a199f3f98b24d1d0ef491eb6c67ff.jpg "Adafruit的树莓派教程第十课：步进电机")

这节课里，你将学到如何使用树莓派以及在[第九课](http://www.geekfan.net/9786/ "Adafruit的树莓派教程第九课：控制一个直流电机")里已经用到的L239D马达控制芯片来控制一个步进电机。

这节课也将展示如何使用另外一种驱动芯片，ULN2803。

在这个项目里，你使用L239D或者ULN2803都是可以的。ULN2803更便宜一些，并且空余出来4个输出针脚你可以用来干点别的事，如果你两个芯片都没有，那还是选择ULN2803更好一些。

步进电机所需的电量很少并且所能承受的最大电流要小于直流电机和伺服马达。所以直接通过树莓派的5V输出并且保证电流是1A的情况下是可以直接驱动步进电机的。

#### 你需要的：

5V步进电机

[![lesson10_2](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ecc117768f_812025bf736333fdad9b016b5b7e0c7c.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ecc117768f_812025bf736333fdad9b016b5b7e0c7c.jpg "Adafruit的树莓派教程第十课：步进电机")

L293D芯片

[![lesson10_3](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6ab4e7d105_04f46e70f69748ba167d804d30bb950e.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6ab4e7d105_04f46e70f69748ba167d804d30bb950e.jpg "Adafruit的树莓派教程第十课：步进电机")

ULN2803

[![lesson10_4](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/798c06855d_03479c6a3263ce585508063c74080d8c.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/798c06855d_03479c6a3263ce585508063c74080d8c.jpg "Adafruit的树莓派教程第十课：步进电机")

小块面包板

[![lesson10_5](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/f57834d23a_d2c388bdd79a499b16562d4189273ba3.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/f57834d23a_d2c388bdd79a499b16562d4189273ba3.jpg "Adafruit的树莓派教程第十课：步进电机")

树莓派

一把跳线

[![lesson10_6](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/d23b0f23fa_97e6fb9ca377158c8eff08ea10b81b50.jpg)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/d23b0f23fa_97e6fb9ca377158c8eff08ea10b81b50.jpg "Adafruit的树莓派教程第十课：步进电机")

#### 硬件部分(L293D)

步进电机有5个引脚，所以L293D的两个半部都会用到。这意味着我们会在面包板上连接很多线。

步进电机的末端有5个接头。把跳线插入这些接头里这样就可以把电机连接在面包板上了。

[![lesson10_7](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/9a2c3e9277_74da052c09f2f92c2cb47f82e689de83.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/9a2c3e9277_74da052c09f2f92c2cb47f82e689de83.png "Adafruit的树莓派教程第十课：步进电机")

注意红色的引脚不连接任何线。

> 要通过引脚的颜色来区分而不是从它们伸出马达的位置。

<h4硬件部分(ULN2803)

如果你是用的是ULN2803，那步进电机的5个引脚都会被用到。

步进电机的末端有5个接头。把跳线插入这些接头里这样就可以把电机连接在面包板上了。

> 这个项目只适用于带有5个单级引脚的步进电机。

[![lesson10_8](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/fd3683c85d_daee234ca1bc6a808fb007b64655c3eb.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/fd3683c85d_daee234ca1bc6a808fb007b64655c3eb.png "Adafruit的树莓派教程第十课：步进电机")

尽管后面的代码里使用了GPIO的第18针，但只有在使用L293D芯片时才会用到它。

#### 步进电机

步进电机使用锯齿状的转子和电磁配合推动转子一次转动”一步”。

[![lesson10_9](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/dada63ac93_11afd99f5414b9dbc1262c5e69b22489.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/dada63ac93_11afd99f5414b9dbc1262c5e69b22489.png "Adafruit的树莓派教程第十课：步进电机")

以正确的顺序给线圈通电，那么电机就会开始转动。转子的齿数与转动”一步”的角度精确对应。

我们现在使用的是8步步进电机，并且它有一个1:64的减速齿轮箱(reduction gearbox)，所以它实际上转一圈需要 8*64=512步。

这节课里，我们不会使用红色的引脚。只有使用另外种类的不支持线圈电极反转的驱动芯片才会用到它。连接到两组线圈的中间意味着你就可以通过给左边或者右边的线圈通电来达到反转方向的目的而不用外接一个反转电流的电路。

因为我们使用的是支持电极反转的L293D芯片，所以我们就用不到红色的那个引脚了。可以通过这个芯片改变正负极来反转方向。

#### ULN2803

我们已经在第九课接触过了L293D芯片，而ULN2803也是一个非常有用的芯片。

[![lesson10_10](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/7b28dd6acc_0d98b59a1ececf9d108f711e99da72a3.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/7b28dd6acc_0d98b59a1ececf9d108f711e99da72a3.png "Adafruit的树莓派教程第十课：步进电机")

不像L293D有4个输出引脚可以反转电极，ULN2803有8个输出引脚可以把来自树莓派GPIO的输出信号放大转换成更大的电流。

与L293D不同的是，ULN2803只能输出一个方向的电流，所以这里我们要用到步进电机的红色引脚作为公用正极。并且每次只会用到线圈的一半，如粉色和橙色的部分，每次只有红色和粉色部分的线圈才会通电。

[![lesson10_11](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6ed564c824_6c3a883a141922479ae9b5f4d4a39543.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/6ed564c824_6c3a883a141922479ae9b5f4d4a39543.png "Adafruit的树莓派教程第十课：步进电机")

#### 软件部分

不过你用L293D还是ULN2803，软件部分都是一样的。

这个项目会用到Rpi.GPIO类库，如果你还没有装过，请参考[第四课](http://www.geekfan.net/8972/ "Adafruit的树莓派教程第四课：GPIO配置")。

要安装软件，你可以通过[SSH连接到树莓派](http://www.geekfan.net/9128/ "Adafruit的树莓派教程第六课：使用SSH")上然后通过下面的命令打开一个编辑器：
    
    
    nano stepper.py

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

[![lesson10_12](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/a3d841c10c_c83f06bea4d07c2afec1854bc105a8a7.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/a3d841c10c_c83f06bea4d07c2afec1854bc105a8a7.png "Adafruit的树莓派教程第十课：步进电机")
    
    
    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BCM)
    
    enable_pin = 18
    coil_A_1_pin = 4
    coil_A_2_pin = 17
    coil_B_1_pin = 23
    coil_B_2_pin = 24
    
    GPIO.setup(enable_pin, GPIO.OUT)
    GPIO.setup(coil_A_1_pin, GPIO.OUT)
    GPIO.setup(coil_A_2_pin, GPIO.OUT)
    GPIO.setup(coil_B_1_pin, GPIO.OUT)
    GPIO.setup(coil_B_2_pin, GPIO.OUT)
    
    GPIO.output(enable_pin, 1)
    
    def forward(delay, steps):  
      for i in range(0, steps):
        setStep(1, 0, 1, 0)
        time.sleep(delay)
        setStep(0, 1, 1, 0)
        time.sleep(delay)
        setStep(0, 1, 0, 1)
        time.sleep(delay)
        setStep(1, 0, 0, 1)
        time.sleep(delay)
    
    def backwards(delay, steps):  
      for i in range(0, steps):
        setStep(1, 0, 0, 1)
        time.sleep(delay)
        setStep(0, 1, 0, 1)
        time.sleep(delay)
        setStep(0, 1, 1, 0)
        time.sleep(delay)
        setStep(1, 0, 1, 0)
        time.sleep(delay)
    
    def setStep(w1, w2, w3, w4):
      GPIO.output(coil_A_1_pin, w1)
      GPIO.output(coil_A_2_pin, w2)
      GPIO.output(coil_B_1_pin, w3)
      GPIO.output(coil_B_2_pin, w4)
    
    while True:
      delay = raw_input("Delay between steps (milliseconds)?")
      steps = raw_input("How many steps forward? ")
      forward(int(delay) / 1000.0, int(steps))
      steps = raw_input("How many steps backwards? ")
      backwards(int(delay) / 1000.0, int(steps))

当步进电机不转动的时候，它也是处于激活状态的并且保持它的位置。这会耗电。如果你不需要步进电机保持它的位置，你可以调用**setStep(0,0,0,0)** 来释放线圈。这样电机的转子就能自由转动并且不耗费电力了。

#### 配置与测试

这个程序需要超级用户权限，所以要在ssh里受用下面的命令：
    
    
    sudo python stepper.py

输入一个延时(5会是个合适的值)和转动的步数(512转一圈)。

[![lesson10_13](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5501a88ab8_dbbe0a8c2a49b709c495555eaf07d081.png)](https://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5501a88ab8_dbbe0a8c2a49b709c495555eaf07d081.png "Adafruit的树莓派教程第十课：步进电机")

尝试减少延时来找到电机的最大速度吧。

[Adafruit的树莓派教程第十课：步进电机](http://www.geekfan.net/9926/)，首发于[极客范 – GeekFan.net](http://www.geekfan.net)。
