ENIB 2024 : CatchTheJackpot : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(étape 1: câbler et souder)
(troubleshouting)
Ligne 260 : Ligne 260 :
  
 
1er problème : le programme ne marchait pas car la LED était montée à l'envers
 
1er problème : le programme ne marchait pas car la LED était montée à l'envers
 +
 +
2ème problème : adapter la taille du support qui était d'abord trop grand
  
 
==Sources et documentation complémentaire==
 
==Sources et documentation complémentaire==

Version du 30 janvier 2024 à 17:08

Ahok.jpg

Titre de la fiche expérience :

description

Ce projet fonction grâce à une carte Arduino, des LEDs et un bouton.

Une lumière traverse le ruban de gauche à droite et lorsqu'elle est au milieu, il faut appuyer sur le bouton au bon moment pour gagner.

réalisé par :

-Arnaud Genty
-Maxime Bintein
-Tristan Le Coz

Introduction

éventuelle vidéo

Liste des composants

  • Bouton poussoir style Arcade
  • Arduino nano
  • 2 rubans de LED adressable (85 LEDs pour être exacte)
  • Carton
  • Câbles mini-USB
  • Câbles

Outils

  • Cutter
  • Marqueur noir
  • Pistolet à colle
  • Scotch
  • Fer à souder
  • Bibliothèque Arduino FastLed
 https://fastled.io/

fichiers à joindre

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

Code :

  1 #include "FastLED.h"                    //bibliothèque pour controler le ruban led
  2 #define NUM_LEDS 86
  3 #define NUM_OF_LEDS_BY_LEVEL 17         // nombre de leds par niveau
  4 #define NUM_OF_LEVELS 5                  // nombre de niveaux
  5 #define PIN_BTN 3                       // Entree du bouton
  6 #define PIN_LEDS 2                      // Sortie du ruban led
  7 
  8 // Dans ce programme nous avons utilisé presque intégralement des variables globales
  9 
 10 CRGB leds[NUM_LEDS];
 11 int level = 0;        // niveau auquel le joueur est
 12 int delay_level = 30; // délai qui permet de controler la vitesse de déplacement de la led
 13 auto color = CRGB::Purple; // couleur de la led qui se déplace
 14 int score = 0;           // socre du joueur
 15 const double coef[] = {1, 1.4, 1.7, 1.9, 2, 2.2}; // coefficient multiplicateur de point par niveau
 16 int last_point = 0;     // sauvegarde de la derniere led allumée pour la rallumer après flash()
 17 
 18 
 19 // Déclarations de fonctions
 20 int compute_score(int score_of_level);    // calcul du score par niveau
 21 int up();           // deplacement led
 22 int down();         // deplacement led dans l'autre sense
 23 void level_up();    // passage de niveau
 24 void flash();       // animation de victoire d'un niveau
 25 
 26 
 27 void setup() {
 28   FastLED.addLeds<NEOPIXEL, 2>(leds, NUM_LEDS);     // setup du ruban de led sur la sortie PIN_LEDS => 2
 29   pinMode(PIN_BTN, INPUT);                          // setup du bouton dur l'entrée PIN_BTN => 3
 30   Serial.begin(9600);                               // setup moniteur série pour debug
 31 }
 32 
 33 void loop() {
 34 
 35   int score_of_level;
 36   if (score_of_level = up())              // led avance dans un sense
 37   {
 38     score += compute_score(score_of_level);       // ajout score du niveau
 39     level_up();
 40   }
 41   else if (score_of_level = down())       // led avance dans l'autre sense
 42   {
 43     score += compute_score(score_of_level);       // ajout score du niveau
 44     level_up();
 45   }
 46 
 47 
 48 }
 49 
 50 int compute_score(int score_of_level)
 51 {
 52   return (NUM_OF_LEDS_BY_LEVEL/2 - (int)abs((level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2) - score_of_level)) * coef[level] + 1;
 53   // On calcul le nombre de leds d'un niveau moins la différence entre la led du joueur et celle du milieu on ajoute 2 et on multiplie par le coefficient de points du level
 54 }
 55 
 56 int up()
 57 {
 58   for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++)
 59   {
 60     if (digitalRead(PIN_BTN))   // appuie sur le bouton
 61     {
 62       while (digitalRead(PIN_BTN))    // blocage du bouton tant que celui-ci n'a pas été relaché
 63       {
 64         delay(2);
 65       }
 66       last_point = i-1;     // on concerve la valeur de la led choisie pour la réafficher après le flash
 67       return i - 1;   // renvoie la position de la led au moment de l'appuie sur le bouton
 68     }
 69     leds[i - 1] = CRGB::Black;
 70     delay(3);
 71 
 72     leds[level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2] = CRGB::White;
 73     leds[i] = color;
 74 
 75     FastLED.show();
 76     delay(delay_level);
 77   }
 78   leds[NUM_OF_LEDS_BY_LEVEL * level + 20] = CRGB::Black;
 79   FastLED.show();
 80   delay(delay_level);
 81   return 0;
 82 
 83 }
 84 
 85 int down()
 86 {
 87 
 88   for (int i = NUM_OF_LEDS_BY_LEVEL * level +  NUM_OF_LEDS_BY_LEVEL - 1; i >= NUM_OF_LEDS_BY_LEVEL * level ; i--)
 89   {
 90     if (digitalRead(PIN_BTN))
 91     {
 92       while (digitalRead(PIN_BTN))
 93       {
 94         delay(2);
 95       }
 96       last_point = i+1;
 97       return i + 1;   // renvoie la position de la led au moment de l'appuie sur le bouton
 98     }
 99     leds[i + 1] = CRGB::Black;
100     delay(3);
101 
102     leds[level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2] = CRGB::White;
103     leds[i] = color;
104 
105     FastLED.show();
106     delay(delay_level);
107   }
108   leds[NUM_OF_LEDS_BY_LEVEL] = CRGB::Black;
109   FastLED.show();
110   delay(delay_level);
111   return 0;
112 
113 
114 }
115 void flash()   // fonction de décoration qui fait clignoter les leds en blanc avant le passage de niveau
116 {
117   for (int cpt = 0; cpt < 4; cpt++) 
118   {
119     for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++)  // On met toute les leds du niveau en blanc
120     {
121       leds[i] = CRGB::White;
122     }
123     FastLED.show();
124 
125     delay(100);
126     for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++) // On éteint toutes les leds du niveau
127     {
128       leds[i] = CRGB::Black;
129     }
130     FastLED.show();
131     delay(100);
132   }
133   leds[last_point] = CRGB::Red;
134 }
135 
136 void score_leds()   // affichage du score avec les leds
137 {
138   for (int i = 0; i < score; i++)
139   {
140     leds[i] = CRGB::Red;
141 
142     FastLED.show();
143     delay(10);
144   }
145 }
146 
147 void reset_leds()   // on éteint toutes les leds
148 {
149   for (int i = 0; i < NUM_LEDS; i++)
150   {
151     leds[i] = CRGB::Black;
152 
153   }
154   FastLED.show();
155 }
156 
157 void animation_attente()
158 {
159     for(int i = 0; i < NUM_LEDS; i++)
160     {
161       leds[i].red = random(0,255);
162       leds[i].green = random(0,255);
163       leds[i].blue = random(0,255);
164     }
165     FastLED.show();
166   
167 }
168 void level_up()   // changement de niveau
169 {
170   flash();  // animation
171   level++;  // incrémentation de la variable niveau
172   delay_level -= 4; // le jeu devient de plus en plus rapide
173   if (level >= NUM_OF_LEVELS)   // fin du jeu
174   {
175     reset_leds();
176     score_leds();   // affichage score
177     delay(3000);
178     reset_leds();
179     while (!digitalRead(PIN_BTN))   // on attend que l'utilisateur appuie sur un bonton
180     {
181       animation_attente();
182       delay(200);
183     }
184     while (digitalRead(PIN_BTN))  // on vérifie que le bouton n'est pas resté appuyé
185     {
186       delay(10);
187     }
188     // on réinitialise le jeu
189     level = 0;      
190     reset_leds();
191     score = 0;
192     delay_level = 30;
193 
194 
195   }
196 
197 
198 }

étapes de fabrication

étape 1: câbler et souder

câbler les fils entre les leds, la carte arduino et le bouton puis souder les fils si nécessaire et enfin téléverser le programme dans la carte si nécessaire.

Cablage.jpg

étape 2: le support

réaliser le support en coupant et collant les cartons


Tonk1.jpg Tonk2.jpg

étape ...

troubleshouting

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

1er problème : le programme ne marchait pas car la LED était montée à l'envers

2ème problème : adapter la taille du support qui était d'abord trop grand

Sources et documentation complémentaire

ne pas modifier sous cette ligne