树莓派使用Python控制步进电机

  • 内容
  • 评论
  • 相关

步进电机和普通电机最大的不同是步进电机可以更加精确地旋转,这个特性使得它们在各种树莓派项目中得到广泛运用。

树莓派3B主板

步进电机选择

28byj-48-5v步进电机

市面上有很多步进电机可供选择,最后我们还是决定使用ULN2003控制板和28BJY-48电机。选择它的原因是:便宜、5V供电、易于连接树莓派的GPIO接口等等。28BJY-48步进电机的数据表中还有很多详细信息。

28BYJ48-12 datasheet

树莓派的连接

28BJY-48-Stepper-Motor

先将步进电机连接到控制板。控制板上有6个引脚,需要连接到Pi的GPIO接口上,连接如下:

  • 5V (P1-02)
  • GND (P1-06)
  • Inp1 (P1-11)
  • Inp2 (P1-15)
  • Inp3 (P1-16)
  • Inp4 (P1-18)

上面的P1-XX指的是本文中使用的树莓派的引脚号。这些定义在下面Python代码的StepPins列表中,因此如果使用不同的引脚,请确保更新Python列表。您可以使用其他GPIO 引脚,只是记住要更新Python的脚本。

要控制步进电机旋转,我们需要一系列“high” 和 “low” 电平,通过设置正确的高低电平顺序,电机就会旋转,颠倒顺序旋转方向也会相反。

Python控制步进电机的代码示例

代码使用RPi.GPIO库,定义了4步和8步序列。

#!/usr/bin/python
# Import required libraries
import sys
import time
import RPi.GPIO as GPIO
 
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
 
# Define GPIO signals to use
# Physical pins 11,15,16,18
# GPIO17,GPIO22,GPIO23,GPIO24
StepPins = [17,22,23,24]
 
# Set all pins as output
for pin in StepPins:
  print "Setup pins"
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin, False)
 
# Define advanced sequence
# as shown in manufacturers datasheet
Seq = [[1,0,0,1],
       [1,0,0,0],
       [1,1,0,0],
       [0,1,0,0],
       [0,1,1,0],
       [0,0,1,0],
       [0,0,1,1],
       [0,0,0,1]]
        
StepCount = len(Seq)
StepDir = 1 # Set to 1 or 2 for clockwise
            # Set to -1 or -2 for anti-clockwise
 
# Read wait time from command line
if len(sys.argv)>1:
  WaitTime = int(sys.argv[1])/float(1000)
else:
  WaitTime = 10/float(1000)
 
# Initialise variables
StepCounter = 0
 
# Start main loop
while True:
 
  print StepCounter,
  print Seq[StepCounter]
 
  for pin in range(0, 4):
    xpin = StepPins[pin]if Seq[StepCounter][pin]!=0:
      print " Enable GPIO %i" %(xpin)
      GPIO.output(xpin, True)
    else:
      GPIO.output(xpin, False)
 
  StepCounter += StepDir
 
  # If we reach the end of the sequence
  # start again
  if (StepCounter>=StepCount):
    StepCounter = 0
  if (StepCounter<0):
    StepCounter = StepCount+StepDir
 
  # Wait before moving on
  time.sleep(WaitTime)

代码保存为“stepper.py”,然后使用“sudo”来运行:

sudo python stepper.py

按Ctrl-C退出。

step等待时间

在本例中,默认等待时间设置为0.01秒(10毫秒)。要改变旋转速度,你可以改变这个值。我发现我可以在电机停止工作之前将它减少到4ms。如果脚本运行得太快,电机控制器就跟不上了。这种性能可能取决于你的电机和它的控制器。要指定不同的等待时间,可以使用以下方法:

sudo python stepper.py 20

其中20是毫秒数。

步幅

完整的步幅由8个步幅组成。如果将StepDir设置为-2或2,则步幅数会减少到4。4步步幅速度更快,但扭矩更低。8步步幅速度更慢,但扭矩更高。

现在我们可以使用树莓派和Python脚本来控制步进电机了。如果再加上一个小马达,一个小型机器人的雏形就出现了!