Here is a small example of using the arduino/wiring platform to control things in the real world.
A pretty good reference for the controlling stepper motors can be found at.
http://en.nanotec.com/steppermotor_animation.html
The following Circuit fleshes out the sketch at the site above.
And finally here is the sketch to make it go.
/* Rapha Roller Race Controller.
* The Rapha Roller Race Controller is for a 4 bike 500 meter race The bikes are on rollers which
* produce pulses. The pulses are used to drive a dial per bicycle which is controlled by
* a unipolar stepper motor, the dials are geared such that two pulses two each one
* motor half "step" results in 500 meters per complete revolution.
*
* This program uses wirings External Interrupt Mechanism. The program loop is used to
* watch the control panel and move the dials to a starting position.
*
* NOTE: RABBID PROTOTYPE! This was done in a very make it work NOW mode.
* I am certain there are more elegant solutions.
*
* Author Donald Delmar Davis, Tempus Dictum Inc.
*/
#define NMOTORS 4
#define NPINS 4
#define NSTATES 8
#define HALFSTEP 1
#define FULLSTEP 0
#define FORWARDSTEP 1
#define BACKWARDSTEP 0
/*------------------------------------------------------------------------------------
* Pin Mapping
*/
#define SWITCH1PIN 34
#define SWITCH2PIN 35
#define SWITCH3APIN 49
#define SWITCH3BPIN 50
#define LEDPIN 48
#define BIKE1 36
#define BIKE2 37
#define BIKE3 38
#define BIKE4 39
int motorPins[NMOTORS][NPINS]= {
{ 11, 9, 10, 8 } , // ccw is forward
{ 15, 13, 14, 12 },
{ 20, 22, 21, 23 },
{ 16, 18, 17, 19 },
// { 8, 10, 9, 11}, // cw is forward
// {12, 14, 13, 15},
// {23, 21, 22, 20},
// {19, 17, 18, 16},
};
int pulsesPerStep=2;
volatile int pulseCount[4]={0,0,0,0};
volatile int pulseMod[4]={2,2,2,2};
int ledState = HIGH;
int switchState=LOW;
int delayTime = 10;
int motorState [NMOTORS] = {0,0,0,0};
int pinStates[NSTATES][NPINS]= {
{ HIGH,LOW ,LOW ,LOW } ,
{ HIGH,HIGH,LOW ,LOW },
{ LOW ,HIGH,LOW ,LOW },
{ LOW ,HIGH,HIGH,LOW },
{ LOW ,LOW ,HIGH,LOW },
{ LOW ,LOW ,HIGH,HIGH },
{ LOW ,LOW ,LOW ,HIGH },
{ HIGH,LOW ,LOW ,HIGH }
};
/* -------
*/
void stepit (int motorNum, int stepDir, int stepSize) {
int stateSkip=2;
int pin;
if (stepSize==HALFSTEP) stateSkip=1;
if (stepDir==FORWARDSTEP) {
motorState[motorNum] += stateSkip;
if (motorState[motorNum] >= NSTATES) {
motorState[motorNum]=0;
}
}
else {
if (motorState[motorNum] < stateSkip){
motorState[motorNum] = NSTATES-1;
}
else {
motorState[motorNum] -= stateSkip ;
}
}
for (pin=0 ; pin < NPINS ; pin++) {
digitalWrite(motorPins[motorNum][pin], pinStates[motorState[motorNum]][pin]);
}
}
/*---------------------------------------------------------------------------------setup()
*
*
*
*/
void setup() {
int motor;
int pin;
for (motor=0;motor<NMOTORS; motor++){
for (pin=0; pin<NPINS; pin++){
pinMode(motorPins[motor][pin],OUTPUT);
digitalWrite(motorPins[motor][pin],pinStates[motorState[motor]][pin]);
}
}
pinMode(LEDPIN,OUTPUT);
pinMode(BIKE1,INPUT);
pinMode(BIKE2,INPUT);
pinMode(BIKE3,INPUT);
pinMode(BIKE4,INPUT);
pinMode(SWITCH1PIN,INPUT);
pinMode(SWITCH2PIN,INPUT);
pinMode(SWITCH3APIN,INPUT);
pinMode(SWITCH3BPIN,INPUT);
attachInterrupt(4, bike1, RISING); //
attachInterrupt(5, bike2, RISING); //
attachInterrupt(6, bike3, RISING); //
attachInterrupt(7, bike4, RISING); //
// Serial.begin(9600); // Starts Serial to print data
}
/*-----------------------------------------------------------------------------------------
************************************* Interrupt Handlers *********************************
*/
/*----------------------------------------------------------------------------------bike1()
*/
void bike1() {
//Serial.print("bike1 ");
++pulseCount[0];
if ((--pulseMod[0]) == 0 ){
stepit(0,FORWARDSTEP,HALFSTEP);
pulseMod[0]=pulsesPerStep;
}
}
/*-----------------------------------------------------------------------------------------
*/
void bike2() {
//Serial.print("bike2 ");
++pulseCount[1];
if ((--pulseMod[1]) == 0 ){
stepit(1,FORWARDSTEP,HALFSTEP);
pulseMod[1]=pulsesPerStep;
}
}
/*-----------------------------------------------------------------------------------------
*/
void bike3() {
//Serial.print("bike3 ");
++pulseCount[2];
if ((--pulseMod[2]) == 0 ){
stepit(2,FORWARDSTEP,HALFSTEP);
pulseMod[2]=pulsesPerStep;
}
}
/*-----------------------------------------------------------------------------------------
*/
void bike4() {
//Serial.print("bike4 ");
++pulseCount[3];
if ((--pulseMod[3]) == 0 ){
stepit(3,FORWARDSTEP,HALFSTEP);
pulseMod[3]=pulsesPerStep;
}
}
/*-----------------------------------------------------------------------------------------
************************************* Main Loop ******************************************
*---------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------
*
*/
void loop() {
int currentMotor;
currentMotor=(digitalRead(SWITCH1PIN)*2)+digitalRead(SWITCH2PIN) ;
switchState=digitalRead(SWITCH3BPIN);
if (switchState==HIGH) {
stepit(currentMotor,FORWARDSTEP,HALFSTEP);
}
switchState=digitalRead(SWITCH3APIN);
if (switchState==HIGH) {
stepit(currentMotor,BACKWARDSTEP,HALFSTEP);
}
ledState=!ledState;
digitalWrite(LEDPIN,ledState);
delay(delayTime);
}