步进电机和普通电机最大的不同是步进电机可以更加精确地旋转,这个特性使得它们在各种树莓派项目中得到广泛运用。
步进电机选择
市面上有很多步进电机可供选择,最后我们还是决定使用ULN2003控制板和28BJY-48电机。选择它的原因是:便宜、5V供电、易于连接树莓派的GPIO接口等等。28BJY-48步进电机的数据表中还有很多详细信息。
树莓派的连接
先将步进电机连接到控制板。控制板上有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脚本来控制步进电机了。如果再加上一个小马达,一个小型机器人的雏形就出现了!