Thursday, 25 June 2020

Enginursday: Reflow Toaster Oven - a Qwiic Hack!

While working from home during the past few months, I have greatly missed being able to throw some prototypes through the super nice SparkFun production reflow oven.

zoom in of solder paste reflowing in a toaster oven
Ahhh, so glad I didn't have to hand solder each of those blobs.

I really wanted a reflow oven in my garage, so after doing some research online, I decided to buy a cheap toaster oven and give this hack a try. Ultimately, I decided to use a standard hobby servo to automate the movement of the temperature knob like so:

alt text
Just like a push-pull linkage in a model airplane!

Although slightly less elegant than some of the other methods out there, this servo control method works quite well. Additionally, it didn't require any modifications to the wiring of my toaster oven and was pretty darn cheap and simple to setup.

Research

I came across many blogs, websites and products dedicated to hacking toaster ovens into reflow ovens:

The most important things I learned were the following:

  1. Get a toaster oven with these features (I purchased the Black & Decker TO3000G, which was $59 new):

    • Analog dial control style
    • Quartz elements (two above and two below if you can)
    • A convection fan
    • Small or medium-sized
  2. A single thermocouple "floating" in the air near the PCB works fine. Note, a lot of the pro-end models have multiple temp sensors (at multiple points in the chamber and one touching the PCB), but I haven't found the need yet. The SparkFun Qwiic Thermocouple and braided thermocouple work great!

  3. Opening the door seems to be the only way to get a good and fast cool down. Even the ~$4,000 pro machines have the drawer open automatically to achieve good "free air" cooling. I have yet to automate this step, but so far I love watching the solder flow. When I see my reflow time is up, I have been manually opening the door. If I find the need to automate this in the future, I'll most likely get another servo or stepper motor involved.

  4. Most toaster ovens can't achieve an ideal ramp up rate of 1.5C/second, but that's okay. You can add a slower ramp up during your soak phase - a slow ramp up from 150-180. More on this later as we discuss the profile, the code and show some results.

Parts List

Manual testing

Before rigging up a servo to move the control knob, I first gathered parts and got my thermocouple readings working. Then the plan was to simply move the control knob manually (with my hand), and see if I could get a decent profile while watching the data plotter.

alt text
My very first attempt manually adjusting the knob by hand.

Following the profile suggestions in the CompuPhase article and reading what Wikipedea had, I decided to try for a profile represented by the blue line in the graphic above. The red represents the live readings from the thermocouple. Note: in all of my serial plotter graphics, the blue line is being plotted as a reference, and my controller is not analyzing the blue line in any way.

And so I tried again:

alt text
Second attempt adjusting temp knob by hand.

As you can see, I started taking notes to keep track of what was working and what was not. For my second attempt, I actually set the oven to "warm" for ten seconds before starting my plotter. The adjustments noted in the graphic were done by me physically moving the dial with my hand.

By my fourth manual test, I was pretty pleased with the results - not perfect by any means, but starting to look a bit like an actual profile:

alt text
Fourth attempt by hand, starting to look decent.

Servo Hack

Now that I knew a decent profile could be achieved by simply moving the temp dial, it was time to slap a servo on this thing and automate the movements!

First things first, I ripped off that control knob. A flat head screw driver helped greatly to get it started. Next, I mounted the servo horn to the knob with a servo mount screw in the center hole of the servo horn.

Temp knob removed. Mount with center point screw first.

Then, I drilled out two more holes for a good secure mount. Note: I'd make sure to align the positioning mark (that little silver thing) directly down. This will ensure that the servo linkage and rotation can achieve the full 180 degrees of motion.

Mounted servo horn with center screw. Horn mounting complete.

Next was actually mounting the servo to the oven. I had a scrap piece of wood that fit the job exactly, but anything that can extend the servo out past the face of the oven should work. I opted to use dual-lock hook and loop, but servo tape or double-sided foam tape would have worked too. Make sure to align properly both along the center point of the servo horns and the depth away from the oven.

Center point alignment. Depth alignement.

Finally, the last step was to link the two control horns. There are many ways to do this with various linkage hardware, but the simplest is to use bare control rods and add "Z-bends" at specific points. I first tried this with a single control rod, but it was much smoother with two!

Z-bend Dual control rod hooked up

The Code

The source code for the project can be downloaded from the GitHub repository here:

Using Example 1 from the Qwiic Thermocouple Arduino Library and a basic servo control example, I was able to piece together a sketch that accomplishes a pretty nice reflow profile.

Before diving into the code, I'd like to highlight the fact that this project does not use PID control to try and follow a set profile. I first proved out that manually moving the temp knob by hand could create a decent reflow profile. By watching the temperature and keeping track of time, my Arduino can determine the zone (preheat, soak, ramp up, reflow, cooldown). Once you know the zone, you can simply set servo to predetermined positions (or toggle on/off as in soak) to hold a close enough temperature or ramp up.

My plan was:

  1. Set full power
  2. Wait to see 140C, kill power, enter soak zone
  3. During soak, toggle power on/off to climb from 150C to 180C
  4. Once soak time is complete, turn on full power (enter ramp-up zone)
  5. During ramp-up, wait to see reflow temp (220C) (enter reflow zone)
  6. During reflow, toggle servo on/off to hold temp
  7. Once reflow time is complete, turn servo to "off," indicating user should open door

My main loop simply uses a "for loop" to get through the zones, then when it's done it stops with a "while(1)". It is updateServoPos() that actually determines the zone and updates a global variable.

void loop() {

for (int i = 0 ; i <= 4 ; i++) // cycle through all zones - 0 through 4.
{
    int tempDelta = abs(profileTemp[i + 1] - profileTemp[i]);
    int timeDelta = abs(profileTimeStamp[i + 1] - profileTimeStamp[i]);
    float rampIncrementVal = float(tempDelta) / float(timeDelta);
    currentTargetTemp = profileTemp[i];

    // Print data to serial for good plotter view in real time.
    // Print target (for visual reference only), currentTemp, ovenSetting (aka servo pos), zone
    for (int j = 0 ; j < (timeDelta - 1); j++)
    {
    currentTargetTemp += rampIncrementVal;
    Serial.print(currentTargetTemp, 2);
    Serial.print(",");

    if (tempSensor.available())
    {
        currentTemp = tempSensor.getThermocoupleTemp();
    }
    else {
        currentTemp = 0; // error
    }

    Serial.print(currentTemp);
    Serial.print(",");

    updateServoPos(); // Note, this will increment the zone when specific times or temps are reached.

    Serial.print(ovenSetting);
    Serial.print(",");

    Serial.println(zone * 20);
    delay(1000);
    totalTime++;
    }
}

// monitor actual temps during cooldown
for (int i = 0 ; i < COOL_DOWN_SECONDS ; i++)
{
    currentTargetTemp = 0;
    Serial.print(currentTargetTemp, 2);
    Serial.print(",");
    if (tempSensor.available())
    {
    currentTemp = tempSensor.getThermocoupleTemp();
    }
    else {
    currentTemp = 0; // error
    }
    Serial.print(currentTemp);
    Serial.print(",");
    updateServoPos();
    Serial.print(ovenSetting);
    Serial.print(",");
    Serial.println(zone * 20);
    delay(1000);
}
while (1); // end
}

The following function, updateServoPos(), is where the temperature and totalTime is checked to determine the zone we are currently in, and ultimately what servo positions are desired.

void updateServoPos()
{
    if ((zone == ZONE_preheat) && (currentTemp > 140)) // done with preheat, move onto soak
    {
        zone = ZONE_soak;
    }
    else if ((zone == ZONE_soak) && (soakSeconds > SOAK_TIME)) // done with soak, move onto ramp
    {
        zone = ZONE_ramp;
    }
    else if ((zone == ZONE_ramp) && (currentTemp > 215)) // done with ramp move onto reflow
    {
        zone = ZONE_reflow;
    }
    else if ((zone == ZONE_reflow) && (reflowSeconds > 30))
    {
        zone = ZONE_cool;
    }

switch (zone) {
    case ZONE_preheat:
        setServo(41);
        break;
    case ZONE_soak:
        soakSeconds++;
        if ((soakSeconds % 15) == 0) // every 15 seconds toggle
        {
            soakState = !soakState;
        }
        if (soakState)
        {
            setServo(100);
        }
        else {
            setServo(0);
        }
        break;
    case ZONE_ramp:
        setServo(100);
        break;
    case ZONE_reflow:
        reflowSeconds++;
        if ((reflowSeconds > 5) && (reflowSeconds < 10)) // from 5-10 seconds drop to off
        {
            setServo(0);
        }
        else {
            setServo(100);
        }
        break;
    case ZONE_cool:
        setServo(0);
        break;
    }
}

Some of these settings would surely need to be tweaked when using a different oven, thermocouple and servo setup. Slight variations in the servo hardware hookups will most likely require different servo positions settings to get the desired position on the temp knob.

Also, the position of the thermocouple can affect its readings, so each setup will most likely require different temperature trigger values (i.e. in the servoUpdatePos() function, you may need to adjust the if statements that determine the zone).

Last, paste and component size must be considered. After reflowing a few panels, I saw that the SAC305 paste I was using actually started reflowing closer to 220C, so I made that my target max reflow temp. And if I had huge components, these can act as heatsinks and may require a longer soak and/or higher peak reflow temp.

Results

alt text
My last profile cooking actual panels and looking good!

The above screenshot is from my latest achieved profile using servo control. The different colored lines represent the following:

  • Blue: Generic reference profile
  • Red: Temp readings showing actual profile in the oven
  • Yellow: Zones, stepping up through preheat, soak, ramp-up, reflow, cooldown
  • Green: Servo position, represented by 0-100 percent power

Although this last profile screenshot is the result of almost 20 test runs and 10 actual board panels reflowing, I would like to mention that even with some slight variation between profiles, all of my panels came out beautifully. A good paste job and proper placement of parts can greatly help your initial yield, but I even had a few sloppy paste jobs and they came out fine!

Conclusion

My complete setup in the garage. Panel in the oven.

If you're interested in reflowing some electronics using a toaster oven, it can be done using a simple Arduino, servo and thermocouple. It does take a little time to do some test runs and make slight adjustments to the provided Arduino sketch, but the results are pretty great! I currently have to watch the oven to manually open the door when it's done, but this could be automated. Plus, while one panel was in the oven, I simply started hand placing parts on the next panel and so no time was really lost.

If you would like to give this a try and have any questions, please reach out in the comment below or at the GitHub project repository.

Also, if you have any experience with solder reflow profiles, I'd love to hear your thoughts in the comments below.

Thanks for reading and cheers to some good DIY electronics SMD assembly!

Resources

comments | comment feed



No comments:

Post a Comment