In June and July, I borrowed the girls’ robotics team Lego pieces and EV3 brain in order to build my own dot-matrix printer.
At various FIRST events, I have seen a kid or two who built a printer. I’ve also seen some on YouTube. As a fan of retrocomputing and Legos, I thought it would be a lot of fun to make my own printer.
The basic idea is simple and requires three motors. One feeds the paper forward or backward. One slides a print head back and forth horizontally across the page. The last one moves a marker or a pen up and down to draw a dot.
I made a lot of iterations of this printer, trying to solve various problems. It wasn’t perfect, and I was particularly limited by the number and kinds of pieces I had available. But it DID work! I was able to print out some portraits that were recognizable, as well as a Print Shop-style banner.
The main challenges (for me, anyway), were how to move the marker up and down, and how to code the printer so that it had good resolution. Early on, I attached the motors directly to the shafts, then measured how far to move things using tacho counts. But that led to very sloppy, inconsistent results. After a while, I realized I needed to use a technique called “gearing up”: The motor turns a small gear, which then drives a much larger gear. This decreases speed, requiring me to use many more tacho units to move the print head the same amount. This might sound bad, but in fact it greatly reduces inconsistency. I used “gearing up” to improve both the paper feeder, and the horizontal print head movement.
I wrote the code for the printer in Python, and controlled the EV3 using the ev3dev linux system. Later versions of the code were capable of reading in a PNG file and converting it to a low-res black and white image to print.
At the end of the summer, I created a 3D model of the printer using Lego Digital Designer. Download the viper-printer.lxf file and try it yourself in either LDD or Stud.io. The model isn’t perfect (There are two blank slots in the tread where I couldn’t get things to connect, for example), but is a nearly exact replica.
Inexplicably, I failed to take photos of the final version of the printer. So, here instead are some renderings of the printer, made using Stud.io: