User Tools

Site Tools


bdev:filamentextrduer_code

This is an old revision of the document!


Filabotextruder code 1

5 motor

#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 directionD = 0;
int directionE = 0;

int ton = 0;

int buttonastate = 0;
int buttonbstate = 0;
int buttoncstate = 0;
int buttondstate = 0;
int buttonestate = 0;

int afl = 0;
int bfl = 0;
int cfl = 0;
int dfl = 0;
int efl = 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 10


int PS[] = {26, 28, 30, 32, 34, 36, 40, 42, 44, 46, 48, 50, 52, 24};

// 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[10];
const int directionPinD = PS[11];
const int stepsPinD = PS[12];

const int enablePinE = PS[14];
const int directionPinE = PS[16];
const int stepsPinE = PS[18];

const int speedpotA = A1;
const int gobuttonA = A2;
const int stopbuttonA = A3;
const int stepspinA = LOW;

const int speedpotB = A4;
const int gobuttonB = A5;
const int stopbuttonB = A6;
const int stepspinB = LOW;

const int speedpotC = A7;
const int gobuttonC = A8;
const int stopbuttonC = A9;
const int stepspinC = LOW;

const int speedpotD = A10;
const int gobuttonD = A11;
const int stopbuttonD = A12;
const int stepspinD = LOW;

const int speedpotE = A13;
const int gobuttonE = A14;
const int stopbuttonE = A15;
const int stepspinE = 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);
AccelStepper stepperE = AccelStepper(motorInterfaceType, stepsPinE, directionPinE);


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(stepsPinE, OUTPUT);
  pinMode(directionPinE, OUTPUT);
  pinMode(enablePinE, OUTPUT);



  pinMode(TEMPCONTROLA, OUTPUT);




  digitalWrite(enablePinA,HIGH);
  digitalWrite(enablePinB,HIGH);
  digitalWrite(enablePinC,HIGH);
  digitalWrite(enablePinD,HIGH);
  digitalWrite(enablePinE,HIGH);

  digitalWrite(directionPinA, LOW);
  digitalWrite(directionPinB, LOW);
  digitalWrite(directionPinC, LOW);
  digitalWrite(directionPinD, LOW);
  digitalWrite(directionPinE, LOW);
  
  
  stepperA.setMaxSpeed(1000*16);
  stepperB.setMaxSpeed(1000*16);
  stepperC.setMaxSpeed(1000*16);  
  stepperD.setMaxSpeed(1000*16);  
  stepperE.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);
  int speedE = map(analogRead(speedpotE), 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);
  }
bfl = motorStop(stopbuttonA, enablePinA, directionA, directionPinA, bfl);
motorMove(gobuttonA, enablePinA);

bfl = motorStop(stopbuttonB, enablePinB, directionB, directionPinB, bfl);
motorMove(gobuttonB, enablePinB);

bfl = motorStop(stopbuttonC, enablePinC, directionC, directionPinC, bfl);
motorMove(gobuttonC, enablePinC);

bfl = motorStop(stopbuttonD, enablePinD, directionD, directionPinD, bfl);
motorMove(gobuttonD, enablePinD);

bfl = motorStop(stopbuttonE, enablePinE, directionE, directionPinE, bfl);
motorMove(gobuttonE, enablePinE);

  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());
  stepperE.runSpeed();
  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);
  }
}

int motorStop(int stopbutton, int enablePin, int direction, int directionPin, int bfl){
 if (digitalRead(stopbutton) ==HIGH){
  digitalWrite(enablePin, HIGH);
  if (bfl == 0){
   if (direction==0){direction = 1; digitalWrite(directionPin, HIGH); }else{direction=0; digitalWrite(directionPin, LOW);}
    bfl = 1;
   }
  } else { bfl = 0; }
return bfl;
}



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;
}

#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.1669674621.txt.gz · Last modified: 2022/11/28 22:30 by richard