Escape Game: JoyCode: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Jens.potthoff@stud.hshl.de (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(269 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 5: Zeile 5:
{| class="wikitable"
{| class="wikitable"
|-
|-
|'''Autoren:''' || [[Benutzer: jens.potthoff@stud.hshl.de|Jens Potthoff]] [[Benutzer: Lauraine.tsamo-tazanou2@stud.hshl.de | Lauraine Tsamo-Tazanou]]'''
|'''Autoren:''' || [[Benutzer: jens.potthoff@stud.hshl.de|Jens Potthoff]] [[Benutzer: Mohammed-Yassine.Houari@stud.hshl.de| Mohammed Yassine Houari]]'''
|-
|-
|'''Betreuer:'''|| [[Benutzer:Marc Ebmeyer| Marc Ebmeyer]]'''
|'''Betreuer:'''|| [[Benutzer:Marc Ebmeyer| Marc Ebmeyer]]'''
|-
|-
|}
|}
 
[[Datei:Joycode_Image.png|rechts|thumb|1080px|Hardware-Prototyp des Escape-Games „JoyCode“]]


== Einleitung ==
== Einleitung ==
Im Rahmen des Fachpraktikums im Modul Angewandte Mechatronik des Studiengangs Business and Systems Engineering werden Rätsel entwickelt, die in etwa fünf Minuten lösbar sind und in ein übergeordnetes Escape-Game integriert werden. Das Projekt „JoyCode“ ist ein solches Escape-Rätsel, das über zwei Joysticks gesteuert wird. Ziel ist es, beide Joysticks in zufällig generierte Zielpositionen zu bewegen, wobei jeder Joystick eine eigene Zielposition hat. Neben den Joysticks befindet sich eine LED-Statusanzeige, die den Abstand zur jeweiligen Zielposition in Echtzeit visualisiert. In drei aufeinanderfolgenden Runden müssen die Joysticks korrekt positioniert und die jeweilige Zielstellung für drei Sekunden gehalten werden. Nach jeder erfolgreich abgeschlossenen Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Nach drei Runden ergibt sich so ein vollständiger Zahlencode, der für den Zugang zum nächsten Rätsel benötigt wird. Die Rückmeldung erfolgt über RGB-LEDs: Rot signalisiert eine große Abweichung, Gelb zeigt Annäherung, Grün steht für fast korrekt, und blinkendes Grün markiert die exakte Zielposition, die dann für drei Sekunden gehalten werden muss. Das Rätsel besteht aus den Joysticks, den RGB-LEDs zur visuellen Rückmeldung, dem LC-Display zur Anzeige der freigeschalteten Ziffern sowie den drei aufeinanderfolgenden Runden, deren erfolgreiche Bewältigung den Zahlencode freischaltet.  
Im Rahmen des Fachpraktikums im Modul Angewandte Mechatronik des Studiengangs Business and Systems Engineering werden Rätsel entwickelt, die in etwa fünf Minuten lösbar sind und in ein übergeordnetes Escape-Game integriert werden. Das Projekt „JoyCode“ ist ein solches Escape-Rätsel, das über zwei Joysticks gesteuert wird. Ziel ist es, beide Joysticks in zufällig generierte Zielpositionen zu bewegen, wobei jeder Joystick eine eigene Zielposition hat. Neben den Joysticks befindet sich eine LED-Statusanzeige, die den Abstand zur jeweiligen Zielposition in Echtzeit visualisiert. In vier aufeinanderfolgenden Runden müssen die Joysticks korrekt positioniert und die jeweilige Zielstellung für drei Sekunden gehalten werden. Nach jeder erfolgreich abgeschlossenen Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Nach vier Runden ergibt sich so ein vollständiger Zahlencode, der für den Zugang zum nächsten Rätsel benötigt wird. Die Rückmeldung erfolgt über RGB-LEDs: Rot signalisiert eine große Abweichung, Gelb zeigt Annäherung, Grün steht für fast korrekt, und blinkendes Grün markiert die exakte Zielposition, die dann für drei Sekunden gehalten werden muss. Das Rätsel besteht aus den Joysticks, den RGB-LEDs zur visuellen Rückmeldung, dem LC-Display zur Anzeige der freigeschalteten Ziffern sowie den vier aufeinanderfolgenden Runden, deren erfolgreiche Bewältigung den Zahlencode freischaltet.  




'''Schwierigkeitslevel'''
'''Schwierigkeitslevel'''<br/>
 
Fortgeschritten.
Fortgeschritten.
Das Rätsel erfordert eine gute Hand-Auge-Koordination, da beide Joysticks gleichzeitig und präzise bewegt werden müssen. Je nach eingestelltem Toleranzbereich und den angezeigten Hinweisen auf dem Display kann der Schwierigkeitsgrad leicht angepasst werden.
Das Rätsel erfordert eine gute Hand-Auge-Koordination, da beide Joysticks gleichzeitig und präzise bewegt werden müssen. Je nach eingestelltem Toleranzbereich und den angezeigten Hinweisen auf dem Display kann der Schwierigkeitsgrad leicht angepasst werden.




'''Lernziele'''
'''Lernziele'''<br/>
 
Das Lernziel des Rätsels besteht darin, zwei Steuerungen gleichzeitig präzise zu bedienen und ihre Bewegungen gezielt zu koordinieren. Durch die farbliche Rückmeldung der LEDs wird das Verständnis für Positionsänderungen und deren Auswirkungen geschult. Das Rätsel fördert somit die Hand-Auge-Koordination, Feinmotorik sowie die Fähigkeit, Rückmeldungen richtig zu interpretieren und entsprechend darauf zu reagieren.
Das Lernziel des Rätsels besteht darin, zwei Steuerungen gleichzeitig präzise zu bedienen und ihre Bewegungen gezielt zu koordinieren. Durch die farbliche Rückmeldung der LEDs wird das Verständnis für Positionsänderungen und deren Auswirkungen geschult. Das Rätsel fördert somit die Hand-Auge-Koordination, Feinmotorik sowie die Fähigkeit, Rückmeldungen richtig zu interpretieren und entsprechend darauf zu reagieren.




'''Bezug zum BSE Studium'''
'''Bezug zum BSE Studium'''<br/>
 
Für die Umsetzung des Projekts werden mechatronische Kenntnisse praktisch angewendet, insbesondere im Bereich Sensorik, Softwareintegration und Systemsteuerung. Das Projekt erfordert zudem die Verknüpfung der Hardware- und Softwarekomponenten sowie die Umsetzung von Echtzeit-Rückmeldungen über die LEDs. Dabei wird die Fähigkeit gefördert, von einer Idee über die Planung und Konzeption ein funktionierendes Hardware-/Software-System zu entwickeln, das praktisch innerhalb des übergeordneten Escape-Game genutzt werden kann. Die Planung, Programmierung und Steuerung mechatronischer Systeme wird erlernt, die Zusammenhänge zwischen Hardware und Software erlernt.
Für die Umsetzung des Projekts werden mechatronische Kenntnisse praktisch angewendet, insbesondere im Bereich Sensorik, Softwareintegration und Systemsteuerung. Das Projekt erfordert zudem die Verknüpfung der Hardware- und Softwarekomponenten sowie die Umsetzung von Echtzeit-Rückmeldungen über die LEDs. Dabei wird die Fähigkeit gefördert, von einer Idee über die Planung und Konzeption ein funktionierendes Hardware-/Software-System zu entwickeln, das praktisch innerhalb des übergeordneten Escape-Game genutzt werden kann. Die Planung, Programmierung und Steuerung mechatronischer Systeme wird erlernt, die Zusammenhänge zwischen Hardware und Software erlernt.


Zeile 38: Zeile 35:
! ID !! Inhalt !! Prio !! Ersteller !! Datum !! Geprüft von !! Datum
! ID !! Inhalt !! Prio !! Ersteller !! Datum !! Geprüft von !! Datum
|-
|-
| 1  || Das System muss die gleichzeitige Bedienung von zwei Joysticks ermöglichen. || Hoch || Potthoff || 02.10.2025 || ||  
| 1  || Das System muss die gleichzeitige Bedienung von zwei Joysticks ermöglichen. || Hoch || Potthoff || 02.10.2025 || Potthoff || 05.01.2026
|-
|-
| 2  || Für jeden Joystick muss eine LED-Statusanzeige den Abstand zur jeweiligen Zielposition in Echtzeit anzeigen. || Hoch || Potthoff || 02.10.2025 || ||
| 2  || Für jeden Joystick muss eine LED-Statusanzeige den Abstand zur jeweiligen Zielposition in Echtzeit anzeigen. || Hoch || Potthoff || 02.10.2025 || Potthoff  || 05.01.2026
|-
|-
| 3  || Beide Joysticks müssen gleichzeitig für mindestens 3 Sekunden an der Zielposition gehalten werden, damit eine Ziffer freigeschaltet wird. || Hoch || Tsamo-Tazanou || 02.10.2025 || ||
| 3  || Beide Joysticks müssen gleichzeitig für mindestens 3 Sekunden an der Zielposition gehalten werden, damit eine Ziffer freigeschaltet wird. || Hoch || Houari || 02.10.2025 || Potthoff || 05.01.2026
|-
|-
| 4  || Das Rätsel muss aus drei aufeinanderfolgenden Runden bestehen, wobei in jeder Runde eine Ziffer der dreistelligen PIN freigeschaltet wird. || Hoch || Tsamo-Tazanou || 02.10.2025 || ||
| 4  || Das Rätsel muss aus vier aufeinanderfolgenden Runden bestehen, wobei in jeder Runde eine Ziffer der dreistelligen PIN freigeschaltet wird. || Hoch || Houari || 02.10.2025 || Potthoff  || 05.01.2026
|-
|-
| 5  || Die RGB-LEDs müssen den Abstand zur Zielposition farblich darstellen: Rot = weit entfernt, Gelb = Annäherung, Grün = nahe, blinkendes Grün = Zielposition erreicht. || Hoch || Potthoff || 02.10.2025 || ||
| 5  || Die RGB-LEDs müssen den Abstand zur Zielposition farblich darstellen: Rot = weit entfernt, Gelb = Annäherung, Grün = nahe, blinkendes Grün = Zielposition erreicht. || Hoch || Potthoff || 02.10.2025 || Potthoff  || 05.01.2026
|-
|-
| 6  || Das LC-Display muss die freigeschalteten Ziffern sowie optionale Startinformationen anzeigen. || Hoch || Potthoff || 02.10.2025 || ||
| 6  || Das LC-Display muss die freigeschalteten Ziffern sowie optionale Startinformationen anzeigen. || Hoch || Potthoff || 02.10.2025 || Potthoff || 05.01.2026
|-
|-
| 7  || Ein Start-Button muss das Rätsel initialisieren und alle Werte zurücksetzen. || Hoch || Tsamo-Tazanou || 02.10.2025 || ||
| 7  || Ein Start-Button muss das Rätsel initialisieren und alle Werte zurücksetzen. || Hoch || Houari || 02.10.2025 || Potthoff || 05.01.2026
|-
|-
| 8  || Ein Reset-Button muss den aktuellen Spielstand löschen und das Rätsel in den Ausgangszustand versetzen. || Mittel || Tsamo-Tazanou || 02.10.2025 || ||
| 8  || Ein Reset-Button muss den aktuellen Spielstand löschen und das Rätsel in den Ausgangszustand versetzen. || Mittel || Houari || 02.10.2025 || Potthoff  || 05.01.2026
|-
|-
| 9  || Ein Lösungs-Button muss auf dem LC-Display den korrekten Zahlencode anzeigen, falls das Rätsel nicht gelöst wurde. || Hoch || Tsamo-Tazanou || 02.10.2025 || ||
| 9  || Ein Lösungs-Button muss auf dem LC-Display den korrekten Zahlencode anzeigen, falls das Rätsel nicht gelöst wurde. || Hoch || Houari || 02.10.2025 || Potthoff ||05.01.2026
|-
|-
| 10 || Die Zielpositionen müssen zu Beginn jeder Runde zufällig generiert werden. || Hoch || Potthoff || 02.10.2025 || ||
| 10 || Die Zielpositionen müssen zu Beginn jeder Runde zufällig generiert werden. || Hoch || Potthoff || 02.10.2025 || Potthoff  || 05.01.2026
|-
|-
| 11 || Der Toleranzbereich der Zielpositionen muss so eingestellt sein, dass das Rätsel lösbar, aber herausfordernd bleibt. || Hoch || Potthoff || 02.10.2025 || ||
| 11 || Der Toleranzbereich der Zielpositionen muss so eingestellt sein, dass das Rätsel lösbar, aber herausfordernd bleibt. || Hoch || Potthoff || 02.10.2025 || Potthoff || 05.01.2026
|-
|-
| 12 || Das Gehäuse muss aus 3D-gedrucktem Material bestehen und die Elektronik sicher und stabil aufnehmen. || Mittel || Tsamo-Tazanou || 02.10.2025 || ||
| 12 || Das Gehäuse muss aus 3D-gedrucktem Material bestehen und die Elektronik sicher und stabil aufnehmen. || Mittel || Houari || 02.10.2025 || Houari || 05.01.2026
|-
|-
| 13 || Die maximale Außenabmessung des Gehäuses darf die Größe eines Standard-Schuhkartons nicht überschreiten. || Hoch || Potthoff || 02.10.2025 || ||
| 13 || Die maximale Außenabmessung des Gehäuses darf die Größe eines Standard-Schuhkartons nicht überschreiten. || Hoch || Potthoff || 02.10.2025 || Houari  || 05.01.2026
|-
|-
| 14 || Die Spieldauer pro Rätsel darf 5 Minuten nicht überschreiten. || Hoch || Potthoff || 02.10.2025 || ||
| 14 || Die Spieldauer pro Rätsel darf 5 Minuten nicht überschreiten. || Hoch || Potthoff || 02.10.2025 || Potthoff  || 05.01.2026
|-
|-
| 15 || Das Rätsel ist ohne zusätzliche digitale Geräte vollständig spielbar. || Mittel || Potthoff || 02.10.2025 || ||
| 15 || Das Rätsel ist ohne zusätzliche digitale Geräte vollständig spielbar. || Mittel || Potthoff || 02.10.2025 || Potthoff  || 05.01.2026
|-
| 16 || Die zufällige Initialisierung der Zielposition darf nicht der Standardposition des Joysticks entsprechen. || Hoch || Potthoff || 02.10.2025 || Potthoff || 05.01.2026
|-
|-
|}
|}


== Funktionaler Systementwurf ==
== Funktionaler Systementwurf ==
Die beiden Joysticks dienen dazu, vordefinierte Zielpositionen zu erreichen. Jeder Joystick hat eine eigene Zielposition für X- und Y-Achse, die zu Beginn jeder Runde zufällig festgelegt wird. Die Joysticks müssen so bewegt werden, dass die Zielpositionen innerhalb eines definierten Toleranzbereichs erreicht und für drei Sekunden gehalten werden. Sobald beide Joysticks korrekt positioniert sind, wird eine Ziffer auf dem LC-Display freigeschaltet. Die RGB-LEDs liefern dabei zusätzlich Echtzeit-Feedback über die aktuelle Abweichung von der Zielposition.
Der Aufbau des Projekts JoyCode erfolgt in einem kompakten, rechteckigen Gehäuse, dessen Frontplatte alle Bedienelemente übersichtlich anordnet, wie Abbildung 1 zeigt. Im oberen mittleren Bereich befindet sich das LC-Display, das als zentrale Anzeige dient. Es zeigt den jeweils aktuellen Fortschritt, also die freigeschaltete Ziffern des Zahlencodes während des Rätzels an. Direkt unterhalb des Displays sind drei Taster angeordnet: links der Start-Button (grün) zum Initialisieren des Rätzels, in der Mitte der Reset-Button (rot) zum Zurücksetzen des aktuellen Fortschritts und rechts der Lösungs-Button (schwarz), der bei Bedarf jeweils die nächste Ziffer auf dem Display anzeigt.
Im unteren Bereich der Frontplatte sollen die beiden Joysticks symmetrisch angeordnet – einer links, einer rechts. Diese dienen als Haupteingabegeräte, über die die Zielpositionen gesteuert werden. Oberhalb jedes Joysticks wird eine RGB-LED positioniert, die den aktuellen Abstand zur jeweiligen Zielposition farblich visualisiert: Rot signalisiert eine große Abweichung, Gelb zeigt eine Annäherung und Grün markiert die korrekte Position.
Links neben dem Display soll sich der Anschlussbereich für die Stromversorgung bzw. den PD-Port befinden, über den das System mit Energie versorgt wird. Abbildung 1 zeigt das Designkonzept des Projekts.
Im Inneren des Gehäuses ist die gesamte Elektronik auf einer Trägerplatte montiert. Der Arduino Uno R3 fungiert als zentrale Steuereinheit und ist so platziert, dass alle Verbindungskabel zu den Joysticks, LEDs, Tastern und dem Display möglichst kurz gehalten werden.
Das Gehäuse selbst soll so konstruiert werden, dass alle Komponenten bündig in die Frontplatte eingelassen sind. Die Bedienelemente ragen leicht hervor, während die RGB-LEDs durch Öffnungen sichtbar bleiben. Im Inneren sollen Abstandshalter und Podeste dafür sorgen, dass alle Bauteile auf derselben Höhe liegen und mechanisch stabil montiert sind.
Die Technische Umsetzung der Software bzw. der Programmablauf zeigt Abbildung 2: Programmablaufplan JoyCode.
[[Datei:Konzept_zeichnung_JoyCode.png|450px|Abb. 01: Technischer Systementwurf]]
Abb. 01: Konzeptzeichnung JoyCode
[[Datei:Programmablaufplan_JoyCode.png|450px|Abb. 01: Technischer Systementwurf]]
Abb. 02: Programmablaufplan JoyCode
<br><br><br>


== Technischer Systementwurf ==
== Technischer Systementwurf ==
Für das Projekt zeigt die folgende Abbildung den technischen Systementwurf. In diesem sind alle elektronischen Bauteile des sowie deren Verdrahtung mit dem Arduino dargestellt.


Für das Projekt zeigt die folgende Abbildung den technischen Systementwurf. In diesem sind alle elektronischen Bauteile sowie deren Verdrahtung mit dem Arduino dargestellt.


[[Datei:Technischer_Systementwurf_JoyCode.jpg|750px|Abb. 01: Technischer Systementwurf]]
<div style="display: flex; align-items: flex-start; gap: 20px;">


Abb. 01: Technischer Systementwurf
<!-- Bild links -->
<div style="flex: 1;">
[[Datei:Technischer Systementwurf2 JoyCode.png|750px|Abb. 03: Technischer Systementwurf]]
</div>
 
<!-- Tabelle rechts -->
<div style="flex: 1;">
 
{| class="wikitable"
! Komponente !! Pin(s) !! Funktion / Farbe
|-
| Joystick 1 || A3 || X-Position
|-
| Joystick 1 || A2 || Y-Position
|-
| Joystick 2 || A0 || X-Position
|-
| Joystick 2 || A1 || Y-Position
|-
| LED 1 || Pin 6 || PWM – Blau
|-
| LED 1 || Pin 3 || PWM – Grün
|-
| LED 1 || Pin 5 || PWM – Rot
|-
| LED 2 || Pin 10 || PWM – Blau
|-
| LED 2 || Pin 11 || PWM – Grün
|-
| LED 2 || Pin 9 || PWM – Rot
|-
| Taster Start || Pin 13 || Digital
|-
| Taster Solution || Pin 8 || Digital
|-
| Taster Reset || Pin 12 || Digital
|-
| LCD || SCL || I2C Clock
|-
| LCD || SDA || I2C Data
|}
</div>
</div>
Abb. 03: Technischer Systementwurf
<br><br>


== Komponentenspezifikation ==
== Komponentenspezifikation ==
'''Mikrocontroller-Board – Arduino Uno R3'''<br />
Der Arduino Uno R3 dient als zentrale Steuereinheit und ist mit dem ATmega328P ausgestattet. Es bietet ausreichend Anschlussmöglichkeiten, um alle für das Rätsel benötigten Komponenten unterzubringen.
'''LC-Display – Joy-it SBC-LCD16x2 Display-Modul'''<br />
Das LC-Display zeigt die freigeschalteten Ziffern des Zahlencodes an. Dank des integrierten I²C-Moduls kann es direkt über die SDA- und SCL-Pins (A4 und A5) des Arduino Uno R3 angeschlossen werden. Zusätzlich benötigt das Display eine Spannungsversorgung (VCC) und Masse (GND).
'''Joystick – KY-023 Joystick-Modul (2 Stück)'''<br />
Die Joysticks dienen zur Eingabe von X/Y-Koordinaten. Die Anschlüsse für die vertikale und horizontale Achse werden an zwei analoge Eingänge des Arduino angeschlossen. Die integrierte Tasterfunktion wird nicht verwendet.
'''RGB-LED – Iduino SE010 RGB-LED-Modul (2 Stück)'''<br />
Die RGB-LEDs geben visuelles Feedback über die Abweichung von der Zielposition. Die Vorwiderstände sind bereits integriert. Jede LED wird über drei digitale PWM-Pins des Arduino für die Farben Rot, Grün und Blau angesteuert.
'''Taster (3 Stück)'''<br />
Die Taster dienen als Bedienelemente (Starten, Zurücksetzen, Lösung). Sie werden jeweils zwischen Masse (GND) und einen digitalen Eingang des Arduino angeschlossen, um deren Zustand (0 oder 1) abzufragen.
'''Gehäuse und Montage'''<br />
Alle Komponenten werden auf ein 3D-gedrucktes Gehäuse montiert, wobei die Kabelverbindungen verborgen werden. Um sicherzustellen, dass alle Bauteile die richtige Höhe im Gehäuse haben, werden zusätzliche Podeste für die einzelnen Komponenten gedruckt. Die sichtbaren Teile der Komponenten ragen dabei durch passgenaue Ausschnitte des Gehäuses nach außen.


== Materialliste ==
== Materialliste ==


Für die Realisierung des Projekts werden verschiedene Hardwarekomponenten benötigt, die in Tabelle 2 aufgeführt sind. Die Kernkomponenten sind das Mikrocontroller-Board Arduino Uno R3 als zentrale Steuereinheit, zwei Joystick-Module als Eingabegeräte, RGB-LEDs mit je 3 220 Ohm Widerstände für die visuelle Rückmeldung sowie ein LC-Display zur Anzeige des Zahlencodes. Ergänzt wird die Schaltung durch Taster zur Steuerung und ein Netzteil zur Stromversorgung.
Für die Realisierung des Projekts werden verschiedene Hardwarekomponenten benötigt, die in Tabelle 2 aufgeführt sind. Die Kernkomponenten sind das Mikrocontroller-Board Arduino Uno R3 als zentrale Steuereinheit, zwei Joystick-Module als Eingabegeräte, RGB-LEDs für die visuelle Rückmeldung sowie ein LC-Display zur Anzeige des Zahlencodes. Ergänzt wird die Schaltung durch Taster zur Steuerung und ein Netzteil zur Stromversorgung.


{| class="wikitable"
{| class="wikitable"
Zeile 96: Zeile 182:
! style="font-weight: bold;" | Beschreibung
! style="font-weight: bold;" | Beschreibung
! style="font-weight: bold;" | Datenblatt
! style="font-weight: bold;" | Datenblatt
! style="font-weight: bold;" | Abbildung
|-
|-
|1
|1
Zeile 104: Zeile 189:
|Mikrocontroller-Board
|Mikrocontroller-Board
|[https://funduinoshop.com/elektronische-module/weitere/mikrocontroller/funduino-uno-r3-mikrocontroller-arduino-kompatibel Arduino Uno R3]
|[https://funduinoshop.com/elektronische-module/weitere/mikrocontroller/funduino-uno-r3-mikrocontroller-arduino-kompatibel Arduino Uno R3]
|Zentrale Steuereinheit des Systems mit ATmega328P.
|Zentrale Steuereinheit mit ATmega328P.
|[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Datenblatt Arduino Uno]
|[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Datenblatt Arduino Uno]
|[[Datei:ArduinoDue.png|125px|mini|links|Abb. 03: Arduino Uno]]
|
|-
|-
|2
|2
Zeile 124: Zeile 209:
|RGB LED
|RGB LED
|[https://www.conrad.de/de/p/iduino-se010-rgb-led-modul-1-st-1616253.html Iduino SE010 RGB LED-Modul]
|[https://www.conrad.de/de/p/iduino-se010-rgb-led-modul-1-st-1616253.html Iduino SE010 RGB LED-Modul]
|Visuelles Feedback über Abweichung von der Zielposition.
|Visuelles Feedback über Abweichung von der Zielposition. Die Widerstände sind bereits montiert.
|[https://asset.conrad.com/media10/add/160267/c1/-/en/001616253ML01/bedienungs-und-sicherheitshinweise-1616253-iduino-se010-rgb-led-modul-1-st.pdf Datenblatt RGB-LED-Modul]
|[https://asset.conrad.com/media10/add/160267/c1/-/en/001616253ML01/bedienungs-und-sicherheitshinweise-1616253-iduino-se010-rgb-led-modul-1-st.pdf Datenblatt RGB-LED-Modul]
|
|
Zeile 134: Zeile 219:
|LC-Display
|LC-Display
|[https://www.conrad.de/de/p/joy-it-sbc-lcd16x2-display-modul-6-6-cm-2-6-zoll-16-x-2-pixel-passend-fuer-entwicklungskits-raspberry-pi-arduino-1503825.html Joy-it SBC-LCD16x2 Display-Modul]
|[https://www.conrad.de/de/p/joy-it-sbc-lcd16x2-display-modul-6-6-cm-2-6-zoll-16-x-2-pixel-passend-fuer-entwicklungskits-raspberry-pi-arduino-1503825.html Joy-it SBC-LCD16x2 Display-Modul]
|Anzeige der freigeschalteten Ziffern des Zahlencodes.
|Anzeige der freigeschalteten Ziffern des Zahlencodes. Das LC-Display kann direkt an die SDA- und SCL-Pins (A4 und A5) des Arduino Uno R3 angeschlossen werden.
|[https://asset.conrad.com/media10/add/160267/c1/-/de/001503825ML01/bedienungs-und-sicherheitshinweise-1503825-joy-it-sbc-lcd16x2-display-modul-66-cm-26-zoll-16-x-2-pixel-passend-fuer-entwicklungskits-raspberry-pi-arduino.pdf LCD16x2 Display-Modul]
|[https://asset.conrad.com/media10/add/160267/c1/-/de/001503825ML01/bedienungs-und-sicherheitshinweise-1503825-joy-it-sbc-lcd16x2-display-modul-66-cm-26-zoll-16-x-2-pixel-passend-fuer-entwicklungskits-raspberry-pi-arduino.pdf LCD16x2 Display-Modul]
|
|
Zeile 144: Zeile 229:
|Taster
|Taster
|[https://www.reichelt.de/de/de/shop/produkt/entwicklerboards_-_taster-modul-282680 Taster]
|[https://www.reichelt.de/de/de/shop/produkt/entwicklerboards_-_taster-modul-282680 Taster]
|Bedienelemente zur Steuerung der Anwendung.
|Bedienelemente zur Steuerung des Rätzels (starten, zurücksetzen, Lösung).
|[https://cdn-reichelt.de/documents/datenblatt/A300/SE046.pdf Taster-Modul]
|[https://cdn-reichelt.de/documents/datenblatt/A300/SE046.pdf Taster-Modul]
|
|
Zeile 154: Zeile 239:
|9V Netzteil
|9V Netzteil
|[https://funduinoshop.com/werkstatt/stromversorgung/netzteile/netzteil-fuer-mikrocontroller-9v-1a 9V Netzteil]
|[https://funduinoshop.com/werkstatt/stromversorgung/netzteile/netzteil-fuer-mikrocontroller-9v-1a 9V Netzteil]
|Stromversorgung des Mikrocontrollers und der Module.
|Stromversorgung des Mikrocontrollers.
|
|
|-
|-
|7
|6x
|
|
|
|
|220 Ohm Widerstand
|
|
|Für die Implementierung der RGB-LEDs.
|40,19 €
|
|
|
|
|
|
|
|-
|}
= Regelungstechnische Theorie =
Das im Rahmen des Fachpraktikums entwickelte Escape-Rätsel „JoyCode“ lässt sich aus regelungstechnischer Sicht als ein geschlossener Regelkreis mit Mensch-Maschine-Interaktion beschreiben. Ziel des Systems ist es, zwei Joysticks in vorgegebene, zufällig generierte Zielpositionen zu bewegen.
''' Regelungstechnische Einordnung '''
Bei dem System handelt es sich um einen geschlossenen Regelkreis, da eine kontinuierliche Rückführung der Istwerte erfolgt und der Nutzer anhand dieser Rückmeldung Korrekturen vornimmt. Der Mensch übernimmt dabei die Funktion des Reglers, während die technische Umsetzung (Joystick, Mikrocontroller, LEDs und Display) die Regelstrecke bildet.
''' Führungs- und Regelgrößen '''
Die Führungsgröße (Sollwert) wird durch die vom System zufällig generierten Zielpositionen der beiden Joysticks definiert. Für jeden Joystick existiert eine eigene Zielposition.
Die Regelgröße (Istwert) ist die aktuell gemessene Position der Joysticks, die über analoge Eingangswerte erfasst und vom Mikrocontroller verarbeitet wird.
Die Regelabweichung ergibt sich aus der Differenz zwischen Soll- und Istwert und dient als Grundlage für die visuelle Rückmeldung an den Nutzer.
''' Regler und Stellgröße '''
Der Regler ist in diesem System der Nutzer selbst. Mithilfe der visuellen Rückmeldung interpretiert er die aktuelle Regelabweichung und passt die Position der Joysticks entsprechend an.
Die Stellgröße ist somit die manuelle Bewegung der Joysticks durch den Nutzer, mit der versucht wird, die Regelabweichung zu minimieren.
''' Regelstrecke und Rückführung '''
Die Regelstrecke umfasst die Joysticks als Eingabeelemente, den Mikrocontroller zur Auswertung der Positionsdaten sowie die Ausgabeelemente zur Rückmeldung.
Die Rückführung erfolgt über RGB-LEDs, die den Abstand zur Zielposition visualisieren:
* Rot signalisiert eine große Abweichung
* Gelb zeigt eine Annäherung an die Zielposition
* Grün steht für eine geringe Abweichung
Diese Rückmeldung schließt den Regelkreis, indem sie dem Nutzer kontinuierlich Informationen über den aktuellen Systemzustand liefert.
''' Mehrstufiger Regelprozess '''
Das Rätsel besteht aus vier aufeinanderfolgenden Runden, die jeweils einen eigenen Regelkreis mit neu generierten Sollwerten darstellen. Nach jeder erfolgreich abgeschlossenen Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Erst nach Abschluss aller vier Runden ergibt sich ein vollständiger Zahlencode, der den Zugang zum nächsten Escape-Rätsel ermöglicht.
''' Toleranzbereich und regelungstechnische Bewertung '''
Aufgrund der hohen Sensibilität der verwendeten Joysticks ist es in der Praxis nicht möglich, eine exakt punktgenaue Zielposition dauerhaft zu erreichen. Aus regelungstechnischer Sicht wird dieses Problem durch die Einführung eines Toleranzbereichs um den Sollwert gelöst.
Der Toleranzbereich definiert einen zulässigen Wertebereich, innerhalb dessen die Regelabweichung als ausreichend klein betrachtet wird. Befindet sich der Istwert innerhalb dieses Bereichs, gilt der Sollwert als erreicht.
''' Toleranzwert als Totzone '''
Regelungstechnisch kann der Toleranzbereich als sogenannte Totzone (Deadband) interpretiert werden. Innerhalb dieser Totzone führt eine geringe Regelabweichung zu keiner weiteren Regelaktion, da das System diesen Zustand als stabil bewertet.
Die Totzone verhindert:
* ständiges Nachregeln durch minimale Abweichungen,
* unruhiges Verhalten des Reglers (Nutzer),
* sowie das Scheitern der Aufgabe durch nicht vermeidbares Sensorrauschen.
== Regelkreis ==
[[Datei:JoyCode Regelkreis.png|mini|center|720px|Abb. 04: Regelkreis für das Projekt]]
Die dargestellte Abbildung beschreibt den Regelkreis des Projekts JoyCode unter Einbeziehung des Nutzers als aktiven Regler. Die Führungsgröße (w) bildet eine zufällig generierte Zielposition, die mit der aktuellen Regelgröße (x), der tatsächlichen Joystick-Position, verglichen wird. Aus diesem Vergleich resultiert die Regelabweichung (e), die im System als euklidische Distanz berechnet und dem Nutzer über die Rückführung mittels RGB-LEDs visuell vermittelt wird. Der Mensch fungiert hierbei als Regler, der basierend auf der wahrgenommenen Abweichung eine Handbewegung als Stellgröße (u) ausführt, um die Regelstrecke (die Joystick-Mechanik) zu beeinflussen. Motorische Unruhe wirkt dabei als Störgröße (z) auf den Prozess ein, während der Prozess-Ausgang (y) die finale Position für die Logikprüfung bereitstellt.
<br><br><br>
= Umsetzung (HW/SW) =
== Hardware Umsetzung ==
=== Platinendesign und Erstellung ===
Auf der Platine müssen keine zusätzlichen Widerstände oder andere elektronische Bauteile untergebracht werden. Diese Teile sind bereits auf den internen Platinen der einzelnen Komponenten vorhanden, zum Beispiel bei den RGB-LEDs.
Deshalb muss keine eigene Platine gefräst oder gebohrt werden.
Die elektronischen Bauteile brauchen nur einen gemeinsamen Masseanschluss und einen gemeinsamen Anschluss für die Spannungsversorgung. Daher wird eine Lochplatine bzw. Streifenrasterplatine verwendet.
Auf der Platine werden acht Masseanschlüsse und drei Spannungsanschlüsse benötigt. Der 5-V-Pin des Arduino wird an eine Seite der Platine geführt. Die dafür genutzten Lötpunkte werden miteinander verbunden, so entsteht eine gemeinsame 5-V-Schiene. Genauso wird der Masseanschluss des Arduino an eine andere Seite der Platine geführt. Die acht Masseanschlüsse werden mit dieser GND-Schiene verbunden.
Abbildung 05 zeigt das vorgehen.
[[Datei:Platinenkonzept Joycode.png|mini|center|420px|Abb. 05: Platinenkonzept]]
=== Testen der Hardwarekomponenten ===
[[Datei:Komponenten Tests Joycode.jpg|mini|left|420px|Abb. 06: Steckbrettaufbau]]
Um die einzelnen Komponenten zunächst zu testen, werden diese auf einem Steckbrett aufgebaut (siehe Abbildung 7) und mit einer ersten Simulink-Software in Betrieb genommen.
Um die Komponenten korrekt nutzen zu können, wird zunächst ihre internen Wertebereiche und mögliche offsets überprüft.
Joystick: Die analogen Eingänge lieferten Werte im Bereich von 0 bis 1023 (10 Bit). In der Neutralstellung (Mitte) beträgt der Wert ca. 512. Aufgrund kleiner Fertigungstoleranzen tritt ein Offset von bis zu ±30 auf, der berücksichtige werden muss. Beim Testen ist aufgefallen, dass der Wertebereich von 0 bis 1023 die vollen Stellungsgrenzen des Joysticks durch den Mittelstellungs-Offset nicht exakt abbildet, was bei der Auswertung berücksichtigt werden muss.
RGB-LEDs: Das eingesetzte Modul Iduino SE010 ist eine SMD-RGB-LED. Für den korrekten Anschluss ist zunächst die Polung zu beachten. Es handelt sich um eine Common-Cathode-LED, bei der der gemeinsame Anschluss mit GND verbunden ist. Die einzelnen Farbkanäle Rot (R), Grün (G) und Blau (B) werden über digitale Ausgänge bzw. PWM-Signale (0–255) angesteuert.
Die LED besitzt somit drei Farbanschlüsse zur Farbmischung sowie einen gemeinsamen Masseanschluss. Um die Werte von den Joysticks als Eingabe für die RGB-LEDs zu nutzen, müssen diese auf einen wert von 0 bis 255 normiert werden. Da das Ziel darin besteht, die RGB-LED abhängig von der Entfernung des Joysticks zur Zielposition einzufärben, zeigt sich, dass es schwierig ist, einen geeigneten Wertebereich für die LED zu definieren. Besonders verschiedene Grüntöne lassen sich sehr genau unterscheiden, sodass ein „echtes“ klares Grün erst angezeigt werden sollte, wenn die Zielposition tatsächlich erreicht wird. Andernfalls sollte die LED deutlich gelb oder rot leuchten.
LC-Display: Das Display wird zunächst über die Library LiquidCrystal_I2C konfiguriert und anschließend ein eigener Simulink-Block mit dem IO Device Builder erstellt, der Eingänge für die Steuerung und das Schreiben von Zeichen bereitstellt.
Die Idee, dynamisch veränderbaren Text anzuzeigen, je nach runde wurde folgendermaßen umgesetzt, kann am besten mit vier Eingänge realisiert werden:
Zwei Eingänge, die jeweils eine Liste von uint8-Werten übergeben – eine Liste für die erste Zeile (0,0) und eine für die zweite Zeile (0,1). Die Zahlen werden entsprechend der ASCII-Tabelle in Zeichen konvertiert.
Dritter Eingang: Eine Zahl (0, 1, 2, 3, 4), um den aktuellen Fortschritt zu überprüfen (z. B. wie viele Zahlen bereits freigeschaltet wurden) oder den kompletten Zahlencode anzuzeigen.
Vierter Eingang: Ein Boolean-Signal, das überprüft, ob die Joystick-Position der Zielposition entspricht. Nur wenn dies zutrifft, wird der Text auf dem LC-Display aktualisiert.
Taster: Die Signale der drei Taster werden mit Digital Input-Blöcken aufgenommen, wobei der PinMode auf Pull-Up gesetzt wird, um stabile Eingabewerte zu gewährleisten. Die Taster Funktionieren einwandfrei.
Um alle PWM Ausgänge nutzen zu könne muss in den Einstellungen in Simulink unter Solver "Treat each discrete rate as a separate task" deaktiviert werden.
Das Testen der Hardwarekomponenten hat gezeigt, dass alle Komponenten funktionieren. Abbildung 6 zeigt die provisorische Testverkabelung und Abbildung 7 das Simulink-Modell zum Testen.
[[Datei:Simulink Ansterung Joystick LED Joycode.png|mini|center|720px|Abb. 07: Simulink-Modell zum testen]]
=== Test der Sensoren ===
Für die erfolgreiche Umsetzung des Projekts ist eine detaillierte Voruntersuchung der verwendeten Hardware notwendig. Ziel dieser Testphase ist es, das physikalische und elektrische Verhalten der Sensoren genau zu verstehen, um Fehlfunktionen im späteren Spielablauf auszuschließen.
'''Mechanische Analyse und CAD-Anforderungen'''<br>
Zunächst wird der Joystick auf seine mechanischen Eigenschaften geprüft. Dies ist entscheidend für die Konstruktion des Gehäuses und den anschließenden 3D-Druck. Besonders relevant ist hierbei die Dimensionierung der Gehäuseöffnung. Bei der Untersuchung der Kinematik wurde festgestellt, dass sich lediglich die aufgesteckte Kappe neigt, während der darunterliegende Sockel seinen Durchmesser am Drehpunkt beibehält. Da die Kappe oberhalb des Gehäuses sitzt, ist für die Konstruktion der Durchmesser dieses Sockels ausschlaggebend.
'''Konsequenz für das Design'''<br>
Der Radius der kreisförmigen Aussparung im Gehäusedeckel kann direkt anhand der Dicke des Joysticksockels bestimmt werden. Die Öffnung muss so dimensioniert sein, dass sie dem Sockel genügend Spielraum für die Neigung bietet, ohne dass das Innenleben sichtbar wird oder die Kappe am Gehäuse schleift.
'''Elektrische Analyse: Kennlinie und Signalverhalten'''<br>
Im zweiten Schritt wird das elektrische Verhalten des KY-023 Joystick-Moduls analysiert. Das Ziel ist es zu klären, ob die Sensoren eine lineare Kennlinie aufweisen und wie präzise die Signalausgabe erfolgt.
Der KY-023 basiert auf zwei Potentiometern für die X- und Y-Achse, die als Spannungsteiler fungieren. Bei der verwendeten Versorgungsspannung von 5V wandelt der Analog-Digital-Wandler (ADC) des Mikrocontrollers die Spannung in diskrete Werte zwischen 0 und 1023 um.
• Theoretischer Mittelpunkt: 512 (entspricht ca. 2,5V).
• Theoretische Endpunkte: 0 (GND) und 1023 (VCC).
Während der Tests zeigten sich charakteristische Eigenheiten der Module, die bei der Softwareentwicklung berücksichtigt werden müssen:
1. Signalrauschen: Im Ruhezustand ist das Signal sehr stabil. Das Rauschen ist minimal und liegt im Bereich von nur 1 Einheit (z. B. schwankend zwischen 511 und 513).
2. Offset im Nullpunkt und Wiederholgenauigkeit: Die physische Ruheposition entspricht nicht exakt dem theoretischen Mittelwert von 512. In den Tests ergaben sich feste Offset-Werte von +/- 30. Positiv ist jedoch die hohe Wiederholgenauigkeit: Nach dem Loslassen zentriert sich der Stick mechanisch zuverlässig und kehrt stabil zu diesen Ruhewerfen zurück.
3. Abweichung der Endwerte: Obwohl der Joystick mechanisch bis zum Anschlag bewegt werden kann, erreichen die Potentiometer elektrisch nicht die vollen Grenzwerte von 0 oder 1023.
Das Verhalten der Kennlinie eines KY-023 Joysticks und die menschliche Wahrnehmung während der Bedienung sind der unterschiedlich. In der Theorie ist die Kennlinie linear, in der Praxis fühlt sie sich aber "sprunghaft" oder "aggressiv" an. Positionen um die Ruheposition (512) ist der Joystick extrem sensibel. Wenn eine Zielposition nahe der Mitte generiert wird, muss extrem vorsichtig agiert werden, da man dort kaum mechanischen Widerstand spürt, der bei der Feinjustierung hilft. Außerdem muss verhindert werden, dass eine Zielposition genau dies Ruheposition gelegt wird.
'''Maßnahmen für die Software-Implementierung'''<br>
Aus den Testergebnissen werden folgende Parameter für die Programmierung der „JoyCode“-Logik abgeleitet:
• Einschränkung des Zielbereichs: Um das Problem der elektrischen Offsets an den Rändern zu umgehen, werden die zufälligen Zielkoordinaten nicht im vollen Spektrum generiert. Der gültige Bereich wird auf 30 bis 980 begrenzt. Dies stellt sicher, dass jede generierte Position elektrisch erreichbar ist.
• Toleranzbereich: Um den Versatz des Nullpunkts und die feinen motorischen Ungenauigkeiten der rätselden Personn auszugleichen, darf keine punktgenaue Übereinstimmung verlangt werden. Stattdessen wird ein Toleranzradius um die Zielposition definiert. Da das Spielkonzept ohnehin eine visuelle Rückmeldung über die „Nähe zum Ziel“ vorsieht, lässt sich diese Notwendigkeit nahtlos in die Spielmechanik integrieren.
Auch darf die Zielpositionen nicht um 512 liegen, da da die Ruheposition ist. Daher wird für die Zielpositon werte um +/- 20 um 512 ebenfalls ausgeschlossen.
'''RGB-LEDs'''<br>
Die visuelle Rückmeldung stellt den einzigen Indikator für den Rätselnden dar. Daher ist die Farbdarstellung – insbesondere die klare Unterscheidung zwischen „Gelb“ (Annäherung) und „Grün“ (Ziel erreicht) – von zentraler Bedeutung.
Während der Tests zeigte sich, dass der Übergang von Gelb zu Grün nur schwer wahrnehmbar ist, insbesondere bei Farbtönen, die bereits „fast grün“ erscheinen. Dies ist problematisch, da solche Farben fälschlicherweise als Zielzustand interpretiert werden können.
Da das menschliche Auge Farben subjektiv wahrnimmt, ist eine Kalibrierung der Farbmischung notwendig. Theoretisch ergibt sich Gelb aus 100 % Rot + 100 % Grün. In der Praxis überstrahlt jedoch der Grünanteil das Rot, wodurch der resultierende Farbton eher hellgrünlich wirkt und seine Funktion als Warn- bzw. Annäherungsfarbe verliert.
Zur Farbkorrektur wird daher der Rotanteil bewusst stärker gewichtet, sodass ein klar erkennbares Gelb entsteht. Diese Anpassung wird über eine Look-up-Tabelle (LUT) realisiert, deren Werte experimentell durch Tests und Beobachtungen ermittelt werden.
Zusätzlich ist eine Helligkeitsreduktion erforderlich, da die LEDs bei maximalem PWM-Wert (255) deutlich zu hell sind. Aus diesem Grund wird ein maximaler PWM-Wert von 100 verwendet, was sowohl die Sichtbarkeit verbessert als auch die Augenbelastung reduziert.
<br><br>
=== Gehäuse 3D-Druck ===
Das Gehäuse des Escape-Game-Moduls JoyCode wurde vollständig als 3D-druckbares Bauteil konzipiert und dient der sicheren Aufnahme sowie der strukturierten Integration aller elektronischen und mechanischen Komponenten. Ziel der Konstruktion ist eine kompakte, stabile und wartungsfreundliche Lösung, die sich für den Einsatz im Escape-Game-Umfeld eignet.
'''Konstruktiver Aufbau'''
Das Gehäuse besteht aus zwei Hauptkomponenten:
- einer Frontplatte mit Bedienelementen '''(200mm x 100mm)'''
- einem rückseitigen Gehäusekörper zur Aufnahme der Elektronik '''(206mm x 106mm x 80mm)'''
Die Frontplatte ist verschraubt ausgeführt und ermöglicht dadurch einen einfachen Zugang zu den internen Komponenten. Alle Bedienelemente sind präzise in die Front integriert und mechanisch abgestützt.
Die Wandstärke beträgt '''3mm'''.
'''Integration der Komponenten'''
In die Frontplatte sind folgende Elemente integriert:
- zwei Joysticks zur Benutzereingabe,
- drei Taster (Start, Reset, Solution),
- ein LCD-Display zur Anzeige von Informationen und Codes,
- zwei LEDs zur optischen Rückmeldung während des Spiels.
Im Inneren des Gehäuses sind Montagebolzen und Distanzhalter vorgesehen, um die Joystick-Module, das LCD-Display, die LED-Module, sowie den Arduino-Controllerpositionsgenau zu fixieren. Dadurch wird eine spannungsfreie Montage der Leiterplatten gewährleistet und mechanische Belastungen auf Lötstellen vermieden. Die Anordnung der Komponenten erlaubt eine übersichtliche Kabelführung und ausreichend Platz für Wartung oder spätere Erweiterungen.
'''Schnittstellen und Zugänglichkeit'''
An der Seitenwand des Gehäuses befindet sich eine Aussparung für den USB-Anschluss des Arduino-Boards, sodass Programmierung und Spannungsversorgung ohne Demontage möglich sind. Zusätzlich ist eine Öffnung für die externe Stromversorgung vorgesehen.
'''Design- und Fertigungsaspekte'''
Das Gehäuse wird mit abgerundeten Kanten und definierten Wandstärken konstruiert, um:
- eine gute Druckbarkeit zu gewährleisten,
- Verzug und Materialspannungen zu reduzieren,
- sowie eine robuste Haptik zu erzeugen.
Die Konstruktion ist so ausgelegt, dass sie ohne oder mit minimalen Stützstrukturen gefertigt werden kann. Schraubverbindungen und Befestigungspunkte sind auf Standard-Metrikschrauben ausgelegt.
<br><br><br><br>
=== CAD Modell ===
Die folgenden Abbildungen zeigen das erstelle JoyCode CAD-Modell mit eingesetzten Hardwarekomponenten, nach dem im vorherigen Abschnitt beschriebenen Kriterien und Fertigungsaspekten.
{| class="wikitable" style="margin:left; text-align:center;"
|-
| [[Datei:JoyCode CAD 1.jpg|360px]]
| [[Datei:JoyCode CAD 2.jpg|360px]]
| [[Datei:JoyCode CAD 3.jpg|360px]]
|-
| [[Datei:JoyCode CAD 4.jpg|360px]]
| [[Datei:JoyCode CAD 5.jpg|360px]]
| [[Datei:JoyCode CAD 6.jpg|360px]]
|}
Abb. 08: CAD-Modell des Projekts
<br><br><br><br>
=== Einbinden der Hardwarekomponenten ===
Die Einbindung der Hardwarekomponenten im System JoyCode erfolgt zentral über den Mikrocontroller, der als Schnittstelle zwischen Sensorik, Aktorik und Anzeigeelementen fungiert. Ziel der Hardwareintegration ist eine zuverlässige, störungsarme Signalverarbeitung sowie eine eindeutige Zuordnung aller Ein- und Ausgänge.
'''Analoge Eingabekomponenten'''
Die beiden Joysticks werden jeweils über zwei analoge Signalleitungen (x- und y-Achse) an den Mikrocontroller angebunden. Die Potentiometer der Joysticks liefern positionsabhängige Spannungen im zulässigen Eingangsbereich des Analog-Digital-Wandlers.
Die Signale werden direkt auf dedizierte ADC-Eingangspins geführt, wobei auf eine gemeinsame Masseführung geachtet wird, um Offset- und Rausch­effekte zu minimieren.
Die Zuordnung der ADC-Kanäle erfolgt so wie in Abb. 03: Technischer Systementwurf dargestellt über die A01 bis A04 Pins, sodass jede Joystick-Achse eindeutig adressiert und ausgewertet werden kann.
'''Digitale Ausgabekomponenten'''
Die RGB-LEDs werden über digitale Ausgangspins angesteuert. Jede Farbkomponente (Rot, Grün, Blau) ist separat verschaltet, wodurch eine flexible Farbmischung realisiert werden kann. Die Ansteuerung erfolgt softwareseitig über definierte Pulsweitenmodulation.
Das LC-Display wird über eine serielle Schnittstelle (I²C) in das System eingebunden. Dadurch kann die Anzahl benötigter Ein- und Ausgangspins reduziert werden. Die Initialisierung des Displays sowie die Aktualisierung der Inhalte erfolgen zyklisch bzw. ereignisabhängig aus der Software heraus.
'''Spannungsversorgung und Massekonzept'''
Die Spannungsversorgung aller Hardwarekomponenten erfolgt zentral über den Mikrocontroller. Dabei wird sichergestellt, dass alle Module eine gemeinsame Referenzmasse besitzen. Dieses Massekonzept ist entscheidend für die stabile Funktion der analogen Joystick-Signale und die reproduzierbare ADC-Messung.
Die Stromaufnahme der angeschlossenen Komponenten liegt innerhalb der zulässigen Grenzwerte des Systems, sodass keine zusätzliche externe Versorgung notwendig ist.
'''Systemintegration'''
Durch die klare Trennung von analogen Eingängen (Joysticks) und digitalen Ausgängen (LEDs, Display) entsteht eine übersichtliche und wartbare Systemstruktur. Die Hardware ist so eingebunden, dass jede Komponente eindeutig adressierbar ist und unabhängig getestet werden kann.
Die enge Kopplung zwischen Hardwareanschluss und Softwarestruktur ermöglicht eine konsistente Signalverarbeitung und bildet die Grundlage für den stabilen Betrieb des regelungstechnischen Gesamtsystems.
<br><br><br>
=== Lötarbeiten und Platinenfertigung ===
{| style="width:100%;"
|-
| style="vertical-align:top;" |
[[Datei:JoyCode Platine Oberseite.jpg|mini|260px|Abb. 09: Platine Oberseite]]
| style="vertical-align:top;" |
[[Datei:JoyCode Platine Unterseite.jpg|mini|300px|Abb. 10: Platine Unterseite]]
| style="vertical-align:top;" |
Die acht GND-Anschlüsse für die Komponenten werden mit schwarzen Leitungen realisiert.
Zusätzlich stellt eine Leitung den Masseanschluss dar, der direkt vom Arduino geführt wird.
Die Versorgungsspannungen für die beiden Joysticks sowie das LCD-Modul sind rot gekennzeichnet.
Ebenso eine Leitung für die 5-V-Versorgung vom Arduino.
|}
<br clear="both"/>
[[Datei:JoyCode Hardwarekomponenten montage.jpg|360px|mini|links|Abb. 11: Hardwarekomponenten Montage]]
Die Verbindungen zu den einzelnen Hardwarekomponenten des Projekts werdenmit Dupont-Kabeln realisiert.
Da diese standardmäßig recht locker sitzen, werden die Kontakte zusätzlich mit Lötzinn etwas verzinnt, wodurch sie einen größeren Durchmesser erhalten.
Auf diese Weise sitzen die Anschlüsse nun sehr fest und zuverlässig, sodass ein stabiler elektrischer Kontakt gewährleistet ist – selbst beim Ziehen an den Leitungen oder bei starker Bewegung bzw. Erschütterung des Gehäuses.
<br clear="left"/>
=== Ergebnis ===
Das entworfene Gehäuse wurde erfolgreich gefertigt und mit allen Komponenten bestückt. Abbildung 12 zeigt das fertiggestellte JoyCode-Modul mit montierter Elektronik und integrierter Verkabelung. Das System ist betriebsbereit und erfüllt alle mechanischen und funktionalen Anforderungen.
{| class="wikitable" style="margin:left; text-align:center;"
|-
| [[Datei:JoyCode Ergebnis 1.jpg|480px]]
| [[Datei:JoyCode Ergebnis 2.jpg|480px]]
|-
| [[Datei:JoyCode Ergebnis 4.jpg|480px]]
| [[Datei:JoyCode Ergebnis 3.jpg|480px]]
|}
Abb. 12: Ergebnis des CAD-Drucks und Komponentenmontage
<br><br><br>
== Software Umsetzung ==
=== Signalverarbeitung ===
Die analogen X- und Y-Achsen der beiden Joysticks werden über die ADC-Eingänge des Arduino erfasst. Für den linken Joystick werden die Pins A0 (X-Achse) und A1 (Y-Achse) verwendet, für den rechten Joystick die Pins A2 (X-Achse) und A3 (Y-Achse).
Die analogen Pins A4 und A5 werden nicht für die Joysticks verwendet, da sie zusätzlich die I²C-Funktionen SDA und SCL unterstützen. Obwohl das LC-Display an die oberen SDA- und SCL-Pins des Arduino angeschlossen ist, sind A4 und A5 intern weiterhin mit dem I²C-Bus verbunden. Eine alternative Belegung dieser Pins führt zu Störungen der I²C-Kommunikation und führt dazu, dass das Display nicht korrekt funktioniert.
Die aktuelle Position eines Joysticks wird für beide Achsen (X und Y) mit der jeweiligen Zielposition verglichen. Dazu wird für jede Achse die Differenz zwischen aktueller Position und Zielposition berechnet. Aus diesen beiden Abweichungen wird anschließend die euklidische Distanz zur Zielposition bestimmt:
<math>
d = \sqrt{(x_{aktuell} - x_{ziel})^2 + (y_{aktuell} - y_{ziel})^2}
</math>
Die euklidische Distanz beschreibt den direkten Abstand zwischen der aktuellen Joystickposition und der Zielposition im zweidimensionalen Koordinatensystem. Der minimale Distanzwert beträgt 0 und entspricht der exakten Zielposition. Der maximale Distanzwert liegt bei 1448 und ergibt sich aus der größtmöglichen Entfernung zwischen zwei Punkten im Wertebereich der ADC-Auflösung (0–1023) beider Achsen, also der Distanz zwischen zwei gegenüberliegenden Eckpunkten des Koordinatensystems:
<math>
d_{max} = \sqrt{(1023 - 0)^2 + (1023 - 0)^2}
</math>
Ergibt:
<math>
d_{max} \approx 1448
</math>
Der berechnete Distanzwert wird anschließend normiert:
<math>
d_{norm} = \frac{d}{d_{max}}
</math>
Der normierte Distanzwert liegt damit im Bereich von 0 bis 1 und dient als Eingangsgröße für eine Lookup-Tabelle. Diese Lookup-Tabelle ordnet dem jeweiligen Distanzbereich die passende visuelle Rückmeldung über die RGB-LEDs zu.
<br><br><br>
=== Joystick auslesen und LED Steuerung ===
<br clear="both"/>
[[Datei:JoyCode Joystick LED Logik.png|mini|links|720px|Abb. 13: Simulink Modell zum Joystick auslesen und LED Steuerung]]
<br clear="left"/>
'''zielGenerator.m'''<br>
Diese Funktion erzeugt zufällige Zielpositionen für den Joystick. Eine Ausschlusszone um die Mittelstellung (Ruheposition) verhindert, dass Ziele zu nah am Nullpunkt erscheinen.
<syntaxhighlight lang="matlab" line>
function [zielX_out, zielY_out] = zielGenerator(rundeGewechselt, zielX_in, zielY_in)
%% PARAMETER
minVal = 30;    maxVal = 980;      % Gültiger Wertebereich
ausschlussMitte = 512;              % Joystick-Ruheposition
ausschlussBreite = 20;              % Halbe Breite der Ausschlusszone
ausschlussMin = ausschlussMitte - ausschlussBreite;  % 492
ausschlussMax = ausschlussMitte + ausschlussBreite;  % 532
effektiveRange = (maxVal - minVal + 1) - (ausschlussMax - ausschlussMin + 1);
%% NEUE POSITION BERECHNEN
if rundeGewechselt == 1
    % Zufallswerte durch deterministische Berechnung
    tempX = mod(zielX_in * 7 + zielY_in * 3 + 137, effektiveRange);
    tempY = mod(zielY_in * 11 + zielX_in * 5 + 251, effektiveRange);
   
    % Auf gültige Bereiche mappen (Ausschlusszone überspringen)
    zielX_out = mappeAufGueltig(tempX, minVal, ausschlussMin, ausschlussMax);
    zielY_out = mappeAufGueltig(tempY, minVal, ausschlussMin, ausschlussMax);
else
    zielX_out = zielX_in;  zielY_out = zielY_in;  % Werte beibehalten
end
end
function wert = mappeAufGueltig(temp, minVal, ausschlussMin, ausschlussMax)
    bereich1Groesse = ausschlussMin - minVal;  % Größe des unteren Bereichs
    if temp < bereich1Groesse
        wert = minVal + temp;                  % Unterer Bereich
    else
        wert = ausschlussMax + 1 + (temp - bereich1Groesse);  % Oberer Bereich
    end
end
</syntaxhighlight>
<br>'''Funktionsprinzip:'''
{| class="wikitable"
|-
! Aspekt !! Beschreibung
|-
| Zufall || Deterministische Berechnung mittels Modulo-Arithmetik
|-
| Ausschlusszone || Bereich 492-532 wird übersprungen (Joystick-Ruheposition)
|-
| Wertebereich || Gültige Ausgabe: 30-491 oder 533-980
|-
| Trigger || Neue Werte nur wenn <code>rundeGewechselt == 1</code>
|}
Die Berechnung der Distanz zur Zielposition wird wie im Abschnitt Signalverarbeitung beschrieben, realisiert.
Als Toleranzwert für die LED-Rückmeldung und für die Freischaltung der Ziffer wird ein Wert von 150 verwendet. Dies entspricht einem relativ großzügigen Bereich, ist jedoch notwendig, da die Bedienung der Joysticks und die Interpretation des „richtigen“ Grüntons in der RGB-Rückmeldung vergleichsweise knifflig ist.
Dieser Wert wird direkt auf die berechnete euklidische Distanz zwischen aktueller Joystickposition und Zielposition angewendet, noch bevor die Distanz normiert wird. Liegt die Distanz innerhalb der Toleranz, gilt die Runde als „erfolgreich“ und die Ziffer auf dem LC-Display kann freigeschaltet werden
Beispiel Zielposition: <br>
<math>
x_{ziel,1} = 500, \quad y_{ziel,1} = 600
</math>
<math>
x_{ziel,2} = 300, \quad y_{ziel,2} = 400
</math>
<br>
Angenommen, die aktuellen Joystickpositionen sind:<br>
<math>
x_1 = 520, \quad y_1 = 580
</math>
<br>
<math>
x_2 = 320, \quad y_2 = 390
</math>
<br><br>
Berechnung der euklidischen Distanz:<br>
<math>
d_1 = \sqrt{(x_1 - x_{ziel,1})^2 + (y_1 - y_{ziel,1})^2}
      = \sqrt{(520-500)^2 + (580-600)^2}
      = \sqrt{20^2 + (-20)^2}
      = \sqrt{400 + 400}
      = \sqrt{800}
      \approx 28.3
</math>
<br>
<math>
d_2 = \sqrt{(x_2 - x_{ziel,2})^2 + (y_2 - y_{ziel,2})^2}
      = \sqrt{(320-300)^2 + (390-400)^2}
      = \sqrt{20^2 + (-10)^2}
      = \sqrt{400 + 100}
      = \sqrt{500}
      \approx 22.4
</math>
<br>
Da beide Distanzen kleiner sind als der Toleranzwert von 150:<br>
<math>
d_1 \approx 28.3 \le 150, \quad d_2 \approx 22.4 \le 150
</math>
<br>
gilt die Runde als erfolgreich abgeschlossen und die entsprechende Ziffer kann auf dem LC-Display freigeschaltet werden. Die Normierung der Distanz erfolgt erst nach dieser Toleranzprüfung, um die Werte anschließend für die Lookup-Tabelle der LED-Rückmeldung zu verwenden.
<br><br>
'''LED-Farbsteuerung über Lookup-Tabellen'''
Für die Ansteuerung der RGB-LEDs werden zwei separate Lookup-Tabellen (LUTs) verwendet, die den normierten Distanzwert auf die entsprechenden PWM-Werte für die Farbkanäle Rot und Grün abbilden. Die Stützpunkte der Lookup-Tabellen sind in der folgenden Tabelle dargestellt:
{| class="wikitable" style="text-align:center;"
|+ Stützpunkte der Lookup-Tabellen für die LED-Ansteuerung
|-
! Normierte Distanz ''d<sub>norm</sub>'' !! PWM-Wert Grün !! PWM-Wert Rot !! Resultierende Farbe
|-
| 0,00 || 80 || 0 || Grün (Ziel erreicht)
|-
| 0,10 || 50 || 40 || Gelbgrün
|-
| 0,25 || 20 || 80 || Orange
|-
| 0,50 || 0 || 100 || Rot
|-
| 1,00 || 0 || 100 || Rot (maximale Distanz)
|}
Die gewählten Stützpunkte erzeugen einen asymmetrischen Kurvenverlauf, bei dem der Grünanteil deutlich schneller abnimmt als der Rotanteil zunimmt. Der Grünkanal fällt bereits bei einer normierten Distanz von 0,5 auf den Wert 0, während der Rotkanal bei diesem Punkt seinen Maximalwert von 100 erreicht und diesen bis zur maximalen Distanz beibehält. Diese Charakteristik führt dazu, dass die Rot- und Orange-Phase einen Großteil des Distanzbereichs abdeckt, während die Grünphase erst bei unmittelbarer Nähe zum Ziel einsetzt.
Diese Kurvenform wurde bewusst so gewählt, um eine eindeutige visuelle Unterscheidung zwischen den Zuständen „weit entfernt", „Annäherung" und „Ziel erreicht" zu ermöglichen. Da das menschliche Auge Grüntöne tendenziell stärker wahrnimmt als Rottöne, würde ein linearer Verlauf dazu führen, dass bereits bei mittlerer Distanz ein grünlicher Farbeindruck entsteht. Dies könnte fälschlicherweise als Zielerreichung interpretiert werden. Durch die späte Aktivierung des Grünkanals und die gleichzeitige Dominanz des Rotkanals über einen weiten Distanzbereich wird sichergestellt, dass ausschließlich bei tatsächlicher Annäherung an das Ziel ein deutlicher Farbumschlag von Rot über Orange zu Grün wahrnehmbar ist. Die folgenden Abbildungen 14 und 15 visualisieren den Farbverlauf der RGB-LEDs in Abhängigkeit vom Abstand des Joysticks zur Zielposition unter Verwendung der aktuellen Look-Up-Table. Der dargestellte Farbraum ist der HSV-Farbraum mit einer leicht erhöhten Grüngewichtung (Faktor 1,1). Die so dargestellten Farben entsprechen dem tatsächlichen Farbverlauf der LEDs sehr genau. Im RGB-Farbraum lässt sich dieser Farbverlauf hingegen nicht korrekt abbilden.
<br><br>
<br clear="both"/>
[[Datei:Abbildung Raeumliche Verteilung.png|mini|links|360px|Abb. 14: Farbwertverteilung der LED je nach Joystick Zielabstand]]
<br clear="left"/>
<br clear="both"/>
[[Datei:Farbgradient RGB LED.png|mini|links|720px|Abb. 15: Farbgradient der RGB-LED]]
<br clear="left"/>
<br><br><br>
=== LCD-Anzeige ===
<br clear="both"/>
[[Datei:JoyCode LCD Ansteuerung.png|mini|links|720px|Abb. 16: CAD Simulink Modell der LCD-Anzeige]]
<br clear="left"/>
Die LCD-Anzeige dient als visuelle Rückmeldung und zeigt den aktuellen Spielzustand sowie die freigeschalteten Zahlen des Codes an.
Die LCD-Ansteuerung ist in zwei Komponenten aufgeteilt:
{| class="wikitable"
|-
! Komponente !! Sprache !! Aufgabe
|-
| LCD_Logik || MATLAB/Simulink || Berechnung der anzuzeigenden Zeichen
|-
| lcd.cpp || Arduino C++ || Hardware-Ansteuerung via I2C
|}
'''lcd.cpp'''
<syntaxhighlight lang="cpp" line>
#include "lcd.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Festgelegt um was für einen Display es sich handelt. Eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27.
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setupFunctionlcd(){
    lcd.init(); // Im Setup wird der LCD gestartet
    lcd.backlight(); // Hintergrundbeleuchtung einschalten
}
// Input uint8 [16,1]
// Input1 uint8 [16,1]
void stepFunctionlcd(uint8_T * Input,int size_vector_a,uint8_T * Input1,int size_vector_b){
 
    // Hier wird die Position des ersten Zeichens festgelegt.
    // In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
    lcd.setCursor(0, 0);
    lcd.print((char*)Input);
    lcd.setCursor(0, 1); // In diesem Fall bedeutet (0,1) das erste Zeichen in der zweiten Zeile.
    lcd.print((char*)Input1);
}
</syntaxhighlight>
'''LCD_Logik.m (Kurzfassung)'''
<syntaxhighlight lang="matlab" line>
function [zeile1,zeile2]=LCD_Logik(runde,code1,code2,code3,code4,spielLaeuft)
zeile1=zeros(16,1);  zeile2=zeros(16,1);
if spielLaeuft == 0
    zeile1 = [68,114,117,101,99,107,101,32,83,84,65,82,84,32,32,32]';  % "Druecke START"
    zeile2 = [117,109,32,122,117,32,98,101,103,105,110,110,101,110,32,32]'; % "um zu beginnen"
    return;
end
freigeschaltet = min(max(runde-1,0),4);
if runde >= 5
    zeile1 = [70,101,114,116,105,103,33,32,32,32,32,32,32,32,32,32]';  % "Fertig!"
else
    zeile1 = [90,97,104,108,101,110,99,111,100,101,58,48+(runde-1),47,52,32,32]'; % "Zahlencode:X/4"
end
zeile2(:)=32;  % Leerzeichen
codes = [code1,code2,code3,code4];
positionen = [1,5,9,13];
for i=1:4
    if freigeschaltet>=i, zeile2(positionen(i))=48+codes(i);
    else,                zeile2(positionen(i))=45; end  % '-'
end
end
</syntaxhighlight>
'''ASCII-Referenz:'''
{| class="wikitable"
|-
! Zeichen !! ASCII !! Verwendung
|-
| '0'-'9' || 48-57 || <code>48 + ziffer</code>
|-
| '-' || 45 || Platzhalter
|-
| ' ' || 32 || Leerzeichen
|-
| '/' || 47 || Trenner in "X/4"
|}
|}
<br>
'''Funktionsprinzip'''
'''<br>Schritt 1: Logikverarbeitung in Simulink'''<br>
Die MATLAB-Funktion <code>LCD_Logik</code> erhält folgende Eingänge:
* <code>runde</code> – Aktuelle Spielrunde (1-5). Wobei die 1. Runde die Initialisierungs-Runde ist.
* <code>code1</code> bis <code>code4</code> – Die vier Ziffern des Geheimcodes
* <code>spielLaeuft</code> – Zustandsflag (0 = Startbildschirm, 1 = Spiel aktiv)
Die Ausgabe sind zwei Arrays mit je 16 Elementen:
* <code>zeile1</code> – Obere LCD-Zeile
* <code>zeile2</code> – Untere LCD-Zeile


'''<br>Schritt 2: ASCII-Kodierung'''<br>


Jedes Zeichen wird als ASCII-Code (Zahlenwert 0-255) gespeichert:


{| class="wikitable"
|-
! Zeichen !! ASCII-Code !! Verwendung
|-
| 'D' || 68 || Startbildschirm
|-
| '0'-'9' || 48-57 || Ziffernanzeige
|-
| '-' || 45 || Platzhalter für gesperrte Ziffern
|-
| ' ' || 32 || Leerzeichen
|}


Beispiel für Ziffernberechnung:
<syntaxhighlight lang="matlab">
zeile2(1) = 48 + code1;  % Wenn code1=7, dann 48+7=55 → ASCII für '7'
</syntaxhighlight>


'''<br>Schritt 3: Zustandsabhängige Anzeige'''<br>


{| class="wikitable"
|-
! Zustand !! Zeile 1 !! Zeile 2
|-
| Vor Spielstart || <code>Druecke START  </code> || <code>um zu beginnen  </code>
|-
| Runde 1 (0 Codes) || <code>Zahlencode:0/4  </code> || <code>-  -  -  -  </code>
|-
| Runde 2 (1 Code) || <code>Zahlencode:1/4  </code> || <code>1  -  -  -  </code>
|-
| Runde 3 (2 Codes) || <code>Zahlencode:2/4  </code> || <code>1  2  -  -  </code>
|-
| Runde 4 (3 Codes) || <code>Zahlencode:3/4  </code> || <code>1  2  3  -  </code>
|-
| Runde 5 (Gewonnen) || <code>Fertig!        </code> || <code>1  2  3  4  </code>
|}


== Umsetzung (HW/SW) ==
'''<br>Schritt 4: Hardware-Ausgabe'''<br>


== Komponententest ==
Die C++-Funktion überträgt die Daten via I2C an das LCD:


== Ergebnis ==
<syntaxhighlight lang="cpp">
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Adresse 0x27, 16 Spalten, 2 Zeilen


== Zusammenfassung ==
void stepFunctionlcd(uint8_T * Input, int size_a, uint8_T * Input1, int size_b) {
=== Lessons Learned ===
    lcd.setCursor(0, 0);        // Position: Zeile 0, Spalte 0
    lcd.print((char*)Input);    // Zeile 1 ausgeben
   
    lcd.setCursor(0, 1);        // Position: Zeile 1, Spalte 0
    lcd.print((char*)Input1);  // Zeile 2 ausgeben
}
</syntaxhighlight>


== Projektunterlagen ==
Die ASCII-Tabelle ist so aufgebaut, dass die Ziffern 0-9 aufeinanderfolgende Codes haben:
=== Projektplan ===
 
=== Projektdurchführung ===
{| class="wikitable"
|-
! Ziffer !! ASCII-Code !! Formel
|-
| 0 || 48 || 48 + 0
|-
| 1 || 49 || 48 + 1
|-
| ... || ... || ...
|-
| 9 || 57 || 48 + 9
|}
 
<syntaxhighlight lang="matlab">
% Effiziente Umwandlung: Zahl → Zeichen
zeile2(1) = 48 + code1;  % code1=7 → 48+7=55 → '7'
zeile1(12) = 48 + rundeLCD; % Rundenanzeige
</syntaxhighlight>
 
 
Das LCD wird über den integrierten I2C-Bus (Inter-Integrated Circuit) angesteuert:
 
{| class="wikitable"
|-
! Methode !! Benötigte Pins !! Verkabelung !! Geschwindigkeit
|-
| Parallel (4-Bit) || 6-7 Pins || Komplex || Schnell
|-
| Parallel (8-Bit) || 10-11 Pins || Sehr komplex || Sehr schnell
|-
| '''I2C''' || '''2 Pins (SDA, SCL)''' || '''Einfach''' || Ausreichend
|}
<br><br><br><br>
 
=== Taster-Funktionalität ===
 
{| style="margin:left; text-align:center;"
|-
| [[Datei:JoyCode Taster Funktion.png|360px]]
| [[Datei:JoyCode Taster Flanke.png|360px]]
|}
Abb. 17: Darstellung der Taster-Funktionalität und der verwendeten Flankenfunktion.
<br><br>
Für die Funktionalität der drei Taster, die als Öffner ausgeführt sind und deren Signal daher zunächst invertiert werden muss, wird eine Flankenfunktion verwendet, wie in der obigen Abbildung dargestellt.
Die drei Taster werden über die digitalen Eingänge des Arduino eingelesen und anschließend dem Eingang der Flankenfunktion zugeführt.
Die daraus erzeugten Tastensignale werden an verschiedene weitere Komponenten in Simulink weitergeleitet, darunter die Startlogik, Resetlogik und Rundenlogik.
 
Der Ausgang der Flankenfunktion erzeugt genau einen sauberen Impuls pro Tastendruck, unabhängig davon, wie lange oder unruhig der Taster betätigt wird.
Dadurch werden Mehrfachauslösungen und Prellen zuverlässig verhindert.
Ein neuer Impuls ist erst nach dem vollständigen Loslassen des Tasters möglich.
<br><br><br>
 
=== Runden Realisierung ===
<br clear="both"/>
[[Datei:JoyCode Escape Game Logik.png|360px|mini|links|Abb. 18: Simulink Modell zur Runden Realisierung]]
<br clear="left"/>
 
Das Simulink-Modell bildet eine einfache Ablauf- und Rundenlogik ab. Es prüft, ob sich beide Joysticks gleichzeitig in der vorgegebenen Zielposition befinden. Beim erstmaligen Erreichen der Zielposition wird über eine Flankenerkennung ein Ereignis erzeugt. Dieses Ereignis löst die Festlegung einer neuen Zielposition aus und erhöht gleichzeitig einen Rundenzähler. Die Rundenlogik begrenzt die Anzahl der Durchläufe auf maximal fünf Runden. Wobei der initialisierungszustand als Runde 1 zählt. Ein Startsignal in Kombination mit einer neuen Zielposition erlaubt den Beginn einer neuen Runde. Über eine Reset-Logik wird der Rundenzähler und die zugehörigen Zustände auf den Anfangszustand zurückgesetzt werden.
<br><br><br><br>
 
=== Start Logik ===
 
<br clear="both"/>
[[Datei:JoyCode Start Logik.png|mini|links|720px|Abb. 19: Simulink Startlogik]]
<br clear="left"/>
 
'''StartLogik.m'''<br>
Diese Funktion regelt den Start Mechanismus des Escape-Games.
 
<syntaxhighlight lang="matlab" line>
function spielLaeuft_out = StartLogik(tasterStart, tasterReset, spielLaeuft_in)
 
    % Standardmäßig bleibt der Zustand gleich
    spielLaeuft_out = spielLaeuft_in;
   
    % Wenn Reset gedrückt wird, Spiel stoppen
    if tasterReset == 1
        spielLaeuft_out = 0;
    end
   
    % Wenn Start gedrückt wird UND Spiel noch nicht läuft, Spiel starten
    if tasterStart == 1 && spielLaeuft_in == 0
        spielLaeuft_out = 1;
    end
 
end
</syntaxhighlight>
<br>
Die Start-Logik steuert den Spielzustand spielLaeuft. Der aktuelle Zustand wird gespeichert und standardmäßig beibehalten. Wird der Reset-Taster betätigt, wird das Spiel gestoppt und der Zustand auf inaktiv gesetzt. Wird der Start-Taster gedrückt, während das Spiel noch nicht läuft, wird das Spiel gestartet. Der Ausgang wird über einen Speicherblock rückgeführt, sodass der Spielzustand über die Zeit erhalten bleibt.
<br><br><br><br>
 
=== Simulink-Modell ===
 
<br clear="both"/>
[[Datei:JoyCode Simulink.png|720px|mini|links|Abb. 20: Vollständiges Simulink Modell]]
<br clear="left"/>
 
Das abgebildete Simulink-Modell bildet die zentrale Steuereinheit des Projekts „JoyCode“ und koordiniert das Zusammenspiel zwischen Hardware-Eingängen, Logikverarbeitung und visueller Ausgabe. Das System ist modular aufgebaut und umfasst Subsysteme für den linken und rechten Joystick, welche die Positionswerte erfassen und die entsprechende LED-Statusrückmeldung berechnen. Eine zentrale Logikeinheit prüft, ob sich beide Joysticks simultan in der Zielposition befinden, und triggert bei erfolgreichem Halten der Position die „Runden Logik“. Diese verwaltet den Fortschritt über die vier Spielrunden und steuert die Freischaltung der Code-Ziffern auf der LCD Anzeige. Über ein separates Eingangsmodul werden die physischen Taster für Start, Solution und Reset abgefragt, während die „Start Logik“ und das „Reset“-Subsystem den globalen Status des Rätsels definieren und die Generierung neuer Zielpositionen einleiten.
<br><br><br>
 
=== Tests der Funktionalität ===
{| class="wikitable" style="width:100%;"
|+ Funktionstests des Escape-Game-Systems
! Test !! Erwartetes Ergebnis !! Tatsächliches Verhalten !! Bestanden?
|-
| Gleichzeitige Bedienung beider Joysticks
| Beide Joysticks können parallel bewegt werden, ohne sich gegenseitig zu beeinflussen oder am Gehäuse zu schleifen.
| Beide Joysticks lassen sich gleichzeitig und unabhängig bewegen. Ohne Kontakt zum Gehäuse.
| Ja
|-
| Einzelner Joystick außerhalb der Zielposition
| Befindet sich nur ein Joystick an der Zielposition, erfolgt keine Freischaltung.
| Keine Freischaltung bei nur einem korrekt positionierten Joystick.
| Ja
|-
| Haltezeit beider Joysticks an der Zielposition
| Beide Joysticks müssen mindestens 3 Sekunden an der Zielposition gehalten werden, damit eine Ziffer freigeschaltet wird.
| Nein, ist mit der Sensibilität der Joysticks nicht realisierbar. Wird daher nicht umgesetzt.
| Nein
|-
| Rundenablauf und PIN-Freischaltung
| Das Rätsel besteht aus vier aufeinanderfolgenden Runden, in denen jeweils eine Ziffer freigeschaltet wird.
| Vier Runden werden korrekt durchlaufen, pro Runde wird eine Ziffer freigeschaltet.
| Ja
|-
| LED-Statusanzeige und Farbwechsel
| Die RGB-LEDs zeigen den Abstand zur Zielposition korrekt an (Rot, Gelb, Grün, blinkendes Grün).
| Farbwechsel entspricht korrekt dem Abstand zur Zielposition.
| Ja
|-
| Anzeige auf dem LC-Display
| Das LC-Display zeigt freigeschaltete Ziffern sowie Start- und Statusinformationen korrekt an.
| Alle Ziffern und Statusmeldungen werden korrekt angezeigt.
| Ja
|-
| Start- und Reset-Funktion
| Start initialisiert das Spiel, Reset setzt den aktuellen Spielstand jederzeit vollständig zurück.
| Spiel startet korrekt und wird vollständig zurückgesetzt.
| Ja
|-
| Taster-Funktion und Entprellung
| Auch bei schnellem, wiederholtem Betätigen der Taster wird pro Betätigung nur ein Impuls erzeugt.
| Pro Tastendruck wird zuverlässig nur ein Impuls erkannt.
| Ja
|-
| Lösungsanzeige
| Der korrekte Zahlencode wird über den Lösungs-Button auf dem LC-Display angezeigt.
| Jede Betätigung schaltet nacheinander eine Ziffer frei.
| Ja
|-
| Zufällige Generierung der Zielpositionen
| Zu Beginn jeder Runde werden neue, zufällige Zielpositionen generiert.
| Die Zielpositionen ändern sich in jeder Runde und sind nicht identisch.
| Ja
|-
| Abweichung von der Standardposition
| Die zufällige Zielposition darf nicht der Neutralstellung des Joysticks entsprechen.
| Die Zielposition liegt stets außerhalb der Mittelstellung.
| Ja
|-
| Toleranzbereich der Zielposition
| Der Toleranzbereich ist so gewählt, dass das Rätsel lösbar, aber herausfordernd ist.
| Zielpositionen sind reproduzierbar erreichbar, ohne sofortige Freischaltung.
| Ja
|-
| Spieldauer
| Die maximale Spieldauer pro Rätsel überschreitet 5 Minuten nicht.
| Das Rätsel kann innerhalb von weniger als 5 Minuten abgeschlossen werden.
| Ja
|-
| Autarker Betrieb
| Das Rätsel ist ohne zusätzliche digitale Geräte vollständig spielbar.
| Betrieb erfolgt ausschließlich über integrierte Hardware.
| Ja
|-
| Spannungsversorgung und Masseführung
| Die Spannungsversorgung (5 V) ist stabil, es treten keine Ausfälle oder Fehlfunktionen auf.
| Stabile 5-V-Versorgung ohne Störungen oder Ausfälle.
| Ja
|-
| Mechanische Stabilität von Gehäuse und Anschlüssen
| Auch bei Bewegung des Gehäuses oder Zug an den Leitungen bleiben alle Funktionen erhalten.
| Keine Funktionsausfälle bei Bewegung oder Zug an Leitungen.
| Ja
|}
 
<br><br><br>
 
= Ergebnis & Zusammenfassung =
Das Projekt JoyCode realisiert ein interaktives Escape-Game-Rätsel, bei dem zwei Joysticks gleichzeitig präzise auf zufällig festgelegte Zielpositionen gebracht werden müssen. Die visuelle Rückmeldung über den Abstand zur Zielposition erfolgt in Echtzeit über farbcodierte RGB-LEDs. Nach vier aufeinanderfolgenden, erfolgreich gehaltenen Zielstellungen wird ein vollständiger Zahlencode sichtbar, der für den Zugang zum nächsten Spielabschnitt im übergeordneten Escape Game genutzt wird.
 
Technisch kombiniert das System Mechatronik-Grundlagen mit praxisnaher Sensorik, Steuerungstechnik und Echtzeit-Interaktion. Der Arduino Uno R3 fungiert als zentrale Steuereinheit und liest die Joystick-Positionen über analoge Eingänge aus. Die LEDs und das LC-Display werden zur Status- und Fortschrittsanzeige verwendet, während Taster zur Steuerung und Reset-Funktion integriert sind.
 
Die Hardwarekomponenten sind in einem 3D-gedruckten Gehäuse montiert, das alle Bausteine sicher aufnimmt und die Frontbedienelemente ergonomisch zugänglich macht. Die Verdrahtung ist so ausgelegt, dass Versorgungsspannung und Masse sauber verteilt werden, während Signalverbindungen kurz gehalten werden, um Störanfälligkeit zu minimieren.
 
Das regelungstechnische Konzept – mit dem Menschen als Regler und der visuellen Rückmeldung als Rückführung – wurde erfolgreich in die Spielmechanik integriert. Die Einführung eines Toleranzbereichs (Totzone) ermöglicht eine faire und lösbare Spielerfahrung trotz der hohen Joystick-Sensibilität.
 
Die durchgeführten Funktionstests bestätigen, dass nahezu alle definierten Anforderungen erfüllt werden:
 
* Beide Joysticks können gleichzeitig und unabhängig bedient werden
* Die LED-Farbsteuerung visualisiert den Abstand zur Zielposition zuverlässig
* Der Rundenablauf mit vier aufeinanderfolgenden Runden funktioniert korrekt
* Die Taster-Entprellung verhindert Mehrfachauslösungen
* Das Rätsel ist innerhalb der vorgesehenen fünf Minuten lösbar
* Der autarke Betrieb ohne zusätzliche digitale Geräte ist gewährleistet
Lediglich die ursprünglich geplante 3-Sekunden-Haltezeit konnte aufgrund der Joystick-Sensibilität nicht umgesetzt werden. Diese Anforderung wurde aus dem finalen Design entfernt, da sie die Spielbarkeit erheblich beeinträchtigt hätte.
 
Insgesamt stellt JoyCode eine gelungene Verbindung aus Konzept, Technik und Interaktion dar und demonstriert die praktische Anwendung mechatronischer Systeme im Rahmen eines komplexeren Spielsystems.
 
 
 
== Hindernisse und Schwierigkeiten ==
 
Während der Projektentwicklung traten mehrere technische und konzeptionelle Herausforderungen auf:
 
'''Joystick-Sensibilität und Haltezeit'''<br>
Die ursprünglich geplante Anforderung, beide Joysticks für drei Sekunden an der Zielposition zu halten, erwies sich als nicht realisierbar. Die hohe Sensibilität der KY-023-Module führt dazu, dass selbst minimale motorische Unruhe des Nutzers zu Positionsabweichungen führt. Diese Anforderung musste aus dem Spielkonzept entfernt werden.
 
'''Joystick-Offset und Wertebereich'''<br>
Die Joystick-Module zeigten Fertigungstoleranzen mit Offset-Werten von bis zu ±30 um die Neutralstellung. Das musste berücksichtigt werden.
 
'''RGB-LED Farbmischung'''<br>
Der Grünanteil der LEDs überstrahlt in der Praxis den Rotanteil, wodurch ein theoretisch gemischtes Gelb eher grünlich erscheint. Dies erschwert die visuelle Unterscheidung zwischen „Annäherung" und „Ziel erreicht". Eine experimentelle Kalibrierung über Lookup-Tabellen war erforderlich.
 
'''Simulink-Konfiguration'''<br>
Um alle PWM-Ausgänge gleichzeitig nutzen zu können, musste die Solver-Einstellung „Treat each discrete rate as a separate task" deaktiviert werden.
 
'''Mechanische Gehäuseplanung'''<br>
Die Konstruktion des 3D-gedruckten Gehäuses erwies sich als kritisch, da spätere Änderungen an der Hardware nur mit erheblichem Aufwand möglich sind. Die Dimensionierung der Aussparungen musste präzise auf die Kinematik der Joysticks abgestimmt werden.
<br><br>
== Lessons Learned ==
Im Verlauf der Entwicklung und Umsetzung des JoyCode-Systems konnten sowohl auf technischer als auch auf methodischer Ebene mehrere zentrale Erkenntnisse gewonnen werden.
 
'''Systemstruktur und Modularität'''<br>
Die klare Trennung zwischen Messung, Auswertung, Entscheidungslogik und Ausgabe erwies sich als entscheidend für Nachvollziehbarkeit und Erweiterbarkeit. Frühzeitige Strukturentscheidungen vereinfachten spätere Anpassungen erheblich.
 
'''Mensch-Maschine-Interaktion'''<br>
Bei Systemen mit menschlichem Regler sind intuitive Rückmeldungen wichtiger als mathematisch optimale Parameter. Kleine Anpassungen an der visuellen Rückmeldung beeinflussten die Bedienbarkeit stärker als Änderungen an Berechnungsalgorithmen. Die menschliche Farbwahrnehmung weicht zudem von theoretischen RGB-Werten ab – experimentelle Kalibrierung ist unerlässlich.
 
'''Hardware und Verdrahtung'''<br>
Saubere Verdrahtung und gemeinsame Masseführung sind essenziell für stabilen Betrieb. Detaillierte Voruntersuchungen der Sensoren vor der Softwareentwicklung ermöglichten realistische Parameterwahl. Pin-Belegungen und Bus-Konflikte sollten frühzeitig geprüft werden.
 
'''Software und Testing'''<br>
Zeitabhängige Logik erfordert sorgfältige Implementierung. Zustandsbasierte Programmstrukturen sind wartungsfreundlicher als linearer Code. Iteratives Testen einzelner Module verhinderte die Ausbreitung von Fehlern über Systemebenen hinweg.
 
'''Anforderungsvalidierung'''<br>
Ursprüngliche Anforderungen müssen unter realen Bedingungen validiert werden. Toleranzbereiche und motorische Ungenauigkeiten sind von Beginn an einzuplanen.
 
'''Fazit'''<br>
Das Projekt zeigt, dass einfache Hardwarekomponenten durch durchdachte Systemarchitektur und gezielte Benutzerführung zu einem zuverlässigen Gesamtsystem kombiniert werden können.
 
'''Angewandte und vertiefte Fähigkeiten'''<br>
 
* MATLAB/Simulink-Modellierung und -Programmierung
* Regelungstechnische Systemanalyse
* C++-Programmierung für Mikrocontroller
* 3D-Konstruktion und additive Fertigung
* Schaltungsentwurf und Platinenlötung
* Sensorintegration und Signalverarbeitung
* Technische Dokumentation (Wiki)
<br><br>
== Spielanleitung JoyCode ==
 
'''Ziel:''' Bewege beide Joysticks gleichzeitig in die richtige Position, um den 4-stelligen Zahlencode freizuschalten.
 
'''So geht's:'''
# Drücke den grünen Start-Taster
# Beobachte die LEDs über die Joystick-Bewegung:
#* Rot = weit entfernt
#* Gelb = Annäherung
#* Grün = Zielposition erreicht
# Beide LEDs müssen gleichzeitig grün leuchten
# Pro erfolgreiche Runde wird eine Ziffer des Codes freigeschaltet
# Nach 4 Runden ist der vollständige Zahlencode sichtbar
 
'''Taster:'''
* Grün = Start
* Rot = Reset (Neustart)
* Schwarz = Überspringt die aktuelle Runde und zeigt die nächste Ziffer
 
'''Viel Erfolg!'''
<br><br>
 
== Projektdurchführung ==
 
'''Ideenfindung'''<br>
Die Projektdurchführung begann mit einer gemeinsamen Ideenfindung zu Beginn des Semesters. Im Rahmen des Fachpraktikums sollten Escape-Game-Rätsel entwickelt werden, die in ein übergeordnetes Rätselsystem integriert werden können. Die Idee zu JoyCode entstand aus der Überlegung, ein Rätsel zu schaffen, das motorische Geschicklichkeit mit visueller Rückmeldung kombiniert. Die gleichzeitige Bedienung zweier Joysticks bietet dabei einen intuitiven Zugang und erzeugt durch die Echtzeit-Farbsteuerung ein unmittelbares Erlebnis.
 
'''Zielsetzung'''<br>
Das Ziel des Projekts war es, ein mechatronisches System zu entwickeln, das Hardware (Sensoren, Aktoren, Mikrocontroller) und Software (Simulink, Matlab) zu einem Rätselerlebnis verbindet. Das Rätsel sollte ohne externe Geräte autark funktionieren, innerhalb von fünf Minuten lösbar sein und sich nahtlos in das übergeordnete Escape-Game einfügen.
 
'''Aufgabenstellung'''<br>
Die technische Realisierung wurde in folgende Kernfunktionen unterteilt:
 
* '''Positionserfassung und Zielgenerierung:''' Das System muss die Positionen beider Joysticks kontinuierlich über analoge Eingänge erfassen. Zu Beginn jeder Runde werden zufällige Zielpositionen generiert, die außerhalb der Ruhestellung und innerhalb des erreichbaren Wertebereichs liegen.
 
* '''Visuelle Rückmeldung:''' Die RGB-LEDs müssen den Abstand zur Zielposition in Echtzeit visualisieren. Der Farbverlauf von Rot über Gelb zu Grün ermöglicht eine intuitive Orientierung ohne zusätzliche Anzeigen.
 
* '''Rundenlogik und Code-Freischaltung:''' Das System muss erkennen, wenn beide Joysticks gleichzeitig die Zielposition erreichen. Pro erfolgreicher Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Nach vier Runden ist der vollständige Zahlencode sichtbar.
 
* '''Steuerung und Reset:''' Über drei Taster kann das Escape-Game gestartet, zurückgesetzt oder die aktuelle Runde übersprungen werden.
 
'''Planung und Vorbereitung'''<br>
Nach der Festlegung des Konzepts wurde zunächst eine Komponentenliste erstellt und die benötigte Hardware beschafft. Parallel dazu erfolgte die Erstellung eines funktionalen Systementwurfs sowie eines Programmablaufplans. Die regelungstechnische Einordnung des Systems half dabei, die Anforderungen an Toleranzbereiche und Rückmeldung systematisch zu definieren. Für das Gehäuse wurden CAD-Modelle erstellt, die alle Komponenten berücksichtigen und eine ergonomische Anordnung der Bedienelemente gewährleisten.
 
'''Umsetzung'''<br>
Die Umsetzung erfolgte in mehreren Phasen. Zunächst wurden alle Hardwarekomponenten einzeln auf einem Steckbrett getestet, um Kennlinien, Offsets und Signalverhalten zu analysieren. Anschließend wurde die Simulink-Software schrittweise entwickelt und mit der Hardware verknüpft. Nach erfolgreichen Funktionstests wurde die Lochplatine gelötet und die Verkabelung finalisiert. Das 3D-gedruckte Gehäuse wurde gefertigt und alle Komponenten montiert. Abschließende Systemtests bestätigten die Funktionsfähigkeit des Gesamtsystems.


== YouTube Video ==
== YouTube Video ==


== Weblinks ==


== Literatur ==
Link:
{{#ev:youtube|https://www.youtube.com/watch?v=FP4AfBzAZ9o | 450 |left|[https://www.youtube.com/watch?v=FP4AfBzAZ9o=1 Escape Game - JoyCode]|frame}}
<br clear=all>
<br><br>
 
= Projektunterlagen =
 
<br clear="both"/>
[[Datei:JoyCode Programm Main.png|1650px|mini|links|900px|Abb. 21: Simulink Ablaufplan [[Datei:JoyCode Simulink ZIP.zip|mini]]]]
<br clear="left"/>
 
= Projektplan =
 
 
<br clear="both"/>
[[Datei:JoyCode Projektplan.png|1650px|mini|links|920px|Abb. 22: [https://svn.hshl.de/svn/Elektrotechnik_Fachpraktikum/trunk/Projekte/185-196/196_JoyCode/Projektplan/ Projektplan erstellt mit GanttProject]]]
<br clear="left"/>
 
= Weblinks =
 
= Literatur =





Aktuelle Version vom 13. Januar 2026, 18:27 Uhr

Autoren: Jens Potthoff Mohammed Yassine Houari
Betreuer: Marc Ebmeyer
Hardware-Prototyp des Escape-Games „JoyCode“

Einleitung

Im Rahmen des Fachpraktikums im Modul Angewandte Mechatronik des Studiengangs Business and Systems Engineering werden Rätsel entwickelt, die in etwa fünf Minuten lösbar sind und in ein übergeordnetes Escape-Game integriert werden. Das Projekt „JoyCode“ ist ein solches Escape-Rätsel, das über zwei Joysticks gesteuert wird. Ziel ist es, beide Joysticks in zufällig generierte Zielpositionen zu bewegen, wobei jeder Joystick eine eigene Zielposition hat. Neben den Joysticks befindet sich eine LED-Statusanzeige, die den Abstand zur jeweiligen Zielposition in Echtzeit visualisiert. In vier aufeinanderfolgenden Runden müssen die Joysticks korrekt positioniert und die jeweilige Zielstellung für drei Sekunden gehalten werden. Nach jeder erfolgreich abgeschlossenen Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Nach vier Runden ergibt sich so ein vollständiger Zahlencode, der für den Zugang zum nächsten Rätsel benötigt wird. Die Rückmeldung erfolgt über RGB-LEDs: Rot signalisiert eine große Abweichung, Gelb zeigt Annäherung, Grün steht für fast korrekt, und blinkendes Grün markiert die exakte Zielposition, die dann für drei Sekunden gehalten werden muss. Das Rätsel besteht aus den Joysticks, den RGB-LEDs zur visuellen Rückmeldung, dem LC-Display zur Anzeige der freigeschalteten Ziffern sowie den vier aufeinanderfolgenden Runden, deren erfolgreiche Bewältigung den Zahlencode freischaltet.


Schwierigkeitslevel
Fortgeschritten. Das Rätsel erfordert eine gute Hand-Auge-Koordination, da beide Joysticks gleichzeitig und präzise bewegt werden müssen. Je nach eingestelltem Toleranzbereich und den angezeigten Hinweisen auf dem Display kann der Schwierigkeitsgrad leicht angepasst werden.


Lernziele
Das Lernziel des Rätsels besteht darin, zwei Steuerungen gleichzeitig präzise zu bedienen und ihre Bewegungen gezielt zu koordinieren. Durch die farbliche Rückmeldung der LEDs wird das Verständnis für Positionsänderungen und deren Auswirkungen geschult. Das Rätsel fördert somit die Hand-Auge-Koordination, Feinmotorik sowie die Fähigkeit, Rückmeldungen richtig zu interpretieren und entsprechend darauf zu reagieren.


Bezug zum BSE Studium
Für die Umsetzung des Projekts werden mechatronische Kenntnisse praktisch angewendet, insbesondere im Bereich Sensorik, Softwareintegration und Systemsteuerung. Das Projekt erfordert zudem die Verknüpfung der Hardware- und Softwarekomponenten sowie die Umsetzung von Echtzeit-Rückmeldungen über die LEDs. Dabei wird die Fähigkeit gefördert, von einer Idee über die Planung und Konzeption ein funktionierendes Hardware-/Software-System zu entwickeln, das praktisch innerhalb des übergeordneten Escape-Game genutzt werden kann. Die Planung, Programmierung und Steuerung mechatronischer Systeme wird erlernt, die Zusammenhänge zwischen Hardware und Software erlernt.

Anforderungen

Tabelle 1: Anforderungen an das Escape Game
ID Inhalt Prio Ersteller Datum Geprüft von Datum
1 Das System muss die gleichzeitige Bedienung von zwei Joysticks ermöglichen. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
2 Für jeden Joystick muss eine LED-Statusanzeige den Abstand zur jeweiligen Zielposition in Echtzeit anzeigen. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
3 Beide Joysticks müssen gleichzeitig für mindestens 3 Sekunden an der Zielposition gehalten werden, damit eine Ziffer freigeschaltet wird. Hoch Houari 02.10.2025 Potthoff 05.01.2026
4 Das Rätsel muss aus vier aufeinanderfolgenden Runden bestehen, wobei in jeder Runde eine Ziffer der dreistelligen PIN freigeschaltet wird. Hoch Houari 02.10.2025 Potthoff 05.01.2026
5 Die RGB-LEDs müssen den Abstand zur Zielposition farblich darstellen: Rot = weit entfernt, Gelb = Annäherung, Grün = nahe, blinkendes Grün = Zielposition erreicht. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
6 Das LC-Display muss die freigeschalteten Ziffern sowie optionale Startinformationen anzeigen. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
7 Ein Start-Button muss das Rätsel initialisieren und alle Werte zurücksetzen. Hoch Houari 02.10.2025 Potthoff 05.01.2026
8 Ein Reset-Button muss den aktuellen Spielstand löschen und das Rätsel in den Ausgangszustand versetzen. Mittel Houari 02.10.2025 Potthoff 05.01.2026
9 Ein Lösungs-Button muss auf dem LC-Display den korrekten Zahlencode anzeigen, falls das Rätsel nicht gelöst wurde. Hoch Houari 02.10.2025 Potthoff 05.01.2026
10 Die Zielpositionen müssen zu Beginn jeder Runde zufällig generiert werden. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
11 Der Toleranzbereich der Zielpositionen muss so eingestellt sein, dass das Rätsel lösbar, aber herausfordernd bleibt. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
12 Das Gehäuse muss aus 3D-gedrucktem Material bestehen und die Elektronik sicher und stabil aufnehmen. Mittel Houari 02.10.2025 Houari 05.01.2026
13 Die maximale Außenabmessung des Gehäuses darf die Größe eines Standard-Schuhkartons nicht überschreiten. Hoch Potthoff 02.10.2025 Houari 05.01.2026
14 Die Spieldauer pro Rätsel darf 5 Minuten nicht überschreiten. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026
15 Das Rätsel ist ohne zusätzliche digitale Geräte vollständig spielbar. Mittel Potthoff 02.10.2025 Potthoff 05.01.2026
16 Die zufällige Initialisierung der Zielposition darf nicht der Standardposition des Joysticks entsprechen. Hoch Potthoff 02.10.2025 Potthoff 05.01.2026

Funktionaler Systementwurf

Die beiden Joysticks dienen dazu, vordefinierte Zielpositionen zu erreichen. Jeder Joystick hat eine eigene Zielposition für X- und Y-Achse, die zu Beginn jeder Runde zufällig festgelegt wird. Die Joysticks müssen so bewegt werden, dass die Zielpositionen innerhalb eines definierten Toleranzbereichs erreicht und für drei Sekunden gehalten werden. Sobald beide Joysticks korrekt positioniert sind, wird eine Ziffer auf dem LC-Display freigeschaltet. Die RGB-LEDs liefern dabei zusätzlich Echtzeit-Feedback über die aktuelle Abweichung von der Zielposition.

Der Aufbau des Projekts JoyCode erfolgt in einem kompakten, rechteckigen Gehäuse, dessen Frontplatte alle Bedienelemente übersichtlich anordnet, wie Abbildung 1 zeigt. Im oberen mittleren Bereich befindet sich das LC-Display, das als zentrale Anzeige dient. Es zeigt den jeweils aktuellen Fortschritt, also die freigeschaltete Ziffern des Zahlencodes während des Rätzels an. Direkt unterhalb des Displays sind drei Taster angeordnet: links der Start-Button (grün) zum Initialisieren des Rätzels, in der Mitte der Reset-Button (rot) zum Zurücksetzen des aktuellen Fortschritts und rechts der Lösungs-Button (schwarz), der bei Bedarf jeweils die nächste Ziffer auf dem Display anzeigt.

Im unteren Bereich der Frontplatte sollen die beiden Joysticks symmetrisch angeordnet – einer links, einer rechts. Diese dienen als Haupteingabegeräte, über die die Zielpositionen gesteuert werden. Oberhalb jedes Joysticks wird eine RGB-LED positioniert, die den aktuellen Abstand zur jeweiligen Zielposition farblich visualisiert: Rot signalisiert eine große Abweichung, Gelb zeigt eine Annäherung und Grün markiert die korrekte Position. Links neben dem Display soll sich der Anschlussbereich für die Stromversorgung bzw. den PD-Port befinden, über den das System mit Energie versorgt wird. Abbildung 1 zeigt das Designkonzept des Projekts.

Im Inneren des Gehäuses ist die gesamte Elektronik auf einer Trägerplatte montiert. Der Arduino Uno R3 fungiert als zentrale Steuereinheit und ist so platziert, dass alle Verbindungskabel zu den Joysticks, LEDs, Tastern und dem Display möglichst kurz gehalten werden.

Das Gehäuse selbst soll so konstruiert werden, dass alle Komponenten bündig in die Frontplatte eingelassen sind. Die Bedienelemente ragen leicht hervor, während die RGB-LEDs durch Öffnungen sichtbar bleiben. Im Inneren sollen Abstandshalter und Podeste dafür sorgen, dass alle Bauteile auf derselben Höhe liegen und mechanisch stabil montiert sind. Die Technische Umsetzung der Software bzw. der Programmablauf zeigt Abbildung 2: Programmablaufplan JoyCode.


Abb. 01: Technischer Systementwurf

Abb. 01: Konzeptzeichnung JoyCode



Abb. 01: Technischer Systementwurf

Abb. 02: Programmablaufplan JoyCode


Technischer Systementwurf

Für das Projekt zeigt die folgende Abbildung den technischen Systementwurf. In diesem sind alle elektronischen Bauteile sowie deren Verdrahtung mit dem Arduino dargestellt.

Abb. 03: Technischer Systementwurf

Komponente Pin(s) Funktion / Farbe
Joystick 1 A3 X-Position
Joystick 1 A2 Y-Position
Joystick 2 A0 X-Position
Joystick 2 A1 Y-Position
LED 1 Pin 6 PWM – Blau
LED 1 Pin 3 PWM – Grün
LED 1 Pin 5 PWM – Rot
LED 2 Pin 10 PWM – Blau
LED 2 Pin 11 PWM – Grün
LED 2 Pin 9 PWM – Rot
Taster Start Pin 13 Digital
Taster Solution Pin 8 Digital
Taster Reset Pin 12 Digital
LCD SCL I2C Clock
LCD SDA I2C Data

Abb. 03: Technischer Systementwurf

Komponentenspezifikation

Mikrocontroller-Board – Arduino Uno R3
Der Arduino Uno R3 dient als zentrale Steuereinheit und ist mit dem ATmega328P ausgestattet. Es bietet ausreichend Anschlussmöglichkeiten, um alle für das Rätsel benötigten Komponenten unterzubringen.

LC-Display – Joy-it SBC-LCD16x2 Display-Modul
Das LC-Display zeigt die freigeschalteten Ziffern des Zahlencodes an. Dank des integrierten I²C-Moduls kann es direkt über die SDA- und SCL-Pins (A4 und A5) des Arduino Uno R3 angeschlossen werden. Zusätzlich benötigt das Display eine Spannungsversorgung (VCC) und Masse (GND).

Joystick – KY-023 Joystick-Modul (2 Stück)
Die Joysticks dienen zur Eingabe von X/Y-Koordinaten. Die Anschlüsse für die vertikale und horizontale Achse werden an zwei analoge Eingänge des Arduino angeschlossen. Die integrierte Tasterfunktion wird nicht verwendet.

RGB-LED – Iduino SE010 RGB-LED-Modul (2 Stück)
Die RGB-LEDs geben visuelles Feedback über die Abweichung von der Zielposition. Die Vorwiderstände sind bereits integriert. Jede LED wird über drei digitale PWM-Pins des Arduino für die Farben Rot, Grün und Blau angesteuert.

Taster (3 Stück)
Die Taster dienen als Bedienelemente (Starten, Zurücksetzen, Lösung). Sie werden jeweils zwischen Masse (GND) und einen digitalen Eingang des Arduino angeschlossen, um deren Zustand (0 oder 1) abzufragen.

Gehäuse und Montage
Alle Komponenten werden auf ein 3D-gedrucktes Gehäuse montiert, wobei die Kabelverbindungen verborgen werden. Um sicherzustellen, dass alle Bauteile die richtige Höhe im Gehäuse haben, werden zusätzliche Podeste für die einzelnen Komponenten gedruckt. Die sichtbaren Teile der Komponenten ragen dabei durch passgenaue Ausschnitte des Gehäuses nach außen.

Materialliste

Für die Realisierung des Projekts werden verschiedene Hardwarekomponenten benötigt, die in Tabelle 2 aufgeführt sind. Die Kernkomponenten sind das Mikrocontroller-Board Arduino Uno R3 als zentrale Steuereinheit, zwei Joystick-Module als Eingabegeräte, RGB-LEDs für die visuelle Rückmeldung sowie ein LC-Display zur Anzeige des Zahlencodes. Ergänzt wird die Schaltung durch Taster zur Steuerung und ein Netzteil zur Stromversorgung.

Tabelle 2: Stückliste
ID Anzahl Kosten pro Stück € Summe Bezeichnung / Komponente technische Bezeichnung Beschreibung Datenblatt
1 1x 13,90€ 13,90€ Mikrocontroller-Board Arduino Uno R3 Zentrale Steuereinheit mit ATmega328P. Datenblatt Arduino Uno
2 2x 1,29€ 2,58€ Joystick KY-023-Joystick Modul Dient zur Eingabe (X/Y-Koordinaten). Benutzung Joystick-Modul
3 2x 2,49€ 4,98€ RGB LED Iduino SE010 RGB LED-Modul Visuelles Feedback über Abweichung von der Zielposition. Die Widerstände sind bereits montiert. Datenblatt RGB-LED-Modul
4 1x 9,88€ 9,88€ LC-Display Joy-it SBC-LCD16x2 Display-Modul Anzeige der freigeschalteten Ziffern des Zahlencodes. Das LC-Display kann direkt an die SDA- und SCL-Pins (A4 und A5) des Arduino Uno R3 angeschlossen werden. LCD16x2 Display-Modul
5 3x 1,65€ 4,95€ Taster Taster Bedienelemente zur Steuerung des Rätzels (starten, zurücksetzen, Lösung). Taster-Modul
6 1x 3,90€ 3,90€ 9V Netzteil 9V Netzteil Stromversorgung des Mikrocontrollers.
40,19 €

Regelungstechnische Theorie

Das im Rahmen des Fachpraktikums entwickelte Escape-Rätsel „JoyCode“ lässt sich aus regelungstechnischer Sicht als ein geschlossener Regelkreis mit Mensch-Maschine-Interaktion beschreiben. Ziel des Systems ist es, zwei Joysticks in vorgegebene, zufällig generierte Zielpositionen zu bewegen.


Regelungstechnische Einordnung

Bei dem System handelt es sich um einen geschlossenen Regelkreis, da eine kontinuierliche Rückführung der Istwerte erfolgt und der Nutzer anhand dieser Rückmeldung Korrekturen vornimmt. Der Mensch übernimmt dabei die Funktion des Reglers, während die technische Umsetzung (Joystick, Mikrocontroller, LEDs und Display) die Regelstrecke bildet.


Führungs- und Regelgrößen

Die Führungsgröße (Sollwert) wird durch die vom System zufällig generierten Zielpositionen der beiden Joysticks definiert. Für jeden Joystick existiert eine eigene Zielposition.

Die Regelgröße (Istwert) ist die aktuell gemessene Position der Joysticks, die über analoge Eingangswerte erfasst und vom Mikrocontroller verarbeitet wird.

Die Regelabweichung ergibt sich aus der Differenz zwischen Soll- und Istwert und dient als Grundlage für die visuelle Rückmeldung an den Nutzer.


Regler und Stellgröße

Der Regler ist in diesem System der Nutzer selbst. Mithilfe der visuellen Rückmeldung interpretiert er die aktuelle Regelabweichung und passt die Position der Joysticks entsprechend an.

Die Stellgröße ist somit die manuelle Bewegung der Joysticks durch den Nutzer, mit der versucht wird, die Regelabweichung zu minimieren.


Regelstrecke und Rückführung

Die Regelstrecke umfasst die Joysticks als Eingabeelemente, den Mikrocontroller zur Auswertung der Positionsdaten sowie die Ausgabeelemente zur Rückmeldung.

Die Rückführung erfolgt über RGB-LEDs, die den Abstand zur Zielposition visualisieren:

  • Rot signalisiert eine große Abweichung
  • Gelb zeigt eine Annäherung an die Zielposition
  • Grün steht für eine geringe Abweichung

Diese Rückmeldung schließt den Regelkreis, indem sie dem Nutzer kontinuierlich Informationen über den aktuellen Systemzustand liefert.


Mehrstufiger Regelprozess

Das Rätsel besteht aus vier aufeinanderfolgenden Runden, die jeweils einen eigenen Regelkreis mit neu generierten Sollwerten darstellen. Nach jeder erfolgreich abgeschlossenen Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Erst nach Abschluss aller vier Runden ergibt sich ein vollständiger Zahlencode, der den Zugang zum nächsten Escape-Rätsel ermöglicht.


Toleranzbereich und regelungstechnische Bewertung

Aufgrund der hohen Sensibilität der verwendeten Joysticks ist es in der Praxis nicht möglich, eine exakt punktgenaue Zielposition dauerhaft zu erreichen. Aus regelungstechnischer Sicht wird dieses Problem durch die Einführung eines Toleranzbereichs um den Sollwert gelöst.

Der Toleranzbereich definiert einen zulässigen Wertebereich, innerhalb dessen die Regelabweichung als ausreichend klein betrachtet wird. Befindet sich der Istwert innerhalb dieses Bereichs, gilt der Sollwert als erreicht.


Toleranzwert als Totzone

Regelungstechnisch kann der Toleranzbereich als sogenannte Totzone (Deadband) interpretiert werden. Innerhalb dieser Totzone führt eine geringe Regelabweichung zu keiner weiteren Regelaktion, da das System diesen Zustand als stabil bewertet.

Die Totzone verhindert:

  • ständiges Nachregeln durch minimale Abweichungen,
  • unruhiges Verhalten des Reglers (Nutzer),
  • sowie das Scheitern der Aufgabe durch nicht vermeidbares Sensorrauschen.



Regelkreis

Abb. 04: Regelkreis für das Projekt

Die dargestellte Abbildung beschreibt den Regelkreis des Projekts JoyCode unter Einbeziehung des Nutzers als aktiven Regler. Die Führungsgröße (w) bildet eine zufällig generierte Zielposition, die mit der aktuellen Regelgröße (x), der tatsächlichen Joystick-Position, verglichen wird. Aus diesem Vergleich resultiert die Regelabweichung (e), die im System als euklidische Distanz berechnet und dem Nutzer über die Rückführung mittels RGB-LEDs visuell vermittelt wird. Der Mensch fungiert hierbei als Regler, der basierend auf der wahrgenommenen Abweichung eine Handbewegung als Stellgröße (u) ausführt, um die Regelstrecke (die Joystick-Mechanik) zu beeinflussen. Motorische Unruhe wirkt dabei als Störgröße (z) auf den Prozess ein, während der Prozess-Ausgang (y) die finale Position für die Logikprüfung bereitstellt.


Umsetzung (HW/SW)

Hardware Umsetzung

Platinendesign und Erstellung

Auf der Platine müssen keine zusätzlichen Widerstände oder andere elektronische Bauteile untergebracht werden. Diese Teile sind bereits auf den internen Platinen der einzelnen Komponenten vorhanden, zum Beispiel bei den RGB-LEDs. Deshalb muss keine eigene Platine gefräst oder gebohrt werden. Die elektronischen Bauteile brauchen nur einen gemeinsamen Masseanschluss und einen gemeinsamen Anschluss für die Spannungsversorgung. Daher wird eine Lochplatine bzw. Streifenrasterplatine verwendet. Auf der Platine werden acht Masseanschlüsse und drei Spannungsanschlüsse benötigt. Der 5-V-Pin des Arduino wird an eine Seite der Platine geführt. Die dafür genutzten Lötpunkte werden miteinander verbunden, so entsteht eine gemeinsame 5-V-Schiene. Genauso wird der Masseanschluss des Arduino an eine andere Seite der Platine geführt. Die acht Masseanschlüsse werden mit dieser GND-Schiene verbunden. Abbildung 05 zeigt das vorgehen.


Abb. 05: Platinenkonzept

Testen der Hardwarekomponenten

Abb. 06: Steckbrettaufbau


Um die einzelnen Komponenten zunächst zu testen, werden diese auf einem Steckbrett aufgebaut (siehe Abbildung 7) und mit einer ersten Simulink-Software in Betrieb genommen. Um die Komponenten korrekt nutzen zu können, wird zunächst ihre internen Wertebereiche und mögliche offsets überprüft.

Joystick: Die analogen Eingänge lieferten Werte im Bereich von 0 bis 1023 (10 Bit). In der Neutralstellung (Mitte) beträgt der Wert ca. 512. Aufgrund kleiner Fertigungstoleranzen tritt ein Offset von bis zu ±30 auf, der berücksichtige werden muss. Beim Testen ist aufgefallen, dass der Wertebereich von 0 bis 1023 die vollen Stellungsgrenzen des Joysticks durch den Mittelstellungs-Offset nicht exakt abbildet, was bei der Auswertung berücksichtigt werden muss.

RGB-LEDs: Das eingesetzte Modul Iduino SE010 ist eine SMD-RGB-LED. Für den korrekten Anschluss ist zunächst die Polung zu beachten. Es handelt sich um eine Common-Cathode-LED, bei der der gemeinsame Anschluss mit GND verbunden ist. Die einzelnen Farbkanäle Rot (R), Grün (G) und Blau (B) werden über digitale Ausgänge bzw. PWM-Signale (0–255) angesteuert. Die LED besitzt somit drei Farbanschlüsse zur Farbmischung sowie einen gemeinsamen Masseanschluss. Um die Werte von den Joysticks als Eingabe für die RGB-LEDs zu nutzen, müssen diese auf einen wert von 0 bis 255 normiert werden. Da das Ziel darin besteht, die RGB-LED abhängig von der Entfernung des Joysticks zur Zielposition einzufärben, zeigt sich, dass es schwierig ist, einen geeigneten Wertebereich für die LED zu definieren. Besonders verschiedene Grüntöne lassen sich sehr genau unterscheiden, sodass ein „echtes“ klares Grün erst angezeigt werden sollte, wenn die Zielposition tatsächlich erreicht wird. Andernfalls sollte die LED deutlich gelb oder rot leuchten.

LC-Display: Das Display wird zunächst über die Library LiquidCrystal_I2C konfiguriert und anschließend ein eigener Simulink-Block mit dem IO Device Builder erstellt, der Eingänge für die Steuerung und das Schreiben von Zeichen bereitstellt.

Die Idee, dynamisch veränderbaren Text anzuzeigen, je nach runde wurde folgendermaßen umgesetzt, kann am besten mit vier Eingänge realisiert werden: Zwei Eingänge, die jeweils eine Liste von uint8-Werten übergeben – eine Liste für die erste Zeile (0,0) und eine für die zweite Zeile (0,1). Die Zahlen werden entsprechend der ASCII-Tabelle in Zeichen konvertiert. Dritter Eingang: Eine Zahl (0, 1, 2, 3, 4), um den aktuellen Fortschritt zu überprüfen (z. B. wie viele Zahlen bereits freigeschaltet wurden) oder den kompletten Zahlencode anzuzeigen. Vierter Eingang: Ein Boolean-Signal, das überprüft, ob die Joystick-Position der Zielposition entspricht. Nur wenn dies zutrifft, wird der Text auf dem LC-Display aktualisiert.

Taster: Die Signale der drei Taster werden mit Digital Input-Blöcken aufgenommen, wobei der PinMode auf Pull-Up gesetzt wird, um stabile Eingabewerte zu gewährleisten. Die Taster Funktionieren einwandfrei.

Um alle PWM Ausgänge nutzen zu könne muss in den Einstellungen in Simulink unter Solver "Treat each discrete rate as a separate task" deaktiviert werden.

Das Testen der Hardwarekomponenten hat gezeigt, dass alle Komponenten funktionieren. Abbildung 6 zeigt die provisorische Testverkabelung und Abbildung 7 das Simulink-Modell zum Testen.


Abb. 07: Simulink-Modell zum testen

Test der Sensoren

Für die erfolgreiche Umsetzung des Projekts ist eine detaillierte Voruntersuchung der verwendeten Hardware notwendig. Ziel dieser Testphase ist es, das physikalische und elektrische Verhalten der Sensoren genau zu verstehen, um Fehlfunktionen im späteren Spielablauf auszuschließen.

Mechanische Analyse und CAD-Anforderungen
Zunächst wird der Joystick auf seine mechanischen Eigenschaften geprüft. Dies ist entscheidend für die Konstruktion des Gehäuses und den anschließenden 3D-Druck. Besonders relevant ist hierbei die Dimensionierung der Gehäuseöffnung. Bei der Untersuchung der Kinematik wurde festgestellt, dass sich lediglich die aufgesteckte Kappe neigt, während der darunterliegende Sockel seinen Durchmesser am Drehpunkt beibehält. Da die Kappe oberhalb des Gehäuses sitzt, ist für die Konstruktion der Durchmesser dieses Sockels ausschlaggebend.

Konsequenz für das Design
Der Radius der kreisförmigen Aussparung im Gehäusedeckel kann direkt anhand der Dicke des Joysticksockels bestimmt werden. Die Öffnung muss so dimensioniert sein, dass sie dem Sockel genügend Spielraum für die Neigung bietet, ohne dass das Innenleben sichtbar wird oder die Kappe am Gehäuse schleift.

Elektrische Analyse: Kennlinie und Signalverhalten
Im zweiten Schritt wird das elektrische Verhalten des KY-023 Joystick-Moduls analysiert. Das Ziel ist es zu klären, ob die Sensoren eine lineare Kennlinie aufweisen und wie präzise die Signalausgabe erfolgt. Der KY-023 basiert auf zwei Potentiometern für die X- und Y-Achse, die als Spannungsteiler fungieren. Bei der verwendeten Versorgungsspannung von 5V wandelt der Analog-Digital-Wandler (ADC) des Mikrocontrollers die Spannung in diskrete Werte zwischen 0 und 1023 um. • Theoretischer Mittelpunkt: 512 (entspricht ca. 2,5V). • Theoretische Endpunkte: 0 (GND) und 1023 (VCC).

Während der Tests zeigten sich charakteristische Eigenheiten der Module, die bei der Softwareentwicklung berücksichtigt werden müssen: 1. Signalrauschen: Im Ruhezustand ist das Signal sehr stabil. Das Rauschen ist minimal und liegt im Bereich von nur 1 Einheit (z. B. schwankend zwischen 511 und 513). 2. Offset im Nullpunkt und Wiederholgenauigkeit: Die physische Ruheposition entspricht nicht exakt dem theoretischen Mittelwert von 512. In den Tests ergaben sich feste Offset-Werte von +/- 30. Positiv ist jedoch die hohe Wiederholgenauigkeit: Nach dem Loslassen zentriert sich der Stick mechanisch zuverlässig und kehrt stabil zu diesen Ruhewerfen zurück. 3. Abweichung der Endwerte: Obwohl der Joystick mechanisch bis zum Anschlag bewegt werden kann, erreichen die Potentiometer elektrisch nicht die vollen Grenzwerte von 0 oder 1023.

Das Verhalten der Kennlinie eines KY-023 Joysticks und die menschliche Wahrnehmung während der Bedienung sind der unterschiedlich. In der Theorie ist die Kennlinie linear, in der Praxis fühlt sie sich aber "sprunghaft" oder "aggressiv" an. Positionen um die Ruheposition (512) ist der Joystick extrem sensibel. Wenn eine Zielposition nahe der Mitte generiert wird, muss extrem vorsichtig agiert werden, da man dort kaum mechanischen Widerstand spürt, der bei der Feinjustierung hilft. Außerdem muss verhindert werden, dass eine Zielposition genau dies Ruheposition gelegt wird.




Maßnahmen für die Software-Implementierung
Aus den Testergebnissen werden folgende Parameter für die Programmierung der „JoyCode“-Logik abgeleitet: • Einschränkung des Zielbereichs: Um das Problem der elektrischen Offsets an den Rändern zu umgehen, werden die zufälligen Zielkoordinaten nicht im vollen Spektrum generiert. Der gültige Bereich wird auf 30 bis 980 begrenzt. Dies stellt sicher, dass jede generierte Position elektrisch erreichbar ist. • Toleranzbereich: Um den Versatz des Nullpunkts und die feinen motorischen Ungenauigkeiten der rätselden Personn auszugleichen, darf keine punktgenaue Übereinstimmung verlangt werden. Stattdessen wird ein Toleranzradius um die Zielposition definiert. Da das Spielkonzept ohnehin eine visuelle Rückmeldung über die „Nähe zum Ziel“ vorsieht, lässt sich diese Notwendigkeit nahtlos in die Spielmechanik integrieren. Auch darf die Zielpositionen nicht um 512 liegen, da da die Ruheposition ist. Daher wird für die Zielpositon werte um +/- 20 um 512 ebenfalls ausgeschlossen.


RGB-LEDs
Die visuelle Rückmeldung stellt den einzigen Indikator für den Rätselnden dar. Daher ist die Farbdarstellung – insbesondere die klare Unterscheidung zwischen „Gelb“ (Annäherung) und „Grün“ (Ziel erreicht) – von zentraler Bedeutung. Während der Tests zeigte sich, dass der Übergang von Gelb zu Grün nur schwer wahrnehmbar ist, insbesondere bei Farbtönen, die bereits „fast grün“ erscheinen. Dies ist problematisch, da solche Farben fälschlicherweise als Zielzustand interpretiert werden können. Da das menschliche Auge Farben subjektiv wahrnimmt, ist eine Kalibrierung der Farbmischung notwendig. Theoretisch ergibt sich Gelb aus 100 % Rot + 100 % Grün. In der Praxis überstrahlt jedoch der Grünanteil das Rot, wodurch der resultierende Farbton eher hellgrünlich wirkt und seine Funktion als Warn- bzw. Annäherungsfarbe verliert. Zur Farbkorrektur wird daher der Rotanteil bewusst stärker gewichtet, sodass ein klar erkennbares Gelb entsteht. Diese Anpassung wird über eine Look-up-Tabelle (LUT) realisiert, deren Werte experimentell durch Tests und Beobachtungen ermittelt werden. Zusätzlich ist eine Helligkeitsreduktion erforderlich, da die LEDs bei maximalem PWM-Wert (255) deutlich zu hell sind. Aus diesem Grund wird ein maximaler PWM-Wert von 100 verwendet, was sowohl die Sichtbarkeit verbessert als auch die Augenbelastung reduziert.



Gehäuse 3D-Druck

Das Gehäuse des Escape-Game-Moduls JoyCode wurde vollständig als 3D-druckbares Bauteil konzipiert und dient der sicheren Aufnahme sowie der strukturierten Integration aller elektronischen und mechanischen Komponenten. Ziel der Konstruktion ist eine kompakte, stabile und wartungsfreundliche Lösung, die sich für den Einsatz im Escape-Game-Umfeld eignet.

Konstruktiver Aufbau

Das Gehäuse besteht aus zwei Hauptkomponenten:

- einer Frontplatte mit Bedienelementen (200mm x 100mm)

- einem rückseitigen Gehäusekörper zur Aufnahme der Elektronik (206mm x 106mm x 80mm)

Die Frontplatte ist verschraubt ausgeführt und ermöglicht dadurch einen einfachen Zugang zu den internen Komponenten. Alle Bedienelemente sind präzise in die Front integriert und mechanisch abgestützt.

Die Wandstärke beträgt 3mm.

Integration der Komponenten

In die Frontplatte sind folgende Elemente integriert:

- zwei Joysticks zur Benutzereingabe,

- drei Taster (Start, Reset, Solution),

- ein LCD-Display zur Anzeige von Informationen und Codes,

- zwei LEDs zur optischen Rückmeldung während des Spiels.

Im Inneren des Gehäuses sind Montagebolzen und Distanzhalter vorgesehen, um die Joystick-Module, das LCD-Display, die LED-Module, sowie den Arduino-Controllerpositionsgenau zu fixieren. Dadurch wird eine spannungsfreie Montage der Leiterplatten gewährleistet und mechanische Belastungen auf Lötstellen vermieden. Die Anordnung der Komponenten erlaubt eine übersichtliche Kabelführung und ausreichend Platz für Wartung oder spätere Erweiterungen.

Schnittstellen und Zugänglichkeit

An der Seitenwand des Gehäuses befindet sich eine Aussparung für den USB-Anschluss des Arduino-Boards, sodass Programmierung und Spannungsversorgung ohne Demontage möglich sind. Zusätzlich ist eine Öffnung für die externe Stromversorgung vorgesehen.

Design- und Fertigungsaspekte

Das Gehäuse wird mit abgerundeten Kanten und definierten Wandstärken konstruiert, um:

- eine gute Druckbarkeit zu gewährleisten,

- Verzug und Materialspannungen zu reduzieren,

- sowie eine robuste Haptik zu erzeugen.

Die Konstruktion ist so ausgelegt, dass sie ohne oder mit minimalen Stützstrukturen gefertigt werden kann. Schraubverbindungen und Befestigungspunkte sind auf Standard-Metrikschrauben ausgelegt.



CAD Modell

Die folgenden Abbildungen zeigen das erstelle JoyCode CAD-Modell mit eingesetzten Hardwarekomponenten, nach dem im vorherigen Abschnitt beschriebenen Kriterien und Fertigungsaspekten.

Abb. 08: CAD-Modell des Projekts



Einbinden der Hardwarekomponenten

Die Einbindung der Hardwarekomponenten im System JoyCode erfolgt zentral über den Mikrocontroller, der als Schnittstelle zwischen Sensorik, Aktorik und Anzeigeelementen fungiert. Ziel der Hardwareintegration ist eine zuverlässige, störungsarme Signalverarbeitung sowie eine eindeutige Zuordnung aller Ein- und Ausgänge.

Analoge Eingabekomponenten

Die beiden Joysticks werden jeweils über zwei analoge Signalleitungen (x- und y-Achse) an den Mikrocontroller angebunden. Die Potentiometer der Joysticks liefern positionsabhängige Spannungen im zulässigen Eingangsbereich des Analog-Digital-Wandlers. Die Signale werden direkt auf dedizierte ADC-Eingangspins geführt, wobei auf eine gemeinsame Masseführung geachtet wird, um Offset- und Rausch­effekte zu minimieren.

Die Zuordnung der ADC-Kanäle erfolgt so wie in Abb. 03: Technischer Systementwurf dargestellt über die A01 bis A04 Pins, sodass jede Joystick-Achse eindeutig adressiert und ausgewertet werden kann.

Digitale Ausgabekomponenten

Die RGB-LEDs werden über digitale Ausgangspins angesteuert. Jede Farbkomponente (Rot, Grün, Blau) ist separat verschaltet, wodurch eine flexible Farbmischung realisiert werden kann. Die Ansteuerung erfolgt softwareseitig über definierte Pulsweitenmodulation.

Das LC-Display wird über eine serielle Schnittstelle (I²C) in das System eingebunden. Dadurch kann die Anzahl benötigter Ein- und Ausgangspins reduziert werden. Die Initialisierung des Displays sowie die Aktualisierung der Inhalte erfolgen zyklisch bzw. ereignisabhängig aus der Software heraus.

Spannungsversorgung und Massekonzept

Die Spannungsversorgung aller Hardwarekomponenten erfolgt zentral über den Mikrocontroller. Dabei wird sichergestellt, dass alle Module eine gemeinsame Referenzmasse besitzen. Dieses Massekonzept ist entscheidend für die stabile Funktion der analogen Joystick-Signale und die reproduzierbare ADC-Messung.

Die Stromaufnahme der angeschlossenen Komponenten liegt innerhalb der zulässigen Grenzwerte des Systems, sodass keine zusätzliche externe Versorgung notwendig ist.

Systemintegration

Durch die klare Trennung von analogen Eingängen (Joysticks) und digitalen Ausgängen (LEDs, Display) entsteht eine übersichtliche und wartbare Systemstruktur. Die Hardware ist so eingebunden, dass jede Komponente eindeutig adressierbar ist und unabhängig getestet werden kann.

Die enge Kopplung zwischen Hardwareanschluss und Softwarestruktur ermöglicht eine konsistente Signalverarbeitung und bildet die Grundlage für den stabilen Betrieb des regelungstechnischen Gesamtsystems.


Lötarbeiten und Platinenfertigung

Abb. 09: Platine Oberseite
Abb. 10: Platine Unterseite

Die acht GND-Anschlüsse für die Komponenten werden mit schwarzen Leitungen realisiert. Zusätzlich stellt eine Leitung den Masseanschluss dar, der direkt vom Arduino geführt wird. Die Versorgungsspannungen für die beiden Joysticks sowie das LCD-Modul sind rot gekennzeichnet. Ebenso eine Leitung für die 5-V-Versorgung vom Arduino.



Abb. 11: Hardwarekomponenten Montage

Die Verbindungen zu den einzelnen Hardwarekomponenten des Projekts werdenmit Dupont-Kabeln realisiert. Da diese standardmäßig recht locker sitzen, werden die Kontakte zusätzlich mit Lötzinn etwas verzinnt, wodurch sie einen größeren Durchmesser erhalten. Auf diese Weise sitzen die Anschlüsse nun sehr fest und zuverlässig, sodass ein stabiler elektrischer Kontakt gewährleistet ist – selbst beim Ziehen an den Leitungen oder bei starker Bewegung bzw. Erschütterung des Gehäuses.

Ergebnis

Das entworfene Gehäuse wurde erfolgreich gefertigt und mit allen Komponenten bestückt. Abbildung 12 zeigt das fertiggestellte JoyCode-Modul mit montierter Elektronik und integrierter Verkabelung. Das System ist betriebsbereit und erfüllt alle mechanischen und funktionalen Anforderungen.

Abb. 12: Ergebnis des CAD-Drucks und Komponentenmontage


Software Umsetzung

Signalverarbeitung

Die analogen X- und Y-Achsen der beiden Joysticks werden über die ADC-Eingänge des Arduino erfasst. Für den linken Joystick werden die Pins A0 (X-Achse) und A1 (Y-Achse) verwendet, für den rechten Joystick die Pins A2 (X-Achse) und A3 (Y-Achse). Die analogen Pins A4 und A5 werden nicht für die Joysticks verwendet, da sie zusätzlich die I²C-Funktionen SDA und SCL unterstützen. Obwohl das LC-Display an die oberen SDA- und SCL-Pins des Arduino angeschlossen ist, sind A4 und A5 intern weiterhin mit dem I²C-Bus verbunden. Eine alternative Belegung dieser Pins führt zu Störungen der I²C-Kommunikation und führt dazu, dass das Display nicht korrekt funktioniert.

Die aktuelle Position eines Joysticks wird für beide Achsen (X und Y) mit der jeweiligen Zielposition verglichen. Dazu wird für jede Achse die Differenz zwischen aktueller Position und Zielposition berechnet. Aus diesen beiden Abweichungen wird anschließend die euklidische Distanz zur Zielposition bestimmt: d=(xaktuellxziel)2+(yaktuellyziel)2

Die euklidische Distanz beschreibt den direkten Abstand zwischen der aktuellen Joystickposition und der Zielposition im zweidimensionalen Koordinatensystem. Der minimale Distanzwert beträgt 0 und entspricht der exakten Zielposition. Der maximale Distanzwert liegt bei 1448 und ergibt sich aus der größtmöglichen Entfernung zwischen zwei Punkten im Wertebereich der ADC-Auflösung (0–1023) beider Achsen, also der Distanz zwischen zwei gegenüberliegenden Eckpunkten des Koordinatensystems: dmax=(10230)2+(10230)2 Ergibt: dmax1448

Der berechnete Distanzwert wird anschließend normiert: dnorm=ddmax Der normierte Distanzwert liegt damit im Bereich von 0 bis 1 und dient als Eingangsgröße für eine Lookup-Tabelle. Diese Lookup-Tabelle ordnet dem jeweiligen Distanzbereich die passende visuelle Rückmeldung über die RGB-LEDs zu.


Joystick auslesen und LED Steuerung


Abb. 13: Simulink Modell zum Joystick auslesen und LED Steuerung


zielGenerator.m
Diese Funktion erzeugt zufällige Zielpositionen für den Joystick. Eine Ausschlusszone um die Mittelstellung (Ruheposition) verhindert, dass Ziele zu nah am Nullpunkt erscheinen.

function [zielX_out, zielY_out] = zielGenerator(rundeGewechselt, zielX_in, zielY_in)

%% PARAMETER
minVal = 30;    maxVal = 980;       % Gültiger Wertebereich
ausschlussMitte = 512;              % Joystick-Ruheposition
ausschlussBreite = 20;              % Halbe Breite der Ausschlusszone

ausschlussMin = ausschlussMitte - ausschlussBreite;  % 492
ausschlussMax = ausschlussMitte + ausschlussBreite;  % 532
effektiveRange = (maxVal - minVal + 1) - (ausschlussMax - ausschlussMin + 1);

%% NEUE POSITION BERECHNEN
if rundeGewechselt == 1
    % Zufallswerte durch deterministische Berechnung
    tempX = mod(zielX_in * 7 + zielY_in * 3 + 137, effektiveRange);
    tempY = mod(zielY_in * 11 + zielX_in * 5 + 251, effektiveRange);
    
    % Auf gültige Bereiche mappen (Ausschlusszone überspringen)
    zielX_out = mappeAufGueltig(tempX, minVal, ausschlussMin, ausschlussMax);
    zielY_out = mappeAufGueltig(tempY, minVal, ausschlussMin, ausschlussMax);
else
    zielX_out = zielX_in;  zielY_out = zielY_in;  % Werte beibehalten
end
end

function wert = mappeAufGueltig(temp, minVal, ausschlussMin, ausschlussMax)
    bereich1Groesse = ausschlussMin - minVal;  % Größe des unteren Bereichs
    if temp < bereich1Groesse
        wert = minVal + temp;                   % Unterer Bereich
    else
        wert = ausschlussMax + 1 + (temp - bereich1Groesse);  % Oberer Bereich
    end
end


Funktionsprinzip:

Aspekt Beschreibung
Zufall Deterministische Berechnung mittels Modulo-Arithmetik
Ausschlusszone Bereich 492-532 wird übersprungen (Joystick-Ruheposition)
Wertebereich Gültige Ausgabe: 30-491 oder 533-980
Trigger Neue Werte nur wenn rundeGewechselt == 1

Die Berechnung der Distanz zur Zielposition wird wie im Abschnitt Signalverarbeitung beschrieben, realisiert.

Als Toleranzwert für die LED-Rückmeldung und für die Freischaltung der Ziffer wird ein Wert von 150 verwendet. Dies entspricht einem relativ großzügigen Bereich, ist jedoch notwendig, da die Bedienung der Joysticks und die Interpretation des „richtigen“ Grüntons in der RGB-Rückmeldung vergleichsweise knifflig ist. Dieser Wert wird direkt auf die berechnete euklidische Distanz zwischen aktueller Joystickposition und Zielposition angewendet, noch bevor die Distanz normiert wird. Liegt die Distanz innerhalb der Toleranz, gilt die Runde als „erfolgreich“ und die Ziffer auf dem LC-Display kann freigeschaltet werden

Beispiel Zielposition:

xziel,1=500,yziel,1=600

xziel,2=300,yziel,2=400


Angenommen, die aktuellen Joystickpositionen sind:
x1=520,y1=580
x2=320,y2=390

Berechnung der euklidischen Distanz:
d1=(x1xziel,1)2+(y1yziel,1)2=(520500)2+(580600)2=202+(20)2=400+400=80028.3
d2=(x2xziel,2)2+(y2yziel,2)2=(320300)2+(390400)2=202+(10)2=400+100=50022.4
Da beide Distanzen kleiner sind als der Toleranzwert von 150:
d128.3150,d222.4150
gilt die Runde als erfolgreich abgeschlossen und die entsprechende Ziffer kann auf dem LC-Display freigeschaltet werden. Die Normierung der Distanz erfolgt erst nach dieser Toleranzprüfung, um die Werte anschließend für die Lookup-Tabelle der LED-Rückmeldung zu verwenden.

LED-Farbsteuerung über Lookup-Tabellen

Für die Ansteuerung der RGB-LEDs werden zwei separate Lookup-Tabellen (LUTs) verwendet, die den normierten Distanzwert auf die entsprechenden PWM-Werte für die Farbkanäle Rot und Grün abbilden. Die Stützpunkte der Lookup-Tabellen sind in der folgenden Tabelle dargestellt:

Stützpunkte der Lookup-Tabellen für die LED-Ansteuerung
Normierte Distanz dnorm PWM-Wert Grün PWM-Wert Rot Resultierende Farbe
0,00 80 0 Grün (Ziel erreicht)
0,10 50 40 Gelbgrün
0,25 20 80 Orange
0,50 0 100 Rot
1,00 0 100 Rot (maximale Distanz)

Die gewählten Stützpunkte erzeugen einen asymmetrischen Kurvenverlauf, bei dem der Grünanteil deutlich schneller abnimmt als der Rotanteil zunimmt. Der Grünkanal fällt bereits bei einer normierten Distanz von 0,5 auf den Wert 0, während der Rotkanal bei diesem Punkt seinen Maximalwert von 100 erreicht und diesen bis zur maximalen Distanz beibehält. Diese Charakteristik führt dazu, dass die Rot- und Orange-Phase einen Großteil des Distanzbereichs abdeckt, während die Grünphase erst bei unmittelbarer Nähe zum Ziel einsetzt.

Diese Kurvenform wurde bewusst so gewählt, um eine eindeutige visuelle Unterscheidung zwischen den Zuständen „weit entfernt", „Annäherung" und „Ziel erreicht" zu ermöglichen. Da das menschliche Auge Grüntöne tendenziell stärker wahrnimmt als Rottöne, würde ein linearer Verlauf dazu führen, dass bereits bei mittlerer Distanz ein grünlicher Farbeindruck entsteht. Dies könnte fälschlicherweise als Zielerreichung interpretiert werden. Durch die späte Aktivierung des Grünkanals und die gleichzeitige Dominanz des Rotkanals über einen weiten Distanzbereich wird sichergestellt, dass ausschließlich bei tatsächlicher Annäherung an das Ziel ein deutlicher Farbumschlag von Rot über Orange zu Grün wahrnehmbar ist. Die folgenden Abbildungen 14 und 15 visualisieren den Farbverlauf der RGB-LEDs in Abhängigkeit vom Abstand des Joysticks zur Zielposition unter Verwendung der aktuellen Look-Up-Table. Der dargestellte Farbraum ist der HSV-Farbraum mit einer leicht erhöhten Grüngewichtung (Faktor 1,1). Die so dargestellten Farben entsprechen dem tatsächlichen Farbverlauf der LEDs sehr genau. Im RGB-Farbraum lässt sich dieser Farbverlauf hingegen nicht korrekt abbilden.


Abb. 14: Farbwertverteilung der LED je nach Joystick Zielabstand



Abb. 15: Farbgradient der RGB-LED





LCD-Anzeige


Abb. 16: CAD Simulink Modell der LCD-Anzeige


Die LCD-Anzeige dient als visuelle Rückmeldung und zeigt den aktuellen Spielzustand sowie die freigeschalteten Zahlen des Codes an. Die LCD-Ansteuerung ist in zwei Komponenten aufgeteilt:

Komponente Sprache Aufgabe
LCD_Logik MATLAB/Simulink Berechnung der anzuzeigenden Zeichen
lcd.cpp Arduino C++ Hardware-Ansteuerung via I2C


lcd.cpp

#include "lcd.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Festgelegt um was für einen Display es sich handelt. Eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27.
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setupFunctionlcd(){
    lcd.init(); // Im Setup wird der LCD gestartet
    lcd.backlight(); // Hintergrundbeleuchtung einschalten
}

// Input uint8 [16,1]
// Input1 uint8 [16,1]

void stepFunctionlcd(uint8_T * Input,int size_vector_a,uint8_T * Input1,int size_vector_b){
  
    // Hier wird die Position des ersten Zeichens festgelegt. 
    // In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
    lcd.setCursor(0, 0);
    lcd.print((char*)Input);
    lcd.setCursor(0, 1); // In diesem Fall bedeutet (0,1) das erste Zeichen in der zweiten Zeile.
    lcd.print((char*)Input1);
}


LCD_Logik.m (Kurzfassung)

function [zeile1,zeile2]=LCD_Logik(runde,code1,code2,code3,code4,spielLaeuft)

zeile1=zeros(16,1);  zeile2=zeros(16,1);

if spielLaeuft == 0
    zeile1 = [68,114,117,101,99,107,101,32,83,84,65,82,84,32,32,32]';   % "Druecke START"
    zeile2 = [117,109,32,122,117,32,98,101,103,105,110,110,101,110,32,32]'; % "um zu beginnen"
    return;
end

freigeschaltet = min(max(runde-1,0),4);

if runde >= 5
    zeile1 = [70,101,114,116,105,103,33,32,32,32,32,32,32,32,32,32]';   % "Fertig!"
else
    zeile1 = [90,97,104,108,101,110,99,111,100,101,58,48+(runde-1),47,52,32,32]'; % "Zahlencode:X/4"
end

zeile2(:)=32;  % Leerzeichen
codes = [code1,code2,code3,code4];
positionen = [1,5,9,13];
for i=1:4
    if freigeschaltet>=i, zeile2(positionen(i))=48+codes(i); 
    else,                 zeile2(positionen(i))=45; end  % '-'
end

end

ASCII-Referenz:

Zeichen ASCII Verwendung
'0'-'9' 48-57 48 + ziffer
'-' 45 Platzhalter
' ' 32 Leerzeichen
'/' 47 Trenner in "X/4"


Funktionsprinzip
Schritt 1: Logikverarbeitung in Simulink

Die MATLAB-Funktion LCD_Logik erhält folgende Eingänge:

  • runde – Aktuelle Spielrunde (1-5). Wobei die 1. Runde die Initialisierungs-Runde ist.
  • code1 bis code4 – Die vier Ziffern des Geheimcodes
  • spielLaeuft – Zustandsflag (0 = Startbildschirm, 1 = Spiel aktiv)

Die Ausgabe sind zwei Arrays mit je 16 Elementen:

  • zeile1 – Obere LCD-Zeile
  • zeile2 – Untere LCD-Zeile


Schritt 2: ASCII-Kodierung

Jedes Zeichen wird als ASCII-Code (Zahlenwert 0-255) gespeichert:

Zeichen ASCII-Code Verwendung
'D' 68 Startbildschirm
'0'-'9' 48-57 Ziffernanzeige
'-' 45 Platzhalter für gesperrte Ziffern
' ' 32 Leerzeichen

Beispiel für Ziffernberechnung:

zeile2(1) = 48 + code1;  % Wenn code1=7, dann 48+7=55 → ASCII für '7'


Schritt 3: Zustandsabhängige Anzeige

Zustand Zeile 1 Zeile 2
Vor Spielstart Druecke START um zu beginnen
Runde 1 (0 Codes) Zahlencode:0/4 - - - -
Runde 2 (1 Code) Zahlencode:1/4 1 - - -
Runde 3 (2 Codes) Zahlencode:2/4 1 2 - -
Runde 4 (3 Codes) Zahlencode:3/4 1 2 3 -
Runde 5 (Gewonnen) Fertig! 1 2 3 4


Schritt 4: Hardware-Ausgabe

Die C++-Funktion überträgt die Daten via I2C an das LCD:

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Adresse 0x27, 16 Spalten, 2 Zeilen

void stepFunctionlcd(uint8_T * Input, int size_a, uint8_T * Input1, int size_b) {
    lcd.setCursor(0, 0);        // Position: Zeile 0, Spalte 0
    lcd.print((char*)Input);    // Zeile 1 ausgeben
    
    lcd.setCursor(0, 1);        // Position: Zeile 1, Spalte 0
    lcd.print((char*)Input1);   // Zeile 2 ausgeben
}

Die ASCII-Tabelle ist so aufgebaut, dass die Ziffern 0-9 aufeinanderfolgende Codes haben:

Ziffer ASCII-Code Formel
0 48 48 + 0
1 49 48 + 1
... ... ...
9 57 48 + 9
% Effiziente Umwandlung: Zahl → Zeichen
zeile2(1) = 48 + code1;   % code1=7 → 48+7=55 → '7'
zeile1(12) = 48 + rundeLCD; % Rundenanzeige


Das LCD wird über den integrierten I2C-Bus (Inter-Integrated Circuit) angesteuert:

Methode Benötigte Pins Verkabelung Geschwindigkeit
Parallel (4-Bit) 6-7 Pins Komplex Schnell
Parallel (8-Bit) 10-11 Pins Sehr komplex Sehr schnell
I2C 2 Pins (SDA, SCL) Einfach Ausreichend





Taster-Funktionalität

Abb. 17: Darstellung der Taster-Funktionalität und der verwendeten Flankenfunktion.

Für die Funktionalität der drei Taster, die als Öffner ausgeführt sind und deren Signal daher zunächst invertiert werden muss, wird eine Flankenfunktion verwendet, wie in der obigen Abbildung dargestellt. Die drei Taster werden über die digitalen Eingänge des Arduino eingelesen und anschließend dem Eingang der Flankenfunktion zugeführt. Die daraus erzeugten Tastensignale werden an verschiedene weitere Komponenten in Simulink weitergeleitet, darunter die Startlogik, Resetlogik und Rundenlogik.

Der Ausgang der Flankenfunktion erzeugt genau einen sauberen Impuls pro Tastendruck, unabhängig davon, wie lange oder unruhig der Taster betätigt wird. Dadurch werden Mehrfachauslösungen und Prellen zuverlässig verhindert. Ein neuer Impuls ist erst nach dem vollständigen Loslassen des Tasters möglich.


Runden Realisierung


Abb. 18: Simulink Modell zur Runden Realisierung


Das Simulink-Modell bildet eine einfache Ablauf- und Rundenlogik ab. Es prüft, ob sich beide Joysticks gleichzeitig in der vorgegebenen Zielposition befinden. Beim erstmaligen Erreichen der Zielposition wird über eine Flankenerkennung ein Ereignis erzeugt. Dieses Ereignis löst die Festlegung einer neuen Zielposition aus und erhöht gleichzeitig einen Rundenzähler. Die Rundenlogik begrenzt die Anzahl der Durchläufe auf maximal fünf Runden. Wobei der initialisierungszustand als Runde 1 zählt. Ein Startsignal in Kombination mit einer neuen Zielposition erlaubt den Beginn einer neuen Runde. Über eine Reset-Logik wird der Rundenzähler und die zugehörigen Zustände auf den Anfangszustand zurückgesetzt werden.



Start Logik


Abb. 19: Simulink Startlogik


StartLogik.m
Diese Funktion regelt den Start Mechanismus des Escape-Games.

function spielLaeuft_out = StartLogik(tasterStart, tasterReset, spielLaeuft_in)

    % Standardmäßig bleibt der Zustand gleich
    spielLaeuft_out = spielLaeuft_in;
    
    % Wenn Reset gedrückt wird, Spiel stoppen
    if tasterReset == 1
        spielLaeuft_out = 0;
    end
    
    % Wenn Start gedrückt wird UND Spiel noch nicht läuft, Spiel starten
    if tasterStart == 1 && spielLaeuft_in == 0
        spielLaeuft_out = 1;
    end

end


Die Start-Logik steuert den Spielzustand spielLaeuft. Der aktuelle Zustand wird gespeichert und standardmäßig beibehalten. Wird der Reset-Taster betätigt, wird das Spiel gestoppt und der Zustand auf inaktiv gesetzt. Wird der Start-Taster gedrückt, während das Spiel noch nicht läuft, wird das Spiel gestartet. Der Ausgang wird über einen Speicherblock rückgeführt, sodass der Spielzustand über die Zeit erhalten bleibt.



Simulink-Modell


Abb. 20: Vollständiges Simulink Modell


Das abgebildete Simulink-Modell bildet die zentrale Steuereinheit des Projekts „JoyCode“ und koordiniert das Zusammenspiel zwischen Hardware-Eingängen, Logikverarbeitung und visueller Ausgabe. Das System ist modular aufgebaut und umfasst Subsysteme für den linken und rechten Joystick, welche die Positionswerte erfassen und die entsprechende LED-Statusrückmeldung berechnen. Eine zentrale Logikeinheit prüft, ob sich beide Joysticks simultan in der Zielposition befinden, und triggert bei erfolgreichem Halten der Position die „Runden Logik“. Diese verwaltet den Fortschritt über die vier Spielrunden und steuert die Freischaltung der Code-Ziffern auf der LCD Anzeige. Über ein separates Eingangsmodul werden die physischen Taster für Start, Solution und Reset abgefragt, während die „Start Logik“ und das „Reset“-Subsystem den globalen Status des Rätsels definieren und die Generierung neuer Zielpositionen einleiten.


Tests der Funktionalität

Funktionstests des Escape-Game-Systems
Test Erwartetes Ergebnis Tatsächliches Verhalten Bestanden?
Gleichzeitige Bedienung beider Joysticks Beide Joysticks können parallel bewegt werden, ohne sich gegenseitig zu beeinflussen oder am Gehäuse zu schleifen. Beide Joysticks lassen sich gleichzeitig und unabhängig bewegen. Ohne Kontakt zum Gehäuse. Ja
Einzelner Joystick außerhalb der Zielposition Befindet sich nur ein Joystick an der Zielposition, erfolgt keine Freischaltung. Keine Freischaltung bei nur einem korrekt positionierten Joystick. Ja
Haltezeit beider Joysticks an der Zielposition Beide Joysticks müssen mindestens 3 Sekunden an der Zielposition gehalten werden, damit eine Ziffer freigeschaltet wird. Nein, ist mit der Sensibilität der Joysticks nicht realisierbar. Wird daher nicht umgesetzt. Nein
Rundenablauf und PIN-Freischaltung Das Rätsel besteht aus vier aufeinanderfolgenden Runden, in denen jeweils eine Ziffer freigeschaltet wird. Vier Runden werden korrekt durchlaufen, pro Runde wird eine Ziffer freigeschaltet. Ja
LED-Statusanzeige und Farbwechsel Die RGB-LEDs zeigen den Abstand zur Zielposition korrekt an (Rot, Gelb, Grün, blinkendes Grün). Farbwechsel entspricht korrekt dem Abstand zur Zielposition. Ja
Anzeige auf dem LC-Display Das LC-Display zeigt freigeschaltete Ziffern sowie Start- und Statusinformationen korrekt an. Alle Ziffern und Statusmeldungen werden korrekt angezeigt. Ja
Start- und Reset-Funktion Start initialisiert das Spiel, Reset setzt den aktuellen Spielstand jederzeit vollständig zurück. Spiel startet korrekt und wird vollständig zurückgesetzt. Ja
Taster-Funktion und Entprellung Auch bei schnellem, wiederholtem Betätigen der Taster wird pro Betätigung nur ein Impuls erzeugt. Pro Tastendruck wird zuverlässig nur ein Impuls erkannt. Ja
Lösungsanzeige Der korrekte Zahlencode wird über den Lösungs-Button auf dem LC-Display angezeigt. Jede Betätigung schaltet nacheinander eine Ziffer frei. Ja
Zufällige Generierung der Zielpositionen Zu Beginn jeder Runde werden neue, zufällige Zielpositionen generiert. Die Zielpositionen ändern sich in jeder Runde und sind nicht identisch. Ja
Abweichung von der Standardposition Die zufällige Zielposition darf nicht der Neutralstellung des Joysticks entsprechen. Die Zielposition liegt stets außerhalb der Mittelstellung. Ja
Toleranzbereich der Zielposition Der Toleranzbereich ist so gewählt, dass das Rätsel lösbar, aber herausfordernd ist. Zielpositionen sind reproduzierbar erreichbar, ohne sofortige Freischaltung. Ja
Spieldauer Die maximale Spieldauer pro Rätsel überschreitet 5 Minuten nicht. Das Rätsel kann innerhalb von weniger als 5 Minuten abgeschlossen werden. Ja
Autarker Betrieb Das Rätsel ist ohne zusätzliche digitale Geräte vollständig spielbar. Betrieb erfolgt ausschließlich über integrierte Hardware. Ja
Spannungsversorgung und Masseführung Die Spannungsversorgung (5 V) ist stabil, es treten keine Ausfälle oder Fehlfunktionen auf. Stabile 5-V-Versorgung ohne Störungen oder Ausfälle. Ja
Mechanische Stabilität von Gehäuse und Anschlüssen Auch bei Bewegung des Gehäuses oder Zug an den Leitungen bleiben alle Funktionen erhalten. Keine Funktionsausfälle bei Bewegung oder Zug an Leitungen. Ja




Ergebnis & Zusammenfassung

Das Projekt JoyCode realisiert ein interaktives Escape-Game-Rätsel, bei dem zwei Joysticks gleichzeitig präzise auf zufällig festgelegte Zielpositionen gebracht werden müssen. Die visuelle Rückmeldung über den Abstand zur Zielposition erfolgt in Echtzeit über farbcodierte RGB-LEDs. Nach vier aufeinanderfolgenden, erfolgreich gehaltenen Zielstellungen wird ein vollständiger Zahlencode sichtbar, der für den Zugang zum nächsten Spielabschnitt im übergeordneten Escape Game genutzt wird.

Technisch kombiniert das System Mechatronik-Grundlagen mit praxisnaher Sensorik, Steuerungstechnik und Echtzeit-Interaktion. Der Arduino Uno R3 fungiert als zentrale Steuereinheit und liest die Joystick-Positionen über analoge Eingänge aus. Die LEDs und das LC-Display werden zur Status- und Fortschrittsanzeige verwendet, während Taster zur Steuerung und Reset-Funktion integriert sind.

Die Hardwarekomponenten sind in einem 3D-gedruckten Gehäuse montiert, das alle Bausteine sicher aufnimmt und die Frontbedienelemente ergonomisch zugänglich macht. Die Verdrahtung ist so ausgelegt, dass Versorgungsspannung und Masse sauber verteilt werden, während Signalverbindungen kurz gehalten werden, um Störanfälligkeit zu minimieren.

Das regelungstechnische Konzept – mit dem Menschen als Regler und der visuellen Rückmeldung als Rückführung – wurde erfolgreich in die Spielmechanik integriert. Die Einführung eines Toleranzbereichs (Totzone) ermöglicht eine faire und lösbare Spielerfahrung trotz der hohen Joystick-Sensibilität.

Die durchgeführten Funktionstests bestätigen, dass nahezu alle definierten Anforderungen erfüllt werden:

  • Beide Joysticks können gleichzeitig und unabhängig bedient werden
  • Die LED-Farbsteuerung visualisiert den Abstand zur Zielposition zuverlässig
  • Der Rundenablauf mit vier aufeinanderfolgenden Runden funktioniert korrekt
  • Die Taster-Entprellung verhindert Mehrfachauslösungen
  • Das Rätsel ist innerhalb der vorgesehenen fünf Minuten lösbar
  • Der autarke Betrieb ohne zusätzliche digitale Geräte ist gewährleistet

Lediglich die ursprünglich geplante 3-Sekunden-Haltezeit konnte aufgrund der Joystick-Sensibilität nicht umgesetzt werden. Diese Anforderung wurde aus dem finalen Design entfernt, da sie die Spielbarkeit erheblich beeinträchtigt hätte.

Insgesamt stellt JoyCode eine gelungene Verbindung aus Konzept, Technik und Interaktion dar und demonstriert die praktische Anwendung mechatronischer Systeme im Rahmen eines komplexeren Spielsystems.


Hindernisse und Schwierigkeiten

Während der Projektentwicklung traten mehrere technische und konzeptionelle Herausforderungen auf:

Joystick-Sensibilität und Haltezeit
Die ursprünglich geplante Anforderung, beide Joysticks für drei Sekunden an der Zielposition zu halten, erwies sich als nicht realisierbar. Die hohe Sensibilität der KY-023-Module führt dazu, dass selbst minimale motorische Unruhe des Nutzers zu Positionsabweichungen führt. Diese Anforderung musste aus dem Spielkonzept entfernt werden.

Joystick-Offset und Wertebereich
Die Joystick-Module zeigten Fertigungstoleranzen mit Offset-Werten von bis zu ±30 um die Neutralstellung. Das musste berücksichtigt werden.

RGB-LED Farbmischung
Der Grünanteil der LEDs überstrahlt in der Praxis den Rotanteil, wodurch ein theoretisch gemischtes Gelb eher grünlich erscheint. Dies erschwert die visuelle Unterscheidung zwischen „Annäherung" und „Ziel erreicht". Eine experimentelle Kalibrierung über Lookup-Tabellen war erforderlich.

Simulink-Konfiguration
Um alle PWM-Ausgänge gleichzeitig nutzen zu können, musste die Solver-Einstellung „Treat each discrete rate as a separate task" deaktiviert werden.

Mechanische Gehäuseplanung
Die Konstruktion des 3D-gedruckten Gehäuses erwies sich als kritisch, da spätere Änderungen an der Hardware nur mit erheblichem Aufwand möglich sind. Die Dimensionierung der Aussparungen musste präzise auf die Kinematik der Joysticks abgestimmt werden.

Lessons Learned

Im Verlauf der Entwicklung und Umsetzung des JoyCode-Systems konnten sowohl auf technischer als auch auf methodischer Ebene mehrere zentrale Erkenntnisse gewonnen werden.

Systemstruktur und Modularität
Die klare Trennung zwischen Messung, Auswertung, Entscheidungslogik und Ausgabe erwies sich als entscheidend für Nachvollziehbarkeit und Erweiterbarkeit. Frühzeitige Strukturentscheidungen vereinfachten spätere Anpassungen erheblich.

Mensch-Maschine-Interaktion
Bei Systemen mit menschlichem Regler sind intuitive Rückmeldungen wichtiger als mathematisch optimale Parameter. Kleine Anpassungen an der visuellen Rückmeldung beeinflussten die Bedienbarkeit stärker als Änderungen an Berechnungsalgorithmen. Die menschliche Farbwahrnehmung weicht zudem von theoretischen RGB-Werten ab – experimentelle Kalibrierung ist unerlässlich.

Hardware und Verdrahtung
Saubere Verdrahtung und gemeinsame Masseführung sind essenziell für stabilen Betrieb. Detaillierte Voruntersuchungen der Sensoren vor der Softwareentwicklung ermöglichten realistische Parameterwahl. Pin-Belegungen und Bus-Konflikte sollten frühzeitig geprüft werden.

Software und Testing
Zeitabhängige Logik erfordert sorgfältige Implementierung. Zustandsbasierte Programmstrukturen sind wartungsfreundlicher als linearer Code. Iteratives Testen einzelner Module verhinderte die Ausbreitung von Fehlern über Systemebenen hinweg.

Anforderungsvalidierung
Ursprüngliche Anforderungen müssen unter realen Bedingungen validiert werden. Toleranzbereiche und motorische Ungenauigkeiten sind von Beginn an einzuplanen.

Fazit
Das Projekt zeigt, dass einfache Hardwarekomponenten durch durchdachte Systemarchitektur und gezielte Benutzerführung zu einem zuverlässigen Gesamtsystem kombiniert werden können.

Angewandte und vertiefte Fähigkeiten

  • MATLAB/Simulink-Modellierung und -Programmierung
  • Regelungstechnische Systemanalyse
  • C++-Programmierung für Mikrocontroller
  • 3D-Konstruktion und additive Fertigung
  • Schaltungsentwurf und Platinenlötung
  • Sensorintegration und Signalverarbeitung
  • Technische Dokumentation (Wiki)



Spielanleitung JoyCode

Ziel: Bewege beide Joysticks gleichzeitig in die richtige Position, um den 4-stelligen Zahlencode freizuschalten.

So geht's:

  1. Drücke den grünen Start-Taster
  2. Beobachte die LEDs über die Joystick-Bewegung:
    • Rot = weit entfernt
    • Gelb = Annäherung
    • Grün = Zielposition erreicht
  3. Beide LEDs müssen gleichzeitig grün leuchten
  4. Pro erfolgreiche Runde wird eine Ziffer des Codes freigeschaltet
  5. Nach 4 Runden ist der vollständige Zahlencode sichtbar

Taster:

  • Grün = Start
  • Rot = Reset (Neustart)
  • Schwarz = Überspringt die aktuelle Runde und zeigt die nächste Ziffer

Viel Erfolg!

Projektdurchführung

Ideenfindung
Die Projektdurchführung begann mit einer gemeinsamen Ideenfindung zu Beginn des Semesters. Im Rahmen des Fachpraktikums sollten Escape-Game-Rätsel entwickelt werden, die in ein übergeordnetes Rätselsystem integriert werden können. Die Idee zu JoyCode entstand aus der Überlegung, ein Rätsel zu schaffen, das motorische Geschicklichkeit mit visueller Rückmeldung kombiniert. Die gleichzeitige Bedienung zweier Joysticks bietet dabei einen intuitiven Zugang und erzeugt durch die Echtzeit-Farbsteuerung ein unmittelbares Erlebnis.

Zielsetzung
Das Ziel des Projekts war es, ein mechatronisches System zu entwickeln, das Hardware (Sensoren, Aktoren, Mikrocontroller) und Software (Simulink, Matlab) zu einem Rätselerlebnis verbindet. Das Rätsel sollte ohne externe Geräte autark funktionieren, innerhalb von fünf Minuten lösbar sein und sich nahtlos in das übergeordnete Escape-Game einfügen.

Aufgabenstellung
Die technische Realisierung wurde in folgende Kernfunktionen unterteilt:

  • Positionserfassung und Zielgenerierung: Das System muss die Positionen beider Joysticks kontinuierlich über analoge Eingänge erfassen. Zu Beginn jeder Runde werden zufällige Zielpositionen generiert, die außerhalb der Ruhestellung und innerhalb des erreichbaren Wertebereichs liegen.
  • Visuelle Rückmeldung: Die RGB-LEDs müssen den Abstand zur Zielposition in Echtzeit visualisieren. Der Farbverlauf von Rot über Gelb zu Grün ermöglicht eine intuitive Orientierung ohne zusätzliche Anzeigen.
  • Rundenlogik und Code-Freischaltung: Das System muss erkennen, wenn beide Joysticks gleichzeitig die Zielposition erreichen. Pro erfolgreicher Runde wird eine Ziffer auf dem LC-Display freigeschaltet. Nach vier Runden ist der vollständige Zahlencode sichtbar.
  • Steuerung und Reset: Über drei Taster kann das Escape-Game gestartet, zurückgesetzt oder die aktuelle Runde übersprungen werden.

Planung und Vorbereitung
Nach der Festlegung des Konzepts wurde zunächst eine Komponentenliste erstellt und die benötigte Hardware beschafft. Parallel dazu erfolgte die Erstellung eines funktionalen Systementwurfs sowie eines Programmablaufplans. Die regelungstechnische Einordnung des Systems half dabei, die Anforderungen an Toleranzbereiche und Rückmeldung systematisch zu definieren. Für das Gehäuse wurden CAD-Modelle erstellt, die alle Komponenten berücksichtigen und eine ergonomische Anordnung der Bedienelemente gewährleisten.

Umsetzung
Die Umsetzung erfolgte in mehreren Phasen. Zunächst wurden alle Hardwarekomponenten einzeln auf einem Steckbrett getestet, um Kennlinien, Offsets und Signalverhalten zu analysieren. Anschließend wurde die Simulink-Software schrittweise entwickelt und mit der Hardware verknüpft. Nach erfolgreichen Funktionstests wurde die Lochplatine gelötet und die Verkabelung finalisiert. Das 3D-gedruckte Gehäuse wurde gefertigt und alle Komponenten montiert. Abschließende Systemtests bestätigten die Funktionsfähigkeit des Gesamtsystems.

YouTube Video

Link:




Projektunterlagen


Abb. 21: Simulink Ablaufplan Datei:JoyCode Simulink ZIP.zip


Projektplan


Abb. 22: Projektplan erstellt mit GanttProject


Weblinks

Literatur


→ zurück zur Übersicht: WS 25/26: Escape Game