ENIB 2024 : GNOP

De Les Fabriques du Ponant
Aller à : navigation, rechercher

Titre de la fiche expérience :

Description

Le projet est de fabriquer un jeu ludique à l'aide d'une carte Arduino, notre jeu est le D1-Pong. Inspiré du sport du tennis de table, il reprend le même principe mais avec des LEDS, la balle se déplace sur les LEDS et dès qu'elle arrive à une extrémité, le joueur en question appuie sur son bouton pour que la balle parte dans l'autre sens et ainsi de suite.
​ Voici notre équipe :
LAVRAITEAM.jpg

Photos

Outil et matériel

Pour fabriquer ce jeu, nous avons eut besoin de :

  • Carte Arduino D1 Mini
  • 2 boutons d'arcade
  • Carton
  • Fils électriques
  • Interupteur
  • Batterie
  • Ruban de LEDS
  • Haut-parleur


Nous nous sommes servis de plusieurs outils :

  • Fer à souder
  • Pistolet à colle
  • Cutter

Fichiers à joindre

On mettra une vidéo

Code Arduino

  1  
  2 /*
  3    Code de fonctionnement pour le jeu PONG.
  4    Par les petits débrouillards.
  5 */
  6 
  7 #include <FastLED.h>
  8 
  9 // Definition des couleurs
 10 const CRGB NOIR  = CRGB(0,   0,   0  );
 11 const CRGB BLANC = CRGB(255, 255, 255);
 12 const CRGB ROUGE = CRGB(255, 0,   0  );
 13 const CRGB VERT  = CRGB(0,   255, 0  );
 14 const CRGB BLEU  = CRGB(0,   0,   255);
 15 const CRGB JAUNE = CRGB(255, 255, 0  );
 16 const CRGB ROSE  = CRGB(255, 0,   255);
 17 const CRGB CYAN  = CRGB(0,   255, 255);
 18 
 19 // Definition des notes de musique
 20 const int NOTE_DO_1 = 33;
 21 
 22 
 23 /******************************
 24    PARAMETRES DE BRANCHEMENTS
 25  ******************************/
 26 
 27 const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs
 28 const int BUTTON1_PIN = 3;      // Numero de branchement du premier bouton
 29 const int BUTTON2_PIN = 2;      // Numero de branchement du deuxieme bouton
 30 const int HAUT_PARLEUR_PIN = 6; // Numero de branchement du haut parleur (optionnel)
 31 
 32 
 33 /******************************
 34    PARAMETRES GENERAUX DU JEU
 35  ******************************/
 36 const int   NUM_LEDS = 40;      // Nombre de LEDs sur la bande
 37 const float SPEED = 0.5;        // Vitesse de la balle
 38 const float ACCELERATION = 8;  // Accelleration de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir
 39 const int   HIT_ZONE = 5;       // Nombre de LED pendant lesquelles on peut renvoyer la balle
 40 const int   MAX_SCORE = 3;
 41 
 42 const CRGB  PLAYER1_COLOR = CYAN;    // Couleur player 1
 43 const CRGB  PLAYER2_COLOR = ROSE;    // Couleur player 2
 44 const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle
 45 
 46 
 47 // LEDs
 48 CRGB leds[NUM_LEDS];
 49 
 50 // Players
 51 enum Player
 52 {
 53   PERSONNE,
 54   PLAYER1,
 55   PLAYER2
 56 };
 57 
 58 // Etats du jeu
 59 enum GameState
 60 {
 61   START,
 62   GAME
 63 };
 64 GameState gameState = START;
 65 
 66 
 67 // Fonctions de fonctionnement du jeu
 68 
 69 // Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2
 70 void ledColor(Player player, int pos, CRGB color)
 71 {
 72   if (player == PLAYER1)
 73   {
 74     leds[pos] = color;
 75   }
 76   else // player == PLAYER2
 77   {
 78     leds[NUM_LEDS - pos - 1] = color;
 79   }
 80 }
 81 
 82 // Fonction permettant de changer la couleur d'une LED
 83 void ledColor(int pos, CRGB color)
 84 {
 85   leds[pos] = color;
 86 }
 87 
 88 // Variables de fonctionnement du jeu
 89 Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton
 90 float ballSpeed = SPEED;  // Vitesse de la balle
 91 float ballPosition = 1; // Position de la balle sur la bande de led (Si ballPosition = 0, la balle est devant le player 1. Si ballPosition = 1, la balle est devant le player 2)
 92 int player1Score = 0;   // Score du player 1
 93 int player2Score = 0;   // Score du player 2
 94 Player lastWinner = PERSONNE;
 95 
 96 unsigned long lastMillis = 0;
 97 unsigned long gameBegin = 0;
 98 unsigned int counter = 0;
 99 
100 
101 // Fonction servant à afficher les scores
102 void showScore()
103 {
104   // On commence par effacer toutes les couleurs de led
105   FastLED.clear();
106 
107   // On allume le nombre de led correspondant au score du player 1
108   for (int i = 0; i < player1Score; i++)
109   {
110     ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);
111   }
112 
113   // On allume le nombre de led correspondant au score du player 2
114   for (int i = 0; i < player2Score; i++)
115   {
116     ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);
117   }
118 
119   // On envoie les nouvelles couleurs a la bande de led
120   FastLED.show();
121 
122   // On fait clignotter trois fois
123   if (lastWinner == PLAYER1)
124   {
125     for (int i = 0; i < 3; i++)
126     {
127       // On eteint la derniere LED pendant 0.5s
128       delay(500);
129       ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);
130       FastLED.show();
131 
132       // On allume la derniere LED pendant 0.5s
133       delay(500);
134       ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);
135       FastLED.show();
136     }
137   }
138   else // lastWinner == PLAYER2
139   {
140     for (int i = 0; i < 3; i++)
141     {
142       // On eteint la derniere LED pendant 0.5s
143       delay(500);
144       ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);
145       FastLED.show();
146 
147       // On allume la derniere LED pendant 0.5s
148       delay(500);
149       ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);
150       FastLED.show();
151     }
152   }
153 
154   // Si la partie est terminée on va a l'affichage de fin
155   if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)
156   {
157     gameState = START;
158 
159     // On reinitialise les scores
160     player1Score = 0;
161     player2Score = 0;
162 
163     // On reinitialise la vitesse
164     ballSpeed = SPEED;
165 
166     // On reinitialise les leds
167     FastLED.clear();
168   }
169   // Sinon on reprend le jeu
170   else
171   {
172     gameState = GAME;
173     ballSpeed = SPEED;
174   }
175 }
176 
177 
178 
179 /****************************************************************
180    Cette fonction s'execute une fois lorsque la carte s'allume.
181  ****************************************************************/
182 void setup() {
183   Serial.begin(115200);
184   // Initialisation des LEDs
185   FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
186 
187   // Initialisations des boutons
188   pinMode(BUTTON1_PIN, INPUT_PULLUP);
189   pinMode(BUTTON2_PIN, INPUT_PULLUP);
190 
191   // Initialisation du haut parleur
192   pinMode(HAUT_PARLEUR_PIN, OUTPUT);
193 
194   // COULEUR DES LEDS EN DEBUT DE PARTIE
195   FastLED.clear();
196   // Couleurs player 1
197   ledColor(PLAYER1, 0, PLAYER1_COLOR);
198   ledColor(PLAYER1, 1, PLAYER1_COLOR);
199   ledColor(PLAYER1, 2, PLAYER1_COLOR);
200   ledColor(PLAYER1, 3, PLAYER1_COLOR);
201   ledColor(PLAYER1, 4, PLAYER1_COLOR);
202 
203   // Couleurs player 2
204   ledColor(PLAYER2, 0, PLAYER2_COLOR);
205   ledColor(PLAYER2, 1, PLAYER2_COLOR);
206   ledColor(PLAYER2, 2, PLAYER2_COLOR);
207   ledColor(PLAYER2, 3, PLAYER2_COLOR);
208   ledColor(PLAYER2, 4, PLAYER2_COLOR);
209 
210   // On envoie les changements a la bande de leds
211   FastLED.show();
212 }
213 
214 /*************************************************************
215    Cette fonction s'execute en continue tout au long du jeu.
216  *************************************************************/
217 void loop() {
218 
219   switch (gameState)
220   {
221     case START:
222       // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur
223       if (lastWinner == PLAYER1)
224       {
225         fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);
226         FastLED.show();
227       }
228       else if (lastWinner == PLAYER2)
229       {
230         fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);
231         FastLED.show();
232       }
233 
234       // On regarde si un des boutons est appuye
235       if (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW)
236       {
237         // La partie commence
238         gameState = GAME;
239 
240         // Initialisation de la varable lastMillis
241         lastMillis = millis();
242 
243         // Initialisation du temps de début de jeu
244         gameBegin = millis();
245       }
246       break;
247 
248     case GAME:
249       // Calcul du temps ecoule entre deux boucles
250       unsigned long currentMillis = millis();
251 
252       // On calcule le numero de la LED allumee
253       int ballLed = int(ballPosition * NUM_LEDS);
254 
255       // On s'assure que la position de la balle ne dépasse pas la taille de la bande de LED
256       ballLed = min(ballLed, NUM_LEDS - 1);
257 
258       // On regarde qui est en train de jouer
259       if (player == PLAYER1)
260       {
261         // On regarde si le player a appuye sur son bouton et si le délai de début de jeu est passé
262         if (digitalRead(BUTTON1_PIN) == LOW && currentMillis - gameBegin > 500)
263         {
264           // Si la balle est hors de la zone de tir, l'autre player marque un point
265           if (ballLed >= HIT_ZONE)
266           {
267             player2Score += 1;
268             lastWinner = PLAYER2;
269             ballPosition = 0;
270 
271             // On passe en mode affichage des scores
272             showScore();
273 
274             // C'est a l'autre player de jouer
275             player = PLAYER2;
276 
277             // Actualisation de la variable lastMillis
278             lastMillis = millis();
279           }
280           else
281           {
282             // On accelere la balle
283             ballSpeed *= 1.0 + ACCELERATION / 100;
284 
285             // C'est a l'autre player de jouer
286             player = PLAYER2;
287 
288             // On joue la note de musique
289             tone(HAUT_PARLEUR_PIN, NOTE_DO_1, 300);
290           }
291 
292           break;
293         }
294 
295         // On fait avancer la balle
296         ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;
297 
298         // On regarde si la balle est sortie de la zone
299         if (ballPosition < 0.0f)
300         {
301           // Si oui le player 2 marque un point
302           player2Score += 1;
303           lastWinner = PLAYER2;
304           ballPosition = 0;
305 
306           // On passe en mode affichage des scores
307           showScore();
308 
309           // C'est a l'autre player de jouer
310           player = PLAYER2;
311 
312           // Actualisation de la variable lastMillis
313           lastMillis = millis();
314           break;
315         }
316       }
317       else // player == PLAYER2
318       {
319         // On regarde si le player a appuye sur son bouton et si le délai de début de jeu est passé
320         if (digitalRead(BUTTON2_PIN) == LOW && currentMillis - gameBegin > 500)
321         {
322           // Si la balle est hors de la zone de tir, l'autre player marque un point
323           if (ballLed < NUM_LEDS - HIT_ZONE)
324           {
325             player1Score += 1;
326             lastWinner = PLAYER1;
327             ballPosition = 1;
328 
329             // On passe en mode affichage des scores
330             showScore();
331 
332             // C'est a l'autre player de jouer
333             player = PLAYER1;
334 
335             // Actualisation de la variable lastMillis
336             lastMillis = millis();
337           }
338           else
339           {
340             // On accelere la balle
341             ballSpeed *= 1.1;
342 
343             // C'est a l'autre player de jouer
344             player = PLAYER1;
345           }
346 
347           break;
348         }
349 
350         // On fait avancer la balle dans l'autre sens
351         ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;
352 
353         // On regarde si la balle est sortie de la zone
354         if (ballPosition >= 1)
355         {
356           // Si oui le player 1 marque un point
357           player1Score += 1;
358           lastWinner = PLAYER1;
359           ballPosition = 1;
360 
361           // On passe en mode affichage des scores
362           showScore();
363           // C'est a l'autre player de jouer
364           player = PLAYER1;
365 
366           // Actualisation de la variable lastMillis
367           lastMillis = millis();
368           break;
369         }
370       }
371 
372       ///// AFFICHAGE BANDE DE LEDs /////
373       // Premierement on efface toutes les couleurs precedentes
374       FastLED.clear();
375 
376       // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote
377       for (int i = 0; i < HIT_ZONE; i++)
378       {
379         // On allume de chaque cote
380         ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante
381         ledColor(PLAYER2, i, PLAYER2_COLOR / 10);
382       }
383 
384       // Ensuite on allume faiblement les LEDs correspondant aux scores
385       // Pour le player 1
386       for (int i = 0; i < player1Score; i++)
387       {
388         ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);
389       }
390       // Pour le player 2
391       for (int i = 0; i < player2Score; i++)
392       {
393         ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);
394       }
395 
396       // Ensuite on actualise la position de la balle
397       // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non
398 
399       // Si la balle est dans le camp d'un des player, elle est rouge.
400       if (ballLed < HIT_ZONE || ballLed >= NUM_LEDS - HIT_ZONE)
401       {
402         ledColor(ballLed, ROUGE);
403       }
404       // Si elle en est proche, elle est jaune
405       else if (ballLed < 2 * HIT_ZONE || ballLed >= NUM_LEDS - 2 * HIT_ZONE)
406       {
407         ledColor(ballLed, JAUNE);
408       }
409       // Sinon la balle a sa couleur par defaut
410       else
411       {
412         ledColor(ballLed, BALL_COLOR);
413       }
414 
415       // On envoie la couleur des leds a la bande de leds
416       FastLED.show();
417 
418       // On actualise la variable lastMillis pour la boucle suivante
419       lastMillis = currentMillis;
420       break;
421   }
422 }

étapes de fabrication

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

étape 1

étape 2

étape ...

troubleshouting

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

Sources et documentation complémentaire