User Tools

Site Tools


bdev:filamentextrduer_code

Filabotextruder code 1

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;
}
bdev/filamentextrduer_code.txt · Last modified: 2022/12/01 03:02 by richard