5 motor
#include <PID_v1.h> #include <AccelStepper.h> #define motorInterfaceType 1 struct flowData{ int bfl; int dir; }; //Define the aggressive and conservative Tuning Parameters double aggKpA=150, aggKiA=0.5, aggKdA=0; int thermoelectricval = 255; int celsius; int levelstreamon; double settemp = 0; double Setpoint, Input, Output, OutputA, OutputB, OutputC; int tme = 250; int directionA = 0; int directionB = 0; int directionC = 0; int directionD = 0; int ton = 0; int buttonastate = 0; int buttonbstate = 0; int buttoncstate = 0; int buttondstate = 0; int afl = 0; int bfl = 0; int cfl = 0; int dfl = 0; String command; long int currpos; long int pos; //Specify the links and initial tuning parameters PID myPIDA(&Input, &Output, &Setpoint, aggKpA, aggKiA, aggKdA, DIRECT); #define THERMISTOR_PINA A0 #define TEMPCONTROLA 13 #define PUMP 12 int PS[] = {26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 45, 47, 49}; // Define some steppers and the pins the will use const int enablePinA = PS[0]; const int directionPinA = PS[1]; const int stepsPinA = PS[2]; const int enablePinB = PS[3]; const int directionPinB = PS[4]; const int stepsPinB = PS[5]; const int enablePinC = PS[6]; const int directionPinC = PS[7]; const int stepsPinC = PS[8]; const int enablePinD = PS[9]; const int directionPinD = PS[10]; const int stepsPinD = PS[11]; //const int speedpotA = A1; //const int gobuttonA = A2; //const int stopbuttonA = A3; const int speedpotA = A4; const int gobuttonA = A5; const int stopbuttonA = A6; const int stepspinA = LOW; const int speedpotB = A7; const int gobuttonB = A8; const int stopbuttonB = A9; const int stepspinB = LOW; const int speedpotC = A10; const int gobuttonC = A11; const int stopbuttonC = A12; const int stepspinC = LOW; const int speedpotD = A13; const int gobuttonD = A14; const int stopbuttonD = A15; const int stepspinD = LOW; AccelStepper stepperA = AccelStepper(motorInterfaceType, stepsPinA, directionPinA); AccelStepper stepperB = AccelStepper(motorInterfaceType, stepsPinB, directionPinB); AccelStepper stepperC = AccelStepper(motorInterfaceType, stepsPinC, directionPinC); AccelStepper stepperD = AccelStepper(motorInterfaceType, stepsPinD, directionPinD); void setup() { Serial.begin(115200); pinMode(stepsPinA, OUTPUT); pinMode(directionPinA, OUTPUT); pinMode(enablePinA, OUTPUT); pinMode(stepsPinB, OUTPUT); pinMode(directionPinB, OUTPUT); pinMode(enablePinB, OUTPUT); pinMode(stepsPinC, OUTPUT); pinMode(directionPinC, OUTPUT); pinMode(enablePinC, OUTPUT); pinMode(stepsPinD, OUTPUT); pinMode(directionPinD, OUTPUT); pinMode(enablePinD, OUTPUT); pinMode(TEMPCONTROLA, OUTPUT); pinMode(PUMP, OUTPUT); digitalWrite(enablePinA,HIGH); digitalWrite(enablePinB,HIGH); digitalWrite(enablePinC,HIGH); digitalWrite(enablePinD,HIGH); digitalWrite(directionPinA, LOW); digitalWrite(directionPinB, LOW); digitalWrite(directionPinC, LOW); digitalWrite(directionPinD, LOW); digitalWrite(PUMP,LOW); stepperA.setMaxSpeed(1000*16); stepperB.setMaxSpeed(1000*16); stepperC.setMaxSpeed(1000*16); stepperD.setMaxSpeed(1000*16); //turn the PID on myPIDA.SetMode(AUTOMATIC); } void loop(){ int speedA = map(analogRead(speedpotA), 0, 1023, 1, 2000); int speedB = map(analogRead(speedpotB), 0, 1023, 1, 2000); int speedC = map(analogRead(speedpotC), 0, 1023, 1, 2000); int speedD = map(analogRead(speedpotD), 0, 1023, 1, 2000); Input = read_temp("A"); double gap = abs(Setpoint-Input); //distance away from setpoint myPIDA.SetTunings(aggKpA, aggKiA, aggKdA); myPIDA.Compute(); analogWrite(TEMPCONTROLA,Output); int rawvalue = analogRead(THERMISTOR_PINA); int rawvalueA = rawvalue; float celsiusA = read_temp("A"); if (levelstreamon == 1) { Serial.print("A: "); Serial.print(rawvalueA); Serial.print(" "); Serial.println(celsiusA); Serial.print("Settemp: "); Serial.println(settemp); delay(500); } /* Serial.print("A go "); Serial.println(digitalRead(gobuttonA)); Serial.print("A stop "); Serial.println(digitalRead(stopbuttonA)); Serial.print("B go "); Serial.println(digitalRead(gobuttonB)); Serial.print("B stop "); Serial.println(digitalRead(stopbuttonB)); Serial.print("C go "); Serial.println(digitalRead(gobuttonC)); Serial.print("C stop "); Serial.println(digitalRead(stopbuttonC)); Serial.print("D go "); Serial.println(digitalRead(gobuttonD)); Serial.print("D stop "); Serial.println(digitalRead(stopbuttonD)); Serial.println(""); delay(500); */ flowData A = {bfl, directionA}; flowData *AA = &A; flowData AAA = motorStop(stopbuttonA, enablePinA, directionPinA, AA); directionA = AAA.dir; motorMove(gobuttonA, enablePinA); flowData B = {bfl, directionB}; flowData *BB = &B; flowData BBB = motorStop(stopbuttonB, enablePinB, directionPinB, BB); directionB = BBB.dir; motorMove(gobuttonB, enablePinB); flowData C = {bfl, directionC}; flowData *CC = &C; flowData CCC = motorStop(stopbuttonC, enablePinC, directionPinC, CC); directionC = CCC.dir; motorMove(gobuttonC, enablePinC); flowData D = {bfl, directionD}; flowData *DD = &D; flowData DDD = motorStop(stopbuttonD, enablePinD, directionPinD, DD); directionD = DDD.dir; motorMove(gobuttonD, enablePinD); if (A.dir == 1) {stepperA.setSpeed(speedA);}else{stepperA.setSpeed(-speedA);} if (B.dir == 1) {stepperB.setSpeed(speedB);}else{stepperB.setSpeed(-speedB);} if (C.dir == 1) {stepperC.setSpeed(speedC);}else{stepperC.setSpeed(-speedC);} if (D.dir == 1) {stepperD.setSpeed(speedD);}else{stepperD.setSpeed(-speedD);} stepperD.runSpeed(); stepperC.runSpeed(); stepperB.runSpeed(); stepperA.runSpeed(); if(Serial.available()){ char c = Serial.read(); if (c== '\n'){ currpos = parseCommand(command, currpos); command = ""; } else{ command +=c; } } } void motorMove(int gobutton, int enablePin){ if (digitalRead(gobutton) == 1){ digitalWrite(enablePin, LOW); Serial.print("move "); Serial.println(gobutton); } } flowData motorStop(int stopbutton, int enablePin, int directionPin, flowData *X){ if (digitalRead(stopbutton) ==HIGH){ digitalWrite(enablePin, HIGH); if (X->bfl == 0){ if (X->dir==0){X->dir = 1; digitalWrite(directionPin, HIGH); }else{X->dir=0; digitalWrite(directionPin, LOW);} X->bfl = 1; } } else { X->bfl = 0; } Serial.print("stop "); Serial.println(stopbutton); return *X; } long int parseCommand(String com, long int currpos){ //Serial.print("Your command: "); //Serial.println(com); if(com.equalsIgnoreCase("readpot")){ readpotentionmetersanity(); } else if(com.equalsIgnoreCase("pumpon")){ digitalWrite(PUMP,HIGH); } else if(com.equalsIgnoreCase("pumpoff")){ digitalWrite(PUMP,LOW); } else if(com.equalsIgnoreCase("info")){ Serial.println("Extruder spool speed controller"); } else if (com.substring(0,7) == "settemp") { settemp = com.substring(8).toDouble(); Setpoint = settemp; Serial.print("settemp: "); Serial.println(settemp); } else if(com.equalsIgnoreCase("levelstreamoff")){ levelstreamon = 0; } else if(com.equalsIgnoreCase("levelstreamon")){ levelstreamon = 1; } else if(com.equalsIgnoreCase("readlevel")){ int rawvalue = analogRead(THERMISTOR_PINA); float celsius = read_temp("A"); Serial.print("A: "); Serial.println(celsius); } else { Serial.print("Did not recognize "); Serial.println(com); } return currpos; } int readpotentionmetersanity(){ int val = analogRead(speedpotA); Serial.print("speed pinA: "); Serial.println(val); val = analogRead(speedpotB); Serial.print("speed pinB: "); Serial.println(val); val = analogRead(speedpotC); Serial.print("speed pinC: "); Serial.println(val); val = analogRead(speedpotD); Serial.print("speed pinD: "); Serial.println(val); } #define NUMTEMPS 20 short temptable[NUMTEMPS][2] = { {1, 841}, {54, 255}, {107, 209}, {160, 184}, {213, 166}, {266, 153}, {319, 142}, {372, 132}, {425, 124}, {478, 116}, {531, 108}, {584, 101}, {637, 93}, {690, 86}, {743, 78}, {796, 70}, {849, 61}, {902, 50}, {955, 34}, {1008, 3} }; float read_temp(String sensor_type) { int THERMISTOR_PIN = 0; if (sensor_type == "A"){ THERMISTOR_PIN = THERMISTOR_PINA; } int rawtemp = analogRead(THERMISTOR_PIN); float current_celsius = 0; byte i; for (i=1; i<NUMTEMPS; i++) { if (temptable[i][0] > rawtemp) { float realtemp = temptable[i-1][1] + (rawtemp - temptable[i-1][0]) * (temptable[i][1] - temptable[i-1][1]) / (temptable[i][0] - temptable[i-1][0]); if (realtemp > 255) realtemp = 255; current_celsius = realtemp; break; } } // Overflow: We just clamp to 0 degrees celsius if (i == NUMTEMPS) current_celsius = 0; return current_celsius; }
#include <PID_v1.h> #include <AccelStepper.h> #define motorInterfaceType 1 //Define the aggressive and conservative Tuning Parameters double aggKpA=150, aggKiA=0.5, aggKdA=0; int thermoelectricval = 255; int celsius; int levelstreamon; double settemp = 0; double Setpoint, Input, Output, OutputA, OutputB, OutputC; int tme = 250; int directionA = 0; int directionB = 0; int directionC = 0; int ton = 0; int buttonastate = 0; int buttonbstate = 0; int buttoncstate = 0; int afl = 0; int bfl = 0; int cfl = 0; String command; long int currpos; long int pos; int goA, goB, goC; //Specify the links and initial tuning parameters PID myPIDA(&Input, &OutputA, &Setpoint, aggKpA, aggKiA, aggKdA, DIRECT); #define THERMISTOR_PINA A11 #define TEMPCONTROLA 10 // Define some steppers and the pins the will use const int stepsPinA = 11; const int directionPinA = 12; const int enablePinA = 2; const int stepsPinB = 3; const int directionPinB = 4; const int enablePinB = 5; const int stepsPinC = 7; const int directionPinC = 8; const int enablePinC = 9; const int gobuttonA = A0; const int stopbuttonA = A1; const int speedpotA = A2; const int stepspinA = LOW; const int gobuttonB = A5; const int stopbuttonB = A6; const int speedpotB = A3; const int stepspinB = LOW; const int gobuttonC = A7; const int stopbuttonC = A8; const int speedpotC = A4; const int stepspinC = LOW; AccelStepper stepperA = AccelStepper(motorInterfaceType, stepsPinA, directionPinA); AccelStepper stepperB = AccelStepper(motorInterfaceType, stepsPinB, directionPinB); AccelStepper stepperC = AccelStepper(motorInterfaceType, stepsPinC, directionPinC); void setup() { Serial.begin(115200); pinMode(stepsPinA, OUTPUT); pinMode(directionPinA, OUTPUT); pinMode(enablePinA, OUTPUT); pinMode(stepsPinB, OUTPUT); pinMode(directionPinB, OUTPUT); pinMode(enablePinB, OUTPUT); pinMode(stepsPinC, OUTPUT); pinMode(directionPinC, OUTPUT); pinMode(enablePinC, OUTPUT); pinMode(TEMPCONTROLA, OUTPUT); digitalWrite(enablePinA,HIGH); digitalWrite(enablePinB,HIGH); digitalWrite(enablePinC,HIGH); digitalWrite(directionPinA, LOW); digitalWrite(directionPinB, LOW); digitalWrite(directionPinC, LOW); stepperA.setMaxSpeed(1000*16); stepperB.setMaxSpeed(1000*16); stepperC.setMaxSpeed(1000*16); //turn the PID on myPIDA.SetMode(AUTOMATIC); } void loop(){ int speedA = map(analogRead(speedpotA), 0, 1023, 1, 2000); int speedB = map(analogRead(speedpotB), 0, 1023, 1, 2000); int speedC = map(analogRead(speedpotC), 0, 1023, 1, 2000); Input = read_temp("A"); double gap = abs(Setpoint-Input); //distance away from setpoint myPIDA.SetTunings(aggKpA, aggKiA, aggKdA); myPIDA.Compute(); Serial.print("outputA "); Serial.println(OutputA); analogWrite(TEMPCONTROLA,OutputA); int rawvalue = analogRead(THERMISTOR_PINA); int rawvalueA = rawvalue; float celsiusA = read_temp("A"); if (levelstreamon == 1) { Serial.print("A: "); Serial.print(rawvalueA); Serial.print(" "); Serial.println(celsiusA); Serial.print("Settemp: "); Serial.println(settemp); delay(500); } if (digitalRead(stopbuttonA) ==HIGH){ digitalWrite(enablePinA, HIGH); goA = 0; if (bfl == 0){ if (directionA==0){directionA = 1; digitalWrite(directionPinA, HIGH); }else{directionA=0; digitalWrite(directionPinA, LOW);} Serial.print(directionA); Serial.println(" direction changed"); bfl = 1; } } else { bfl = 0; } if (digitalRead(gobuttonA) == 1){ digitalWrite(enablePinA, LOW); Serial.println("moving A"); goA = 1; } if (digitalRead(stopbuttonB) ==HIGH){ digitalWrite(enablePinB, HIGH); goA = 0; if (bfl == 0){ if (directionB==0){directionB = 1; digitalWrite(directionPinB, HIGH); }else{directionB=0; digitalWrite(directionPinB, LOW);} Serial.print(directionB); Serial.println(" direction changed"); bfl = 1; } } else { bfl = 0; } if (digitalRead(gobuttonB) == 1){ digitalWrite(enablePinB, LOW); Serial.println("moving A"); goA = 1; } if (digitalRead(stopbuttonC) ==HIGH){ goC = 0; digitalWrite(enablePinC, HIGH); if (cfl == 0){ if (directionC==0){directionC = 1; digitalWrite(directionPinC, HIGH); }else{directionC=0; digitalWrite(directionPinC, LOW);} Serial.print(directionC); Serial.println(" direction changed"); cfl = 1; } } else { cfl = 0; } if (digitalRead(gobuttonC) == 1){ digitalWrite(enablePinC, LOW); Serial.println("moving C"); goC = 1; } if (directionA == 1) {stepperA.setSpeed(speedA);}else{stepperA.setSpeed(-speedA);} if (directionB == 1) {stepperB.setSpeed(speedB);}else{stepperB.setSpeed(-speedB);} if (directionC == 1) {stepperC.setSpeed(speedC);}else{stepperC.setSpeed(-speedC);} //if (stepperC.distanceToGo() == 0) //stepperC.moveTo(-stepperC.currentPosition()); stepperC.runSpeed(); stepperB.runSpeed(); stepperA.runSpeed(); if(Serial.available()){ char c = Serial.read(); if (c== '\n'){ currpos = parseCommand(command, currpos); command = ""; } else{ command +=c; } } } long int parseCommand(String com, long int currpos){ //Serial.print("Your command: "); //Serial.println(com); if(com.equalsIgnoreCase("readpot")){ readpotentionmetersanity(); } else if(com.equalsIgnoreCase("info")){ Serial.println("Extruder spool speed controller"); } else if (com.substring(0,7) == "settemp") { settemp = com.substring(8).toDouble(); Setpoint = settemp; Serial.print("settemp: "); Serial.println(settemp); } else if(com.equalsIgnoreCase("levelstreamoff")){ levelstreamon = 0; } else if(com.equalsIgnoreCase("levelstreamon")){ levelstreamon = 1; } else if(com.equalsIgnoreCase("readlevel")){ int rawvalue = analogRead(THERMISTOR_PINA); float celsius = read_temp("A"); Serial.print("A: "); Serial.println(celsius); } else { Serial.print("Did not recognize "); Serial.println(com); } return currpos; } int readpotentionmetersanity(){ int val = analogRead(speedpotA); Serial.print("speed pinA: "); Serial.println(val); val = analogRead(speedpotB); Serial.print("speed pinB: "); Serial.println(val); val = analogRead(speedpotC); Serial.print("speed pinC: "); Serial.println(val); } #define NUMTEMPS 20 short temptable[NUMTEMPS][2] = { {1, 841}, {54, 255}, {107, 209}, {160, 184}, {213, 166}, {266, 153}, {319, 142}, {372, 132}, {425, 124}, {478, 116}, {531, 108}, {584, 101}, {637, 93}, {690, 86}, {743, 78}, {796, 70}, {849, 61}, {902, 50}, {955, 34}, {1008, 3} }; float read_temp(String sensor_type) { int THERMISTOR_PIN = 0; if (sensor_type == "A"){ THERMISTOR_PIN = THERMISTOR_PINA; } int rawtemp = analogRead(THERMISTOR_PIN); float current_celsius = 0; byte i; for (i=1; i<NUMTEMPS; i++) { if (temptable[i][0] > rawtemp) { float realtemp = temptable[i-1][1] + (rawtemp - temptable[i-1][0]) * (temptable[i][1] - temptable[i-1][1]) / (temptable[i][0] - temptable[i-1][0]); if (realtemp > 255) realtemp = 255; current_celsius = realtemp; break; } } // Overflow: We just clamp to 0 degrees celsius if (i == NUMTEMPS) current_celsius = 0; return current_celsius; }