Dienstag, 3. November 2015

Roulette mit dem Raspberry Pi bauen


Roulette mit dem Raspberry Pi bauen

Author D.Selzer-McKenzie

Video: https://youtu.be/9h6VQx2e1KQ

Hier zeige ich Ihnen, wie Sie mit wenig Material einen Roulettekessel mit Raspberry Pi bauen können. Ich zeige es hier mit 12-Roulettezahlen, wenn Sie einen Kessel mit 37 Roulettezahlen bauen wollen, können Sie das ganz einfach entsprechend erweitern.

Der Sinn des Spiels besteht darin, vorauszusagen, welches Feld eine Kugel, die sich im Roulettekessel im Kreis dreht, in welchem Fach  zu liegen kommt. Es gibt unterschiedliche Roulette-Varianten einer abweichenden Anzahl Fächer. Für unser Spiel werden

 Da der des Spieles hinsichtlich der runden Anordnung der LEDs Breadboard recht mühsam ist und nicht gerade schön aussieht,  habe ich mich für eine Frontplatte mit einer darunterliegenden Platine  entschieden. Auf der Frontplatte aus Hartschaum, z.B. für Werbetafeln oder Displays benutzt werden, kann man wunderbar passende Löcher an beliebigen Stellen bohren und ist nicht an die festen Rasterabstände einer Lochrasterplatin gebunden. Sie können die Platte mit Distanzhülsen oben auf der Platine platzieren, das sieht echt gut aus.


Frontplatte für das Roulette-Spiel


Platine und Frontplatte für das Roulette-Spiel


Maße der Frontplatte für das Roulette-Spiel


Zusammengebaut sieht das Spiel und Platine so aus. Am Rand können Sie den Wannenstecker erkennen , über den die Verbindung zum Raspberry Pi über ein Flachkabel hergestellt wird.

Benötigte Bauteile>


12 x LEDs 5mm je 4 rote, grüne und gelbe


12 x Widerstand 330 (gelb,lila,braun)


1 x Widerstand 10K (braun,schwarz,orange)


1 x Taster


1 x 26-poliger Wannenstecker + 1 x Stiftleiste


1 x Platine ca. 8,5 x 9,5 cm

1 x Hartschaumplatte, gelb oder andere Farbe (500x250x3)


4 x Distanzhülsen 20mm


4 x Gewindeschrauben M3/30mm + 4 x Mutter

Das Roulettespiel soll so funktionieren, dass bei einem Druck auf den Taster die einzelnen LEDs im Kreislauf nacheinander angezeigt werden, wobei die Geschwindigkeit des Wechsels (ganz wie im echten Roulette) nach und nach geringer wird.

Der Schaltplan:


 

Das Programm: Zu Beginn ist das Initialisierungsprogramm durchzuführen.

Die Initialisierungen:


Anhand der Initialisierungswerte für Port A und Port B können Sie sehen, dass alle Pins auf GPB7 als Ausgänge arbeiten. Der Taster zum Starten des Roulettespiels muss sich natürlich an einem Eingang befinden, und deswegen lautet der Initialisierungswert für Port B auch 0x80, wo das MSB auf 1 ist.

Werfen wir zunächst einen Blick auf die showLED, die die Aufgabe =er LED-Ansteuerung innehat. Sie nimmt einen Wert zwischen 1 und 12  entgegen, der der anzusteuernden LED entsprechen soll. Da LEDs über beide Ports verteilt sind, müssen wir sie natürlich getrennt ansteuern. Da immer nur eine LED aufleuchten soll, verhält es sich mit der Ansteuerung recht einfach. Wir müssen lediglich in Abhängigkeit des übergebenen Wertes eine 1 an die betreffende LED-Position schieben, was über den Schiebeoperator << erfolgt. Haben wir es z.B. mit einem übergebenen Wert von 1 zu tun, muss die erste LED aufleuchten und es darf zu keiner Schiebeoperation kommen. Aus diesem Grund wird in Zeile 21 immer 1 subtrahiert und erst danach mit dem Ergebnis die Schiebeoperation durchgeführt. In Zeile 22 wird Port A angesteuert und B über Zeile 23.

Wie funktioniert das mit der Aussteuerung von Port B ?

Wenn der Wert, der zur Anzeige gebracht werden soll, z.B. 10 beträgt, dann ist er quasi 2 Positionen zu weit links für Port A, was bedeutet, dass dieser Port nichts zur Anzeige bringt. Es muss aber die zweite LED von Port B angesteuert werden. Über das Schieben um 8 Positionen nach rechts in Zeile 23 hole ich mir für Port B die binäre 1 an die zweite Position, damit dort die LED aufleuchtet.

Kommen wir noch zur roll-Funktion, die den die anzuzeigenden Werte aus der main-Funktion enthält und dann die showLED-Funktion aufruft. Die Aufrufreihenfolge ist wie folgt:


Über die for-Schleife in Zeile 28 werden 10 LED-Runden simuliert, wobei am Ende eine LED an bleibt. Wenn der Rundenzähler grösser als 4 ist, wird über das Erhöhen der Verzögerungszeit in Zeile 29 die rotierende (drehende) Kugel langsamer, was in Zeile 32 über die sleep-Funktion zum Tragen kommt. Jede einzelne LED wird über die innere for-Schleife in Zeile 30 angesteuert, wobei der Aufruf der showLED-Funktion in Zeile 31 mit der Übergabe der Laufvariablen j erfolgt. Irgendwann aber mal muss die ermittelte Zufallszahl angezeigt werden bzw. die betreffende LED kontinuierlich leuchten. Das geschieht im letzten  Schleifendurchlauf, wenn der Wert der KLaufvariablen i der äusseren for-Schleife gleich 9 ist. Hat jetzt die innere Schleiufe bzw. deren Laufvariable j, die die LEDs ansteuert, den gleichen WEert wie die generierte Zufallszahl, wird die Funktion über die return-Anweisung verlassden. Die LED, die gerade an war, leuchtet weiterhin. Kommen wir letztlich zur main-Funktion, die alles ins Rollen bringt.


Innerhalb der Endlosschleife wird der Wert von Port B abgefragt, an dem der Taster anbgeschlossen ist. Über die bitweise ODER-Verknüpfung mit dem Ewert 0x80 wird das MSB herausgefiltert. Wenn dieser Wert beim Drücken der Taste ungleich 0 wird, erfolgt in Zeile 42 eine Generierung einer Zufallszahl zwiwchen 1 und 12 (oder wenn Sie verändern, zwichen 1 und 36). Über die Zeile 43 kommt es dann zum Aufruf der roll-Funktion mit der Übergabe eben dieser Zufallszahl, und das Spiel kann beginnen. Bei Neustart einfach wieder den Taster drücken. Falls das Programm über Tastenkombination Strg-C beendet wird, wird über die Zeilen 47 und 48 die noch leuchtende LED ausgeschaltet.

Entwickeln Sie doch ein richtig grosses Roulettespiel mit z.B. drei oder mehr MSC23017, sodass mindestens 48 Leuchtdioden zur Ansteuerung zur Verfügung stehen. Der Taster könnte man dann über einen andere GPIO-Pin anschliessen.






















Keine Kommentare:

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.