„Zieh ab, wenn’s leuchtet!“ – Mini-Reaktionsspiel mit Arduino
Reaktionsspiele kennt jeder: Ein Signal erscheint – und man muss so schnell wie möglich reagieren. Genau dieses einfache Prinzip greifen wir in diesem Projekt auf und machen daraus ein kleines Arduino-Spiel:
„Zieh ab, wenn’s leuchtet!“
Dabei steht nicht das Gewinnen im Vordergrund, sondern das spielerische Lernen. Anhand eines einfachen Spiels lernst du, wie ein Arduino auf Sensordaten reagiert, wie sich Zeitspannen messen lassen und wie Ausgaben wie LEDs oder ein Piezo-Buzzer angesteuert werden.
Im Mittelpunkt steht eine Gabellichtschranke, deren Signal ausgewertet wird, um eine Reaktion exakt zu erfassen. Ohne komplizierte Schaltungen entsteht so ein Projekt, das sofort verständlich ist und gleichzeitig wichtige Grundlagen vermittelt.
https://youtu.be/deVJiPudjW0
Statt eines trockenen Beispiels entsteht ein kleines Spiel, das direkt Feedback liefert – sichtbar, hörbar und messbar. Ideal für Einsteiger, Workshops oder als kleines Projekt für zwischendurch.
Spielidee & Ablauf
Das Spielprinzip von „Zieh ab, wenn’s leuchtet!“ ist bewusst einfach gehalten, damit der Fokus nicht auf komplizierter Technik liegt, sondern auf dem Zusammenspiel von Sensor, Signal und Reaktion.
Die Grundidee
Ein kleiner Steg steckt in einer Gabellichtschranke und unterbricht dort den Lichtstrahl. Solange der Steg steckt, weiß der Arduino: Das Spiel ist bereit. Sobald der Lichtstrahl wieder frei ist, erkennt der Arduino sofort die Bewegung – ganz ohne mechanischen Kontakt.
Der Clou: Der Spieler darf den Steg erst dann herausziehen, wenn das Startsignal erscheint.
So läuft eine Spielrunde ab - Vorbereitung Der Steg wird in die Gabellichtschranke gesteckt und blockiert den Lichtstrahl. Das Spiel wartet auf den Start. - Spielstart Nach dem Drücken des Starttasters beginnt eine zufällige Wartezeit. Diese Zufälligkeit verhindert, dass man „auf Verdacht“ reagiert. - Startsignal Die LED leuchtet auf (optional zusätzlich ein Piezo-Ton). Ab diesem Moment zählt jede Millisekunde. - Reaktion Der Spieler zieht den Steg so schnell wie möglich aus der Gabellichtschranke. Der Lichtstrahl ist wieder frei – das Signal ändert sich. - Zeitmessung Der Arduino misst die Zeit zwischen Startsignal und dem Moment, in dem der Steg gezogen wurde. - Ergebnis Die gemessene Reaktionszeit wird ausgegeben und kann mit vorherigen Runden verglichen werden.
Was lernst du bei diesem Projekt?
Auch wenn „Zieh ab, wenn’s leuchtet!“ auf den ersten Blick wie ein simples Spiel wirkt, stecken darin mehrere grundlegende Arduino-Konzepte, die in vielen Projekten immer wieder gebraucht werden.
Digitale Signale verstehen und auswerten
Du lernst, wie ein digitales Sensorsignal funktioniert und wie der Arduino erkennt, ob der Lichtstrahl der Gabellichtschranke unterbrochen ist oder nicht. Dabei wird klar, was HIGH und LOW bedeuten und warum Pull-up-Widerstände in der Praxis so wichtig sind.
Sensoren sinnvoll einsetzen
Die Gabellichtschranke dient hier nicht nur als „An/Aus-Schalter“, sondern als präziser Sensor, mit dem sich Bewegungen zuverlässig erfassen lassen – ganz ohne mechanischen Kontakt oder Prellen.
Zeit messen am Arduino
Ein zentraler Bestandteil des Spiels ist die Zeitmessung. Du lernst, wie der Arduino Zeitpunkte speichert und daraus Reaktionszeiten im Millisekunden- oder Mikrosekundenbereich berechnet.
LEDs und Piezo-Buzzer ansteuern
Das Projekt zeigt, wie Ausgaben richtig eingesetzt werden: Eine LED signalisiert den Startzeitpunkt, ein Piezo-Buzzer kann diesen zusätzlich akustisch untermalen. So entsteht ein klares, für den Spieler verständliches Feedback.
Programmabläufe logisch strukturieren
Du baust eine einfache, aber saubere Spiellogik auf:
- Warten auf ein Startsignal - Zufällige Verzögerung - Start der Zeitmessung - Auswertung des Sensors - Ausgabe des Ergebnisses
Diese Struktur lässt sich später auf viele andere Arduino-Projekte übertragen.
Benötigte Bauteile
Für das Reaktionsspiel „Zieh ab, wenn’s leuchtet!“ werden nur wenige, gut verfügbare Komponenten benötigt. Viele davon hast du vielleicht bereits in deiner Bastelkiste.
- Arduino UNO* (alternativ Arduino Nano oder andere AVR-basierte Mikrocontroller) - Gabellichtschranke* (optischer Sensor zur Erkennung des herausgezogenen Stegs) - Drei LEDs mit Vorwiderständen* (rot, gelb, grün – z. B. jeweils 220 Ω) - Piezo-Buzzer* (für akustisches Feedback beim Startsignal) - I2C OLED Display* (z. B. 0,96" mit SSD1306-Controller zur Anzeige der Reaktionszeit) - 400-Pin Breadboard* - Diverse Breadboardkabel* (Dupont-Kabel)
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Alternative Mikrocontroller
Statt dem klassischen Arduino UNO kannst du auch den Arduino Nano, oder einen UNO R4 Minima/WiFi/Nano verwenden. Alle diese Mikrocontroller sind kompatibel mit diesem Beitrag.
v.l.n.r. - Arduino UNO R4 Minima - Arduino Nano ESP32 - Arduino Nano V3 - Arduino Nano R4
Die Gabellichtschranke verstehen – warum wir Interrupts nutzen
Die Gabellichtschranke liefert ein digitales Signal: Ist der Lichtstrahl unterbrochen, ändert sich der Zustand am Ausgang (HIGH/LOW).
Man könnte dieses Signal grundsätzlich an einem normalen digitalen Pin abfragen. Für ein Reaktionsspiel ist das jedoch nicht zuverlässig genug. Der Grund: Der Arduino fragt solche Pins nur in bestimmten Programmabschnitten ab. Währenddessen können andere Aufgaben laufen – kurze Signaländerungen gehen verloren oder werden zeitlich ungenau erfasst.
Da es in diesem Projekt auf Millisekunden ankommt, nutzen wir einen Interrupt.
Interrupts sorgen dafür, dass der Arduino sofort reagiert, sobald sich das Signal der Gabellichtschranke ändert – unabhängig davon, was das Hauptprogramm gerade macht.
Beim Arduino UNO stehen dafür die Interrupt-Pins 2 und 3 zur Verfügung. Nur diese Pins können Signaländerungen hardwareseitig direkt erfassen.
Für das Spiel bedeutet das:
- Der Moment, in dem der Steg gezogen wird, wird exakt erkannt - Die Zeitmessung ist präzise und reproduzierbar - Keine Reaktion geht verloren
Merksatz: Zeitkritische Sensorsignale gehören an Interrupt-Pins.
Welche Interrupt-Pins stehen zur Verfügung?
Nicht jeder Arduino stellt die gleichen Pins für Interrupts bereit. Welche Pins genutzt werden können, hängt vom jeweiligen Mikrocontroller ab.
In diesem Projekt verwenden wir bewusst einen klassischen Arduino UNO, bei dem die Interrupt-Pins klar definiert sind. Wenn du jedoch ein anderes Board einsetzt, solltest du wissen, welche Pins Interrupts unterstützen.
Übersicht: Interrupt-fähige Pins nach Board BoardBenutzbare Digitalpins für InterruptsUNO, Nano, Mini (ATmega328-basierte Boards)2, 3Mega, Mega 2560, Mega ADK2, 3, 18, 19, 20, 21Micro, Leonardo (ATmega32u4)0, 1, 2, 3, 7
Weitere Informationen findest du in der offiziellen Dokumentation unter https://docs.arduino.cc/language-reference/de/funktionen/external-interrupts/attachInterrupt/
LEDs und Piezo-Buzzer ansteuern - einfache digitale Ausgänge
Nachdem wir uns mit der Gabellichtschranke und den Interrupts beschäftigt haben, kümmern wir uns nun um die Ausgabeseite des Spiels. Dazu gehören in diesem Projekt drei LEDs und ein Piezo-Buzzer.
Im Gegensatz zur Lichtschranke sind diese Bauteile unkritisch: Sie werden ganz normal an digitale Pins des Arduino angeschlossen und per Software ein- und ausgeschaltet.
LEDs als visuelles Feedback
Die LEDs dienen im Spiel als klare visuelle Signale:
- Rot → Warten / Sperre - Gelb → Vorbereitung - Grün → Startsignal („Zieh ab!“)
Jede LED wird über einen Vorwiderstand (z. B. 220 Ω) an einen eigenen digitalen Pin angeschlossen. Der Arduino schaltet die LEDs anschließend einfach mit HIGH oder LOW.
Technisch betrachtet passiert hier nichts Besonderes – und genau das ist der Vorteil: Der Fokus liegt nicht auf der Schaltung, sondern auf der logischen Bedeutung der Signale im Spielablauf.
Piezo-Buzzer ansteuern – tone() und noTone()
Auch der Buzzer wird an einen normalen digitalen Pin angeschlossen. Zur Ansteuerung stellt die Arduino-Umgebung die Funktion tone() zur Verfügung.
Piezo Buzzer
Dabei gibt es zwei gängige Varianten, die man kennen sollte:
tone(pin, frequenz, dauer)
Wird zusätzlich eine Dauer angegeben, erzeugt der Arduino einen Ton mit der gewünschten Frequenz für genau diesen Zeitraum.
tone(buzzerPin, 1000, 200);
In diesem Beispiel wird ein Ton mit 1000 Hz für 200 Millisekunden ausgegeben. Nach Ablauf der Zeit stoppt der Ton automatisch – ein zusätzlicher Funktionsaufruf ist nicht notwendig.
Diese Variante eignet sich besonders für:
- kurze Signal- oder Bestätigungstöne - Countdown- oder Startsignale - einfache Soundeffekte tone(pin, frequenz) + noTone(pin)
Wird die Funktion tone() ohne Dauer aufgerufen, läuft der Ton endlos, bis er explizit gestoppt wird.
tone(buzzerPin, 800); // ... noTone(buzzerPin);
Hier beginnt der Ton mit 800 Hz und bleibt aktiv, bis noTone() aufgerufen wird.
Diese Variante ist sinnvoll, wenn:
- der Ton von einer Bedingung abhängt - ein Signal aktiv bleiben soll, bis ein Ereignis eintritt - der Ton manuell beendet werden soll Warum wir D0 und D1 bewusst nicht verwenden
Beim Arduino UNO (und kompatiblen Boards) sind die Pins D0 und D1 etwas Besonderes:
- D0 → RX (Serielle Kommunikation) - D1 → TX (Serielle Kommunikation)
Diese Pins werden unter anderem:
- beim Upload eines Programms - für den seriellen Monitor
verwendet.
RX & TX Pins am Arduino UNO
Würden wir LEDs oder den Buzzer an diese Pins anschließen, könnte es:
- zu Problemen beim Upload kommen - zu unerwartetem Flackern oder Tönen - zu gestörter serieller Ausgabe führen
Daher gilt als Faustregel: D0 und D1 bleiben für die serielle Kommunikation reserviert.
Für LEDs und Buzzer stehen mehr als genug andere digitale Pins zur Verfügung.
OLED-Display am Arduino – Ansteuerung über I2C
Für die Anzeige der Reaktionszeit verwenden wir ein OLED-Display mit I2C-Schnittstelle. Der große Vorteil von I2C: Mit nur vier Anschlüssen lässt sich das Display vollständig betreiben.
Benötigte Anschlüsse
Ein I2C-OLED-Display benötigt lediglich:
- VCC → Versorgungsspannung (5 V oder 3,3 V, je nach Modul) - GND → Masse - SDA → Datenleitung - SCL → Taktleitung
Damit ist das Display schnell angeschlossen und spart wertvolle Pins am Arduino.
I2C-Pins am Arduino UNO
Beim Arduino UNO sind die I2C-Pins besonders komfortabel herausgeführt: zum einen als separate, eindeutig beschriftete Buchsen neben AREF (oben links), zum anderen bei den analogen Pins A4 → SDA und A5 → SCL.
Arduino UNO SCL & SDA Pins
Das bedeutet:
- Du kannst entweder die dedizierten SDA/SCL-Pins verwenden - oder alternativ A4 und A5, falls das besser zu deinem Aufbau passt
Beide Varianten funktionieren gleichwertig.
Schaltung & Verdrahtung – alles zusammengeführt
Nachdem wir alle verwendeten Komponenten einzeln betrachtet haben, setzen wir sie nun zu einer vollständigen Schaltung zusammen. Der Aufbau erfolgt bewusst auf einem Breadboard, sodass keine Lötarbeiten notwendig sind und Änderungen jederzeit möglich bleiben.
BauteilFunktionArduino-PinGabellichtschrankeDOD2 (Interrupt-Pin)VCC5 VGNDGNDLED rotStatus „Warten / Sperre“D10LED gelbStatus „Vorbereitung“D9LED grünStartsignalD8Piezo-BuzzerSignalD11GNDGNDStart-TasterSignalD12GNDGNDOLED-Display (I2C)VCC5 VGNDGNDSDASDA / A4SCLSCL / A5
3D-Druck: Halter für die Gabellichtschranke
Für das Reaktionsspiel „Zieh ab, wenn’s leuchtet!“ habe ich einen kleinen 3D-gedruckten Halter für die Gabellichtschranke entworfen. Der Halter nimmt die Lichtschranke passgenau auf und stellt den herausziehbaren Steg bereit, der den Lichtstrahl zuverlässig unterbricht.
Die STL-Dateien kannst du kostenlos auf Thingiverse herunterladen:
Download auf Thingiverse: https://www.thingiverse.com/thing:7269572
Der Halter ist bewusst minimal gehalten und eignet sich ideal für:
- Steckbrett-Aufbauten - Tests und Prototypen - Workshops und Demonstrationen
Programmierung – Schritt für Schritt zum fertigen Spiel
Nachdem der Aufbau der Schaltung abgeschlossen ist, kümmern wir uns nun um die Programmierung des Arduino. Der Sketch wird dabei nicht auf einmal, sondern bewusst Schritt für Schritt aufgebaut.














