USB PCB Toner Transfer machine with Web Interface

I had planned on getting a lamination machine to do toner transfers for a long time. Unfortunately, I never came across anything that had manual temperature regulation, so I decided to take whatever was available and try it. As expected, the temperature was NOT enough for toner to even melt, no matter how many times you tried.

Great, time for an upgrade.


I cracked the thing open, and saw two thermal relays connected in series. Once the temperature rises they disable the heater. Hard as a rock & dumb as brick (c). Sorry little to no photos this time, my camera wasn’t around at the time of making the upgrade, but I’m sure you’ll figure it out.

I started by etching a control board based off a spare atmega48 I had around and a cheap mechanical relay. 4KiBs of flash are just what I need for a dumb hysteresis and vusb stack for communications with PC. While that was still etching, I added a thermistor to the aluminum plate and secured it with RTV Red Silicone gasket maker. This stuff is said to handle up to +375 C, so we’re good 😉

Next was the userspace part. I used my ‘lunartool’ utility, that I mostly use to write host software and quickly drafted an applet that would do all the temperature calculations with all the maths (I didn’t want to take that to the MCU, leaving the firmware as simple as possible, so it just gives me some temperature readings.). If you read occasionally my blog you might remember that tool. Basically it is a simple wrapper around lualibusb (Btw, I now use my own patched version, since upstream has broken control transfers and leaks memory!) Using that you write a small configuation file and get a nice commandline utility to drive your hardware. Are we done? Not yet!

I wondered if I can make a… Web Interface for that thing. With blackjack and hookers jquery and ajax. I picked lapis web framework, flot js plotting library, and some free css template I came around (Remember, no way in hell I’m a web designer or a web developer. I’m a linux kernel hacker for a living, btw!), quickly learned some moonspeak moonscript, and drafted a nice looking web-ui.


I picked lapis and OpenResty for a reson: They use lua. Lapis is written in moonscript (moonscript actually compiles to lua). I wrote a wrapper that reuses my very same applets that make up the command-line utilities and exposes them as an easy-to-use API that you can poke with ajax from a web-page as long as you like. So now, once I write a lunartool applet it automagically becomes a web-aware API and a commandline utility. Slick, heh?

Testing: Once I got the thing to work and got sensible temperature readings, I needed to find the right temperature for the transfer I started somewhere at 160 and ended up at 176-178 C. Since I don’t use any PID, just a dumb hysteresis it’s giving me some ~3 degrees overshoots (Just let it rest for a few swings to stabilise). But for this application it is tolerable. Copper’s thermal capacity compensates that, so I process the PCB twice. First pass for preheating the copper, second for the actual transfer.

I guess some extra fine-tuning will be done on the way, as I try to make some extra big boards. But so far I’ve seen some really interesting:

  • At 174 degrees the transfer results are good, but the toner peels off after a few minutes in the etchant.
  • At 176 degrees the results are awesome, no peeling whatever
  • At 179 degrees thin tracks are pressed onto the board, pieces of toner fall off.


This shows that there’s a very narrow window of several degrees that produces some steady results. No wonder making big boards with a clothes iron has always been THAT challenging.

NOTICE: It’s very likely that the actual temperature in the hot zone is a little bit higher than measured due to the position of the thermal sensor.

SourceCode: It still needs some cleaning up, and documenting. Check out my blog in a few days. I will post the sources and PCB designs in a separate post as soon as I clean it up.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.