2 Replies Latest reply on Jan 11, 2014 4:05 PM by colecago

    Great Glue Gun Recap!

    colecago

      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

      H-Bridge SN754410NE - TEXAS INSTRUMENTS - IC, PERIPHERAL DRIVERS, HALF-H, 36V, 1A, DIP-16 | 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 :-)