ENIB 2024 : TwoSnakeBetterThanOne : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(fichiers à joindre)
(Mettre du code Arduino)
Ligne 31 : Ligne 31 :
 
===Mettre du code Arduino===
 
===Mettre du code Arduino===
 
<syntaxhighlight lang="Arduino" line>  
 
<syntaxhighlight lang="Arduino" line>  
#include <FastLED.h>
+
Le code modifié n'est pas encore présent
 
 
//matrix settings
 
#define NUM_LEDS 256
 
#define  DATA_PIN 3
 
#define BRIGHTNESS 8
 
 
 
//joystick settings
 
#define pinX    A2  // ось X джойстика
 
#define pinY    A1  // ось Y джойстика
 
#define swPin    2  // кнопка джойстика
 
 
 
int snake[256]; // array of snake elements
 
int  snakeSize = 2;  // real snake size
 
int snakeSpeed = 500;
 
 
 
int row;        //  row number
 
int col;        // column number
 
 
 
int lastDirection = 135; //  start direction
 
int i, newDirection, OlddX = 1, OlddY, f;
 
 
 
int red, green,  blue, fred, fgreen, fblue; //colors
 
CRGB leds[NUM_LEDS];
 
 
 
void setup()  {
 
  red = random(0, 255);
 
  green = random(0, 255);
 
  blue = random(0,  255);
 
  fred = random(127, 255);
 
  fgreen = random(127, 255);
 
  fblue =  random(127, 255);
 
 
 
  Serial.begin(9600);
 
  pinMode(pinX, INPUT);
 
  pinMode(pinY, INPUT);
 
  pinMode(swPin, INPUT);
 
  digitalWrite(swPin, HIGH);
 
   
 
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
 
  FastLED.setBrightness(BRIGHTNESS);
 
  for( i=0; i<=255; i++ ){
 
    snake[i] = 0;
 
  }
 
 
 
  for( i=0; i<=snakeSize;  i++ ){
 
    snake[i] = lastDirection+i;
 
  }
 
   
 
  f = random(0, 255);
 
  FastLED.show();
 
}
 
 
 
int Snakedirection(int last, int dX, int dY ){
 
  dX = map(dX, 0, 1000, -1, 1);
 
  dY = map(dY, 0, 1000, -1, 1);
 
  if(dX ==  0 && dY == 0 && OlddX != dX){
 
    dX = OlddX;
 
  }
 
  if(dY == 0 && dX ==  0 && OlddY != dY){
 
    dY = OlddY;
 
  }
 
  int newDirection = last;
 
  if(  dX != 0 ){ // moving in X direction
 
    if ( row&1 ){
 
        if( col == 0  && dX == 1){ newDirection = last -15; }
 
        else if( col == 15 && dX ==  -1){ newDirection = last +15; }
 
        else newDirection = last + dX; // четная
 
    } else {
 
        if( col == 0 && dX == 1){ newDirection = last +15; }
 
        else if( col == 15 && dX == -1 ){ newDirection = last -15; }
 
        else  newDirection = last - dX; // не четная
 
    }
 
  }
 
  if( dY < 0){ // moving  in Y DOWN direction
 
    if(row == 15 && dY == -1){newDirection = col;}
 
    else  if ( row&1 ){
 
      newDirection = last + (col*2)+1; // четная
 
    } else  {
 
      newDirection = last + (16-col-1)+(16-col); // не четная
 
    }
 
  }
 
  if( dY > 0){ // moving in Y UP direction
 
    if( row == 0 && dY == 1){  newDirection = 255 - col;}
 
    else if ( row&1 ){
 
      newDirection = last  - (last - 16*row) - (16 - col); // четная
 
    } else {
 
      newDirection  = last - (col*2)-1; // не четная
 
    }
 
  }
 
  OlddX = dX;
 
  OlddY = dY;
 
  return newDirection;
 
}
 
 
 
int snakeMove(int snakeDirection){
 
 
 
  for(  i=0; i<=255; i++ ){
 
    if( snake[i] == snakeDirection ){
 
      death();
 
    }
 
  }
 
 
 
  FastLED.clear();
 
  for(i=snakeSize; i>=1; i--){
 
    snake[i]  = snake[i-1];
 
  }
 
  snake[0] = snakeDirection;
 
  for( i=0; i<=255; i++  ){
 
    if( snake[i] ){
 
      leds[snake[i]].setRGB(red, green, blue);
 
    }
 
  }
 
  FastLED.show();
 
  row = (int)(snakeDirection/16);  // row number 
 
  if ( row&1 ){
 
    col = (row+1) * 16 - snakeDirection - 1;
 
  } else  {
 
    col = snakeDirection - row * 16;
 
  }
 
  return snakeDirection;
 
}
 
 
 
void  food( int eaten ){
 
  if( eaten == f ){
 
    snakeSize++;
 
    f = random(0,  255);
 
    red = fred;
 
    green = fgreen;
 
    blue = fblue;
 
    fred  = random(0, 255);
 
    fgreen = random(0, 255);
 
    fblue = random(0, 255);
 
    snakeSpeed = snakeSpeed / 1.1;
 
  } else {
 
    leds[f].setRGB(fred, fgreen,  fblue);
 
    FastLED.show();
 
  }
 
}
 
 
 
void death(){
 
    snakeSize  = 2;
 
    snakeSpeed = 500;
 
    red = 255;
 
    green = 0;
 
    blue =  0; 
 
}
 
 
 
void color(boolean sw){
 
  if(!sw){
 
 
 
    red = random(0,255);
 
    green = random(0,255);
 
    blue = random(0,255);
 
   
 
  }
 
}
 
 
 
void  loop() {
 
  color( digitalRead(swPin) );
 
  newDirection = Snakedirection(lastDirection,  analogRead(pinX), analogRead(pinY));
 
  lastDirection = snakeMove(newDirection);
 
  food(newDirection);
 
  delay(snakeSpeed);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Version du 31 janvier 2024 à 11:31

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

Voici le code que nous avons pris : https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475

Mettre du code Arduino

1  
2 Le code modifié n'est pas encore présent

é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 ?

- Joystick
- Changement du signe 

Les commandes gauches droites étaient inversées Changement de signe de dx et dy -> Créait des bugs avec les bords (mais on sai tpas pourquoi

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

Image Joystick TSBTO.jpg Image Joystick2 TSBTO.jpg Image Joystick3 TSBTO.jpg

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