====== Filament extruder recyclebot ======
====== filabotmega.ino ======
#include
#include
#include
#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 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
{{:bdev:potentiometer_stepper.png?400|}}
**Sketch for controlling potentiometer **
#include
#include
#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
#include
//#include
Servo myservo; // create servo object to control a servo #include #include
#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 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;
}