Microprinting

Wechseln zu: Navigation, Suche
Microprinting
Quittungsdrucker zum Drucken der Twitter-Timeline
Status Abgeschlossen
OrganisatorIn Basti, MyJP
InteressentInnen


In diesem Projekt geht es darum, mit einem gewöhnlichen Supermarkt-Quittungsdrucker Dinge auszudrucken. Neben der Twitter-Timeline, die sich für ein solches Projekt fast schon aufzwingt, wollen weitere Ideen folgen. Im Oktober 2012 waren wir mit dem Quittungsdrucker auf dem Hackover (Weiteres dort).


Inhaltsverzeichnis

Epson TM-T88P (Erste Tests am 14.01.2011)

Drucken direkt per Shell

echo "Test" > /dev/lp0

und demnach auch in Python mit dem Workaround

import os
output = "Test per Python!"
os.system("echo " + output + " > /dev/lp0")

funktionierte.

Als Zeichensatz kommt bei diesem Drucker CP437 zum Einsatz. Das heißt: Er kann Umlaute usw. drucken, erwartet sie aber an den gezeigten Positionen in der Zeichentabelle.

Ein
output.encode('cp437','replace')
sorgt für die nötige Umwandlung. In CP437 (dem "IBM Zeichensatz") nicht verfügbare Unicodezeichen werden durch "?" ersetzt.


TEC TRST-53

Der TEC TRST-53 beim Drucken von Twitter-Updates

Diesen Quittungsdrucker konnten wir über einen Digitus DA-70146 Seriell2USB Konverter via pySerial ansprechen.


Minimales Printing-Script

import serial
printer = serial.Serial("/dev/ttyUSB0", 19200)
printer.write("string")

Wenn kein \n am Ende des Strings steht, wartet der Drucker, bis die Zeile voll ist und druckt sie erst dann.


Twitter-Script

Mit folgendem Python-Script konnten wir die Twitter-Timelines periodisch abfragen und Statusupdates direkt ausdrucken:

import serial
import time
import tweepy
 
# Twitter credentials
auth = tweepy.OAuthHandler("<InsertConsumerKeyHere>", "<InsertConsumerSecretHere>")
auth.set_access_token("<InsertAccessTokenHere>", "<InsertAccessTokenSecretHere>")
 
api = tweepy.API(auth)
 
# receipt printer is connected via serial-to-usb converter
printer = serial.Serial("/dev/ttyUSB0", 19200)
 
while True:
	# read savepoint
	file = open("id", "r")
	savepoint = file.read()
	file.close()
 
	timeline = api.friends_timeline()
	timeline.reverse()
 
 
	for status in timeline:
		# assuming that Twitter assigns IDs in ascending order
		if status.id > long(savepoint):
			message = "(%(created)s) %(screenname)s: %(statusmessage)s\n\n" % \ 
				{"created" : status.created_at, 
				"screenname" : status.user.screen_name, 
				"statusmessage" : status.text.encode('cp437', 'replace')}
 
			printer.write(message)
 
			# write savepoint
			file = open("id", "w")
        		file.write(str(status.id))
        		file.close()
 
	# Twitter API allows 350 requests per hour (every ~11 sec should be ok ;)
	time.sleep(11)
TEC TRST-53 twitter receipt.jpg

Damit Statusupdates nicht doppelt gedruckt werden, sichern wir die zuletzt gedruckte Status-ID jeweils in der Textdatei "id". Um zu Beginn die aktuellsten 20 Updates zu bekommen, kann die Datei z.B. die ID 0 (oder eine andere ID, die kleiner als die 20.-aktuellste ID ist) enthalten.


Font-Demo

Folgendes Script druckt die 6 zur Verfügung stehenden Schriftarten aus. Die mit "\x1b" beginnenden Strings sind Steuerzeichen und teilen den Drucker mit, in welcher Schriftart er die folgenden Zeichen drucken soll. Ein Reset auf Standardwerte ist nach dem Drucken einer solchen Zeile sinnvoll, um Verwirrungen zu vermeiden ;-)

Sonstiges

Weitere Features sind z.B. Abschneiden des Bons oder Drucken von Barcodes in verschiedenen Formaten.

# cut & go
printer.write("\x1b\x4A\x9C\x1b\x69")
 
# barcode (JAN13 (EAN) with character code "4029764001807"; see manual page 50 for details)
printer.write("\x1d\x6b\x024029764001807\00")

Weiteres

  • Der Drucker benutzt aktuell die ISO-646-DE Kodierung in den unteren 128 Positionen seines CP437 Zeichensatzes, daher werden die Zeichen @[\]{|}~ als §ÄÖÜäöüß dargestellt.
    • Update Umgestellt: @[\]{|} funktioniert, dafür §ÄÖÜäöüß nicht mehr ...
  • Der TEC TRST-53 ist zumindest soweit baugleich mit einem Citizen CBM 231, sodass dessen Handbuch genutzt werden kann. Darin ist auf Seite 56 visualisiert, worin das aktuelle Problem besteht, und auf den Seiten 21/22 stehen die DIP-Schalter-Stellungen, mit denen Abhilfe geschaffen werden kann.
  • Wollte man doch in Python eine Konvertierung vornehmen, bietet sich
    string.maketrans
    an.
  • In der Standardeinstellung druckt der Drucker 48 Zeichen pro Zeile (Monospace). Andere Fonts können mit dem oben gezeigten Fonttest-Script ausprobiert werden.

Weiterführendes

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Navigation
Sensorik
Werkzeuge