ENIB 2024 : TwoSnakeBetterThanOne

De Les Fabriques du Ponant
Révision datée du 31 janvier 2024 à 11:08 par B1heysch (discussion | contributions) (Les différents Joystick)
Aller à : navigation, rechercher

Titre de la fiche expérience :

description (résumé)

éventuelle photo de l'équipe

Zinzin.jpg

SNAKE

Image Snake.png

Introduction

A l'occasion d'un hackathon, nous devons créer un jeu électronique en deux jours.

Nous avons choisi de créer un jeu Snake sur une plaque de LED 16x16.

outil et matériel

Partie électronique :

- Plaque de LED 16x16
- Joystick Analogique
- Bouton poussoir
- Carte D1 mini
- Plaque Ladec

fichiers à joindre

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

Mettre du code Arduino

  1  
  2 #include <FastLED.h>
  3 
  4 //matrix settings
  5 #define NUM_LEDS 256
  6 #define   DATA_PIN 3
  7 #define BRIGHTNESS 8
  8 
  9 //joystick settings
 10 #define pinX    A2   // ось X джойстика
 11 #define pinY    A1  // ось Y джойстика
 12 #define swPin     2  // кнопка джойстика
 13 
 14 int snake[256]; // array of snake elements
 15 int   snakeSize = 2;  // real snake size 
 16 int snakeSpeed = 500;
 17 
 18 int row;        //   row number
 19 int col;        // column number
 20 
 21 int lastDirection = 135; //   start direction
 22 int i, newDirection, OlddX = 1, OlddY, f;
 23 
 24 int red, green,   blue, fred, fgreen, fblue; //colors
 25 CRGB leds[NUM_LEDS];
 26 
 27 void setup()   {
 28   red = random(0, 255);
 29   green = random(0, 255);
 30   blue = random(0,   255);
 31   fred = random(127, 255);
 32   fgreen = random(127, 255);
 33   fblue =   random(127, 255);
 34   
 35   Serial.begin(9600);
 36   pinMode(pinX, INPUT);
 37    pinMode(pinY, INPUT);
 38   pinMode(swPin, INPUT);
 39   digitalWrite(swPin, HIGH);
 40      
 41   FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
 42   FastLED.setBrightness(BRIGHTNESS);
 43    for( i=0; i<=255; i++ ){
 44     snake[i] = 0;
 45   }
 46 
 47   for( i=0; i<=snakeSize;   i++ ){
 48     snake[i] = lastDirection+i;
 49   }
 50     
 51   f = random(0, 255);
 52    FastLED.show();
 53 }
 54 
 55 int Snakedirection(int last, int dX, int dY ){
 56    dX = map(dX, 0, 1000, -1, 1);
 57   dY = map(dY, 0, 1000, -1, 1);
 58   if(dX ==   0 && dY == 0 && OlddX != dX){
 59     dX = OlddX;
 60   }
 61   if(dY == 0 && dX ==   0 && OlddY != dY){
 62     dY = OlddY;
 63   }
 64   int newDirection = last;
 65   if(   dX != 0 ){ // moving in X direction
 66     if ( row&1 ){
 67         if( col == 0   && dX == 1){ newDirection = last -15; } 
 68         else if( col == 15 && dX ==   -1){ newDirection = last +15; }
 69         else newDirection = last + dX; // четная
 70      } else {
 71         if( col == 0 && dX == 1){ newDirection = last +15; }
 72          else if( col == 15 && dX == -1 ){ newDirection = last -15; }
 73         else   newDirection = last - dX; // не четная
 74     }
 75   } 
 76   if( dY < 0){ // moving   in Y DOWN direction
 77     if(row == 15 && dY == -1){newDirection = col;}
 78     else   if ( row&1 ){
 79       newDirection = last + (col*2)+1; // четная
 80     } else   {
 81       newDirection = last + (16-col-1)+(16-col); // не четная
 82     }
 83    }
 84   if( dY > 0){ // moving in Y UP direction
 85     if( row == 0 && dY == 1){   newDirection = 255 - col;}
 86     else if ( row&1 ){
 87       newDirection = last   - (last - 16*row) - (16 - col); // четная
 88     } else {
 89       newDirection   = last - (col*2)-1; // не четная
 90     }
 91   }
 92   OlddX = dX;
 93   OlddY = dY;
 94    return newDirection;
 95 }
 96 
 97 int snakeMove(int snakeDirection){
 98 
 99   for(   i=0; i<=255; i++ ){
100     if( snake[i] == snakeDirection ){
101       death();
102      }
103   }
104   
105   FastLED.clear();
106   for(i=snakeSize; i>=1; i--){
107     snake[i]   = snake[i-1];
108   }
109   snake[0] = snakeDirection;
110   for( i=0; i<=255; i++   ){
111     if( snake[i] ){
112       leds[snake[i]].setRGB(red, green, blue);
113      }
114   }
115   FastLED.show();
116   row = (int)(snakeDirection/16);  // row number   
117   if ( row&1 ){
118     col = (row+1) * 16 - snakeDirection - 1;
119   } else   {
120     col = snakeDirection - row * 16;
121   }
122   return snakeDirection;
123 }
124 
125 void   food( int eaten ){
126   if( eaten == f ){
127     snakeSize++;
128     f = random(0,   255);
129     red = fred; 
130     green = fgreen; 
131     blue = fblue;
132     fred   = random(0, 255);
133     fgreen = random(0, 255);
134     fblue = random(0, 255);
135      snakeSpeed = snakeSpeed / 1.1;
136   } else {
137     leds[f].setRGB(fred, fgreen,   fblue);
138     FastLED.show();
139   }
140 }
141 
142 void death(){
143     snakeSize   = 2;
144     snakeSpeed = 500;
145     red = 255;
146     green = 0;
147     blue =   0;  
148 }
149 
150 void color(boolean sw){
151   if(!sw){
152 
153     red = random(0,255);
154      green = random(0,255);
155     blue = random(0,255);
156     
157   }
158 }
159 
160 void   loop() {
161   color( digitalRead(swPin) );
162   newDirection = Snakedirection(lastDirection,   analogRead(pinX), analogRead(pinY));
163   lastDirection = snakeMove(newDirection);
164    food(newDirection);
165   delay(snakeSpeed);
166 }

étapes de fabrication

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

étape 1 : Tester le matériel

étape 2 : Trouver un code

Nous vous conseillons de prendre le code fournit, que nous avons nous-même trouver sur Internet.

étape 3 : Tester le code et le débugger

étape 4 : Construire le jeu

étape ...

troubleshouting

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

- Nous avons commencé par prendre un joystick composé de 4 boutons poussoirs, mais nous n'arrivions pas à faire fonctionner celui-ci avec le code. Nous ne pouvions remplacer un joystick analogiques par celui-ci.

Les différents Joystick

Il existe plusieurs types de Joystick, nous en avons utilisé deux :

- 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. 
- 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).

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.

Sources et documentation complémentaire

Je ne crois pas qu'il y ait de bonnes ou de mauvaises documentations.

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.

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.

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.

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

ne pas modifier sous cette ligne