<?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=B1heysch</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=B1heysch"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/B1heysch"/>
		<updated>2026-05-21T09:55:29Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26424</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26424"/>
				<updated>2024-01-31T17:33:39Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Les problèmes de direction */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
 - Mael EVEN&lt;br /&gt;
 - Florian HEME&lt;br /&gt;
 - Benjamin HEYSCH&lt;br /&gt;
 - Jules PETION&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Done is Better than Perfect'''&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons également eu plusieurs problèmes de code tout au long du hackathon. Nous ne pouvons pas tous les cités, car nous les avons réglés pour la plupart et certains étaient inexplicables pour nous.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26420</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26420"/>
				<updated>2024-01-31T15:11:58Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* troubleshouting */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
 - Mael EVEN&lt;br /&gt;
 - Florian HEME&lt;br /&gt;
 - Benjamin HEYSCH&lt;br /&gt;
 - Jules PETION&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Done is Better than Perfect'''&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons également eu plusieurs problèmes de code tout au long du hackathon. Nous ne pouvons pas tous les cités, car nous les avons réglés pour la plupart et certains étaient inexplicables pour nous.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26419</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26419"/>
				<updated>2024-01-31T15:07:41Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
 - Mael EVEN&lt;br /&gt;
 - Florian HEME&lt;br /&gt;
 - Benjamin HEYSCH&lt;br /&gt;
 - Jules PETION&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Done is Better than Perfect'''&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26418</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26418"/>
				<updated>2024-01-31T15:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
- Mael EVEN&lt;br /&gt;
- Florian HEME&lt;br /&gt;
- Benjamin HEYSCH&lt;br /&gt;
- Jules PETION&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Done is Better than Perfect'''&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26414</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26414"/>
				<updated>2024-01-31T15:02:32Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Introduction */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Done is Better than Perfect'''&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26413</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26413"/>
				<updated>2024-01-31T15:02:23Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26411</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26411"/>
				<updated>2024-01-31T15:02:06Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Done is Better than Perfect'''&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26405</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26405"/>
				<updated>2024-01-31T15:00:01Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Nous sommes des élèves ingénieur de l'ENIB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26399</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26399"/>
				<updated>2024-01-31T14:55:29Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 7 : Enjoy */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enjoy TSBTO.jpg|400px]]&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Enjoy_TSBTO.jpg&amp;diff=26396</id>
		<title>Fichier:Enjoy TSBTO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Enjoy_TSBTO.jpg&amp;diff=26396"/>
				<updated>2024-01-31T14:54:19Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26392</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26392"/>
				<updated>2024-01-31T14:50:46Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 7 : Enjoy */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
'''Bilan : '''&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26368</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26368"/>
				<updated>2024-01-31T14:30:26Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 6 : Bonus */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoxFinale TSBTO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:BoxFinale_TSBTO.jpg&amp;diff=26367</id>
		<title>Fichier:BoxFinale TSBTO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:BoxFinale_TSBTO.jpg&amp;diff=26367"/>
				<updated>2024-01-31T14:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : B1heysch a téléversé une nouvelle version de Fichier:BoxFinale TSBTO.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:BoxFinale_TSBTO.jpg&amp;diff=26365</id>
		<title>Fichier:BoxFinale TSBTO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:BoxFinale_TSBTO.jpg&amp;diff=26365"/>
				<updated>2024-01-31T14:28:06Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26364</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26364"/>
				<updated>2024-01-31T14:26:42Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Les différents Joystick */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26363</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26363"/>
				<updated>2024-01-31T14:24:51Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étapes de fabrication */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 7 : Enjoy===&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26361</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26361"/>
				<updated>2024-01-31T14:24:00Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape ... */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 6 : Bonus===&lt;br /&gt;
&lt;br /&gt;
''' Score et ...'''&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26359</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26359"/>
				<updated>2024-01-31T14:22:04Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 4 : Tester le code et le débugger */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
Nous avons détaillé certains points où nous avons rencontré des problèmes, dans une partie suivante.&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26358</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26358"/>
				<updated>2024-01-31T14:20:16Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26357</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26357"/>
				<updated>2024-01-31T14:19:23Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Introduction */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
A la base nous voulions créer un jeu Snake jouable à 2, en faisant un mode versus où les deux joueurs doivent récupérer le plus de pommes sans toucher le serpent de l'autre.&lt;br /&gt;
&lt;br /&gt;
Mais nous sommes tout juste arrivé à avoir un jeu Snake normal qui fonctionne, nous avons donc abandonné l'idée de faire un jeu à 2.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26356</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26356"/>
				<updated>2024-01-31T14:16:01Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26355</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26355"/>
				<updated>2024-01-31T14:14:43Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* description (résumé) */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TwoSnakeBetterThanOne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26346</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26346"/>
				<updated>2024-01-31T13:58:22Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Les différents Joystick */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
Il faut donc bornes du joystick avec les PIN de la carte comme le schéma ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26345</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26345"/>
				<updated>2024-01-31T13:57:14Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Les différents Joystick */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Circuit joystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Circuit_joystick_TSTBO.jpg&amp;diff=26340</id>
		<title>Fichier:Circuit joystick TSTBO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Circuit_joystick_TSTBO.jpg&amp;diff=26340"/>
				<updated>2024-01-31T13:49:17Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26339</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26339"/>
				<updated>2024-01-31T13:46:35Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26338</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26338"/>
				<updated>2024-01-31T13:46:16Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le montage d'un joystick numérique, nous l'expliquons dans la partie Les différents Joystick ci-dessous.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26331</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26331"/>
				<updated>2024-01-31T13:42:42Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Les différents Joystick */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent. En effet, pour brancher le joystick au montage global, il faut compter des résistances en plus. Car si nous ne mettons pas de résistances reliées à la masse, il n'y a pas de 0 logique. C'est à dire que la valeur par défaut des interrupteurs du joystick est 1. Donc les interrupteurs ne passe pas de 0 à 1 quand ils sont actifs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26316</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26316"/>
				<updated>2024-01-31T13:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous. Si la LED s'allume quand quand on met le joystick dans un seul sens (et que ce sens est différent en fonction des bornes) le joystick fonctionne.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26309</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26309"/>
				<updated>2024-01-31T13:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|400px]]&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26308</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26308"/>
				<updated>2024-01-31T13:31:55Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26305</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26305"/>
				<updated>2024-01-31T13:30:03Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26304</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26304"/>
				<updated>2024-01-31T13:29:49Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte. Comme sur le circuit ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: circuit testJoystick TSTBO.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Circuit_testJoystick_TSTBO.jpg&amp;diff=26303</id>
		<title>Fichier:Circuit testJoystick TSTBO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Circuit_testJoystick_TSTBO.jpg&amp;diff=26303"/>
				<updated>2024-01-31T13:28:06Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26299</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26299"/>
				<updated>2024-01-31T13:23:58Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester les interrupteurs, on branche la borne 1 du joystick à l'alimentation de la carte. Puis les autres bornes (une par une) sur la breadboard, pour les reliées à une LED. Il faut mettre une résistance en série qui relie la LED et la masse de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26290</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26290"/>
				<updated>2024-01-31T13:08:19Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Les différents Joystick */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester un interrupteur ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
De plus, nous avons pris beaucoup de temps à faire marcher le joystick numérique, car comme expliquer dans le test du matériel, le joystick numérique doit avoir une résistance pull-down pour fonctionner. Il fallait donc prévoir un montage légèrement différent.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26289</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26289"/>
				<updated>2024-01-31T13:04:39Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étapes de fabrication */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester un interrupteur ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26288</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26288"/>
				<updated>2024-01-31T13:03:36Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 1 : Tester le matériel */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
Pour tester un interrupteur ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26287</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26287"/>
				<updated>2024-01-31T12:52:26Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Mettre du code Arduino */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite apporter quelques modifications pour l'adapter.&lt;br /&gt;
&lt;br /&gt;
Voici le code définitif que nous utilisons :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26286</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26286"/>
				<updated>2024-01-31T12:50:38Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* Mettre du code Arduino */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
#include &amp;lt;FastLED.h&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//matrix settings&lt;br /&gt;
#define NUM_LEDS 256&lt;br /&gt;
#define  DATA_PIN 3&lt;br /&gt;
#define BRIGHTNESS 50&lt;br /&gt;
&lt;br /&gt;
//joystick settings&lt;br /&gt;
#define pinX    A2  // ось X джойстика&lt;br /&gt;
#define pinY    A1  // ось Y джойстика&lt;br /&gt;
#define swPin    2  // кнопка джойстика&lt;br /&gt;
&lt;br /&gt;
int snake[256]; // array of snake elements&lt;br /&gt;
int snakeSize = 2;  // real snake size &lt;br /&gt;
int snakeSpeed = 500;&lt;br /&gt;
&lt;br /&gt;
int row;        //  row number&lt;br /&gt;
int col;        // column number&lt;br /&gt;
&lt;br /&gt;
int lastDirection = 135; //  start direction&lt;br /&gt;
int i, newDirection, OlddX = 1, OlddY, f;&lt;br /&gt;
&lt;br /&gt;
int red, green,  blue, fred, fgreen, fblue; //colors&lt;br /&gt;
CRGB leds[NUM_LEDS];&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x27,  16, 2);&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  red = random(0, 255);&lt;br /&gt;
  green = random(0, 255);&lt;br /&gt;
  blue = random(0,  255);&lt;br /&gt;
  fred = random(127, 255);&lt;br /&gt;
  fgreen = random(127, 255);&lt;br /&gt;
  fblue =  random(127, 255);&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(pinX, INPUT);&lt;br /&gt;
  pinMode(pinY, INPUT);&lt;br /&gt;
  pinMode(swPin, INPUT);&lt;br /&gt;
  digitalWrite(swPin, HIGH);&lt;br /&gt;
    &lt;br /&gt;
  FastLED.addLeds&amp;lt;NEOPIXEL, DATA_PIN&amp;gt;(leds, NUM_LEDS);&lt;br /&gt;
  FastLED.setBrightness(BRIGHTNESS);&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    snake[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i=0; i&amp;lt;=snakeSize;  i++ ){&lt;br /&gt;
    snake[i] = lastDirection+i;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  f = random(0, 255);&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
&lt;br /&gt;
  //initialize lcd screen&lt;br /&gt;
  lcd.init();&lt;br /&gt;
  // turn on the backlight&lt;br /&gt;
  lcd.backlight();&lt;br /&gt;
&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Snake, press&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;button to start &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Snakedirection(int last, int dX, int dY ){&lt;br /&gt;
  dX = map(dX, 0, 1000, -1, 1);&lt;br /&gt;
  dY = map(dY, 0, 1000, -1, 1);&lt;br /&gt;
  if(dX ==  0 &amp;amp;&amp;amp; dY == 0 &amp;amp;&amp;amp; OlddX != dX){&lt;br /&gt;
    dX = OlddX;&lt;br /&gt;
  }&lt;br /&gt;
  if(dY == 0 &amp;amp;&amp;amp; dX ==  0 &amp;amp;&amp;amp; OlddY != dY){&lt;br /&gt;
    dY = OlddY;&lt;br /&gt;
  }&lt;br /&gt;
  int newDirection = last;&lt;br /&gt;
  if(  dX != 0 ){ // moving in X direction&lt;br /&gt;
    if ( row&amp;amp;1 ){&lt;br /&gt;
        if( col == 0  &amp;amp;&amp;amp; dX == -1){ newDirection = last -15; } &lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX ==  1){ newDirection = last +15; }&lt;br /&gt;
        else newDirection = last - dX; // четная&lt;br /&gt;
    } else {&lt;br /&gt;
        if( col == 0 &amp;amp;&amp;amp; dX == -1){ newDirection = last +15; }&lt;br /&gt;
        else if( col == 15 &amp;amp;&amp;amp; dX == 1 ){ newDirection = last -15; }&lt;br /&gt;
        else  newDirection = last + dX; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  if( dY &amp;lt; 0){ // moving  in Y DOWN direction&lt;br /&gt;
    if(row == 15 &amp;amp;&amp;amp; dY == -1){newDirection = col;}&lt;br /&gt;
    else  if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last + (col*2)+1; // четная&lt;br /&gt;
    } else  {&lt;br /&gt;
      newDirection = last + (16-col-1)+(16-col); // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( dY &amp;gt; 0){ // moving in Y UP direction&lt;br /&gt;
    if( row == 0 &amp;amp;&amp;amp; dY == 1){  newDirection = 255 - col;}&lt;br /&gt;
    else if ( row&amp;amp;1 ){&lt;br /&gt;
      newDirection = last  - (last - 16*row) - (16 - col); // четная&lt;br /&gt;
    } else {&lt;br /&gt;
      newDirection  = last - (col*2)-1; // не четная&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  OlddX = dX;&lt;br /&gt;
  OlddY = dY;&lt;br /&gt;
  return newDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int snakeMove(int snakeDirection){&lt;br /&gt;
&lt;br /&gt;
  for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
    if( snake[i] == snakeDirection ){&lt;br /&gt;
      death();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  FastLED.clear();&lt;br /&gt;
  for(i=snakeSize; i&amp;gt;=1; i--){&lt;br /&gt;
    snake[i]  = snake[i-1];&lt;br /&gt;
  }&lt;br /&gt;
  snake[0] = snakeDirection;&lt;br /&gt;
  for( i=0; i&amp;lt;=255; i++  ){&lt;br /&gt;
    if( snake[i] ){&lt;br /&gt;
      leds[snake[i]].setRGB(red, green, blue);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  FastLED.show();&lt;br /&gt;
  row = (int)(snakeDirection/16);  // row number  &lt;br /&gt;
  if ( row&amp;amp;1 ){&lt;br /&gt;
    col = (row+1) * 16 - snakeDirection - 1;&lt;br /&gt;
  } else  {&lt;br /&gt;
    col = snakeDirection - row * 16;&lt;br /&gt;
  }&lt;br /&gt;
  return snakeDirection;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  food( int eaten ){&lt;br /&gt;
  if( eaten == f ){&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 2);&lt;br /&gt;
    snakeSize++;&lt;br /&gt;
    f = random(0,  255);&lt;br /&gt;
    red = fred; &lt;br /&gt;
    green = fgreen; &lt;br /&gt;
    blue = fblue;&lt;br /&gt;
    fred  = random(0, 255);&lt;br /&gt;
    fgreen = random(0, 255);&lt;br /&gt;
    fblue = random(0, 255);&lt;br /&gt;
    snakeSpeed = snakeSpeed / 1.1;&lt;br /&gt;
  } else {&lt;br /&gt;
    leds[f].setRGB(fred, fgreen,  fblue);&lt;br /&gt;
    FastLED.show();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void death(){&lt;br /&gt;
    snakeSize  = 2;&lt;br /&gt;
    snakeSpeed = 500;&lt;br /&gt;
    red = 255;&lt;br /&gt;
    green = 0;&lt;br /&gt;
    blue =  0;&lt;br /&gt;
    lcd.print(&amp;quot; Game over&amp;quot;);&lt;br /&gt;
    while (digitalRead(6)==0){ &lt;br /&gt;
         for(  i=0; i&amp;lt;=255; i++ ){&lt;br /&gt;
      snake[i] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;Score :&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,1);&lt;br /&gt;
    lcd.print(snakeSize + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void color(boolean sw){&lt;br /&gt;
  if(!sw){&lt;br /&gt;
&lt;br /&gt;
    red = random(0,255);&lt;br /&gt;
    green = random(0,255);&lt;br /&gt;
    blue = random(0,255);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  loop() {&lt;br /&gt;
  color( digitalRead(swPin) );&lt;br /&gt;
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));&lt;br /&gt;
  Serial.println(snakeSize+1);&lt;br /&gt;
  lastDirection = snakeMove(newDirection);&lt;br /&gt;
  food(newDirection);&lt;br /&gt;
  delay(snakeSpeed);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26285</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26285"/>
				<updated>2024-01-31T12:48:56Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 2 : Trouver un code et installer les librairies */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer la librairie LiquidCrystal I2C (by Frank de Brabander).&lt;br /&gt;
Pour cela, il faut aller dans l'onglet Tools/Manage Libraries... ; puis rechercher et installer LiquidCrystal I2C.&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26272</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26272"/>
				<updated>2024-01-31T12:36:43Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* troubleshouting */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diretions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26269</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26269"/>
				<updated>2024-01-31T12:34:09Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
Pour le montage nous avons brancher l'alimentation et la masse sur deux lignes différentes la breadboard pour relier tous nos fils sur ces lignes.&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN D3 de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN A2 de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN A1 de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN D2 de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN D6.&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diversions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26266</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26266"/>
				<updated>2024-01-31T12:28:00Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil violet)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN ... de la carte. (via le fil bleu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN ...&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diversions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26265</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26265"/>
				<updated>2024-01-31T12:27:37Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte. (via le fil gris)&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte. (via le fil bleu)&lt;br /&gt;
 - Le fil vert doit être relié à la PIN ... de la carte. (via le fil violet)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN ...&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diversions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26264</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26264"/>
				<updated>2024-01-31T12:26:06Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Ecran TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte.&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte.&lt;br /&gt;
 - Le fil vert doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Montage Joystick TSTBO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN ...&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diversions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Montage_Joystick_TSTBO.jpg&amp;diff=26263</id>
		<title>Fichier:Montage Joystick TSTBO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Montage_Joystick_TSTBO.jpg&amp;diff=26263"/>
				<updated>2024-01-31T12:25:05Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Montage_Ecran_TSTBO.jpg&amp;diff=26262</id>
		<title>Fichier:Montage Ecran TSTBO.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Montage_Ecran_TSTBO.jpg&amp;diff=26262"/>
				<updated>2024-01-31T12:24:40Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26261</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26261"/>
				<updated>2024-01-31T12:12:56Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
 - Le fil rouge doit être relier à l'alimentation de la carte.&lt;br /&gt;
 - Le fil blanc doit être relier à la masse de la carte.&lt;br /&gt;
 - Le fil vert doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
 -1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
 -2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
 -3- (fil violet) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -4- (fil bleu) doit être relié à la PIN ... de la carte.&lt;br /&gt;
 -5- (fil orange) doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN ...&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diversions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26260</id>
		<title>ENIB 2024 : TwoSnakeBetterThanOne</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2024_:_TwoSnakeBetterThanOne&amp;diff=26260"/>
				<updated>2024-01-31T11:38:28Z</updated>
		
		<summary type="html">&lt;p&gt;B1heysch : /* étape 3 : Faire le montage électronique */&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:Zinzin.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
SNAKE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Snake.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.&lt;br /&gt;
&lt;br /&gt;
==outil et matériel==&lt;br /&gt;
&lt;br /&gt;
Partie électronique :&lt;br /&gt;
 - Plaque de LED 16x16&lt;br /&gt;
 - Joystick Analogique&lt;br /&gt;
 - Bouton poussoir&lt;br /&gt;
 - Carte D1 mini&lt;br /&gt;
 - Breadboard&lt;br /&gt;
 - Fils&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
Le code modifié n'est pas encore présent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1 : Tester le matériel===&lt;br /&gt;
&lt;br /&gt;
Nous pouvons tester le joystick, le bouton poussoir et la plaque LED.&lt;br /&gt;
&lt;br /&gt;
Pour le joystick analogique, il faut le brancher à la carte et faire un petit programme qui affiche les valeurs renvoyées par le joystick. &lt;br /&gt;
&lt;br /&gt;
Si vous avez un joystick numérique, il est possible de le tester avec une LED. On peut tester le joystick en testant les quatre interrupteurs séparément.&lt;br /&gt;
&lt;br /&gt;
Pour tester le bouton poussoir, on utilise la même méthode que pour les interrupteurs d'un joystick numérique.&lt;br /&gt;
&lt;br /&gt;
Pour la plaque de LED, il faut créer (ou trouver sur internet) un programme qui allume certaines LED, qui les allument une par une ou qui les faits clignoter...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exemple de code test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===étape 2 : Trouver un code et installer les librairies===&lt;br /&gt;
&lt;br /&gt;
Le code que nous avons utilisé est un code que nous trouver sur internet. (lien ci-dessus dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite modifier celui-ci pour l'adapter à notre matériel et corriger les bugs. (code final afficher dans la partie Code Arduino)&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir compiler le code il faut installer les librairies suivantes :&lt;br /&gt;
&lt;br /&gt;
===étape 3 : Faire le montage électronique===&lt;br /&gt;
&lt;br /&gt;
'''Brancher l'écran'''&lt;br /&gt;
Le fil rouge doit être relier à l'alimentation de la carte.&lt;br /&gt;
Le fil blanc doit être relier à la masse de la carte.&lt;br /&gt;
Le fil vert doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le Joystick'''&lt;br /&gt;
1- (fil marron) doit être relier à la masse de la carte.&lt;br /&gt;
2- (fil orange) doit être relier à l'alimentation de la carte.&lt;br /&gt;
3- (fil violet) doit être relié à la PIN ... de la carte.&lt;br /&gt;
4- (fil bleu) doit être relié à la PIN ... de la carte.&lt;br /&gt;
5- (fil orange) doit être relié à la PIN ... de la carte.&lt;br /&gt;
&lt;br /&gt;
'''Brancher le bouton poussoir'''&lt;br /&gt;
Un fil doit être relié à l'alimentation de la carte et l'autre doit être relié à la PIN ...&lt;br /&gt;
&lt;br /&gt;
===étape 4 : Tester le code et le débugger===&lt;br /&gt;
&lt;br /&gt;
===étape 5 : Construire le support du jeu===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous vous conseillons de faire un écran composé d'une feuille blanche, afin de laisser passer la lumière sans voir la plaque. Nous avons fait le choix de tracer la quadrillage des LED sur la feuille pour avoir plus de lisibilité en jeu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box5 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris les dimensions de l'écran pour le bloquer contre la feuille sans qu'il bouge. Nous avons mis une croix derrière l'écran pour qu'il soit bien plaqué contre la feuille (sinon ce sera flou).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Box4 TSBTO.jpg|300px]]&lt;br /&gt;
[[Fichier:Image Box3 TSBTO.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons collé l'écran de manière verticale sur un boitier où nous avons mis les boutons.&lt;br /&gt;
&lt;br /&gt;
===étape ...===&lt;br /&gt;
&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;
 - Problèmes de Joystick analogique et numérique (voir ci-dessous)&lt;br /&gt;
 - Problèmes de diversions inversées (voir ci-dessous)&lt;br /&gt;
 - Les diagonales du Joystick analogique, effectivement, quand le joystick prend une direction diagonale le jeu ne sait pas quelle direction choisir et fini par bugger. Certaine fois il choisit une direction (droite ou gauche) mais souvent le serpent meurt.&lt;br /&gt;
&lt;br /&gt;
===Les différents Joystick===&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs types de Joystick, nous en avons utilisé deux :&lt;br /&gt;
 - Les Joystick analogiques, qui renvoient la position du Joystick en fonction des axes X et Y, ils renvoient donc deux valeurs, sous forme de vecteur. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos du Joystick analogique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - Les Joystick numériques, qui sont composés de quatre boutons poussoirs. La position du Joystick est décrite par quatre valeurs binaires (pour chaque boutons renvoient 1/0).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image Joystick TSBTO.jpg|350px]]&lt;br /&gt;
[[Fichier:Image Joystick2 TSBTO.jpg|200px]]&lt;br /&gt;
[[Fichier:Image Joystick3 TSBTO.jpg|350px]]&lt;br /&gt;
&lt;br /&gt;
Nous avions commencé avec un joystick numérique, cependant le code que nous avions pris était écrit pour un joystick analogique. C'est à dire, la direction de serpent est contrôlée par des valeurs (X, Y). C'est donc un problème car un joystick numérique ne renvoie pas ces valeurs.&lt;br /&gt;
&lt;br /&gt;
===Les problèmes de direction===&lt;br /&gt;
&lt;br /&gt;
Lorsque notre matériel marchait, nous avons pu tester notre code.&lt;br /&gt;
&lt;br /&gt;
Et celui-ci ne marchait pas, certaines directions étaient inversées. En effet, quand les directions droite et gauche étaient fonctionnelles, les directions haut et bas, elles, étaient inversées.&lt;br /&gt;
Nous avons donc essayer d'inverser nous-même ces directions dans le code. Quand nous faisions cela, les bords de la plaque étaient buggés et nous ne savions pas pourquoi.&lt;br /&gt;
Pour inverser les directions nous avons changé le signe de la dérivé dx. &lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réussi à empêcher ces bugs en modifiant également le signe de la dérivée dx dans les conditions des bords.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Photos des parties de codes modifiées&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.&lt;br /&gt;
&lt;br /&gt;
Moi si je devais résumer ma vie avec vous aujourd'hui, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main à un moment ou je ne pouvais pas, ou j'étais seul chez moi.&lt;br /&gt;
&lt;br /&gt;
Et c'est curieux de se dire que les hasards, les rencontres forgent une destinée, parce que quand on a la gout de la chose, le gout de la chose bien faite, le beau geste, et bien parfois on ne trouve pas l'interlocuteur en face, je dirais le miroir qui vous aide à avancer.&lt;br /&gt;
&lt;br /&gt;
Alors moi, ça ne m'ait pas arrivé, comme je vous l'ai dit, j'ai pu et je dis merci à la vie, je lui dit Merci, je chante la vie, je danse la vie, je ne suis qu'amour.&lt;br /&gt;
&lt;br /&gt;
Et finalement, quand aujourd'hui, beaucoup de gens me demande : mais comment fais-tu pour avoir toute cette humanité ? Et bien je leur répond simplement que c'est ce gout de la chose qui m'a poussé à entreprendre une construction mécanique, mais demain, qui sait, peut être simplement me mettre au service de la communauté, à faire don, don de soi...&lt;br /&gt;
===D'autre sources de Snake===&lt;br /&gt;
* https://uncommentedout.home.blog/2018/11/18/weekend-hack-nxn-snake/&lt;br /&gt;
* https://github.com/raimis001/ArduinoMatrixGames&lt;br /&gt;
* https://projecthub.arduino.cc/Hunter1234/snake-led-matrix-game-59f6ae&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;/div&gt;</summary>
		<author><name>B1heysch</name></author>	</entry>

	</feed>