Filament extruder recyclebot

filabotmega.ino

#include <PID_v1.h> 
#include <Wire.h>
#include <SoftwareSerial.h>
#define motorInterfaceType 1


#define THERMISTOR_PINA A11
#define TEMPCONTROLA 10

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

//Specify the links and initial tuning parameters
PID myPIDA(&Input, &OutputA, &Setpoint, aggKpA, aggKiA, aggKdA, DIRECT);


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 gobuttonB = A5;
const int stopbuttonB = A6;
const int speedpotB = A3;

const int gobuttonC = A7;
const int stopbuttonC = A10;
const int speedpotC = A4;

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;

String command;
long int currpos;
long int pos;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(stepsPinA, OUTPUT);
  pinMode(directionPinA, OUTPUT);
  pinMode(enablePinA, OUTPUT);
  pinMode(stepsPinB, OUTPUT);
  pinMode(directionPinB, OUTPUT);
  pinMode(enablePinB, OUTPUT);
  pinMode(speedpotA, INPUT);
  pinMode(gobuttonA, INPUT);
  pinMode(stopbuttonA, INPUT);
  pinMode(speedpotB, INPUT);
  pinMode(gobuttonB, INPUT);
  pinMode(stopbuttonB, INPUT);
  pinMode(speedpotC, INPUT);
  pinMode(gobuttonC, INPUT);
  pinMode(stopbuttonC, INPUT);

  digitalWrite(enablePinA,LOW);
  digitalWrite(enablePinB,LOW);
  digitalWrite(directionPinA, LOW);
  digitalWrite(directionPinB, LOW);
  digitalWrite(directionPinC, LOW);
  currpos = 0;
}

void loop() {

   Input = read_temp("A");
   double gap = abs(Setpoint-Input); //distance away from setpoint
   myPIDA.SetTunings(aggKpA, aggKiA, aggKdA);
   myPIDA.Compute();
   analogWrite(TEMPCONTROLA,OutputA);

   int rawvalue = analogRead(THERMISTOR_PINA);
   int rawvalueA = rawvalue;
   float celsiusA = read_temp("A");



  Serial.print("");
  
  digitalWrite(stepsPinA, HIGH);
  digitalWrite(directionPinA, LOW);
  digitalWrite(enablePinA, HIGH);  


  digitalWrite(stepsPinB, LOW);
  digitalWrite(directionPinB, LOW);
  digitalWrite(enablePinB, LOW); 

  digitalWrite(stepsPinC, LOW);
  digitalWrite(directionPinC, HIGH);
  digitalWrite(enablePinC, LOW); 


/*
  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){
  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){
   Serial.println("moving A");
   runnerA();
  }

 if (digitalRead(stopbuttonB) ==HIGH){
  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){
  Serial.println("moving B");
   runnerB();
  }

 if (digitalRead(stopbuttonC) ==HIGH){
  if (bfl == 0){
   if (directionC==0){directionC = 1; digitalWrite(directionPinC, HIGH); }else{directionC=0; digitalWrite(directionPinC, LOW);}
    Serial.print(directionC);
    Serial.println(" direction changed");
    bfl = 1;
   }
  } else { bfl = 0; }

 if (digitalRead(gobuttonC) == 1){
  Serial.println("moving C");
   runnerC();
  }
  */


  
 if(Serial.available())
 {
    char c = Serial.read();
    if (c== '\n')
    {
      currpos = parseCommand(command, currpos);
      command = "";
    }
    
    else
    {
      command +=c;
    }
 }
 delay(30);
}

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


int runnerA(){
   int stpper = 1;
   int speed = analogRead(speedpotA);
   int stepdelay = map(speed, 0, 1023, 1, 2000);
   while(stpper > 0){
   speed = analogRead(speedpotA);
   stepdelay = map(speed, 0, 1023, 1, 2000);
   digitalWrite(stepsPinA,HIGH); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   digitalWrite(stepsPinA,LOW); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   if (digitalRead(stopbuttonA) ==HIGH){ break; }
 }
 return 0;
}

int runnerB(){
   int stpper = 1;
   int speed = analogRead(speedpotB);
   int stepdelay = map(speed, 0, 1023, 1, 2000);
   while(stpper > 0){
   speed = analogRead(speedpotB);
   stepdelay = map(speed, 0, 1023, 1, 2000);
   digitalWrite(stepsPinB,HIGH); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   digitalWrite(stepsPinB,LOW); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   if (digitalRead(stopbuttonB) ==HIGH){ break; }
 }
 return 0;
}

int runnerC(){
   int stpper = 1;
   int speed = analogRead(speedpotB);
   int stepdelay = map(speed, 0, 1023, 1, 2000);
   while(stpper > 0){
   speed = analogRead(speedpotC);
   stepdelay = map(speed, 0, 1023, 1, 2000);
   digitalWrite(stepsPinC,HIGH); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   digitalWrite(stepsPinC,LOW); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   if (digitalRead(stopbuttonC) ==HIGH){ break; }
 }
 return 0;
}

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

spool holder I need to design https://www.thingiverse.com/thing:3980786

PCB for potentiometer controller of stepper motor

Sketch for controlling potentiometer

#include <Wire.h>
#include <SoftwareSerial.h>
#define dirPin 4
#define stepPin 3
#define motorInterfaceType 1

int enablePin = 9;
int estepsPin = 3;
int directionPin = 2;
int direction = 0;
int ton = 0;
int speedpot = A5;
int buttona = A4;
int buttonb = A3;
int buttonastate = 0;
int buttonbstate = 0;
int afl = 0;
int bfl = 0;

String command;
long int currpos;
long int pos;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(enablePin, OUTPUT);
  pinMode(directionPin, OUTPUT);
  pinMode(estepsPin, OUTPUT);
  pinMode(speedpot, INPUT);
  pinMode(buttona, INPUT);
  pinMode(buttonb, INPUT);
  digitalWrite(enablePin,LOW);
  digitalWrite(directionPin, LOW);
  currpos = 0;
}

void loop() {
  // put your main code here, to run repeatedly:
 buttonastate = digitalRead(buttona);
 buttonbstate = digitalRead(buttonb);
 /*
 Serial.print("buttonastate ");
 Serial.println(buttonastate);
 Serial.print("buttonbstate");
 Serial.println(buttonbstate);
 delay(100);
 */

 if (buttonbstate ==HIGH){
  if (bfl == 0){
   if (direction==0){direction = 1; digitalWrite(directionPin, HIGH); }else{direction=0; digitalWrite(directionPin, LOW);}
    Serial.print(direction);
    Serial.println(" direction changed");
    bfl = 1;
   }
  } else { bfl = 0; }
 if (buttonastate == HIGH){
   runner(estepsPin, directionPin, speedpot, buttona); 
  }


 if(Serial.available())
 {
    char c = Serial.read();
    if (c== '\n')
    {
      currpos = parseCommand(command, currpos);
      command = "";
    }
    
    else
    {
      command +=c;
    }
 }
 delay(30);
}

long int parseCommand(String com, long int currpos)
{
  //Serial.print("Your command: ");
  //Serial.println(com);

  if(com.equalsIgnoreCase("readpot")){
   readpotentionmetersanity(speedpot);
  }
  if(com.equalsIgnoreCase("g")){
   readpotentionmetersanity(speedpot);
   runner(estepsPin, directionPin, speedpot, buttona);
  } 
  else if(com.equalsIgnoreCase("info")){
    Serial.println("Extruder spool speed controller");
  }
  else {
   Serial.print("Did not recognize ");
   Serial.println(com);
  }
   return currpos;
}

int readpotentionmetersanity(int speedPin){
 int val = analogRead(speedPin);
 Serial.print("speed pin: ");
 Serial.println(val);
 
 //int stepdelay = map(val, 0, 1023, 1, 1000);
 //Serial.print("stepdelay or speed: ");
 //Serial.println(stepdelay);
}


int runner(int stepsPin, int directionPin, int speedpot, int buttona){
  Serial.println("its running ...");
  int stpper = 1;
   int speed = analogRead(speedpot);
   int stepdelay = map(speed, 0, 1023, 1, 1000);
   while(stpper > 0){
   speed = analogRead(speedpot);
   stepdelay = map(speed, 0, 1023, 1, 2000);
   //stepdelay = 100;
   digitalWrite(stepsPin,HIGH); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   digitalWrite(stepsPin,LOW); // Output high
   delayMicroseconds(stepdelay); // Wait 1/2 a ms
   if (digitalRead(buttonb) ==HIGH){ break; }
 }
 return 0;
}

Sketch for controlling temperature

#include <Servo.h> 
#include <PID_v1.h> 
//#include <FastPID.h> 

Servo myservo;  // create servo object to control a servo #include <Wire.h> #include <SoftwareSerial.h>

#define THERMISTOR_PINA A1
#define THERMISTOR_PINB A2
#define THERMISTOR_PINC A3

#define TEMPCONTROLA 3
#define TEMPCONTROLB 5
#define TEMPCONTROLC 6


//Define the aggressive and conservative Tuning Parameters

double aggKpA=150, aggKiA=0.5, aggKdA=0;
double aggKpB=150, aggKiB=0.5, aggKdB=0;
double aggKpC=150, aggKiC=0.5, aggKdC=0;


int thermoelectricval = 255;
String command;
float currpos;
int celsius;
int levelstreamon;
double settemp = 0;
double Setpoint, Input, Output, OutputA, OutputB, OutputC;
int tme = 250;

//Specify the links and initial tuning parameters
//PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
PID myPIDA(&Input, &OutputA, &Setpoint, aggKpA, aggKiA, aggKdA, DIRECT);
PID myPIDB(&Input, &OutputB, &Setpoint, aggKpB, aggKiB, aggKdB, DIRECT);
PID myPIDC(&Input, &OutputC, &Setpoint, aggKpC, aggKiC, aggKdC, DIRECT);

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


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(TEMPCONTROLA, OUTPUT);
  pinMode(TEMPCONTROLB, OUTPUT);
  pinMode(TEMPCONTROLC, OUTPUT);
  analogWrite(TEMPCONTROLA, 255); 
  analogWrite(TEMPCONTROLB, 255); 
  analogWrite(TEMPCONTROLC, 255); 

  Setpoint = settemp;
  //turn the PID on
  myPIDA.SetMode(AUTOMATIC);
  myPIDB.SetMode(AUTOMATIC);
  myPIDC.SetMode(AUTOMATIC);
}

void loop() {
   Input = read_temp("A");
   double gap = abs(Setpoint-Input); //distance away from setpoint
   myPIDA.SetTunings(aggKpA, aggKiA, aggKdA);
   myPIDA.Compute();
   analogWrite(TEMPCONTROLA,OutputA);

   Input = read_temp("B");
   gap = abs(Setpoint-Input); //distance away from setpoint
   myPIDB.SetTunings(aggKpB, aggKiB, aggKdB);
   myPIDB.Compute();
   analogWrite(TEMPCONTROLB,OutputB);

   Input = read_temp("C");
   gap = abs(Setpoint-Input); //distance away from setpoint
   myPIDC.SetTunings(aggKpC, aggKiC, aggKdC);
   myPIDC.Compute();
   analogWrite(TEMPCONTROLC,OutputC);

   
   int rawvalue = analogRead(THERMISTOR_PINA);
   int rawvalueA = rawvalue;
   float celsiusA = read_temp("A");
   rawvalue = analogRead(THERMISTOR_PINB);
   float celsiusB = read_temp("B");
   rawvalue = analogRead(THERMISTOR_PINC);
   float celsiusC = read_temp("C");
   //int fahrenheit = (((celsius * 9) / 5) + 32);
  if (levelstreamon == 1) {
   Serial.print("A: ");
   Serial.print(rawvalueA);
   Serial.print(" ");
   Serial.println(celsiusA);
   Serial.print("B: ");
   Serial.println(celsiusB);
   Serial.print("C: ");
   Serial.println(celsiusC);
   Serial.print("OutputA: ");
   Serial.println(OutputA);
   Serial.print("Settemp: ");
   Serial.println(settemp);   
   delay(500);
  }

 if(Serial.available())
 {
    char c = Serial.read();
    if (c== '\n')
    {
      parseCommand(command);
      command = "";
    }
    else 
    {
      command +=c;
    }
 }
 delay(1);
}

float parseCommand(String com)
{

  if(com.equalsIgnoreCase("info")){
    Serial.println("tempcontrol");
  }
  else if(com.equalsIgnoreCase("levelstreamon")){
   levelstreamon = 1;
  }  
  else if(com.equalsIgnoreCase("defaultpid")){
    double aggKpA=19.56, aggKiA=0.71, aggKdA=134.26;
    double aggKpB=19.56, aggKiB=0.71, aggKdB=134.26;
    double aggKpC=19.56, aggKiC=0.71, aggKdC=134.26;
  }
  else if (com.substring(0,7) == "settemp") {
    settemp = com.substring(8).toDouble();
    Setpoint = settemp;
    Serial.print("settemp: ");
    Serial.println(settemp);
  }
  else if (com.substring(0,4) == "setpA") {
    aggKpA = com.substring(5).toDouble();
  }
  else if (com.substring(0,4) == "setiA") {
    aggKiA = com.substring(5).toDouble();
  }
  else if (com.substring(0,4) == "setdA") {
    aggKdA = com.substring(5).toDouble();
  }

  else if (com.substring(0,4) == "setpB") {
    aggKpB = com.substring(5).toDouble();
  }
  else if (com.substring(0,4) == "setiB") {
    aggKiB = com.substring(5).toDouble();
  }
  else if (com.substring(0,4) == "setdB") {
    aggKdB = com.substring(5).toDouble();
  }

  else if (com.substring(0,4) == "setpC") {
    aggKpC = com.substring(5).toDouble();
  }
  else if (com.substring(0,4) == "setiB") {
    aggKiC = com.substring(5).toDouble();
  }
  else if (com.substring(0,4) == "setdC") {
    aggKdC = com.substring(5).toDouble();
  }
  else if(com.equalsIgnoreCase("levelstreamoff")){
   levelstreamon = 0;
  } 
  else if(com.equalsIgnoreCase("readlevelA")){
     int rawvalue = analogRead(THERMISTOR_PINA);
     float celsius = read_temp("A");
     Serial.println(celsius);
  }
  else if(com.equalsIgnoreCase("readlevelB")){
     int rawvalue = analogRead(THERMISTOR_PINB);
     float celsius = read_temp("B");
     Serial.println(celsius);
  }
  else if(com.equalsIgnoreCase("readlevelC")){
     int rawvalue = analogRead(THERMISTOR_PINC);
     float celsius = read_temp("C");
     Serial.println(celsius);
  }
  else if(com.equalsIgnoreCase("turnonA")){
     analogWrite(TEMPCONTROLA, 255);
     Serial.println("pin A is on");
  }
  else if(com.equalsIgnoreCase("turnoffA")){
     analogWrite(TEMPCONTROLA, 0);
     Serial.println("pin A is off");
  }
  else if(com.equalsIgnoreCase("turnonB")){
     analogWrite(TEMPCONTROLB, 255);
     Serial.println("pin B is on");
  }
  else if(com.equalsIgnoreCase("turnoffB")){
     analogWrite(TEMPCONTROLB, 0);
     Serial.println("pin B is off");
  }
  else if(com.equalsIgnoreCase("turnonC")){
     analogWrite(TEMPCONTROLC, 255);
     Serial.println("pin C is on");
  }
  else if(com.equalsIgnoreCase("turnoffC")){
     analogWrite(TEMPCONTROLC, 0);
     Serial.println("pin C is off");
  }


  else if(com.equalsIgnoreCase("readlevel")){
     int rawvalue = analogRead(THERMISTOR_PINA);
     float celsius = read_temp("A");
     Serial.print("A: ");
     Serial.println(celsius);
     rawvalue = analogRead(THERMISTOR_PINB);
     celsius = read_temp("B");
     Serial.print("B: ");
     Serial.println(celsius);
     rawvalue = analogRead(THERMISTOR_PINC);
     celsius = read_temp("C");
     Serial.print("C: ");
     Serial.println(celsius);
  }
}

float read_temp(String sensor_type)
{
   int THERMISTOR_PIN = 0;
   if (sensor_type == "A"){
    THERMISTOR_PIN = THERMISTOR_PINA;
   }
   if (sensor_type == "B"){
    THERMISTOR_PIN = THERMISTOR_PINB;
   }
   if (sensor_type == "C"){
    THERMISTOR_PIN = THERMISTOR_PINC;
   }

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