User Tools

Site Tools


bdev:filamentextrduer_code

Warning: Undefined array key -1 in /var/www/html/dokuwiki/inc/html.php on line 1458

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
bdev:filamentextrduer_code [2022/11/08 23:12]
richard
bdev:filamentextrduer_code [2022/12/01 03:02] (current)
richard
Line 1: Line 1:
 ====== Filabotextruder code 1 ====== ====== Filabotextruder code 1 ======
 +
 +5 motor
 +<code>
 +#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;
 +}
 +
 +</code>
 +
 +
 +
  
 <code> <code>
Line 102: Line 474:
   stepperC.setMaxSpeed(1000*16);     stepperC.setMaxSpeed(1000*16);  
  
 + //turn the PID on
 +  myPIDA.SetMode(AUTOMATIC);
 } }
  
bdev/filamentextrduer_code.1667949146.txt.gz ยท Last modified: 2022/11/08 23:12 by richard