Licht-Memo-Spiel

Bild "Elektronik:LEDMemory-Platte_Fertig.jpg"

Hier gab mal wieder das vorhandene Material den Anstoß für das Projekt. Konkret waren es etwas mehr als 30 Kugeln aus Deo-Rollern, die über einen längeren Zeitraum in unserer Familie angefallen sind.

Bild "Elektronik:LEDMemory-DeoRoller.jpg"

Nachdem die Kugeln aus dem Deoroller entfernt und gereinigt waren, erschienen sie mir als das ideale Objekt für ein Lichtprojekt. Gegenüber Tischtennisbällen, die man auch sehr schön von innen mit LEDs beleuchten kann, sind diese Bälle lichtdurchlässiger und können so von außen beleuchtet werden. Das Licht muss dann ja zwei Schichten Material durchdringen.

Bild "Elektronik:LEDMemory-DeoKugel.jpg"

Inverses Memory-Spiel

Es sollte ein Spiel werden, bei dem man Kugeln auf ein Spielbrett legt, die dann unterschiedlich aufleuchten. Wo keine Kugel liegt, darf auch nichts leuchten.
Also muss das Brett zunächst mal erkennen, wo eine Kugel liegt und wann sich etwas auf dem Brett verändert.
So entwickelte sich die Spielidee des inversen Memory:
Inverserses Memory deshalb, weil hier nicht wie beim klassischen Memory immer mehr Karten vom Tisch genommen werden, wenn Paare gefunden wurden, sondern immer mehr Kugeln auf das Spielfeld gelegt werden.
Am Ende liegen alle 36 Kugeln und zeigen durch die jeweilige Farbe an, welche(r) der Spieler(innen) erfolgreicher war.

Vorüberlegungen und Experimente

Erster Versuch: RGB-LED als Beleuchtung und Sensor.

Bild "Elektronik:LEDMemory-RGB_LED.jpg"
Eine LED kann nicht nur leuchten, sondern auch Licht detektieren. Wie bei einer Solarzelle, wird bei Lichteinfall eine kleine Spannung erzeugt. Genial wäre, bei einer RGB-LED eine der LEDs als Lichtquelle und einer andere als Lichtsensor zu verwenden.
Das has auch tatsächlich bei einer glasklaren Variante funktioniert. Das Licht der grünen LED, was an einem weißen Blatt Papier reflektiert wurde, hat einige Millivolt Spannung an der roten LED im gleichen Gehäuse erzeugt.
Aber leider ist die Spannung nur sehr klein und war auch nur dann messbar, wenn ein gut reflektierendes Objekt vor der RGB-LED lag. Die sehr lichtdurchlässigen Deokugeln ließen sich so nicht zuverlässig erkennen.

Zweiter Versuch: Reflexlichtschranken

Erfolgreich war ich dann mit Reflexlichtschranken vom Typ ITR8307. Auch hier haben die Deokugeln nur wenig Licht reflektiert - verglichen mit einem Blatt Papier oder einem Tischtennisball - es reicht aber aus, die Kugel sicher zu erkennen.

Bild "Elektronik:LEDMemory-ReflexLichtschranke-ITR8307.png"
Allerdings muss ich am Anfang des Spiel mal kurz alle Lichtschranken kalibrieren, um sicher zu sein, dass bei den jeweiligen Lichtverhältnissen alles zuverlässig funktioniert.

Da ich nicht für jede der 36 Lichtschranken einen Mikrocontroller-Eingang verwenden kann, habe ich die Lichtschranken in einer 6x6-Matrix angeordnet. So kann ich immer eine Reihe von 6 Sende-LEDs einschalten und dann die 6 Spalten mit Fototransistoren abfragen. Also brauche ich 6 Output-Pins und 6 (analoge) Input-Pins.

Ballbeleuchtung

Um hier nicht auch noch eine Matrix aufbauen zu müssen, habe ich WS2812 LEDs verwendet, bei denen ich alle 36 Stück in Reihe schalten konnte und so nur einen Mikrocontroller-Ausgang brauchte. "In Reihe schalten" bedeutet hier, dass jeweils der Data-Output-Pin der LED mit dem Data-Input-Pin der folgenden LED verbunden wird. Ein serielles Protokoll sorgt dafür, dass man bei jeder der WS2812 einenen 24bit Farbwert individuelle einstellen kann.
Bild "Elektronik:LEDMemory-WS2812-PL9823.png"
/!\ Achtung, hier habe ich die kompatible PL9823 verwendet, die pin- und protokollkompatibel ist. Allerdings sind aus einem unerfindlichen Grund Rot und Grün im Protokol vertauscht. Verwendet man die WS2812 Arduino-Library, dann gibt man dort für WS2812 die Farben in der Reihenfolge RGB an während es bei der PL9823 GRB ist.

Bild "Elektronik:LEDMemory-WS2812Experiemente4.jpg"
Die Vertiefungen habe ich erfolgreich mit einem Senker erzeugt. Ein passender Kugelfräser wäre noch schöner gewesen, ließ sich aber auf die Schnelle nicht beschaffen.
Das mittige 5mm-Loch nimmt die LED auf, während im 4mm-Loch daneben die Reflexlichschranke ihren Platz hat.

Bild "Elektronik:LEDMemory-WS2812Experiemente1.jpg"

Die Verdrahtung auf der Rückseite verdeutlicht das Konzept der WS2812/PL9823-LEDs. Alle sind parallel an GND und 5V angeschlossen. Die Daten werden von einer LED zur nächsten weitergereicht.

Bild "Elektronik:LEDMemory-WS2812Experiemente3.jpg"

Dank 24bit Farbauflösung ist man nicht auf Rot, Grün oder Blau beschränkt sondern kann auch z.B. Pastellfarben mischen.

Bild "Elektronik:LEDMemory-WS2812Experiemente.jpg"

Spielbrett und Elektronik

Ich habe mich für die Brettgröße 40cm x 40cm entschieden. 30x30 wären aber auch möglich.

Bild "Elektronik:LEDMemory-6x6-Masse.png"

Leider ist es nicht einfach, gutes Holz zu bekommen. Ich habe es dann aber doch mit stabverleimtem Akazienholz aus dem Baumarkt versucht. Die Anleimer für die Hirnholzseiten habe ich mit der Kreissäge aus der Platte herausgeschnitten.

Bild "Elektronik:LEDMemory-WPlatte_verleimen.jpg"

Allerdings musste ich die Oberfläche etwas anschleifen, wodurch sich zeigte, dass die Platte auch schon im Original lackiert oder gebeizt war.
Um einen gleichmäßigen Farbton zu erzielen musste ich am Ende doch alles schleifen und mit einer Lacklasur streichen...

Bild "Elektronik:LEDMemory-Rahmen_verleimen.jpg"

Der Rahmen aus 10mm x 10mm Buchenholzleisten nimmt die Elektronik auf und dient als Sockel.

Löten...

Wer dieses Spiel nachbauen möchte muss viel Spaß am Löten haben. Alles muss 36x gemacht werden. Und alles muss ja auch zuverlässig funktionieren.
Da ich nicht hunderte Kabelenden abisolieren wollte, habe ich mir aus kupferkaschiertem Pertinax-Platinenmaterial lange Streifen gefräst, so dass der Lötaufwand doch deutlich geringer ausfiel.

Bild "Elektronik:LEDMemory-Isolationsfraesen2.jpg"

Bild "Elektronik:LEDMemory-Isolationsfraesen1.jpg"

Bild "Elektronik:LEDMemory-Isolationsfraesen3.jpg"

Bild "Elektronik:LEDMemory-Isolationsfraesen4.jpg"

Da die Platte 18mm dick ist, reicht die Bedrahtungslänge der LEDs und Lichtschranken nicht aus, um bündig in den Vertiefungen für die Kugeln zu sitzen und auf der Rückseite herauszustehen. Also musste ich mit der Oberfräse entsprechende Nuten in die Rückseite der Platte fräsen. Nachbauer können hier natürlich gleich eine dünnere Platte verwenden, um sich diese Arbeit zu ersparen.

Bild "Elektronik:LEDMemory-Platte_mit_Sensorplatinen.jpg"

Bild "Elektronik:LEDMemory-Platte_Verdrahtung.jpg"

Den Arduino musste ich auch etwas versenken, damit alles in den nur 10mm hohen Sockel passt.

Bild "Elektronik:LEDMemory-Platte_Arduino.jpg"


Schaltplan und Software

Das vereinfachte Schaltbild zeigt die Anordnung der Lichtschranken in einer Matrix und die verketteten WS2812/PL9823 LEDs. Da die Sende-LEDs in den Lichtschranken jeweils ca. 30mA brauchen und sechs Stück parallel geschaltet sind, musste ein PNP Transistor pro Reihe verwendet werden um die ca. 180mA zu schalten. Der Arduino verträgt nur maximal 30mA am Ausgang.
Durch das Setzen eines der Steuerausgänge auf LOW wird der PNP Transistor leitend und die entsprechende Reihe mit Reflexlichtschranken aktiv. Nun kann auf den Eingängen A0 bis A5 der analoge Wert ermittelt werden, der von der Menge des reflektierten Lichts abhängt. Ohne Kugel ist der Wert hoch, weil der Fototransitor in der Reflexlichtschranke nur wenig Licht "sieht". Liegt eine Kugel in der Mulde, dann leitet der Fototransitor und der gelesene Wert am analogen Eingang ist etwas niedriger.

Sorry - Kopierfehler  :schock:
Im ursprünglichen Schaltplan gab es in jeder Reihe 22kOhm Widerstände. Das ist natürlich überflüssig, da diese ja alle über die Spaltenleitung miteinander verbunden sind. Es reicht natürlich ein Widerstand pro Spalte.
So etwas passiert, wenn man einfach jede Zeile nach unten kopiert, ohne genau darüber nachzudenken - sorry mein Fehler.
Hier hier die Zeichnung mit der entsprechenden Korrektur:

Bild "LEDMemory-Schematics-Block-Korrektur.png"

Und hier der korrekte Schaltplan:

Bild "LEDMemory-Schematics-Block.png"

Für eine vergrößerte Darstellung den Schaltplan bitte in einem separaten Fenster laden oder lokal abspeichern.


Bild "Elektronik:LEDMemory-Platte_mit_Baellen-Debug.jpg"

Das Spiel wird mit einem 5V 2A Steckernetzteil betrieben. Das sollte man auch beim Debugging einstecken, wenn der Arduino am PC über USB hängt. Der USB-Port kann nicht den benötigten Strom liefern.

Bild "Elektronik:LEDMemory-KugelDunkel.jpg"

Perfekte Ausleuchtung dank transparenter Deo-Kugel.

Bild "Elektronik:LEDMemory-KugelGruen.jpg"

Spielen

Das Spiel hat in der Tat etwas Suchtpotenzial. Durch die schöne Haptik der Bälle und die pastellfarbenen Kugeln auf dem Spielbrett haben wir immer wieder eine weitere Runde gespielt.

Nach dem Einstecken des Steckernetzteils werden alle LEDs erst einmal auf rot geschaltet um anzuzeigen, dass es noch nicht losgeht.
/!\ Wichtig: Zu diesem Zeitpunkt dürfen noch keine Kugeln auf dem Spielbrett liegen - sonst geht die Kalibrierung schief.

Jetzt werden die Lichtwerte aller Reflexlichtschranken kalibiriert und die 18 Blinklicht-Paare zufällig auf die Felder verteilt.

Hierbei gibts dann z.B.:

/!\ Hinweis: Während des Spiels nicht die Hände auf Felder legen, in denen noch keine Kugel liegt. Das kann dazu führen, dass die Hand als Kugel erkannt wird und das Spiel durcheinander kommt.

Downloads

Fräsdaten der Platinen (optional)
LEDMemory-Platine.zip

Arduino Sketch (incl. Testversionen und WS2812-Library)
DeoMemory-V3.zip



2. Version mit Lochstreifenplatinen


Diese Version entstand aus einer vorher gelb gebeizten Multiplexsperrholzplatte. Diesmal habe ich die Vertiefungen mit einer CNC-Fräse erstellt.
Dazu entstand ein 3D-Entwurf in Onshape.

Bild "Elektronik:LEDMemory_MPX_Onshape.png"

Die exportierte STL Datei habe ich dann mit EstlCAM in G-Code umgewandelt und mit einem Kugelfräser ausgefräst.
Die Platte hat eine Kantenlänge von 30cm - die Vertiefungen rücken daher auch etwas näher zusammen als bei der originalen Version des Spiels.
Ich habe ein Vielfaches von 2.54mm als Abstand gewählt, damit die Abstände der Lochstreifen-Platine genau passen.

So sieht das Fräsergebnis aus:

Bild "Elektronik:LEDMemory_MPX_1.jpg"

Leider war auch diese Platte zu dick, so dass ich auf der Rückseite etwas wegfräsen musste. Auch das geht natürlich sehr sauber auf der CNC-Fräse:

Bild "Elektronik:LEDMemory_MPX_2.jpg"

Der rückseitige Rahmen besteht nun aus einer Leiste, in die ich eine Stufe gefräst habe, so dass der Deckel bündig eingesetzt werden kann.

Bild "Elektronik:LEDMemory_MPX_3.jpg"

Die Verbindungen der Sensoren bilden Lochstreifenplatinen mit drei Leiterbahnen. Nur für die erste Reihe habe ich vier Leiterbahnen verwendet, so dass ich zusätzlich noch eine 5V Leiterbahn habe, an die die sechs PNP Transistoren angeschlossen sind.

Bild "Elektronik:LEDMemory_MPX_4.jpg"

Bild "Elektronik:LEDMemory_MPX_5.jpg"

Bild "Elektronik:LEDMemory_MPX_6.jpg"

Auf jeden Streifen habe ich sechs Reflexlichtschranken gelötet, so dass sie durch die Löcher in die Vertiefungen hineinreichen. Außerdem erhält jede der Lichtschranken einen 150 Ohm Widerstand auf der LED-Seite, die nachher mit Silberdraht senkrecht zu den Platinen verbunden werden.

Bild "Elektronik:LEDMemory_MPX_7.jpg"

Die Basis-Anschlüsse der Transistoren werden dann mit den Ausgängen 2...7 des Arduinos verbunden und die Ausgänge der Reflexlichschranken, die auf jeder Platine zusammengefasst sind, an A0..A5 des Arduinos.

Bild "Elektronik:LEDMemory_MPX_8.jpg"

Dann kann man die Neopixel-LEDs verlöten und einbauen.
Hier die Vorgehensweise in Schritten:

Schritt 1: Unterbrechungen herstellen


Bild "Elektronik:LEDMemory_MPX_10.jpg"

Schritt 2: Drahtbrücken einlöten und Position der LEDs markieren


Bild "Elektronik:LEDMemory_MPX_11.jpg"

Schritt 3: LEDs einstecken


Bild "Elektronik:LEDMemory_MPX_12.jpg"

Schritte 4:LEDs in die Löcher stecken und ausrichten


Bild "Elektronik:LEDMemory_MPX_13.jpg"

Schritt 5: LEDs verlöten


Bild "Elektronik:LEDMemory_MPX_14.jpg"