Registrierkasse mit einem Raspberry Pi

Klar, ein POS kann man kaufen. Die fangen bei 80€ an und enden irgendwo im Nirgendwo. Ob die dann noch alle Funktionen bieten, die man selber gerne hätte? Warum dann nicht gleich selber eine Kasse bauen? Bei diesem Projekt war der Raspberry Pi wirklich das, was er sein sollte: ein Lernobjekt und später ein Produktivsystem.

Irgendwann bestellte ich mir mal einen Thermodrucker für den Raspberry Pi Pi (5V/3V3 bei Rx/Tx beachten), warum weiß ich selbst nicht mehr genau. Zumindest druckte ich in der ersten Zeit dann Bons für Transaktionen bei eBay automatisiert. Klappte gut und da ich im Sommer wieder eine Veranstaltung mit Verkauf hatte, wäre es für das Geld eigentlich schade, nur irgendetwas halbwegs sinnloses zu machen.

Ein Display bildete nachfolgend die Basis für den Aufbau einer ganzen Kasse. Da das Display über I2C angesprochen wurde, musste ich mich damit erst einmal befassen. Ich habe die erste Woche nur geflucht, Freunde und in Foren gefragt, die mir aber auch nicht weiterhelfen konnten. Das Display machte einfach nichts. Am Ende stellte sich heraus: es war gar nicht das Display oder der Controller. Ich hatte mir ein Breakout gebastelt und das mit dem Raspberry Pi mittels Flachbandkabel verbunden. Allerdings war an dem Flachbandkabel der Schnitt nicht sauber gemacht, sodass eine Litze etwas zu lang war und 5V mit SCL verband. Da der Raspi nicht 5V tolerant war, konnte ich glücklich sein, dass er noch lebte, als ich den Fehler fand.

Python ist die präferierte Programmiersprache des Raspberrys (besonders zum Lernen geeignet) – bisher hatte ich nur Erfahrungen in PHP, etwas C und Linux selbst. Das sollte sich ändern, denn die Kasse steht hier heute komplett in Python programmiert. Wenn man keine Erfahrungen in anderen Sprachen hat, ist Python sicher ein guter Einstieg, ansonsten erst einmal eine starke Umgewöhnung. Statt Klammern zu setzten wird hier ein sauberer Programmierstil von vornherein provoziert, indem Blöcke durch Einrücken gruppiert werden. Auch ansonsten gibt es wenig Klammern. Doppelpunkte statt {, for i in range(10) statt for (int i = 0; i < 10; i++) und keine Datentypen für Variablen. Durch die – wie auch beim Arduino – hervorragende Community und Popularität fällt es einem durch viele Beispiele und schnelle Antworten leicht Fortschritte zu machen. Da ich eh eher ein Typ bin, der sich Quellcode anderer anguckt und sich davon die Funktionsweise sowohl des Codeschnipsels, als auch der Sprache selbst ableitet, war es für mich der perfekte Einstieg. Andere mögen Videokurse bei YouTube oder direkt Seminare da bevorzugen.

Zurück zum Projekt:
Nachdem der Fehler mit dem Display behoben war, testete ich einige Zeilen Code. Anzeige lief und der Drucker spuckte mir etwas schwarzes Papier aus. Im Laufe der Zeit kam dann ein weiteres Display dazu, welches für den Kunden dann die Anzeige bilden sollte.
1901954_3960396665747_1632025561_nFür die Eingabe war zuerst eine Folientastatur geplant, dadurch, dass es am Ende zu wenig Tasten und der Druckpunkt für diese Anwendung nicht der richtige waren, wurde die allerdings wieder beiseite gelegt. Für andere Zwecke werde ich die aber wohl noch einsetzen. Ein altes USB-Nummernfeld für einen Laptop, der auch schon auseinandergebaut im Schrank liegt sollte stattdessen Abhilfe schaffen. Da ich keine Tastatureingaben verarbeiten wollte und konnte (dafür muss der Linux-Nutzer angemeldet und das Programm der aktive Prozess sein), blieben am Ende nur noch die Tasten und die Grundplatte davon übrig. Folie lässt sich schlecht löten, sie wurde durch Kurzhub-Taster ersetzt, die dann wieder als Matrix verdrahtet wurden. Die Tasten wurden abgeschliffen und neu beschriftet.

Tastatur ist schön und gut, aber daraus folgert, dass man alles manuell eingeben muss. Die Kasse sollte jedoch für jeden intuitiv und schnell bedienbar sein. Der Bediener sollte nicht erst das gesamte Sortiment mit PLU-Nummern auf einer Liste bekommen (so viele Produkte sind es nicht, trotzdem). Ich versuchte erst Barcode-Erkennung mit einer Webcam, allerdings war der Raspi B für Bildanalyse etwas underpowered. Der Klassiker musste her: ein Laser-Barcode Leser. Bei dem Preis von 16€ sagt man nicht nein. Allerdings gab es auch hier wieder ein paar Komplikationen. Der Scanner kommt mit einem USB-Kabel und arbeitet standardmäßig als Tastatur. Hier ist wieder das gleiche Problem, wie oben beschrieben. Man kann das Gerät aber mit der mitgelieferten System-Barcode-Karte umstellen und so auf seriell switchen. Dann wird man allerdings damit konfrontiert, dass die Pins nicht alle über die USB-Schnittstelle mit laufen (5V/GND/Rx/Tx würden reichen), ebenso auch kein eingebauter USB-Seriell-Wandler vorhanden ist. Wobei ich das bei der Beschreibung der Anschlüsse mit „RS232/USB/KB“ irgendwie hoffte… Also muss man selber ein Kabel mit 10 poligem RJ48-Stecker nach irgendwelchen Datenblättern im Netz konfektionieren. Da die einzige serielle Schnittstelle schon vom Drucker belegt war (wobei ich auch auf die Rückmeldung, ob das Papier alle ist hätte verzichten und stattdessen den Scanner dran hängen können), musste ich eine weitere Schnittstelle mit einem USB-Adapter anklemmen.

1948073_4024578670257_1389120416_nDie Kassenlade ersteigerte ich auch bei eBay – 17€ sind akzeptabel. Alternativ sollte man jedoch auch noch bargeldlos zahlen können. Dafür gibt es NFC-Karten, auf die Geld gebucht wird (im System hinterlegt, die Karte enthält an sich keine Informationen über den Kontostand) und dann als Prepaidkarte kontaktlos auf die Kasse gelegt werden können. Ich habe zwei NFC-Leser ausprobiert, das PN532 kostet zwar etwas mehr, erkennt dafür aber deutlich mehr Karten (auf 13.86 MHz), hat mehr Anschlussmöglichkeiten und Modi. Die Unterstützung durch libnfc ist im späteren Gebrauch auch vorteilhaft.
Der NFC-Reader wurde am Ende unter rückseitig schwarz kaschiertem Plexiglas mit seitlicher Beleuchtung untergebracht. 1975093_4024578870262_977607566_nDie LEDs dafür bestellte ich allerdings nicht aus China, sondern – weil ich endlich fertig werden wollte für den zehnfachen Preis bei Conrad vor Ort (30 superhelle SMD LEDs knapp 10€). Wobei in China hätte ich bei der Menge auch das gleiche bezahlt. Hätte ich von jeder der drei LED-Typen (rot, gelb und grün sind verbaut) 300 genommen, hätte sich der wohl Preis aus China allerdings nicht verändert…

Im Hintergrund werkelt eine MySQL-Datenbank, die die Artikel, Einkäufe und Bezahlvorgänge speichert und während des Betriebes über ein Webinterface Statistiken anzeigt und die Verwaltung der Produkte oder Prepaid-Karten ermöglicht. Anfänglich wurde es mit einer SQLite-Datenbank realisiert, allerdings war die auf dem kleinen Rechner dann für Kassenprogramm, Druckprozess und externer Verwaltung zu häufig mit einem Lock (Datei wird exklusiv von einem Prozess verarbeitet) versehen, sodass ich doch auf ein Datenbanksystem wechseln musste.

10007408_3960396505743_1477727174_nPrototypen. Wie ich sie liebe! Schnell und einfach zusammen gebaut und man sieht grob, wie es später aussehen soll. Mehr soll es doch gar nicht sein. Dafür braucht man weder 3D-Drucker, noch Holz, geschweige eine Säge. Wobei Holz im entferntesten Sinne: ein Pappkarton. Meine liebste Grundlage für einen Prototypen, da jederzeit verformbar, sonst nur Abfall und so noch für etwas weiteres da, somit kostenlos. Mit Klebeband kann man das Gröbste fixieren. Wenn man sich mal verschneidet ist das nicht ganz so tragisch, wie bei Holz oder gar Metall. Die fertige Kasse wurde aus Dibond gefertigt.

Anmerkung: Das Projekt wurde vor einem Jahr fertig gestellt.

*Info: In diesem Beitrag verweisen orangefarbende Links auf Affiliates.
Dieser Eintrag wurde veröffentlicht in Raspberry Pi von Luca Zimmermann. Permanenter Link des Eintrags.

Über Luca Zimmermann

Programmiere seit ich 12 bin und habe einen Hang zur Elektronik seit ich denken kann. Studiere aktuell angewandte Informatik an der Hochschule Hannover. Hier moderiere ich das Forum, warte den Server, bin China-Zwischenhändler und kümmer mich um noch so einiges. Beantworte alle Fragen, sofern möglich, gerne auch im Forum. Fast 24/7 erreichbar.