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.


Inhaltsverzeichnis

Erste Tests am Epson TM-T88P (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-Test

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 ;-)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import serial
 
# receipt printer is connected via serial-to-usb converter
printer = serial.Serial("/dev/ttyUSB0", 19200)
 
inputtext = "abcdefghijklmnopqrstuvwxyz\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n1234567890\n"
 
 
# Normal
printer.write("\x1b\x21\x00")
printer.write(inputtext + "48 Zeichen pro Zeile\n\n\n")
 
# Double Height
printer.write("\x1b\x21\x10")
printer.write(inputtext + "48 Zeichen pro Zeile\n\n\n")
 
# Double Width
printer.write("\x1b\x21\x20")
printer.write(inputtext + "24 Zeichen pro Zeile\n\n\n")
 
 
# Double Width and Double Height
printer.write("\x1b\x21\x30")
printer.write(inputtext + "24 Zeichen pro Zeile\n\n\n")
 
# Reset
printer.write("\x1b\x7B\0")
 
printer.write("------------------------\n\n\n")
 
# Normal
printer.write("\x1b\x21\x01")
printer.write(inputtext + "64 Zeichen pro Zeile\n\n\n")
 
# Double Height
printer.write("\x1b\x21\x11")
printer.write(inputtext + "64 Zeichen pro Zeile\n\n\n")
 
# Double Width
printer.write("\x1b\x21\x21")
printer.write(inputtext + "32 Zeichen pro Zeile\n\n\n")
 
 
# Double Width and Double Height
printer.write("\x1b\x21\x31")
printer.write(inputtext + "32 Zeichen pro Zeile\n\n\n")
 
# Reset
printer.write("\x1b\x7B\0")
 
 
 
# cut & go
printer.write("\x1b\x4A\x9C\x1b\x69")


Weiteres

Weiterführendes

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge