Jan’s Raspberry Pi Advice Machine

Update: Click here for a newer Version, implemented with Arduino.

A few months ago I stumbled  upon Nick’s Blog. He built an Advice Machine based on the credit card sized micro computer „Raspberry Pi“ and some additional hardware. I was totally impressed about his work and driven to build a similar machine on my own. Unfortunatly I never found detailed information like code snippets or wiring pof his work. He just published that he was using the coin acceptor CH-926, the LCD 16×2 character Display and a Sparkfun thermal Printer. I ordered all that parts but left them lying over a year due to not having the time and motivation to get myself into that new matter (I had only a little knowledge about electronics and never worked before with Raspberry’s GPIO interfaces). Then came a day when I helped as a volunteer at my old scout association at the local christmas market. The scouts were selling „Glühwein“ and „Bratwurst“ to get some extra money for their next summer camp. Because it’s more fun to drop money into the cash box instead of giving it out I was trying to find a way to keep people’s glass deposit of 2 Euros in our hands. Just asking for a donation was embarrassing and unimaginative. This was when I remembered the machine as a way to give our customers a little gift for their donation and to put a little smile on their faces.


Here is the partslist of my machine

  • Raspberry Pi Model B 512 MB
  • LM2596 Step-Down Switching Regulator
  • Coin counter CH-926
  • Adafruit 2×16 LCD character display
  • Sparkfun Thermal Printer
  • Raspberry Pi expansion board v2.2
  • Breadboard
  • A couple of jumper wires
  • 1 Resistor (1k Ohm)
  • LED Push Button (6 V)
  • DC 5V power supply with 3A
  • DC Power Jack
  • (Optional: Active Buzzer)

I bought all the parts on Ebay or Amazon. As a case I used a wooden box from a local furnishing store. And here it is in action:

IMAG1017

Wiring


Here is a wiring map of my advice machine.

Advice_Machine

I split the power supply in two circuits – one for the 9V powered parts (Coin counter and thermal printer) and one with 5 Volts for the breadboard which powers the button, the LCD display and even the Raspberry Pi via its GPIO pins. The LM2596 is really easy to use. You connect it to the 9V power source on its input side and take a tension tester on the output side. Now you simply rotate the embedded potentiometer with a screw driver until there are 5V on the output. Thats how it looks inside

IMAG1083 IMAG1082 IMAG1084 IMAG1085

Next step is to „train“ the coin counter. The model CH-926 can identify up to 6 different coins. A tutorial can be found here: Multi coin CH 926 – Sampling My setup sends 1 impulse for 10ct, 2 for 20ct, 5 for 50ct, 10 for 1 Euro, 20 for 2 Euro. All other coins are rejected.


Source Code


Update: Click here for better Arduino version of my advise machine.

The software is written in Python. It was my first experience with that programming language so please forgive me for its lack of elegance. There are excellent code examples for the printer and the LCD provided by adafruit on github. I used the following files for my project:

Here is my additional code. Download the full package here.

Set up Raspberry Pi


I am using a Raspbian Linux. There is not much work to do. Install python image library For image processing I need an additional python library. It can be installed with the following command:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-imaging python-imaging-tk

Setup to start when Raspberry boots I recommend to run the python script in a screen-terminal. Read more about screen.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install screen

Copy the following lines into a new file in /etc/init.d/ named advice.sh

#! /bin/sh
### BEGIN INIT INFO
# Provides: <advice-machine>
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts advice machine
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions
# If you need to source some other scripts, do it here

case "$1" in
 start)
 sudo screen python /usr/share/adafruit/webide/repositories/my-pi-projects/advise_machine/advise_machine.py
 log_begin_msg "Starting my super cool service"
# do something
 log_end_msg $?
 exit 0
 ;;
 stop)
 log_begin_msg "Stopping the coolest service ever unfortunately"

 # do something to kill the service or cleanup or nothing

 log_end_msg $?
 exit 0
 ;;
 *)
 echo "Usage: /etc/init.d/<your script> {start|stop}"
 exit 1
 ;;
esac

Execute the following command:

sudo chmod 755 /etc/init.d/advice.sh
sudo update-rc.d advice.sh defaults

The script should now be started on machine boot.

26 Gedanken zu “Jan’s Raspberry Pi Advice Machine

  1. Moin Jan,
    Amazing tutorial. Really love it. Right now I’m building a Raspberry Pi Photo-Booth in Hamburg.
    I’m using the CH 926 as well.
    Would love share my experiences with you, how could I reach you?

    All the best,
    Franz

    Like

  2. Hallo Jan,
    wie versorgst du deine Raspberry mit Strom?
    Wird das über das expansion board erledigt?
    Und welches Betreibsystem verwendest du? Debian oder Noobs?

    Like

    • Hi Johannes,

      die Stromversorgung mache ich, wie du richtig vermutest, über das Expansion Board. Das sollte man besser nicht so machen, da man die Sicherung des Raspberrys damit übergeht, aber es funktioniert.

      Ich verwendete Raspbian.

      Das war mein erstes Raspberry Projekt und meine ersten Gehversuche mit Python. Im Nachhinein ist mir der hier veröffentlichte Code fast schon etwas peinlich – ich hab sogar schon darüber nachgedacht ihn vom Netz zu nehmen. Er funktioniert zwar tadellos und zuverlässig, aber ich wollte die Maschine irgendwann mal umbauen und den Code neu schreiben.
      Hast du vor eine ähnliche Box zu bauen? Ich würde mich über dein Feedback freuen und mich für deine Umsetzung interessieren.

      Grüße,
      Jan

      Like

      • Morgen Jan,
        ja richtig ich habe überlegt so eine Maschine zu bauen.
        Da du ja meintest das, wenn man die Raspberry über das Expansion Board betreibt die Sicherung übergeht, wäre es nicht besser wenn man anstatt 12V Powe Jack einen 24V Power Jack und dann damit 12V für die Raspberry nimmt und 5V und 3V für die anderen beiden? Somit hätte man jedenfalls wieder die Sicherung der Raspberry. Den Code find ich eigentlich ganz cool. Ich würde es nur anders angehen. Ich würde mir den Betrag der Coin Maschine an Pyhton übergeben lassen und dann mit einer Switch Case Anweisung einen Bestimmten „Betragsbereich“ betretten. Da drin dann mit z.b. random.randrage(1,5) eine Zufallszahl zwischen 1 und 5 ausgeben lassen. Dann wieder ne Switch Case Anweisung mit jeweils dem Spruch.

        Somit hätte man dann je nach höhe des Betrages einen immer wieder veränderten Spruch und es sind nicht immer die selben.

        Was hältst du von dieser Art der Umsetzung?

        Grüße,
        Johannes

        Like

      • Hi,
        die 12V Stromversorgung ist schon richtig und wird für die Stromversorgung vom Thermodrucker und des Coin Acceptors benötigt. Über den Spannungsteiler (LM2596S) leite ich ja aber 5V aus, die man statt direkt ins Breadboard auch über einen gelöteten USB Stecker in den Rasperry leiten könnte. Der Raspberry hat dann wiederum einen eigenen Spannungsteiler, der die 3V und 5V aufs Breadboard stellt.

        Deine Vorgehensweise mit dem Code verstehe ich nicht so ganz. Was genau meinst du mit „Betrag vom Coin Counter an Python übergeben lassen“? Es ist ja so, dass der Coin Counter (je nach Münze) eine festgelegte Anzahl an Impulsen schickt. Er selbst hält also keinen Betrag vor, sondern man muss programmatisch auf dem GPIO zum Coin Counter „lauschen“ und die Impulse verarbeiten. Das kann man durchaus eleganter umsetzen als ich das getan habe!
        Wenn du erst mal einen Münzeinwurf festgestellt und den Münzwert ermittelt hast, dann ist das weitere Vorgehen super simpel. Dann kannst du entweder auf weitere Einwürfe warten oder mit einem weiteren Trigger Event eine Verarbeitung auslösen (z.B. Drücken des Tasters).
        Innerhalb der dann aufgerufenen Funktion ließe sich dann ja problemlos je nach Betrag ein unterschiedliches Set an Sprüchen ansprechen, aus dem dann per Zufall ein Eintrag ausgewählt wird. In meiner Umsetzung wähle ich den Spruch unabhängig vom eingeworfenen Budget aus einer einzigen Liste per Zufall aus.

        Like

      • Ich habe eben festgestellt, dass das YouTube Video, welches die Maschine in Aktion zeigen sollte deaktiviert war. Sollte jetzt wieder gehen.

        Like

  3. Guten Abend !
    Ich muss ein Project starten wo ich Comestero coin selector ( RM5 oder neuer ) verwenden moechte.
    Im kurzem, so etwas sollte geschen:
    – Kunde setzt 2 euro (0.5 / 1 / 2 ) in coin acceptor
    – LCD zeigt jede Wert und ob Summe 2 euro ist, reley sollte anschalten und Tur wird geofnet
    – Keypad und Printer sollte auch implementiert sein.
    Kannst Du mir bitte helfen in Coin acceptor Teil ? . Wie kann ich diese selector an RPI anschlisen ?
    Beste Gruesse !
    Emil

    Like

    • Hi Emil,

      der komplette Sourcecode meiner Maschine steht hier zum Download bereit. Die Umsetzung ist aus meiner heutigen Sicht sehr schlecht und ich überlegte schon, ob ich ihn nicht heraus nehmen soll um mich damit nicht zu blamieren.
      Aber funktionieren tut es jedenfalls (und das erstaunlich gut!).
      Die von dir beschriebenen Funktionen ließen sich da auch relativ leicht einbauen.

      Like

  4. Hallo Jan,

    tolles Projekt! Mich würde interessieren wie genau du den Münzprüfer an den Raspberry angeschlossen hast? Hast du irgendwelche Widerstände verwendet oder den coin output vom Münzprüfer direkt an eine der GPIOs angeschlossen?

    Besten Dank und viele Grüße
    Nils

    Like

  5. Hallo Jan
    Ich bin begeistert von deiner Advice Maschine. Ich will sie für ein gemeinnütziges Projekt nachbauen. Aber ich hab so was noch nie gemacht. Gibt es vielleicht eine detailiertere Beschreibung/Anleitung?? Das wäre schön. Kompliment- tolles Teil.
    Grüße Bernd

    Like

  6. Moin Jan,
    HAMMER Projekt muss ich sagen und mega geil umgesetzt ich bin noch neu auf dem Gebiet und habe mal eine frage

    Erklärung: Ich bin dabei einen Arkade Automaten zu bauen und wollte gerne einen Münzprüfer einbauen, der auch wie bei dir die münzen unterscheidet und auch bei 50Cent einen Impuls entweder an Retro pi abgibt oder ein Relais schaltet.
    Frage: ist so etwas möglich und wenn ja wie welche Zeilen müsste ich dafür herausziehen bzw. ändern und hinzufügen?

    schöne Grüße

    Like

    • Hi Christopher,

      mein hier veröffentlichter Code ist aus heutiger Sicht sehr schlecht und mir fast schon etwas peinlich.

      Wenn du dich davon dennoch inspirieren lassen möchtest, so müsstest du dir einfach die main Methode und den coinEventHandler ansehen.
      Er wird in der main-Methode an das Event gebunden, welches feuert, wenn der CoinCounter Signale sendet.
      Im Prinzip zählt man dann einfach nur die Impulse, indem man sich nach jedem Impuls die Systemzeit merkt (lastImpulse). Ist der letzte Impuls länger als 0,5 Sekunden her, so kann man davon ausgehen, dass der CoinCounter fertig übermittelt hat. Je nach Programmlogik kann man nun die ermittelte Anzahl der Impulse auf das „Guthaben“ aufaddieren. Anschließend setzt man die Anzahl der Impulse für den nächsten Einwurf wieder auf 0.

      Ich hoffe das bringt dich etwas weiter.

      Hier noch eine etwas neuere Implementierung in C#, bei der ich die Maschine mit dem Arduino gebaut habe.

      Like

      • Moin Jan,

        ja das Prinzip habe ich schon verstanden und ich glaubt, dass ich das Prinzip der Programmierung
        auch verstanden habe das einzige ist jetzt das ich nicht weiß wie ich das in mein Retro pi bzw. Raspberry einbringen soll bin mit programmieren nicht so bewandt.

        Würdest du mir dabei helfen, wenn ich darum bitten würde? (Ich möchte es auch gerne lernen)

        ich habe noch mehr großartige Projekte wo ich dieses dann auch noch nutzen würden wollte.

        (Meine E-Mail hast du ja durch den Kommentar Eintrag 😉 )

        schöne Grüße

        Like

      • Du findest für alles ein Tutorial auf YouTube oder Google 😉
        Sorry, aber ich kann dir (schon alleine aus Zeitgründen) keinen privaten Grundkurs Programmieren anbieten :-p

        Like

      • Ok kein Problem werde mich da mal durchkämpfen.
        Kann ich verstehen alles gut trotzdem danke werde mal schauen dein Code beinhaltet ja schon einiges den Rest versuche ich mal so hinzubekommen. 😉

        Schöne Grüße

        Like

  7. Endlich sind meine fehlenden Teile angekommen – alles ist korrekt verkabelt und eingestellt..
    Allerdings kommt das script nicht aus der Initialisierung raus, bis ich die „printer instance“ mit einer # versehe… natürlich geht das der Druckvorgang nicht, weil „printer“ dann nicht definiert ist…
    Muss ich in der Adafruit_Thermal.py etwas bestimmtes ändern? Es kommt mir so vor, das die Initialisierung auf ein Rücksignal wartet (Das ja nicht angeschlossen wird)?!
    Außerhalb des Advice_machine-Skriptes funktioniert der Printer…

    Hat jemand Rat?

    Like

  8. moin wollte jetzt das neue script mal instalieren aber er zeigt mir immer volgende fehlermeldung:
    AdviceMachine:6:10: error: Adafruit_LiquidCrystal.h: No such file or directory

    Mehrere Bibliotheken wurden für „Wire.h“ gefunden
    #include „Adafruit_LiquidCrystal.h“

    Benutzt: C:\Program
    ^~~~~~~~~~~~~~~~~~~~~~~~~~

    compilation terminated.

    exit status 1
    Adafruit_LiquidCrystal.h: No such file or directory

    Weiß da jemand weiter ?
    Schöne Grüße
    Christopher

    Like

  9. Hallo Jan,
    vielen Dank für diese tolle Dokumentation! Das Projekt hat mir sehr gut gefallen und weil du es auch so schön dokumentiert hast, habe ich es letztes Jahr ausgesucht, um in das Thema Raspberry Pi und Python einzusteigen. Also, nachdem ich die ersten LEDs zum blinken gebracht hatte. Elektrovorbildung habe ich auch schon.
    Dann habe ich aber einen anderen Drucker benutzt und alles hat überhaupt nicht mehr gepasst…. und ich hatte ganz schön zu tun, bis es fertig war. 🙂 Das Raspberry Pi Buch vom Herrn Kofler hat sehr dabei geholfen, trotzdem musste noch viel im Internet zusammengesucht werden, bis der Drucker lief.
    Hier ist ein kleiner Film von der Box: https://youtu.be/rUOfjrv6bG8
    Für den nächsten Winter habe ich mir vorgenommen, aus meinem Notizenwust auch so eine schöne Doku zusammenzuschreiben, ich hoffe, die Zeit findet sich.

    Like

Hinterlasse einen Kommentar