ENIB 2024 : catch the light

De Les Fabriques du Ponant
Révision datée du 25 janvier 2024 à 11:23 par Elio (discussion | contributions) (étape 3)
Aller à : navigation, rechercher

Titre de la fiche expérience :

description (résumé)

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.




Groupebg.jpg

Introduction

éventuelle vidéo

outil et matériel

  • bouton poussoir
  • carte D1 mini avec Arduino
  • rubans de led
  • une solderless breadboard
  • appareil a souder
  • colle/scotch
  • petits cables de connexion
  • resistance pour led

fichiers à joindre

code, ficher d'impression 3D, de découpe laser ou vinyle, ...

Mettre du code Arduino

  1. include <Adafruit_NeoPixel.h> //Importer la bibliotèque "Adafruit_NeoPixel"
  1. define NUM_TOTAL_LED 15 // Nombres total de led
  2. define NUM_LED_PER_LEVEL 15 // Nombres de led par level
  3. define NUM_LEVEL 1 // Nombres de level
  4. define PIN_BUTON 3 // Pin bouton sur la carte
  5. 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 score = 0; // Initialisation du score int delay_level = 300; // Initialisation de la vitesse de jeu int led; // Implémentation de la variable globale "led"


void setup() { // Fonction d'initialisation du jeu

 Serial.println("Begin");
 pinMode(PIN_BUTON, INPUT);                                            // Définition de "PIN_BUTON" en tant qu'entrée
 
 leds.begin();                                                         // Initialisation des leds
 leds.setBrightness(255);                                              // 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();
 Serial.println("left");                                                              // Fonction left pour déplacer les leds depuis la gauche
 right(); 
 Serial.println("right");                                                             // Fonction right pour déplacer les leds depuis la droite

}

void bouton(){ // Fonction en cas d'appuie sur le bouton

 score += NUM_LED_PER_LEVEL-2*(int)abs(NUM_LED_PER_LEVEL*level-1+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.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(500);                                                                       // Attendre 500 ms
 for(int i = 0; i <= 10; 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
   }
 }
 level = 0;                                                                        // Réinitialiser le jeu
 delay_level = 300;                                                                // Réinitialiser la vitesse du jeu

}

void left(){ // Fonction permettant de déplacer la led en partant de la gauche

 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
   }
   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
   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
 }

}

void right(){ // Fonction permettant de déplacer la led en partant de la droite

 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
   }
   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
   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
 }

}

étapes de fabrication

indiquer autant d'étape que nécessaire, chacune illustrée par des images (phot, dessins, ...)

étape 1

  • Souder les bandeaux de leds en série en faisant attention au sens de fléchage.

Soudure led.jpg Sens led.jpg

étape 2

  • Faire les branchements sur la plaque et la connecter à l'ordinateur.

Connectique.jpg

étape 3

  • Téléverser notre programme et le tester/debug/améliorer par rapport au rendu réel.

Test prog.jpg

étape 4

  • Fabrique de notre support en bois


troubleshouting

quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?

  • 1er code récupéré qui ne fonctionnait pas. Solution: nous avons rédigé notre propre code.
  • Carte D1 hors service.

Sources et documentation complémentaire