Google+ Followers

Saturday, 11 January 2014

Stepper motors on the pi

Out playing with stepper motors today, using 28bjy-48 and a uln2003 board which I purchased off eBay a while back for about a pound each but had to wait for a month for them to arrive, obviously buying them from a uk company would have meant next day delivery but for about double and sometimes triple the price.

To make a stepper motor work it needs to be provided with a sequence of high and low signals to each of the four inputs in a correct sequence of high and low signals the motor will turn rotating the spindle, this motor can turn clockwise and also anti clockwise by reversing the sequence.

I cannot remember the coding I originally used, but Matt Hawkins over at raspberry-pi-spy has written an excellent short python script which is excellent to play with to get a good understanding of how a, the script works and b, the stepper motor works.

Thanks Matt for the following script:

# Name: Stepper Motor
# Author: matt.hawkins
# Created: 11/07/2012
# Copyright: (c) matt.hawkins 2012
#!/usr/bin/env python
# Import required libraries
import time
import RPi.GPIO as GPIO
# Use BCM GPIO references
# instead of physical pin numbers
# Define GPIO signals to use
# Pins 18,22,24,26
StepPins = [24,25,8,7]
# Set all pins as output
for pin in StepPins:
  print "Setup pins"
  GPIO.output(pin, False)
# Define some settings
StepCounter = 0
WaitTime = 0.5
# Define simple sequence
StepCount1 = 4
Seq1 = []
Seq1 = range(0, StepCount1)
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]
# Define advanced sequence
# as shown in manufacturers datasheet
StepCount2 = 8
Seq2 = []
Seq2 = range(0, StepCount2)
Seq2[0] = [1,0,0,0]
Seq2[1] = [1,1,0,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [0,1,1,0]
Seq2[4] = [0,0,1,0]
Seq2[5] = [0,0,1,1]
Seq2[6] = [0,0,0,1]
Seq2[7] = [1,0,0,1]
# Choose a sequence to use
Seq = Seq1
StepCount = StepCount1
# Start main loop
while 1==1:
  for pin in range(0, 4):
    xpin = StepPins[pin]
    if Seq[StepCounter][pin]!=0:
      print " Step %i Enable %i" %(StepCounter,xpin)
      GPIO.output(xpin, True)
      GPIO.output(xpin, False)
  StepCounter += 1
  # If we reach the end of the sequence
  # start again
  if (StepCounter==StepCount):
    StepCounter = 0
  if (StepCounter<0):
    StepCounter = StepCount
  # Wait before moving on

5v and gnd connections should be obvious while the other four go to pins 18, 22, 24, 26. (Ch1, ch2, ch3, ch4)