For my next project, I'm building a machine to simply print a bunch of files by pressing different buttons.
We're basically going to mash together these two tutorials:
In the end, we'll write code to print arbitrary text, an image file, a saved text file, and a file retrieved from the Interplanetary File System – a new type of decentralized web!
I'm using the Mini Thermal Printer starter kit – follow the Adafruit tutorial to set up your printer with TTL, but you don't need the last networking part.
Ready? Let's go!Step 1. Printing from a Button
See the attached printtest.py for this code.
Since the thermal printer is plugged into the Pi's RX and TX pins for TTL control, I don't have room to plug my test button into GPIO pin 18. So, I moved down and put it on pin GPIO23 + GND instead:
GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_UP)
(It doesn't matter which button wire goes on which pin.)
Then, I initialized the printer (using the port and baud rate I found during the Adafruit tutorial – which doesn't change if you unplug the printer or Pi, unless you're plugging more stuff in):
os.system("stty -F /dev/serial0 19200")
I continued according to my "Shutdown/Restart Button" tutorial, using the
os.system function to run the print commands from the Adafruit tutorial.
The first test worked! To use the script, run:
sudo python printtest.py
As with my previous tutorial, you need to run as the superuser (that is, with
sudo) because it's required to use the GPIO pins.
Here's the feedback from that first test – I pushed the button a couple of times, and the end part (starting at
^C) is me killing the program with Ctrl+C:
Next, I wanted to send a text file to the thermal printer. I've saved some text into the file welcome.txt, in the same Scripts directory with printtest.py .
Since I was running with
sudo (and therefore as root), I had to specify a longer path with the
pi user's home directory in the command:
Using the CUPS filter as described in Adafruit's tutorial, the printer automagically reformats text to fit the page. Good news: you can enter arbitrary text without it being cut off! Bad news: ASCII art gets reformatted :/
You can monkey around with scale to fix this; I wanted to print the welcome text for the Interplanetary File System, so I used "-o cpi=18" to set the characters per inch to 18, rather than the standard 12, since the ASCII art is about 50% longer than the default page width.Step 3. Printing from the Interplanetary File System (IPFS)
This depends upon you having set up IPFS on the Raspberry Pi. I used "ipfs-rpi" by Claudio Bizzotto (setup video coming soon!). Then, I updated the Python script to pull down the readme and print it out.
The print-ipfs.py file attached to this tutorial contains the code for this!Canceling a Print
I needed to cancel lots of prints to save paper during testing! I haven't yet found a great way to do this with commands, but I did it by hitting Ctrl+C and yanking the printer power for at least 10 seconds ^_^
More soon... stay tuned!Video
This isn't edited down yet, but here's my first time setting up the thermal printer, with all its thrills and spills (and fire! see 13:00)...