Skip to content

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

lesson10 1

概览

步进电机介于常规的直流电机(第九课)和伺服马达(第八课)之间。步进电机的优点在于它能够被精确定位,正向或反向一次性转动”一步”,并且也能够连续转动。

lesson10_1

这节课里,你将学到如何使用树莓派以及在第九课里已经用到的L239D马达控制芯片来控制一个步进电机。

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

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

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

你需要的:

5V步进电机

lesson10_2

L293D芯片

lesson10_3

ULN2803

lesson10_4

小块面包板

lesson10_5

树莓派

一把跳线

lesson10_6

硬件部分(L293D)

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

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

lesson10_7

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

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

硬件部分(ULN2803)

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

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

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

lesson10_8

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

步进电机

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

lesson10_9

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

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

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

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

ULN2803

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

lesson10_10

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

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

lesson10_11

软件部分

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

这个项目会用到Rpi.GPIO类库,如果你还没有装过,请参考第四课

要安装软件,你可以通过SSH连接到树莓派上然后通过下面的命令打开一个编辑器:

nano stepper.py

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

lesson10_12

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

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

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

[…] Lesson 10: 控制步进电机 […]

1
0
Would love your thoughts, please comment.x
()
x