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.
Here is a partial working demo early in the process
Here are the two episodes-
Original Parts – Sparkfun
H-Bridge $2.35 https://www.sparkfun.com/products/315
Trigger Pot (retired) https://www.sparkfun.com/products/retired/10314
SSR $4.95 https://www.sparkfun.com/products/10636
Proto board $2.95 https://www.sparkfun.com/products/8811
Wall Wart 9V $5.95 https://www.sparkfun.com/products/298
Thermistor 10k $1.95 https://www.sparkfun.com/products/250 (I think I ruined one and ended up using a 100k though)
RGB LED $.95 https://www.sparkfun.com/products/11120
By request I cross referenced what I could for Newark http://www.newark.com , they should be available at http://canada.newark.com/ as well
BenDuino (Ben’s custom Arduino Uno, link is similar but larger) – http://www.newark.com/arduino/a000066/dev-brd-atmega328-arduino-uno/dp/78T1601
H-Bridge – http://www.newark.com/texas-instruments/sn754410ne/ic-peripheral-drivers-half-h-36v/dp/08F8145
Trigger Pot – Sorry no cross reference for this sweet product 🙁
SSR – http://www.newark.com/sharp/s202s02f/ssr-pc-board-8a-80vrms-to-240vrms/dp/14N9588
Proto board with ground plane – No cross reference
Wall Wart 9V – http://www.newark.com/triad-magnetics/wsu090-0800-r/ac-dc-conv-external-plug-in-1/dp/83T4327
Thermistor 10k – http://www.newark.com/epcos/b57891m0103k000/thermistor-ntc-radial-leaded/dp/63W2796
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
RGB LED we used 10mm not a 5mm – http://www.newark.com/kingbright/l-154a4sureqbfzgew/led-multicol-rgb-5mm-x-bright/dp/66W1972
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 A2boolean 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 resistorfloat thermr = 100000; // thermistor nominal resistancefloat Thermistor(int RawADC) { //converts thermistor reading into a resistance and then temperature in Clong 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 CelsiustempTemp = (tempTemp * 9.0)/ 5.0 + 32.0; // converts to Fahrenheitreturn 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 Fif ((readTemp > 0) && (readTemp < 500))temp = readTemp;//setTemp = analogRead(TempSetPIN);//setTemp = map(setTemp,0,1023,50,350); //analog reading 0-1023, temperature range 50 to 350Fif (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 lightsdigitalWrite(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 gluestickif (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 motorcount = 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 extrudingif (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(“”);}