Raspberry Pi Thermal Printing: an update

Reader Daniel Boira recently asked me if I’d experimented with printing large characters on the SparkFun thermal printer (see Hacking a Thermal Till Printer…) that I’d rigged up to my Raspberry Pi’s GPIO. I hadn’t done so, so I thought I’d give it a try.

Printing double-size text

Print characters tall, wide, or tall and wide

Lauri Kainulainen’s excellent Python module, printer.py, provides an easy-to-use interface to most of the printer’s features but not all of them. Double-height and double-width printing are not included. Fortunately, a look at the printer’s command sheet (PDF) reveals there are control codes that can be sent to the printer to enable large characters to be printed.

To that end, I modified my local copy of printer.py, adding in the following lines within the main body of the class ThermalPrinter(object): code:

    def double_width(self, flag):
    	self.printer.write(self._ESC)

        if flag == True:
        	self.printer.write(chr(14))
        	self.DWIDTH = True
        else:
        	self.printer.write(chr(20))
        	self.DWIDTH = False
        	
    def double_height(self, flag):
	self.printer.write(self._ESC)
	self.printer.write(chr(33))
		
	if flag == True:
		if self.DWIDTH == True:
			self.printer.write(chr(48))
		else:
			self.printer.write(chr(16))

	if flag == False:
		if self.DWIDTH == True:
			self.printer.write(chr(32))
		else:
			self.printer.write(chr(0))

Usage is simple: just call the double_height function directly through the printer object you’ve established in your own program code. Your program might be something like this:

import printer, textwrap, sys 

p = printer.ThermalPrinter(serialport="/dev/ttyAMA0") 
        
base_text = "This is some text to print"

# Turn on double height, width printing

p.double_width(True)
p.double_height(True)

p.print_text(base_text)
p.linefeed()

# Turn off double height, width printing

p.double_width(False)
p.double_height(False)

Sending the value True or False into either of the two functions flips their respective printing modes on and off, respectively.

Finally, I added a variable, DWIDTH, to the class defined in printer.py to track whether double-width printing is enabled or not. The printer provides commands for enabling and disabling double-width printing, but to enable or disable double-height printing, you need to send to the printer a control value that you have to calculate. This value can also enable and disable double-width printing, so the function needs to ‘know’ what the current status of double-width printing is if it’s not to turn it off when you want it on.

To be honest, the same value also alters whether the printer outputs underlined or bold characters. As it stands, if you set the text to bold using printer.py and then use my additional code to enable double-size printing, you won’t get bold print.

But you’re smart folk – see if you can tweak my code to ‘remember’ the status of bold and underlined printing, and ensure that enabling or disabling double-size printing doesn’t change them.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s