Moorhuhn-Lasertag

Auf der Suche nach einer Idee für ein eigenes Arduino-Projekt stieß ich eines Tages auf ein selbst gebautes Lasertag, bei dem einige Fotowiderstände auf einem Rad befestigt waren, das sich drehte. Daraufhin kam mir die Idee, statt eines Rades ein Moorhuhn zu malen und somit das altbekannte Moorhuhn-Computerspiel zu einem Moorhuhn-Lasertag umzugestalten.

Man sollte das Spiel nicht nur alleine, sondern auch zu zweit spielen können. Ursprünglich dachte ich dabei an einen roten und einen grünen Laserpointer, jedoch war ich mir nicht sicher, ob sich das an dem Fotowiderstand unterscheiden ließe. Theoretisch wäre denkbar, dass der grüne Laser (höhere Energie) mehr Elektronen (nicht nur aus dem Valenzband, sondern auch aus tiefer liegenden Energieniveaus) ins Leitungsband hebt und der Widerstand des Fotowiderstands daher stärker sinkt. In der Praxis hat sich gezeigt, dass auch bei einem roten Laser bereits genügend Elektronen ins Leitungsband gehoben werden, um den Widerstand gegen null sinken zu lassen. Ausschlaggebend war allerdings schon vor diesen Überlegungen der Preis von etwa 40€ für einen grünen Laser, der mir für ein Freizeitprojekt bei Weitem zu hoch war (auch wenn sich die Gesamtkosten des Projekts schließlich auf über 40€ beliefen, sollten zumindest die einzelnen Teile deutlich günstiger sein).

Grundsätzlich war damit jedoch die Idee geboren, dass Moorhühner über einen Fotowiderstand mithilfe eines Laserpointers abgeschossen werden sollten. Außerdem sollten sich die Moorhühner bewegen können und daher auf einem Servo-Motor montiert werden. Eine zusätzliche LED sollte anzeigen, welches Moorhuhn abgeschossen werden soll bzw. noch am Leben ist. Dann war nur noch ein LC-Display mit drei Tastern zu ergänzen, um ein paar Einstellungen zur Bewegungshäufigkeit und zur Reaktionszeit vornehmen zu können. Außerdem sollte man zwei verschiedene Spielmodi auswählen können:

1) „Klassisch“: Wie beim klassischen Moorhuhn kommt ein Huhn vorbeigeflogen und dieses soll abgeschossen werden. Die Punktzahl wird dabei umso größer, je schneller man das Moorhuhn abschießt.

2) „Kill ‚em all“: Hier sollten am Anfang alle Moorhühner leben und möglichst schnell abgeschossen werden. Diese Variante hat es zwar ins Auswahlmenü am Anfang geschafft, jedoch habe ich diese Variante nicht programmiert bekommen, weshalb ich stattdessen bei Auswahl dieses Spiels eine kleine Fehlermeldung (Error 404: Game not found) programmiert habe. Wer sich in den Code einarbeiten möchte und diese Spielvariante realisieren kann, der ist herzlich dazu eingeladen!

Zu guter Letzt sah ich für das Panorama-Bild, auf dem die Moorhühner montiert werden sollten, einen Holzrahmen vor, hinter dem eine LED-Kette angebracht werden sollte, damit das Ganze richtig cool aussehen würde.

Also ran ans Werk!

Materialbedarf:

  • Panoramabild
  • Holz für den Rahmen und für die Befestigung der Moorhühner sowie des Arduinos und der kleinen Platine
  • Arduino
  • Für die Moorhühner: 6 LDR, 6 LED (plus Vorwiderstand), 6 Servos
  • 1 Piezo-Summer für akustisches Feedback
  • Für die Anzeige: 1 I²C LC-Display, 3 Taster und 4 Widerstände
  • LED-Kette
  • 1x 9V-Akku für den Arduino, 4x 1,5V-Batterien für die Servos (der Arduino könnte nicht genügend Strom liefern – spätestens, wenn tatsächlich anfangs alle sechs Moorhühner gleichzeitig flattern sollen), 1x 12V-Batterie für die LED-Kette
  • 3 Schiebeschalter, um die einzelnen Spannungsquellen bequem anschalten zu können
  • 1 Relais, um die LED-Kette (12V) mit dem Arduino (max 5V) schalten zu können
  • jede Menge Kabel

Schaltplan:

Leider stellt Fritzing nicht alle Bauteile so bereit, wie ich sie verwendet habe. Das LC-Display lässt sich über I²C ansprechen und hat eigentlich vier Zeilen und 20 Spalten. Die LED-Kette habe ich durch die drei LEDs auf der der rechten Seite ersetzt. Da ich die Anschlüsse des Relais nicht richtig erkennen konnte, habe ich die Kabel einfach irgendwie an das Bauteil angeschlossen – es ist natürlich klar, dass die 12V-Batterie und die LED-Kette an die eine Seite des Relais angeschlossen werden (an den NO (normally open) Kontakt) und dass das Relais auf der anderen Seite mit 5V und GND sowie mit der Steuerleitung verbunden werden muss. Anstatt des Relais hätte ich auch einen passenden Transistor verwenden können, aber da ich noch nie selbst mit einem Relais gearbeitet hatte, wollte ich diese Lösung gerne ausprobieren.

Auch wenn das Ergebnis recht komplex und unübersichtlich wurde, sind alle Teile der Schaltung eigentlich einfach aufgebaut, wie man am Schaltplan erkennen kann. Auf zwei Dinge möchte ich etwas genauer eingehen.

Bei den Fotowiderständen für die Moorhühner habe ich immer zwei Stück in Reihe geschaltet. Da beide LDR auf die Umgebungshelligkeit reagieren und vom gleichen Typ sind, werden sie unabhängig von der Umgebungshelligkeit im Raum etwa den gleichen Widerstandswert annehmen, sodass sich die Spannung immer gleichmäßig auf die Widerstände aufteilen wird und in A0 am Anfang immer ein Wert von etwa 512 eingelesen wird. Zur Sicherheit wird der genaue Wert in A0 am Anfang eingelesen und als Referenzwert gespeichert. Wenn nun der LDR zwischen 5V und A0 mit dem Laserpointer getroffen wird, dann wird sein Widerstand geringer, sodass an diesem LDR auch weniger Spannung abfällt. Entsprechend fällt am LDR zwischen A0 und GND mehr Spannung ab und in A0 wird ein größerer Wert eingelesen. Wenn anders herum der LDR zwischen A0 und GND mit dem Laserpointer getroffen wird, dann sinkt sein Widerstand und die Spannung, die an diesem LDR abfällt. Das heißt, dass auch der Wert, der in A0 eingelesen wird, geringer wird. Somit lässt sich mithilfe des analogen Eingangs A0 entscheiden, ob Moorhuhn 1 oder 2 getroffen wurde. Analog habe ich das für Moorhuhn 3 und 4 sowie Moorhuhn 5 und 6 realisiert.

Aufgrund der vielen Komponenten konnte ich für die Taster nicht 3 digitale Eingänge opfern. Glücklicherweise wusste ich von meinem LCD-Shield, wie man das Einlesen der Taster mit nur einem analogen Eingang realisieren kann – nämlich, indem man sie parallel zu verschieden großen Widerständen schaltet. Wenn kein Taster gedrückt ist, wird in A3 die Spannung eingelesen, die an der Summe der drei Widerstände abfällt. Wenn jedoch ein Taster gedrückt wird, wird der dazu parallel geschaltete Widerstand überbrückt und in A3 wird die Spannung eingelesen, die an der Summe der zwei anderen Widerstände abfällt. Damit lässt sich aus dem eingelesenen Wert in A3 rekonstruieren, welcher Taster gedrückt wurde. Dazu gibt es einen „Vorwiderstand“ zwischen 3,3V und A3, damit kein Kurzschluss entsteht, falls jemand auf die Idee kommt, alle drei Taster gleichzeitig zu drücken. Im Übrigen habe ich bei Taster1 330 Ohm, bei Taster2 660 Ohm und bei Taster3 1000 Ohm verwendet. Das hat zur Folge, dass bei gleichzeitigem Drücken von Taster1 und Taster2 die gleiche Wirkung erreicht wird wie beim Drücken von Taster3. Da das kombinierte Drücken von Tastern bei mir nicht vorgesehen ist, war mir das egal, aber es wäre in anderen Situationen natürlich zu beachten… Im Übrigen habe ich die Taster an eine eigene Spannungsversorgung mit 3,3 Volt angeschlossen, damit ein konstanter Strom gewährleistet ist und nicht irrtümlich ein Signal eingelesen wird. Das passierte nämlich vorher, als ich die Taster ebenfalls an den 5V Ausgang angelegt hatte. Ich weiß nicht, warum es so war, aber durch das Zusammenspiel mit dem LC-Display und den Fotowiderständen wurde ständig das Drücken irgendeines Tasters registriert, obwohl das definitiv nicht der Fall war…

So, das war genug an Theorie zur Schaltung. Hier kommt der Code, der hoffentlich schon ausführlich genug kommentiert ist. Für die Moorhühner habe ich eine eigene Klasse geschrieben, die die Aktionen enthält, die die Moorhühner ausführen können. Der Code enthält zudem noch ein paar auskommentierte Notizen und Ideen zu meinen kläglichen Versuchen, das Spiel „Kill ‚em all“ zu realisieren…

Moorhuhn_Lasertag.ino

Bibliothek für die Moorhühner (zu speichern unter …/Arduino/libraries/Moorhuhn/):
Moorhuhn.h
Moorhuhn.cpp

Und so sieht es dann in Aktion aus:

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.