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
Schema
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
- Teken op papier waar de sterren komen (bv. 5 sterren in een bepaald patroon)
- Beslis hoeveel sterren je wilt (aanbeveling: 4 à 6 sterren voor speelbaarheid)
- Bepaal het materiaal van het bord: karton is makkelijk, acryl ziet er mooier uit
Stap 2 – Materiaal klaarmaken
- Maak gaten in het bord op de geplande sterposities
- Elke ster krijgt: 1 LED (voorkant) + 1 LDR
- Zet de LED en LDR per ster zo dicht mogelijk bij elkaar zodat de laser beide raakt
Stap 3 – Schakeling opbouwen (breadboard)
- Sluit alle LED's aan op digitale pinnen (bv. pin 2 t/m 7) met 220Ω weerstanden
- Maak spanningsdelers voor elke LDR met 10kΩ weerstanden
- Sluit de middelpunten van de spanningsdelers aan op analoge pinnen (A0 t/m A5)
- Sluit de servo/solenoid aan op een PWM-pin (bv. pin 9)
- 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
Bijhorende code
Foto
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
Voorkant
Achterkant