Sterrenbord

- Door Arne De Smet

Wat is het?

Het sterrenbord is een fysiek paneel met sterren (LED's) die oplichten zolang speler A overleeft in Flappy Bird. Speler B richt een laser op de lichtgevoelige sensoren in de sterren. Wanneer alle sterren 'aangelicht' zijn, opent een deurtje en krijgen de spelers een muziekpartituur.

Dit moet het sterrenbord kunnen

  • LED's per ster aansturen (aan/uit via Arduino)
  • Detecteren wanneer een laser op een sensor gericht is (fotodiode of LDR)
  • Communiceren met de hoofdcomputer via seriële verbinding
  • Een deur of slot openen wanneer alle sterren geactiveerd zijn

Componenten

tabel met componenten voor het sterrenbord

Schema

blokschema

Werking

LED's aansturen

Elke LED is verbonden met een digitale pin van de Arduino via een weerstand van 220Ω. De Arduino zet de pin HIGH om de LED aan te zetten, en LOW om hem uit te zetten. Dit wordt gestuurd door de Flappy Bird-computer via seriële communicatie.

Laser detecteren met fototransistor

De fototransistor wordt gebruikt in combinatie met een spanningsdeler, waarbij de gemeten spanning verandert afhankelijk van de hoeveelheid licht op de sensor. Wanneer de fototransistor belicht wordt (bijvoorbeeld door een laser), gaat deze meer stroom geleiden, waardoor de spanning op de analoge ingang van de Arduino verandert. De Arduino leest deze spanningsverandering uit via een analoge pin en vergelijkt deze met een ingestelde drempelwaarde. Op basis hiervan wordt bepaald of een ster geraakt werd.

Signaal versturen

Wanneer alle sterren correct gedetecteerd worden, wordt de puzzel als voltooid beschouwd. Op dat moment stuurt de Arduino een signaal via Bluetooth naar het volgende onderdeel van het systeem, zodat de volgende fase van het spel kan starten. In de code gebeurt dit door een specifiek datapakket te versturen (0x11), wat door andere onderdelen van het systeem geïnterpreteerd wordt als een “gewonnen” toestand. Om visueel aan te geven dat de puzzel voltooid is, worden alle LEDs kort meerdere keren aan en uit geschakeld (flikkeren). Dit gebeurt in een aparte functie waarin alle LEDs vijf keer snel aan en uit gaan. Dit zorgt voor duidelijke feedback voor de speler.

Stappenplan

Stap 1 – Plan het bord

  1. Teken op papier waar de sterren komen (bv. 5 sterren in een bepaald patroon)
  2. Beslis hoeveel sterren je wilt (aanbeveling: 4 à 6 sterren voor speelbaarheid)
  3. Bepaal het materiaal van het bord: karton is makkelijk, acryl ziet er mooier uit

Stap 2 – Materiaal klaarmaken

  1. Maak gaten in het bord op de geplande sterposities
  2. Elke ster krijgt: 1 LED (voorkant) + 1 LDR
  3. Zet de LED en LDR per ster zo dicht mogelijk bij elkaar zodat de laser beide raakt

Stap 3 – Schakeling opbouwen (breadboard)

  1. Sluit alle LED's aan op digitale pinnen (bv. pin 2 t/m 7) met 220Ω weerstanden
  2. Maak spanningsdelers voor elke LDR met 10kΩ weerstanden
  3. Sluit de middelpunten van de spanningsdelers aan op analoge pinnen (A0 t/m A5)
  4. Sluit de servo/solenoid aan op een PWM-pin (bv. pin 9)
  5. Test elke verbinding apart met een multimeter vóór je verder gaat

Stap 4 – Arduino-code schrijven

De basisstructuur van de code:


                    1. Initialisatie: stel pinnen in, begin seriële communicatie (Serial.begin(9600))
                    2. In loop(): lees elke LDR uit via analogRead()
                    3. Als Flappy Bird-signaal binnenkomt: zet LED's aan
                    4. Check of alle LDR's boven drempelwaarde zijn → open deur
                

Stap 5 – Communicatie met het hoofdprogramma

De hoofdapplicatie communiceert met het sterrenbord via Bluetooth door specifieke waarden te versturen om het systeem te starten, stoppen of resetten. De Arduino leest deze binnenkomende gegevens via een seriële verbinding (SoftwareSerial) en past op basis daarvan de toestand van het spel aan, zoals het resetten van de puzzel of het activeren ervan. Wanneer alle sterren correct geactiveerd zijn, stuurt de Arduino een bevestigingssignaal (0x11) terug via Bluetooth. Dit signaal geeft aan dat de puzzel voltooid is en dat het volgende onderdeel van het spel kan starten. Tegelijkertijd worden alle LEDs kort meerdere keren aan en uit geschakeld (flikkeren) om visuele feedback te geven aan de speler dat de puzzel succesvol werd opgelost.

Documentatie

Probeersel in Tinkercad

probeersel schema Tinkercad

Bijhorende code

arduino code bij probeersel

Foto

breadboard probeersel

Eindresultaat

Code


            #include <SoftwareSerial.h>

            #define bluetoothRX 2
            #define bluetoothTX 3

            SoftwareSerial mySerial(bluetoothRX, bluetoothTX);

            const int sensorPins[6] = {A0, A1, A2, A3, A4, A5};
            const int ledPins[6] = {8, 7, 6, 5, 4, 3};
            const int DREMPEL = 500;

            int huidigeStap = 0;
            bool ledUit[6] = {false, false, false, false, false, false};
            byte gameStatus = 0x0;

            void setup() {
              for (int i = 0; i < 6; i++) {
                pinMode(ledPins[i], OUTPUT);
                digitalWrite(ledPins[i], HIGH);
              }
              mySerial.begin(9600);
            }

            void reset() {
              huidigeStap = 0;
              for (int i = 0; i < 6; i++) {
                ledUit[i] = false;
                digitalWrite(ledPins[i], HIGH);
              }
            }

            void flikkerEnVerstuur() {
              // Stuur "gewonnen" signaal via Bluetooth
              mySerial.write(0x11);
              gameStatus = 0x11;

              // Flikker alle LEDs 5 keer
              for (int k = 0; k < 5; k++) {
                for (int i = 0; i < 6; i++) {
                  digitalWrite(ledPins[i], HIGH);
                }
                delay(200);
                for (int i = 0; i < 6; i++) {
                  digitalWrite(ledPins[i], LOW);
                }
                delay(200);
              }
            }

            void loop() {
              // Verwerk inkomende Bluetooth-berichten
              if (mySerial.available()) {
                byte received = mySerial.read();
                if (received == 0x0) {
                  gameStatus = 0x0;
                  reset();
                } else if (received == 0x1) {
                  gameStatus = 0x1;
                  reset();
                } else if (received == 0x21) {
                  mySerial.write(gameStatus);
                }
              }

              // Zorg dat al uitgeschakelde LED's uit blijven
              for (int i = 0; i < 6; i++) {
                if (ledUit[i]) {
                  digitalWrite(ledPins[i], LOW);
                }
              }

              // Controleer of iemand een verkeerde sensor triggert
              for (int i = 0; i < 6; i++) {
                if (i != huidigeStap && !ledUit[i] && analogRead(sensorPins[i]) > DREMPEL) {
                  delay(500);
                  reset();
                  return;
                }
              }

              // Controleer de huidige stap
              int waarde = analogRead(sensorPins[huidigeStap]);
              if (waarde > DREMPEL) {
                ledUit[huidigeStap] = true;
                digitalWrite(ledPins[huidigeStap], LOW);
                huidigeStap++;
                delay(500);

                // Alle 6 gedaan → flikker + Bluetooth-signaal, dan reset
                if (huidigeStap >= 6) {
                  delay(1000);
                  flikkerEnVerstuur();
                  delay(1000);
                  reset();
                }
              }

              delay(100);
            }

Schema

sterrenbeeldschema resultaat

Voorkant

Voorkant sterrenbord

Achterkant

achterkant sterrenbord