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.
Fü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.
Die 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. Die 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.
Prototypen. 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.
Nicht Schlecht 🙂 Hätte dich da evtl. sogar mit Teilen versorgen können ^^ (Hatte 5 Jahre mit Tankstellenkassen und Automaten zu tun )
Hallo Luca,
beim googeln nach „Python Registrierkasse“ bin ich auf deinen Beitrag hier gestossen. Ich bin 44, habe 1992 meine Wunschausbildung als Kommunikationselektroniker FR Informationstechnik beendet und seit dem leider nicht mehr wirklich programmiert. Vor 2 Wochen habe ich mir einen RasPi 2 zugelegt ( wollte ich schon immer mal mit rumbasteln). Da ich mittlerweile die Branche gewechselt habe (meine Frau und ich haben einen EDEKA-Markt in Hamburg), suchte ich nach einem RasPi-Projekt für den Supermarkt. Und hab auch gleich was gefunden: Eine einfache Erfassung von Leergut und Ausgabe eines Leergutbons,der an unseren Kassen eingelöst werden kann. Hintergrund: In unserem Markt wird das Leergut „mit der Hand“ angenommen. Ein Mitarbeiter nimmt das Leergut an,sortiert und verräumt es und stellt an einer alten Registrierkasse einen Bon für den Kunden aus. Das geht schneller als mit jedem Automaten, ist hygienischer, schafft Arbeitsplätze und die Kunden finden es gut,es findet Kommunikation statt.
Aber die Kasse nervt. Die perfekte,einfach zu bedienende Kasse für diese Aufgabe habe ich nie gefunden. Daher soll jetzt mit dem Pi eine Masslösung her.
Die Hardware soll aus einem Pi2, einem Barcode-fahigem Thermoprinter und
einem 7″(oder grösser)Touchscreen bestehen.
Aber softwareseitig sind viele Fragen offen: Ich habe nur rudimentäre Linux-Kenntnisse, und noch keine Ahnung von Python (nach ersten Recherchen scheint’s mir wie eine Mischung aus Pascal und Basic;-).
Das Programm muss nicht viel können: Eine Zehnertastatur und ca.10 Funktionstasten, Berechnung und Ausgabe.
Wäre es möglich, deine Kassen-Software als Vorlage und Beispiel zu verwenden?
Viele Grüße, Stefan
Hallo Stefan,
mein Programm hab ich halbwegs in meinen Anfängen geschrieben. Das würde ich gerne noch einmal neu schreiben, komme aber nicht dazu. So gesehen keine wirklich gute Basis. Ich frage mich allerdings, wozu es ein 7″ Touch sein soll. An sich würde Schlüsselschalter, Scanner, Tastatur, Drucker, LCD und Taster reichen. Beim Drucker habe ich die Adafruit Library genutzt (den Drucker selbst gibt es ja für wenig Geld; kaum ein Drucker unterstützt keine Barcodes).
Den Laserscanner musste ich mir selber zusammenbasteln (zumindest das Kabel für serielle Verbindung). Ansonsten kann man da mit einem Tastatur-Promt arbeiten (dann könnte man auch einen USB-Nummernblock nehmen, müsste entsprechend die Interpretation verarbeiten).
Also am besten doch irgendwie selber machen. MySQL/SQLite (für die Barcode-Datenbank der Flaschen bzw. Kasten/Zuordnung von Pfand und den internen Counter, damit die Kasse jeden Bon als einmalig anerkennt/History). Bei dem einen oder anderen kann ich aber bestimmt unter die Arme greifen.
Beste Grüße
Luca