ENIB 2024 : catch the light
Titre de la fiche expérience :
Sommaire
Description
Le jeu "catch the light" est un jeu de timing. Une lumière se déplace sur un axe horizontal, et fait des aller retour. Le but est d'appuyer sur le bouton poussoir au bon moment afin de stopper la lumière lorsqu'elle se trouve au centre. Il y a 5 bandes horizontales qui représentent 5 étapes. A chaque étape la lumière se déplace plus vite.
photo du groupe |
Introduction
Voici une démo pour mieux comprendre comment fonctionne le jeu.
Outil et Matériel
- bouton poussoir
- carte D1 mini avec Arduino
- rubans de led
- une solderless breadboard
- appareil à souder
- pistolet à colle
- petits câbles de connexion
- résistance pour led
- bois de chêne / scie à bois/ etaux
- petite vis x6
- EPI: lunettes / gants
- perceuse / tournevis
Fichiers à joindre
- include <Adafruit_NeoPixel.h> //Importer la bibliotèque "Adafruit_NeoPixel"
- define NUM_TOTAL_LED 60 // Nombres total de led
- define NUM_LED_PER_LEVEL 15 // Nombres de led par level
- define NUM_LEVEL 4 // Nombres de level
- define PIN_BUTON 3 // Pin bouton sur la carte
- define PIN_LED 2 // Pin led sur la carte
Adafruit_NeoPixel leds(NUM_TOTAL_LED, PIN_LED, NEO_GRB + NEO_KHZ800); // Activer les leds => Adafruit_NeoPixel leds(Nombres de leds, pin arduino commandant les leds, type de leds)
int LED_MIDDLE = NUM_LED_PER_LEVEL/2; // Calcul de la led du milieu
int level = 0; // Initialisation du jeu
int lev = 0; // Variable pour sauter la fin du niveau
int score = 0; // Initialisation du score
int delay_level = 300; // Initialisation de la vitesse de jeu
int led; // Implémentation de la variable globale "led"
unsigned long time = 0; // Initialisation de la variable globale "time"
void setup() { // Fonction d'initialisation du jeu
pinMode(PIN_BUTON, INPUT); // Définition de "PIN_BUTON" en tant qu'entrée leds.begin(); // Initialisation des leds leds.setBrightness(10); // Régler la luminosité des leds leds.show(); // Afficher les leds attachInterrupt(digitalPinToInterrupt(PIN_BUTON), bouton, RISING); // Création d'une interruption à chaque appuie sur le bouton => attachInterrupt(digitalPinToInterrupt(pin arduino de commande du bouton), fonction associée, type de changement) Serial.begin(9600);
}
void loop() { // Fonction de boucle du jeu
left(); // Fonction left pour déplacer les leds depuis la gauche right(); // Fonction right pour déplacer les leds depuis la droite //Serial.println(score);
}
void bouton(){ // Fonction en cas d'appuie sur le bouton
if(millis()-time > 100 && level < NUM_LEVEL){ // Vérification du temps d'appuie bouton pour éviter le rebond time=millis(); // Mettre à jour le bouton pour le prochain appuie score += (NUM_LED_PER_LEVEL)-2*abs(NUM_LED_PER_LEVEL*level+LED_MIDDLE-led); // Modification du score du joueur leds.setPixelColor(NUM_LED_PER_LEVEL*level+LED_MIDDLE, leds.Color(0, 0, 0)); // Éteindre la led du milieu leds.show(); leds.setPixelColor(led, leds.Color(0, 0, 255)); // Allumer en bleu la led cliquée leds.show(); // Afficher la led allumée level++; // Passer au level suivant delay_level /= 2; // Accélérer la vitesse de jeu led = NUM_LED_PER_LEVEL*level; // Initialiser la led du level suivant delay(100); // Attendre 100 ms }
}
void end(){ // Fonction de fin du jeu
leds.fill(leds.Color(0, 0, 0), 0, NUM_TOTAL_LED); // Éteindre toutes les leds leds.fill(leds.Color(255, 0, 0), 0, score); // Afficher le score du joueur leds.show(); // Afficher le score du joueur delay(2000); // Attendre 500 ms for(int i = 0; i <= 3; i++){ // Boucle d'affichage des leds de fin for(led = 0; led < NUM_TOTAL_LED; led++){ // Boucle d'affichage des leds de fin if(i%2 == 0){ // Si la boucle est pair leds.setPixelColor(led, leds.Color(0, 0, 0)); // Afficher la led en blanc } else{ // Sinon int couleur_1 = random(0, 255); // Valeur aléatoire de rouge int couleur_2 = random(0, 255); // Valeur aléatoire de vert int couleur_3 = random(0, 255); // Valeur aléatoire de bleu leds.setPixelColor(led, leds.Color(couleur_1, couleur_2, couleur_3)); // Afficher la led en fonction des couleurs aléatoires } leds.show(); // Afficher la leds delay(50); } } level = 0; // Réinitialiser le jeu delay_level = 300; // Réinitialiser la vitesse du jeu score = 0; // Réinitialiser le score leds.fill(leds.Color(0, 0, 0), 0, NUM_TOTAL_LED); // Réinitialiser l'affichage led leds.show(); // Réinitialiser l'affichage led
}
void left(){
for(led = NUM_LED_PER_LEVEL*level; led < NUM_LED_PER_LEVEL*(level+1)-1; led++){ // Boucle d'affichage des leds en partant de la gauche if(level == NUM_LEVEL){ // Si le level est égal au nombre de level end(); // Fonction de fin du jeu } if (lev != level){ lev++; break; } Serial.println(led); leds.setPixelColor(NUM_LED_PER_LEVEL*level+LED_MIDDLE, leds.Color(255, 0, 0)); // Allumer la led du milieu leds.setPixelColor(led, leds.Color(0, 100, 0)); // Allumer la led qui se déplace leds.show(); // Afficher les leds delay(delay_level); // Attendre un certain temps pour créer la vitesse du jeu if (lev != level){ lev++; break; } leds.setPixelColor(led, leds.Color(0, 0, 0)); // Éteindre la led qui se déplace leds.setPixelColor(NUM_LED_PER_LEVEL*level+LED_MIDDLE, leds.Color(255, 0, 0)); // Allumer la led du milieu leds.show(); // Afficher les leds delay(delay_level); // Attendre un certain temps pour créer la vitesse du jeu } // Fonction permettant de déplacer la led en partant de la gauche
}
void right(){
for(led = NUM_LED_PER_LEVEL*(level+1)-1; led > NUM_LED_PER_LEVEL*level; led--){ // Boucle d'affichage des leds en partant de la droite if(level == NUM_LEVEL){ // Si le level est égal au nombre de level end(); // Fonction de fin du jeu } if (lev != level){ lev++; break; } //Serial.println(led); leds.setPixelColor(NUM_LED_PER_LEVEL*level+LED_MIDDLE, leds.Color(255, 0, 0)); // Allumer la led du milieu leds.setPixelColor(led, leds.Color(0, 100, 0)); // Allumer la led qui se déplace leds.show(); // Afficher les leds delay(delay_level); // Attendre un certain temps pour créer la vitesse du jeu if (lev != level){ lev++; break; } leds.setPixelColor(led, leds.Color(0, 0, 0)); // Éteindre la led qui se déplace leds.setPixelColor(NUM_LED_PER_LEVEL*level+LED_MIDDLE, leds.Color(255, 0, 0)); // Allumer la led du milieu leds.show(); // Afficher les leds delay(delay_level); // Attendre un certain temps pour créer la vitesse du jeu } // Fonction permettant de déplacer la led en partant de la droite
}
Etapes de fabrication
étape 1
- Souder les bandeaux de leds en série en faisant attention au sens de fléchage.
Soudure de la led | Sens de la led |
étape 2
- Faire les branchements sur la plaque et la connecter à l'ordinateur.
Montage plaque |
étape 3
- Téléverser notre programme et le tester/debug/améliorer par rapport au rendu réel.
Test du programme |
étape 4
- Fabrique de notre support en bois
Découpe du bois manuellement |
Problèmes rencontrés et Solutions
- 1er code récupéré qui ne fonctionnait pas. Solution: nous avons rédigé notre propre code.
- Carte D1 hors service. Solution: nous avons pris une autre carte déjà soudée.
- Après quelques test le code contient quelques bug. Solution: Tester et adapter le codes