Tri Duino Stepper
Release status: unknown
Description | Unipolar 3 Stepper driver with an Arduino
|
License | |
Author | |
Contributors | |
Based-on | |
Categories | |
CAD Models | |
External Link |
This is a stepper driver using an ATMEGA168 for three steppers.
I takes step and direction for your gcode interpreter (in this case another ATMEGA168 running 5-D on Arduino)and drives three stepper motors accordingly.
(The code is crude and simplistic but I have not been programing long & it DOES work) There are no libraries needed to run this It really is just as simple as it seems.
CODE...
////////////////////////////////////////////////////////////////////////////// /* // TriStepduino
// Arduino stepper board using ULN2803 // created: 10/18/10 // // By: // Glasshopper // // Known bugs: // None found yet // // Want to add: // done, change port reads to use port byte, this will alow precise timming // done, allow reset and enable to use the external interupts (pins 2 &3) // micro stepping (would need 3 more inputs used: Ms1, Ms2, Ms3 ?) // change defines for steps and speed so they are in eeprom and can be changed via serial // sleep mode when reset? // */
//////////////////////////////////////////////////////////////////////////////
- define version '0.0.1a' // the very first
- define DEBUG 0 // not used yet
- define SER_CLK 19200 // serial baud rate
- define ENABLE_PIN 3 // master pin
- define RESET_PIN 2 // reset pin
- define X_SPEED 5 // x motor speed (higher = slower)
- define X_STEPS 100 // x number of steps on your motor
- define Y_SPEED 5 // y motor speed (higher = slower)
- define Y_STEPS 100 // y number of steps on your motor
- define Z_SPEED 5 // z motor speed (higher = slower)
- define Z_STEPS 100 // z number of steps on your motor
- define DIR_Z_PIN 19 // z direction pin
- define STEP_Z_PIN 18 // z step pin
- define DIR_Y_PIN 17 // y direction pin
- define STEP_Y_PIN 16 // y step pin
- define DIR_X_PIN 15 // x direction pin
- define STEP_X_PIN 14 // x step pin
- define X_PIN4 13 // x motor pin 4
- define X_PIN3 12 // x motor pin 3
- define X_PIN2 11 // x motor pin 2
- define X_PIN1 10 // x motor pin 1
- define Y_PIN4 9 // y motor pin 4
- define Y_PIN3 6 // y motor pin 3
- define Y_PIN2 7 // y motor pin 2
- define Y_PIN1 8 // y motor pin 1
- define Z_PIN4 0 // z motor pin 4
- define Z_PIN3 1 // z motor pin 3
- define Z_PIN2 4 // z motor pin 2
- define Z_PIN1 5 // z motor pin 1
////////////////////////////////////////////////////////////////////////////// // Global variables byte checkPort = B00000000; // byte to hold pinc value boolean ena = HIGH; // enable bit, active low boolean Xstp = LOW; // x step strobe bit boolean Xdir = LOW; // x step direction bit boolean Ystp = LOW; // x step strobe bit boolean Ydir = LOW; // x step direction bit boolean Zstp = LOW; // x step strobe bit boolean Zdir = LOW; // x step direction bit
////////////////////////////////////////////////////////////////////////////// void setup() {
// Serial.begin(SER_CLK); // open serial port
pinMode(ENABLE_PIN, INPUT); // declare enable pin as input ** ACTIVE LOW ** digitalWrite(ENABLE_PIN, HIGH); // turn on internal pullup resistor
pinMode(DIR_X_PIN, INPUT); // declare x direction pin as input pinMode(STEP_X_PIN, INPUT); // declare x step pin as input pinMode(DIR_Y_PIN, INPUT); // declare y direction pin as input pinMode(STEP_Y_PIN, INPUT); // declare y step pin as input pinMode(DIR_Z_PIN, INPUT); // declare z direction pin as input pinMode(STEP_Z_PIN, INPUT); // declare z step pin as input
pinMode(X_PIN1, OUTPUT); // declare x1 pin as output pinMode(X_PIN2, OUTPUT); // declare x2 pin as output pinMode(X_PIN3, OUTPUT); // declare x3 pin as output pinMode(X_PIN4, OUTPUT); // declare x4 pin as output pinMode(Y_PIN1, OUTPUT); // declare y1 pin as output pinMode(Y_PIN2, OUTPUT); // declare y2 pin as output pinMode(Y_PIN3, OUTPUT); // declare y3 pin as output pinMode(Y_PIN4, OUTPUT); // declare y4 pin as output pinMode(Z_PIN1, OUTPUT); // declare z1 pin as output pinMode(Z_PIN2, OUTPUT); // declare z2 pin as output pinMode(Z_PIN3, OUTPUT); // declare z3 pin as output pinMode(Z_PIN4, OUTPUT); // declare z4 pin as output
attachInterrupt(0, reset, CHANGE); // interrupt 0 digital pin 2 attachInterrupt(1, enableSteps, CHANGE); // interrupt 1 digital pin 3
}
////////////////////////////////////////////////////////////////////////////// void loop(){
checkPins(); if (!ena) { // is the enable bit low? if (Xstp) { // is the step bit set? if (Xdir) full_Ccw('X'); // is the direction bit set? then full step counterclockwise else full_Cw('X'); // nope, go a full step clockwise // Xstp = 0; // seems redundant & unneccesary? // Xdir = 0; // " } if (Ystp) { // is the step bit set? if (Ydir) full_Ccw('Y'); // is the direction bit set? then full step counterclockwise else full_Cw('Y'); // nope, go a full step clockwise // Ystp = 0; // Ydir = 0; } if (Zstp) { // is the step bit set? if (Zdir) full_Ccw('Z'); // is the direction bit set? then full step counterclockwise else full_Cw('Z'); // nope, go a full step clockwise // Zstp = 0; // Zdir = 0; } } else reset();
}
////////////////////////////////////////////////////////////////////////////// // can't use delay(x) or any timers in IRQ routine void enableSteps() { // this is an interupt routhing when the input pin changes state
ena = digitalRead(ENABLE_PIN); // Read enablepin **active Low** // ena = bitRead(PIND, 3); // read port d pin 3 input register (pin D03) **active Low** if(ena) reset();
}
////////////////////////////////////////////////////////////////////////////// void reset() {
byte motorPin1, motorPin2, motorPin3, motorPin4; motorPin1 = X_PIN1; motorPin2 = X_PIN2; motorPin3 = X_PIN3; motorPin4 = X_PIN4; digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); motorPin1 = Y_PIN1; motorPin2 = Y_PIN2; motorPin3 = Y_PIN3; motorPin4 = Y_PIN4; digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); motorPin1 = Z_PIN1; motorPin2 = Z_PIN2; motorPin3 = Z_PIN3; motorPin4 = Z_PIN4; digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW);
}
////////////////////////////////////////////////////////////////////////////// void checkPins() {
enableSteps(); checkPort = PINC; // port c input register Xstp = bitRead(checkPort, 0); // if the step line is high set the step bit Xdir = bitRead(checkPort, 1); // if the direction line is high set the direction bit Ystp = bitRead(checkPort, 2); // if the step line is high set the step bit Ydir = bitRead(checkPort, 3); // if the direction line is high set the direction bit Zstp = bitRead(checkPort, 4); // if the step line is high set the step bit Zdir = bitRead(checkPort, 5); // if the direction line is high set the direction bit
}
////////////////////////////////////////////////////////////////////////////// void full_Ccw(char motor) { // one full step clockwise
byte motorPin1, motorPin2, motorPin3, motorPin4, motorSpeed;
switch (motor) { case 'X': motorSpeed = X_SPEED; motorPin1 = X_PIN1; motorPin2 = X_PIN2; motorPin3 = X_PIN3; motorPin4 = X_PIN4; break; case 'Y': motorSpeed = Y_SPEED; motorPin1 = Y_PIN1; motorPin2 = Y_PIN2; motorPin3 = Y_PIN3; motorPin4 = Y_PIN4; break; case 'Z': motorSpeed = Z_SPEED; motorPin1 = Z_PIN1; motorPin2 = Z_PIN2; motorPin3 = Z_PIN3; motorPin4 = Z_PIN4; break; // default: }
// 1010 digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(motorSpeed); // 0110 digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay (motorSpeed); // 0101 digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(motorSpeed); // 1001 digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(motorSpeed);
}
////////////////////////////////////////////////////////////////////////////// void full_Cw(char motor) { // one full step counterclockwise
byte motorPin1, motorPin2, motorPin3, motorPin4, motorSpeed;
switch (motor) { case 'X': motorSpeed = X_SPEED; motorPin1 = X_PIN1; motorPin2 = X_PIN2; motorPin3 = X_PIN3; motorPin4 = X_PIN4; break; case 'Y': motorSpeed = Y_SPEED; motorPin1 = Y_PIN1; motorPin2 = Y_PIN2; motorPin3 = Y_PIN3; motorPin4 = Y_PIN4; break; case 'Z': motorSpeed = Z_SPEED; motorPin1 = Z_PIN1; motorPin2 = Z_PIN2; motorPin3 = Z_PIN3; motorPin4 = Z_PIN4; break; // default: }
// 0101 digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(motorSpeed); // 0110 digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay (motorSpeed); // 1010 digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(motorSpeed); // 1001 digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(motorSpeed);
}
//////////////////////////////////////////////////////////////////////////////