#include // interupt variables volatile int state = LOW; byte inval = 0; // feeder location variables long feederArray[16]={ 0, -104.1666666667, -208.3333333333, -312.5, -416.6666666667, -520.8333333333, -625, -729.1666666667, -833.3333333333, -937.5, -1041.6666666667, -1145.8333333333, -1250, -1354.1666666667, -1458.3333333333, -1562.5}; long xcurrentpos = 0; int currentFeeder = 0; int previousFeeder = 0; int sensorValue = 0; int zHeight = -700; //-5600; // Arduino pins #define dirZPin 10 #define stepZPin 11 #define stopZPin A1 #define dirXPin 12 #define stepXPin 13 #define stopXPin A0 #define pickComplete 8 AccelStepper stepperZ(1,stepZPin,dirZPin); AccelStepper stepperY(1,stepXPin,dirXPin); void setup() { // configure interupt attachInterrupt(0, interupt, RISING); pinMode(pickComplete, OUTPUT); // configure stepper drivers pinMode(dirZPin, OUTPUT); pinMode(stepZPin, OUTPUT); pinMode(dirXPin, OUTPUT); pinMode(stepXPin, OUTPUT); stepperZ.setMaxSpeed(20000); stepperZ.setAcceleration(25000); stepperY.setMaxSpeed(15000); stepperY.setAcceleration(25000); stepperZ.setCurrentPosition(0); stepperY.setCurrentPosition(0); while (!ZeroZ()); while (!ZeroX()); } void loop() { if (state == HIGH) { digitalWrite(pickComplete, HIGH); inval = (digitalRead (3) << 4) |(digitalRead (4) << 3) |(digitalRead (5) << 2) | (digitalRead (6) << 1) | (digitalRead (7)); // check inval and select component switch(inval){ case 0: calcXPosition(0); break; case 1: calcXPosition(1); break; case 2: calcXPosition(2); break; case 3: calcXPosition(3); break; case 4: calcXPosition(4); break; case 5: calcXPosition(5); break; case 6: calcXPosition(6); break; case 7: calcXPosition(7); break; case 8: calcXPosition(8); break; case 9: calcXPosition(9); break; case 10: calcXPosition(10); break; case 11: calcXPosition(11); break; case 12: calcXPosition(12); break; case 13: calcXPosition(13); break; case 14: calcXPosition(14); break; case 15: calcXPosition(15); break; case 31: while (!ZeroZ()); while (!ZeroX()); stepperZ.setCurrentPosition(0); stepperY.setCurrentPosition(0); break; } state = LOW; digitalWrite(pickComplete, LOW); } } void interupt() { // interupt trigered state = HIGH; } boolean ZeroZ() { digitalWrite(dirZPin, HIGH); sensorValue = analogRead(stopZPin); // Serial.println(sensorValue); while (sensorValue >= 100) { digitalWrite(stepZPin, HIGH); delayMicroseconds(50); digitalWrite(stepZPin, LOW); delayMicroseconds(4000); sensorValue = analogRead(stopZPin); } delayMicroseconds(250); sensorValue = 500; return true; } boolean ZeroX() { digitalWrite(dirXPin, LOW); sensorValue = analogRead(stopXPin); while (sensorValue <= 200) { digitalWrite(stepXPin, HIGH); delayMicroseconds(50); digitalWrite(stepXPin, LOW); delayMicroseconds(4000); sensorValue = analogRead(stopXPin); } delayMicroseconds(250); sensorValue = 0; return true; } void calcXPosition(int feeder){ stepperZ.runToNewPosition(0); if (currentFeeder == feeder){ stepperZ.runToNewPosition(zHeight); } else{ long travel = feederArray[feeder]; travel = travel *-1; stepperY.runToNewPosition(travel); stepperZ.runToNewPosition(zHeight); xcurrentpos = feederArray[feeder]; } previousFeeder = currentFeeder; currentFeeder = feeder; }