I recently helped out behind the scenes of the two part Ben Heck Great Glue episode. I did the electronics design, assembly, and firmware for Ben. He put that with the mechanical part of the extruder, changed out the trigger, and packaged it up real nice for the episode. As he rarely does write ups I thought I’d post the code (pre hall effect) and the parts I remember using for others to follow in the great glue gun foot steps.
Make sure to change the code to use the 10k, I ruined my 10k’s after a few prototypes, jbweld is too strong. Anyways I used 100k’s, it’s an easy code change and 10k is more often used
#include <math.h>
#define MotorENPIN 3
#define Motor1APIN 2
#define Motor2APIN 4
#define Light1PIN 5
#define Light2PIN 6
#define minSpeed 50
#define maxSpeedLow 90
#define maxSpeedHigh 160
#define meltTemp 235
#define speedTempOffset 25
//#define SSRPIN 7
#define ThermistorPIN A0 // Analog Pin 0
#define TriggerPIN A1
//#define TempSetPIN A2
boolean extruding = false;
boolean atTemp = false;
int maxSpeed = maxSpeedLow;
int updateCount = 0;
int setTemp = 0;
int reqSpeed = 0;
int setSpeed = 0;
int temp;
int count = 0;
float pad = 100000; // balance/pad resistor value, set this to
// the measured resistance of your pad resistor
float thermr = 100000; // thermistor nominal resistance
float Thermistor(int RawADC) { //converts thermistor reading into a resistance and then temperature in C
long Resistance;
float logVal;
float tempTemp; // Dual-Purpose variable to save space.
Resistance=((1024 * pad / RawADC) – pad);
logVal = 3950/log((float)100000/Resistance);
//T2= T1*B/ln(R1/R2) / ( B/ln(R1/R2) – T1 )
tempTemp = (25+273.15)*logVal;
tempTemp = tempTemp / (logVal-(25+273.15));
tempTemp = tempTemp – 273.15; // Convert Kelvin to Celsius
tempTemp = (tempTemp * 9.0)/ 5.0 + 32.0; // converts to Fahrenheit
return tempTemp; // Return the Temperature
}
void setup() {
Serial.begin(115200);
pinMode(MotorENPIN, OUTPUT);
analogWrite(MotorENPIN, 0);
pinMode(Motor1APIN, OUTPUT);
digitalWrite(Motor1APIN, LOW);
pinMode(Motor2APIN, OUTPUT);
digitalWrite(Motor2APIN, LOW);
pinMode(Light1PIN, OUTPUT);
digitalWrite(Light1PIN, HIGH);
pinMode(Light2PIN, OUTPUT);
digitalWrite(Light2PIN, LOW);
//pinMode(SSRPIN, OUTPUT);
//digitalWrite(SSRPIN, LOW);
analogRead(ThermistorPIN);
analogRead(TriggerPIN);
//analogRead(TempSetPIN);
}
void loop() {
int readTemp = Thermistor(analogRead(ThermistorPIN)); // read ADC and convert it to F
if ((readTemp > 0) && (readTemp < 500))
temp = readTemp;
//setTemp = analogRead(TempSetPIN);
//setTemp = map(setTemp,0,1023,50,350); //analog reading 0-1023, temperature range 50 to 350F
if (temp <= meltTemp){ //if less than set temp, turn on SSR, set lights
//digitalWrite(SSRPIN, HIGH);
digitalWrite(Light1PIN, LOW);
digitalWrite(Light2PIN, HIGH);
maxSpeed = maxSpeedLow;
atTemp = false;
}
if ((temp > (meltTemp + 5)) && (temp <= meltTemp + speedTempOffset)){ //if greater than set temp but less than set temp + 10, set lights
digitalWrite(Light1PIN, HIGH);
digitalWrite(Light2PIN, HIGH);
maxSpeed = maxSpeedLow;
atTemp = true;
}
if (temp > (meltTemp + speedTempOffset + 5)){ //if greater than set temp + 10, turn off SSR, set lights
//digitalWrite(SSRPIN, LOW);
digitalWrite(Light2PIN, LOW);
digitalWrite(Light1PIN, HIGH);
maxSpeed = maxSpeedHigh;
atTemp = true;
}
reqSpeed = 1023 – analogRead(TriggerPIN);
if (reqSpeed < 3){ //if less than 3 (deadzone) and was extruding, reverse the motor to suck in the gluestick
if (extruding == true && count >= 450){
analogWrite(MotorENPIN, 0);
delay(50);
digitalWrite(Motor1APIN, LOW);
digitalWrite(Motor2APIN, HIGH);
analogWrite(MotorENPIN, 125);
setSpeed = 0;
delay(150);
analogWrite(MotorENPIN, 0);
delay(50);
extruding = false;
count = 0;
}
else{ //if less than 3 (deadzone) and was not extruding or reverse timed out, turn off motor
count = 0;
analogWrite(MotorENPIN, 0);
setSpeed = 0;
}
}
else if (reqSpeed > 5 && atTemp == true){ //if greater than 5 (deadzone), turn on motor mapped to stick, 5-1023 reading 50-150 motor, set extruding
if (count < 450)
count++;
setSpeed = map(reqSpeed,5,1023,minSpeed,maxSpeed);
digitalWrite(Motor1APIN, HIGH);
digitalWrite(Motor2APIN, LOW);
analogWrite(MotorENPIN, setSpeed);
extruding = true;
}
if (updateCount <= 250)
updateCount++;
else{
writeUpdates();
updateCount = 0;
}
//writeUpdates(); //for debugging
}
void writeUpdates(){
Serial.print(“Temp: “);
Serial.print(temp,1);
Serial.println(“”);
//Serial.print(“Req Speed: “);
//Serial.print(reqSpeed,1);
//Serial.println(“”);
//Serial.print(“Set Speed: “);
//Serial.print(setSpeed,1);
//Serial.println(“”);
}
As always code and parts list offered without warranty and very little support but you can always shoot me an email and I’ll see what I can do 🙂
Also, if you have questions regarding this project, I did a little write up on Element14, any Ben Heck questions and suggestions should go there, it’s a helpful community with better knowledge base than just me (though I do contribute a lot there).
Oh, and look for a reflow write up in a few weeks. Ben ended up doing a few episodes on the toaster reflow oven I was working on at his shop.