I recently helped out behind the scenes of the two part Ben Heck Great Glue Gun episode. I helped out on the electronics design, assembly, and the firmware. 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.
Here is a partial working demo early in the process
https://www.youtube.com/watch?v=g92pjOrOWOE
Parts (cross referenced the best I could, I used Sparkfun parts unfortunately, so no warranties!)
BenDuino (Ben's custom Arduino Uno, link is similar but larger ->) A000066 - ARDUINO - DEV BRD, ATMEGA328, ARDUINO UNO R3 DIP ED | Newark element14 US
Trigger Pot (retired) https://www.sparkfun.com/products/retired/10314
SSR S202S02F - SHARP - SSR, PC BOARD, 8A, 80VRMS TO 240VRMS | Newark element14 US (We used a different SSR but this is similar)
Proto board wtih ground plane https://www.sparkfun.com/products/8811
Wall Wart 9V WSU090-0800-R - TRIAD MAGNETICS - AC-DC CONV, EXTERNAL PLUG IN, 1 O/P, 7.2W, 9V | Newark element14 US (We used a different wall wart but this is similar)
Thermistor 10k B57891M0103K000 - EPCOS - THERMISTOR, NTC, RADIAL LEADED | Newark element14 US (change the code for a 10k, I ended up ruining my 10k's and falling back on a 100k)
RGB LED L-154A4SUREQBFZGEW - KINGBRIGHT - LED, MULTICOL., RGB 5MM, X-BRIGHT | Newark element14 US (We used a 10mm not a 5mm)
Code
#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 :-)