<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Laouen</id>
		<title>Les Fabriques du Ponant - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Laouen"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/Laouen"/>
		<updated>2026-04-30T11:18:12Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25543</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25543"/>
				<updated>2024-01-25T14:25:39Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 14 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Pour ajouter un peu d'esthétique à notre projet, nous avons gravé à la découpeuse vinyle le titre de notre projet.*&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:GNOP.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 15===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25542</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25542"/>
				<updated>2024-01-25T14:25:19Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 14 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Pour ajouter un peu d'esthétique à notre projet, nous avons gravé à la découpeuse vinyle le titre de notre projet.&lt;br /&gt;
[[Fichier:GNOP.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 15===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25541</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25541"/>
				<updated>2024-01-25T14:24:50Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 14 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Pour ajouter un peu d'esthétique à notre projet, nous avons gravé à la découpeuse vinyle le titre de notre projet.&lt;br /&gt;
[[Fichier:GNOP.jgp|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 15===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:GNOP.jpg&amp;diff=25540</id>
		<title>Fichier:GNOP.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:GNOP.jpg&amp;diff=25540"/>
				<updated>2024-01-25T14:23:49Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25538</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25538"/>
				<updated>2024-01-25T14:22:12Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Pour ajouter un peu d'esthétique à notre projet, nous avons gravé à la découpeuse vinyle le titre de notre projet.&lt;br /&gt;
&lt;br /&gt;
===Étape 15===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25537</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25537"/>
				<updated>2024-01-25T14:20:43Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25535</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25535"/>
				<updated>2024-01-25T14:20:11Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Pour ajouter un peu d'esthétique à  notre maquette, nous avons gravé à la découpeuse vinyle le titre de notre projet.&lt;br /&gt;
&lt;br /&gt;
===Étape 15===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25533</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25533"/>
				<updated>2024-01-25T14:17:14Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Problèmes rencontrés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
Nous avons confronté un certain nombre de problèmes durant la conception de ce projet.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une fois que nous avions fini le projet sur la première maquette, le téléversement ne se faisait pas, sur Arduino IDE, dans l'onglet Tools&amp;gt;Processor il fallait prendre la rubrique &amp;quot;Old Bootloader&amp;quot; et nous étions sur celui de base, mais si l'un ne marche pas c'est que l'autre fonctionne, nous avons donc réussi à résoudre ce problème.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous avons aussi également essayé d'incorporer un haut-parleur classique pour faire du son dès qu'un bouton est appuyé, mais le son n'était clairement pas assez fort donc on a voulu utilisé un amplificateur mais nous n'avons pas réussi à bien le brancher. On a donc opter d'utiliser un buzzer pour que le son soit plus fort pour être entendu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Une des broches de notre carte n'a plus été fonctionnel, nous avons mis du temps à comprendre qu'un de nos problèmes venait de là, on a donc tout simplement changer de broche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous utilisions au début, une batterie à pile, mais celle-ci ne délivrait pas assez de puissance pour faire fonctionner la carte et le programme, nous avons changé cette batterie et opter pour une batterie externe rechargeable qui, elle, convenait parfaitement avec le système.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25506</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25506"/>
				<updated>2024-01-25T14:06:35Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Problèmes rencontrés==&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25503</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25503"/>
				<updated>2024-01-25T14:05:45Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Photos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25502</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25502"/>
				<updated>2024-01-25T14:05:34Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Outil et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
==Code Arduino==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25499</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25499"/>
				<updated>2024-01-25T14:04:54Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Outil et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Batterie externe&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
* Bois&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
* Lime à bois&lt;br /&gt;
* Découpeuse Vinyle&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25495</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25495"/>
				<updated>2024-01-25T14:03:41Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade, vous pouvez le voir sur la photo ci-dessus.&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25493</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25493"/>
				<updated>2024-01-25T14:03:16Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25487</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25487"/>
				<updated>2024-01-25T14:02:06Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche&lt;br /&gt;
[[Fichier:final.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Final.jpg&amp;diff=25485</id>
		<title>Fichier:Final.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Final.jpg&amp;diff=25485"/>
				<updated>2024-01-25T14:01:10Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25476</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25476"/>
				<updated>2024-01-25T13:56:15Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Fichiers à joindre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25467</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25467"/>
				<updated>2024-01-25T13:54:59Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Fichiers à joindre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La biblothèque FastLED est nécéssaire pour pouvoir faire fonctionner le programme.&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
Pour l'installer il faut télécharger FastLED avec ce lien : https://github.com/FastLED/FastLED et le mettre dans le répertoire des bibliothèques d'Arduino. Et sur Arduino IDE avec celui-là : https://www.arduino.cc/en/main/software.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sur le ligociel, il faut chosir la bonne carte, le bon port de sortie et il suffit enfin de téléverser pour pouvoir charger le programme sur la carte.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et maintenant, pour pouvoir utiliser le jeu partout, il faut tout simplement utiliser une batterie (avec piles ou externe) et la brancher à la carte qui à été préalablement chargée avec le programme.&lt;br /&gt;
Ensuite sur Arduino IDE&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25344</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25344"/>
				<updated>2024-01-25T11:27:21Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
===Étape 7===&lt;br /&gt;
On commence à créer notre produit final qui sera fait tout en bois&lt;br /&gt;
&lt;br /&gt;
===Étape 8===&lt;br /&gt;
Pour cela, on va venir couper une planche en bois, et les chutes serviront à faire le maintien de la planche&lt;br /&gt;
&lt;br /&gt;
===Étape 9===&lt;br /&gt;
Ensuite, on fait des trous pour faire passer les boutons d'arcade&lt;br /&gt;
&lt;br /&gt;
===Étape 10===&lt;br /&gt;
On en fait un aussi pour faire passer les fils connectés au ruban de LEDS&lt;br /&gt;
&lt;br /&gt;
===Étape 11===&lt;br /&gt;
On reconnecte tout le système sur notre maquette finale&lt;br /&gt;
&lt;br /&gt;
===Étape 12===&lt;br /&gt;
On colle notre BreadBoard au dos de notre planche pour qu'elle ne soit pas vue&lt;br /&gt;
&lt;br /&gt;
===Étape 13===&lt;br /&gt;
On colle aussi les câbles pour ne pas les vois tomber&lt;br /&gt;
&lt;br /&gt;
===Étape 14===&lt;br /&gt;
Le jeu peut être pleinement apprécié !!&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25306</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25306"/>
				<updated>2024-01-25T11:05:11Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25304</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25304"/>
				<updated>2024-01-25T11:04:41Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:board_pres.jpg]]&lt;br /&gt;
&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Board_pres.jpg&amp;diff=25299</id>
		<title>Fichier:Board pres.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Board_pres.jpg&amp;diff=25299"/>
				<updated>2024-01-25T11:02:31Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25297</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25297"/>
				<updated>2024-01-25T11:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.png]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25291</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25291"/>
				<updated>2024-01-25T11:00:11Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Schema.jpg]]&lt;br /&gt;
&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Schema.png&amp;diff=25288</id>
		<title>Fichier:Schema.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Schema.png&amp;diff=25288"/>
				<updated>2024-01-25T10:57:42Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25287</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25287"/>
				<updated>2024-01-25T10:57:01Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Bouton.jpg&amp;diff=25283</id>
		<title>Fichier:Bouton.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Bouton.jpg&amp;diff=25283"/>
				<updated>2024-01-25T10:54:38Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25276</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25276"/>
				<updated>2024-01-25T10:51:52Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|200px]]&lt;br /&gt;
[[Fichier:bouton.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25271</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25271"/>
				<updated>2024-01-25T10:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étape 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:ruban_led.png|100px]]&lt;br /&gt;
&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25269</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25269"/>
				<updated>2024-01-25T10:48:20Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
[[Fichier:ruban_led.png|100px]]&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Ruban_led.png&amp;diff=25265</id>
		<title>Fichier:Ruban led.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Ruban_led.png&amp;diff=25265"/>
				<updated>2024-01-25T10:46:32Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25258</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25258"/>
				<updated>2024-01-25T10:32:27Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Nous avons fait nos étapes dans cet ordre là car nous avons suivi les étapes dans le [[Wikidabrouillard]]&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25243</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25243"/>
				<updated>2024-01-25T10:26:09Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Outil et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur (Switch)&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25238</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25238"/>
				<updated>2024-01-25T10:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 : (parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
Alban : (jamais vu)&lt;br /&gt;
[[Fichier:alban.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Alban.jpg&amp;diff=25234</id>
		<title>Fichier:Alban.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Alban.jpg&amp;diff=25234"/>
				<updated>2024-01-25T10:23:40Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25226</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25226"/>
				<updated>2024-01-25T10:21:02Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
Ewen 2 :(parti au combat)&lt;br /&gt;
[[Fichier:virgule.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Virgule.jpg&amp;diff=25223</id>
		<title>Fichier:Virgule.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Virgule.jpg&amp;diff=25223"/>
				<updated>2024-01-25T10:19:40Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25222</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25222"/>
				<updated>2024-01-25T10:18:17Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
Ewen 1 :&lt;br /&gt;
[[Fichier:ramzi.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Ramzi.jpg&amp;diff=25220</id>
		<title>Fichier:Ramzi.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Ramzi.jpg&amp;diff=25220"/>
				<updated>2024-01-25T10:17:21Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25210</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25210"/>
				<updated>2024-01-25T10:14:19Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Arthur :&lt;br /&gt;
[[Fichier:arthur.jpg|100px]]&lt;br /&gt;
Laouen :&lt;br /&gt;
[[Fichier:laouen.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25204</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25204"/>
				<updated>2024-01-25T10:13:18Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:arthur.jpg|200px|thumb|right|Arthur]]&lt;br /&gt;
[[Fichier:laouen.jpg|200px|thumb|right|Laouen]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Laouen.jpg&amp;diff=25202</id>
		<title>Fichier:Laouen.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Laouen.jpg&amp;diff=25202"/>
				<updated>2024-01-25T10:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25189</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25189"/>
				<updated>2024-01-25T10:10:36Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:arthur.jpg|200px|thumb|right|Arthur]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25185</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25185"/>
				<updated>2024-01-25T10:09:06Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:arthur.jpg|200px|left|Arthur]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25184</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25184"/>
				<updated>2024-01-25T10:08:46Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:arthur.jpg|200px|Arthur]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25182</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25182"/>
				<updated>2024-01-25T10:08:14Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:arthur.jpg|200px|thumb|left|Arthur]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Arthur.jpg&amp;diff=25181</id>
		<title>Fichier:Arthur.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Arthur.jpg&amp;diff=25181"/>
				<updated>2024-01-25T10:06:59Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25178</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25178"/>
				<updated>2024-01-25T10:05:11Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Outil et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:LAVRAITEAM.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
* Scie à bois&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25148</id>
		<title>ENIB 2024 : GNOP</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_GNOP&amp;diff=25148"/>
				<updated>2024-01-25T09:48:54Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==Description==&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br/&amp;gt;​&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:LAVRAITEAM.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==Photos==&lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
Pour fabriquer ce jeu, nous avons eut besoin de : &lt;br /&gt;
* Carte Arduino Nano&lt;br /&gt;
* 2 boutons d'arcade&lt;br /&gt;
* Carton&lt;br /&gt;
* Fils électriques&lt;br /&gt;
* Interupteur&lt;br /&gt;
* Batterie&lt;br /&gt;
* Ruban de LEDS&lt;br /&gt;
* Haut-parleur&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Nous nous sommes servis de plusieurs outils :&lt;br /&gt;
* Fer à souder&lt;br /&gt;
* Pistolet à colle&lt;br /&gt;
* Cutter&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
On mettra une vidéo&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
/*&lt;br /&gt;
   Code de fonctionnement pour le jeu PONG.&lt;br /&gt;
   Par les petits debrouillards.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Definition des couleurs&lt;br /&gt;
const CRGB NOIR  = CRGB(0,   0,   0  ); //Création d'une constante de type CRGB de couleur noire&lt;br /&gt;
const CRGB BLANC = CRGB(255, 255, 255); //Création d'une constante de type CRGB de couleur blanche&lt;br /&gt;
const CRGB ROUGE = CRGB(255, 0,   0  ); //Création d'une constante de type CRGB de couleur rouge&lt;br /&gt;
const CRGB VERT  = CRGB(0,   255, 0  ); //Création d'une constante de type CRGB de couleur verte&lt;br /&gt;
const CRGB BLEU  = CRGB(0,   0,   255); //Création d'une constante de type CRGB de couleur bleue&lt;br /&gt;
const CRGB JAUNE = CRGB(255, 255, 0  ); //Création d'une constante de type CRGB de couleur jaune&lt;br /&gt;
const CRGB ROSE  = CRGB(255, 0,   255); //Création d'une constante de type CRGB de couleur rose&lt;br /&gt;
const CRGB CYAN  = CRGB(0,   255, 255); //Création d'une constante de type CRGB de couleur cyan&lt;br /&gt;
&lt;br /&gt;
// Definition des notes de musique&lt;br /&gt;
const int PONG_SOUND = 250; //380&lt;br /&gt;
const int LOOSE_SOUND = 180;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
    PARAMETRES DE BRANCHEMENTS&lt;br /&gt;
 ******************************/&lt;br /&gt;
&lt;br /&gt;
const int LED_PIN = 8;          // Numero de branchement de la bande de LEDs&lt;br /&gt;
const int BUTTON1_PIN = 2;      // Numero de branchement du premier bouton&lt;br /&gt;
const int BUTTON2_PIN = 4;      // Numero de branchement du deuxieme bouton&lt;br /&gt;
const int HAUT_PARLEUR_PIN = 5; // Numero de branchement du haut parleur (optionnel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
    PARAMETRES GENERAUX&lt;br /&gt;
 ***********************/&lt;br /&gt;
const int   NUM_LEDS = 60;            // Nombre de LEDs sur la bande&lt;br /&gt;
const CRGB  PLAYER1_COLOR = VERT;     // Couleur Player 1&lt;br /&gt;
const CRGB  PLAYER2_COLOR = ROUGE;    // Couleur Player 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********************&lt;br /&gt;
     PARAMETRES PONG&lt;br /&gt;
 ***********************/&lt;br /&gt;
const float BALL_SPEED = 0.5;   // Vitesse de la balle&lt;br /&gt;
const float ACCELERATION = 9;   // Accélération de la balle a chaque tir, si ACCELERATION = 10 on augmente la vitesse de 10 pourcent a chaque tir&lt;br /&gt;
const int   HIT_ZONE = 8;       // Nombre de LED pendant lesquelles on peut renvoyer la balle&lt;br /&gt;
const int   MAX_SCORE = 3;      // Score maximum avant la fin du jeu&lt;br /&gt;
&lt;br /&gt;
const CRGB  BALL_COLOR = BLANC;      // Couleur de la balle&lt;br /&gt;
&lt;br /&gt;
/*******************************&lt;br /&gt;
     PARAMETRES TIR A LA CORDE&lt;br /&gt;
 *******************************/&lt;br /&gt;
const float INCREMENT = 0.05;   // De combien avance la corde lorsqu'on appuie sur le bouton&lt;br /&gt;
const float ROPE_SMOOTH = 1.0;  // Paramètre servant a lisser la position de la corde&lt;br /&gt;
&lt;br /&gt;
const float WAVE_LENGTH = 0.2;  // Taille des ondes&lt;br /&gt;
const float WAVE_SPEED =  1.0;  // Vitesse des ondes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/******************************&lt;br /&gt;
      VARIABLES GENERALES&lt;br /&gt;
 ******************************/&lt;br /&gt;
// Players&lt;br /&gt;
enum Player&lt;br /&gt;
{&lt;br /&gt;
  PERSONNE,&lt;br /&gt;
  PLAYER1,&lt;br /&gt;
  PLAYER2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Etats du jeu&lt;br /&gt;
enum GameState&lt;br /&gt;
{&lt;br /&gt;
  START,&lt;br /&gt;
  PONG,   // Mode pong&lt;br /&gt;
  TAC     // Mode tir a la corde&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
unsigned long beginTimer = 0;&lt;br /&gt;
unsigned int counter = 0;&lt;br /&gt;
&lt;br /&gt;
Player player = PLAYER1; // Prochain joueur a appuyer sur son bouton&lt;br /&gt;
Player lastWinner = PERSONNE;&lt;br /&gt;
&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
GameState gameState = START;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT GENERALES&lt;br /&gt;
 **********************************************/&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED relativement au player 1 ou 2&lt;br /&gt;
void ledColor(Player player, int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    leds[pos] = color;&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    leds[NUM_LEDS - pos - 1] = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction permettant de changer la couleur d'une LED&lt;br /&gt;
void ledColor(int pos, CRGB color)&lt;br /&gt;
{&lt;br /&gt;
  leds[pos] = color;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 *********************************************/&lt;br /&gt;
float ballSpeed = BALL_SPEED;  // Vitesse de la balle&lt;br /&gt;
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)&lt;br /&gt;
int player1Score = 0;   // Score du player 1&lt;br /&gt;
int player2Score = 0;   // Score du player 2&lt;br /&gt;
&lt;br /&gt;
/**********************************************&lt;br /&gt;
      FONCTIONS DE FONCTIONNEMENT DU PONG&lt;br /&gt;
 **********************************************/&lt;br /&gt;
// Fonction servant a afficher les scores&lt;br /&gt;
void showScore()&lt;br /&gt;
{&lt;br /&gt;
  // On commence par effacer toutes les couleurs de led&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On allume le nombre de led correspondant au score du player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie les nouvelles couleurs a la bande de led&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On fait clignotter trois fois&lt;br /&gt;
  if (lastWinner == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER1, NUM_LEDS / 2 - player1Score, PLAYER1_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // lastWinner == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
    {&lt;br /&gt;
      // On eteint la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, NOIR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
&lt;br /&gt;
      // On allume la derniere LED pendant 0.5s&lt;br /&gt;
      delay(500);&lt;br /&gt;
      ledColor(PLAYER2, NUM_LEDS / 2 - player2Score, PLAYER2_COLOR);&lt;br /&gt;
      FastLED.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si la partie est terminee on va a l'affichage de fin&lt;br /&gt;
  if (player1Score == MAX_SCORE || player2Score == MAX_SCORE)&lt;br /&gt;
  {&lt;br /&gt;
    gameState = START;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les scores&lt;br /&gt;
    player1Score = 0;&lt;br /&gt;
    player2Score = 0;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise la vitesse&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
&lt;br /&gt;
    // On reinitialise les leds&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon on reprend le jeu&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    gameState = PONG;&lt;br /&gt;
    ballSpeed = BALL_SPEED;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU PONG&lt;br /&gt;
 ***************************************/&lt;br /&gt;
void pong_loop()&lt;br /&gt;
{&lt;br /&gt;
  // Calcul du temps ecoule entre deux boucles&lt;br /&gt;
  unsigned long currentMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  // On calcule le numero de la LED allumee&lt;br /&gt;
  int ballLed = ballPosition * NUM_LEDS;&lt;br /&gt;
&lt;br /&gt;
  // On s'assure que la position de la balle ne depasse pas la taille de la bande de LED&lt;br /&gt;
  ballLed = min(ballLed, NUM_LEDS - 1);&lt;br /&gt;
&lt;br /&gt;
  // On regarde qui est en train de jouer&lt;br /&gt;
  if (player == PLAYER1)&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON1_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;gt;= HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player2Score += 1;&lt;br /&gt;
        lastWinner = PLAYER2;&lt;br /&gt;
        ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.0 + ACCELERATION / 100;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle&lt;br /&gt;
    ballPosition -= ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 2 marque un point&lt;br /&gt;
      player2Score += 1;&lt;br /&gt;
      lastWinner = PLAYER2;&lt;br /&gt;
      ballPosition = 0;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER2;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else // player == PLAYER2&lt;br /&gt;
  {&lt;br /&gt;
    // On regarde si le player a appuye sur son bouton et si le delai de debut de jeu est passe&lt;br /&gt;
    if (digitalRead(BUTTON2_PIN) == LOW &amp;amp;&amp;amp; currentMillis - beginTimer &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
      // Si la balle est hors de la zone de tir, l'autre player marque un point&lt;br /&gt;
      if (ballLed &amp;lt; NUM_LEDS - HIT_ZONE)&lt;br /&gt;
      {&lt;br /&gt;
        player1Score += 1;&lt;br /&gt;
        lastWinner = PLAYER1;&lt;br /&gt;
        ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
        // On joue le son de defaite&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
        // On passe en mode affichage des scores&lt;br /&gt;
        showScore();&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // Actualisation de la variable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // On accelere la balle&lt;br /&gt;
        ballSpeed *= 1.1;&lt;br /&gt;
&lt;br /&gt;
        // C'est a l'autre player de jouer&lt;br /&gt;
        player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // On fait avancer la balle dans l'autre sens&lt;br /&gt;
    ballPosition += ballSpeed * (currentMillis - lastMillis) * 0.001f;&lt;br /&gt;
&lt;br /&gt;
    // On regarde si la balle est sortie de la zone&lt;br /&gt;
    if (ballPosition &amp;gt;= 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Si oui le player 1 marque un point&lt;br /&gt;
      player1Score += 1;&lt;br /&gt;
      lastWinner = PLAYER1;&lt;br /&gt;
      ballPosition = 1;&lt;br /&gt;
&lt;br /&gt;
      // On joue le son de defaite&lt;br /&gt;
      tone(HAUT_PARLEUR_PIN, LOOSE_SOUND, 800);&lt;br /&gt;
&lt;br /&gt;
      // On passe en mode affichage des scores&lt;br /&gt;
      showScore();&lt;br /&gt;
      // C'est a l'autre player de jouer&lt;br /&gt;
      player = PLAYER1;&lt;br /&gt;
&lt;br /&gt;
      // Actualisation de la variable lastMillis&lt;br /&gt;
      lastMillis = millis();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ///// AFFICHAGE BANDE DE LEDs /////&lt;br /&gt;
  // Premierement on efface toutes les couleurs precedentes&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant a la zone de chaque cote&lt;br /&gt;
  for (int i = 0; i &amp;lt; HIT_ZONE; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // On allume de chaque cote&lt;br /&gt;
    ledColor(PLAYER1, i, PLAYER1_COLOR / 10);  // On divise la couleur par 10 pour la rendre 10 fois moins puissante&lt;br /&gt;
    ledColor(PLAYER2, i, PLAYER2_COLOR / 10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on allume faiblement les LEDs correspondant aux scores&lt;br /&gt;
  // Pour le player 1&lt;br /&gt;
  for (int i = 0; i &amp;lt; player1Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER1, NUM_LEDS / 2 - (i + 1), PLAYER1_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
  // Pour le player 2&lt;br /&gt;
  for (int i = 0; i &amp;lt; player2Score; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(PLAYER2, NUM_LEDS / 2 - (i + 1), PLAYER2_COLOR / 15);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Ensuite on actualise la position de la balle&lt;br /&gt;
  // On donne la couleur de la led en fonction de si la balle est dans la zone d'un player ou non&lt;br /&gt;
&lt;br /&gt;
  // Si la balle est dans le camp d'un des player, elle est rouge.&lt;br /&gt;
  if (ballLed &amp;lt; HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  // Si elle en est proche, elle est jaune&lt;br /&gt;
  else if (ballLed &amp;lt; 2 * HIT_ZONE || ballLed &amp;gt;= NUM_LEDS - 2 * HIT_ZONE)&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, JAUNE);&lt;br /&gt;
  }&lt;br /&gt;
  // Sinon la balle a sa couleur par defaut&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    ledColor(ballLed, BALL_COLOR);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On envoie la couleur des leds a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // On actualise la variable lastMillis pour la boucle suivante&lt;br /&gt;
  lastMillis = currentMillis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************************************&lt;br /&gt;
      VARIABLES DE FONCTIONNEMENT DU TIR A LA CORDE&lt;br /&gt;
 *******************************************************/&lt;br /&gt;
float ropePosition = 0.5;           // Position non lissee de la corde&lt;br /&gt;
float displayedRopePosition = 0.5;  // Position lissee de la corde&lt;br /&gt;
bool player1Pushed = false;&lt;br /&gt;
bool player2Pushed = false;&lt;br /&gt;
&lt;br /&gt;
float player1Waves[10] = { 0 };&lt;br /&gt;
float player2Waves[10] = { 0 };&lt;br /&gt;
&lt;br /&gt;
/***********************************************&lt;br /&gt;
      FONCTION PRINCIPALE DU TIR A LA CORDE&lt;br /&gt;
 ***********************************************/&lt;br /&gt;
void tac_loop()&lt;br /&gt;
{  &lt;br /&gt;
  // Calcul des temps&lt;br /&gt;
  unsigned long ms = millis();&lt;br /&gt;
  float dt = (ms - lastMillis) * 0.001f;&lt;br /&gt;
  lastMillis = ms;&lt;br /&gt;
&lt;br /&gt;
  // Si moins d'une seconde s'est ecoule depuis le debut, on ne fait rien (pour eviter d'appuyer sans faire expres)&lt;br /&gt;
  if (ms - beginTimer &amp;lt; 1000)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  bool player1Push = !digitalRead(BUTTON1_PIN);&lt;br /&gt;
  bool player2Push = !digitalRead(BUTTON2_PIN);&lt;br /&gt;
&lt;br /&gt;
  if (player1Push &amp;amp;&amp;amp; !player1Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition += INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player1Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        //player1Waves[i] = WAVE_SPEED * dt;&lt;br /&gt;
        player1Waves[i] = 0.01f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (player2Push &amp;amp;&amp;amp; !player2Pushed)&lt;br /&gt;
  {&lt;br /&gt;
    // On incremente la position de la corde&lt;br /&gt;
    ropePosition -= INCREMENT;&lt;br /&gt;
&lt;br /&gt;
    // On lance une nouvelle onde&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (player2Waves[i] == 0.0f)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[i] = 0.99f;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Memorisation des etats des boutons&lt;br /&gt;
  player1Pushed = player1Push;&lt;br /&gt;
  player2Pushed = player2Push;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // On calcule la position lissee de la corde (displayedRopePosition correspond a la variable ropePosition avec un lissage supplementaire)&lt;br /&gt;
  displayedRopePosition += (ropePosition - displayedRopePosition) * dt / ROPE_SMOOTH;&lt;br /&gt;
&lt;br /&gt;
  // On regarde si player 1 a gagne&lt;br /&gt;
  if (displayedRopePosition &amp;gt;= 1.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER1;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // On regarde si player 2 a gagne&lt;br /&gt;
  else if (displayedRopePosition &amp;lt;= 0.0f)&lt;br /&gt;
  {&lt;br /&gt;
    lastWinner = PLAYER2;&lt;br /&gt;
    gameState = START;&lt;br /&gt;
    beginTimer = millis();&lt;br /&gt;
&lt;br /&gt;
    ropePosition = 0.5f;&lt;br /&gt;
    displayedRopePosition = 0.5f;&lt;br /&gt;
&lt;br /&gt;
    FastLED.clear();&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On propage les ondes&lt;br /&gt;
  float dx = WAVE_SPEED * dt;&lt;br /&gt;
&lt;br /&gt;
  for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
  {&lt;br /&gt;
    // Ondes player 1&lt;br /&gt;
    if (player1Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player1Waves[wave] += dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player1Waves[wave] - WAVE_LENGTH &amp;gt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player1Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Ondes player 2&lt;br /&gt;
    if (player2Waves[wave] != 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
      player2Waves[wave] -= dx;&lt;br /&gt;
&lt;br /&gt;
      // Si toute l'onde depasse le point de la corde, on l'arrete&lt;br /&gt;
      if (player2Waves[wave] + WAVE_LENGTH &amp;lt; displayedRopePosition)&lt;br /&gt;
      {&lt;br /&gt;
        player2Waves[wave] = 0.0f;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la bande de leds&lt;br /&gt;
  float ledLuminosity;&lt;br /&gt;
  float ledPosition;&lt;br /&gt;
&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
&lt;br /&gt;
  // On commence par calculer le numero de la led correspondant a la position de la corde&lt;br /&gt;
  int ropeLedPosition = NUM_LEDS * displayedRopePosition;&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 1&lt;br /&gt;
  // Pour cela on calcule la luminosite led par led&lt;br /&gt;
  for (int led = 0; led &amp;lt; ropeLedPosition; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player1Waves[wave] == 0.0f || player1Waves[wave] &amp;lt; ledPosition)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player1Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER1_COLOR / int(2.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On dessine la zone du player 2&lt;br /&gt;
  for (int led = ropeLedPosition + 1; led &amp;lt; NUM_LEDS; led++)&lt;br /&gt;
  {&lt;br /&gt;
    // La luminosite minimale d'une led est 10% de la luminosite max&lt;br /&gt;
    ledLuminosity = 0.1f;&lt;br /&gt;
    ledPosition = float(led) / float(NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
    // Pour chaque onde, on ajoute la luminosite a la led&lt;br /&gt;
    for (int wave = 0; wave &amp;lt; 10; wave++)&lt;br /&gt;
    {&lt;br /&gt;
      // Si l'onde n'est pas active ou si l'onde est avant la led, on n'ajoute aucune luminosite&lt;br /&gt;
      if (player2Waves[wave] == 0.0f || ledPosition &amp;gt; player2Waves[wave])&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // On ajoute de la luminosite de facon decroissante. plus l'onde est loin, moins on ajoute de luminosite.&lt;br /&gt;
      ledLuminosity += max(0.0f, 0.9f - (player2Waves[wave] - ledPosition) / WAVE_LENGTH);&lt;br /&gt;
    }&lt;br /&gt;
    // La valeur maximale de luminosite est 1.0&lt;br /&gt;
    if (ledLuminosity &amp;gt; 2.0f)&lt;br /&gt;
      ledLuminosity = 2.0f;&lt;br /&gt;
&lt;br /&gt;
    // On actualise la valeur de luminosite de la led&lt;br /&gt;
    ledColor(led, PLAYER2_COLOR / int(1.0f / ledLuminosity) / 5);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // On actualise la led correspondant a la position de la corde&lt;br /&gt;
  ledColor(ropeLedPosition, BLANC);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
   Cette fonction s'execute une fois lorsque la carte s'allume.&lt;br /&gt;
 ****************************************************************/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // Initialisation des LEDs&lt;br /&gt;
  FastLED.addLeds&amp;lt;WS2812B, LED_PIN, GRB&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
&lt;br /&gt;
  // Initialisations des boutons&lt;br /&gt;
  pinMode(BUTTON1_PIN, INPUT_PULLUP);&lt;br /&gt;
  pinMode(BUTTON2_PIN, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du haut parleur&lt;br /&gt;
  pinMode(HAUT_PARLEUR_PIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // COULEUR DES LEDS EN DEBUT DE PARTIE&lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  // Couleurs player 1&lt;br /&gt;
  ledColor(PLAYER1, 0, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 1, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 2, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 3, PLAYER1_COLOR);&lt;br /&gt;
  ledColor(PLAYER1, 4, PLAYER1_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // Couleurs player 2&lt;br /&gt;
  ledColor(PLAYER2, 0, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 1, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 2, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 3, PLAYER2_COLOR);&lt;br /&gt;
  ledColor(PLAYER2, 4, PLAYER2_COLOR);&lt;br /&gt;
&lt;br /&gt;
  // On envoie les changements a la bande de leds&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  // Initialisation du temps d'allumage&lt;br /&gt;
  beginTimer = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*************************************************************&lt;br /&gt;
   Cette fonction s'execute en continue tout au long du jeu.&lt;br /&gt;
 *************************************************************/&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  switch (gameState)&lt;br /&gt;
  {&lt;br /&gt;
    case START:&lt;br /&gt;
      // Si un player a gagne, on affiche l'arc en ciel du cote du vainqueur&lt;br /&gt;
      if (lastWinner == PLAYER1)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
      else if (lastWinner == PLAYER2)&lt;br /&gt;
      {&lt;br /&gt;
        fill_rainbow(leds + NUM_LEDS / 2, NUM_LEDS / 2, counter++, 7);&lt;br /&gt;
        FastLED.show();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // On regarde si un temps minimim s'est ecoule et si un des boutons est appuye&lt;br /&gt;
      if (millis() - beginTimer &amp;gt; 1000 &amp;amp;&amp;amp; (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW))&lt;br /&gt;
      {&lt;br /&gt;
        unsigned long pushBegin = millis();&lt;br /&gt;
&lt;br /&gt;
        while (digitalRead(BUTTON1_PIN) == LOW || digitalRead(BUTTON2_PIN) == LOW);&lt;br /&gt;
&lt;br /&gt;
        if (millis() - pushBegin &amp;lt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
          gameState = PONG;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          gameState = TAC;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On joue la note de musique&lt;br /&gt;
        tone(HAUT_PARLEUR_PIN, PONG_SOUND, 100);&lt;br /&gt;
&lt;br /&gt;
        // Initialisation de la varable lastMillis&lt;br /&gt;
        lastMillis = millis();&lt;br /&gt;
&lt;br /&gt;
        // Initialisation du temps de debut de jeu&lt;br /&gt;
        beginTimer = millis();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case PONG:&lt;br /&gt;
      pong_loop();&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case TAC:&lt;br /&gt;
      tac_loop();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
Voici toutes les étapes de fabrication de notre projet :&lt;br /&gt;
===Étape 1===&lt;br /&gt;
Tout d'abord on se rend compte du matériel qu'on nous donne et on regarde les différentes étapes à suivre sur le Wikidébrouillard&lt;br /&gt;
===Étape 2===&lt;br /&gt;
On soude des fils électriques au ruban de LEDS et sur les pattes des interrupteurs&lt;br /&gt;
===Étape 2-1===&lt;br /&gt;
En même temps, on construit le support sur lequel le jeu va être joué&lt;br /&gt;
===Étape 3===&lt;br /&gt;
On soude aussi les broches de support sur la carte Arduino&lt;br /&gt;
===Étape 4===&lt;br /&gt;
On réalise le câblage sur la plaquette qui nous a été fourni pour pouvoir tester le code&lt;br /&gt;
===Étape 5===&lt;br /&gt;
Puis on commence à mettre tous nos composants sur la maquette réelle&lt;br /&gt;
===Étape 6===&lt;br /&gt;
Ensuite, le jeu peut être utilisé !&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_l&amp;diff=25146</id>
		<title>ENIB 2024 : l</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_l&amp;diff=25146"/>
				<updated>2024-01-25T09:47:45Z</updated>
		
		<summary type="html">&lt;p&gt;Laouen : Page créée avec « Titre de la fiche expérience : ==description (résumé)== éventuelle photo de l'équipe   200px  ==Introduction==  éventu... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Titre de la fiche expérience :&lt;br /&gt;
==description (résumé)==&lt;br /&gt;
éventuelle photo de l'équipe &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Totem-maisonsDesMinerauxCrozon.JPG|200px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
éventuelle vidéo&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
indiquer autant d'étape que nécessaire, chacune illustrée par des images (phot, dessins, ...)&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
===étape 2===&lt;br /&gt;
===étape ...===&lt;br /&gt;
===troubleshouting===&lt;br /&gt;
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>Laouen</name></author>	</entry>

	</feed>