ENIB 2024 : Snake 16x16

De Les Fabriques du Ponant
Révision datée du 2 février 2024 à 14:58 par Antonydbzh (discussion | contributions) (Sources et documentation complémentaire)
Aller à : navigation, rechercher

Description

Dans le cadre de l'intersemestre 3 de 2024, en collaboration avec les Fabriques du Ponant, nous avons fabriquer un jeu de Snake à l'aide d'un afficheur LED 16x16. Le principe du jeu est le suivant: vous devez diriger un serpent en pleine croissance pour qu'il se nourrisse. Le défi est de réussir à le faire grandir sans qu'il ne touche les bordures de l'écran ou qu'il ne se morde la queue.

PhotoSnake00.jpg

Outil et matériel

SnakeIMG01.jpg

Fichiers à télécharger

SnakeIMG07.jpg

SnakeIMG08.jpg SnakeIMG09.jpg

Circuit électrique

SnakeIMG12.png

-La Carte du microcontrolleur utilisée dans notre cas était un esp8266 D1 mini à la place de l'arduino uno. L'esp peut être programmé de la même manière qu'un Arduino (voir le tuto ici pour installer la carte sur le logiciel Arduino: https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino)

-Les pins utilisés sont les suivants: signal de l'affichage: xx le joystick à été représenté par 4 boutons poussoirs reliés à un pin d'alimentation de 5v est dont l'autre pin est relié à la fois à une entrée de la carte allant de 1 à 4 et également à la masse par le biais d'une résistance de pull down d'une dizaine de kiloohms.

-Le son peut venir soit d'un buzzer accompagné d'un condensateur de 10micro Farads pour absorber les pics de tension comme sur le schéma, soit d'un haut parleur (comme sur les photos) et dans ce cas il faudra placer un amplificateur entre la carte et le haut parleur.

Code Arduino

Nous n'avons pas réussi à finir le code dans les temps mais voici ce que nous avons réalisé.

  1  
  2 #define PIN 9
  3 #include <Arduino_GFX_Library.h>
  4 
  5 #include "FastLED.h"
  6  
  7 #define JOYSTICK_UP_PIN 1
  8 #define JOYSTICK_DOWN_PIN 1
  9 #define JOYSTICK_LEFT_PIN 1
 10 #define JOYSTICK_RIGHT_PIN 1
 11 #define DISPLAY_PIN 14
 12 #define SPEAKER_PIN 1
 13  
 14 #define DISPLAY_WIDTH 16
 15 #define DISPLAY_HEIGHT 16
 16  
 17 CRGB leds[DISPLAY_WIDTH*DISPLAY_HEIGHT];
 18  
 19 uint16_t snake[DISPLAY_WIDTH*DISPLAY_HEIGHT][2];
 20  
 21 uint8_t last_direction = 0;
 22 // 0 = UP
 23 // 1 = RIGHT
 24 // 2 = DOWN
 25 // 3 = LEFT
 26  
 27 void setPixel(uint16_t x, uint16_t y, CRGB color) {
 28   if (x < DISPLAY_WIDTH && y < DISPLAY_HEIGHT) {
 29     if (y % 2) {
 30       leds[y * DISPLAY_WIDTH + x] = color;
 31     } else {
 32       leds[(y + 1) * DISPLAY_WIDTH - x - 1] = color;
 33     }
 34   }
 35 }
 36  
 37 void clear() {
 38   for (uint8_t i = 0; i < DISPLAY_WIDTH*DISPLAY_HEIGHT; ++i) {
 39     leds[i] = CRGB::Black;
 40   }
 41 }
 42  
 43 void setup() {
 44   pinMode(JOYSTICK_UP_PIN, INPUT);
 45   pinMode(JOYSTICK_DOWN_PIN, INPUT);
 46   pinMode(JOYSTICK_LEFT_PIN, INPUT);
 47   pinMode(JOYSTICK_RIGHT_PIN, INPUT);
 48   pinMode(SPEAKER_PIN, OUTPUT);
 49   digitalWrite(SPEAKER_PIN, LOW);
 50  
 51   for (uint8_t i = 0; i < DISPLAY_WIDTH*DISPLAY_HEIGHT; ++i) {
 52     snake[i] = {DISPLAY_WIDTH, DISPLAY_HEIGHT}; 
 53   }
 54  
 55   snake[0] = {round(DISPLAY_WIDTH/2), round(DISPLAY_HEIGHT/2)};
 56  
 57   FastLED.addLeds<WS2812, DISPLAY_PIN, GRB>(leds, DISPLAY_WIDTH * DISPLAY_HEIGHT); 
 58   FastLED.setBrightness(64);
 59  
 60   FastLED.show();
 61 }
 62  
 63 void loop() {
 64   clear();
 65  
 66   for (uint8_t i = 0; i < DISPLAY_WIDTH*DISPLAY_HEIGHT; ++i) {
 67     if (snake[i] == {DISPLAY_WIDTH, DISPLAY_HEIGHT}) {
 68       break;
 69     }
 70     setPixel(snake[i][0], snake[i][1], CRGB::Green);
 71   }
 72  
 73   bool passed = false; 
 74  
 75   for (uint8_t i = DISPLAY_WIDTH*DISPLAY_HEIGHT-1; i > 0; i--) {
 76  
 77     snake[i+1] = snake[i];
 78  
 79     if (snake[i] == {DISPLAY_WIDTH, DISPLAY_HEIGHT}) {
 80       if (passed) {
 81         break;
 82       }
 83       snake[0] = snake[i];
 84       passed = true; 
 85     }
 86  
 87     setPixel(snake[i][0], snake[i][1], CRGB::Green);
 88   }
 89  
 90   FastLED.show();
 91  
 92   for (uint8_t i = 0; i < DISPLAY_WIDTH*DISPLAY_HEIGHT; ++i) {
 93     if (snake[i] == {DISPLAY_WIDTH, DISPLAY_HEIGHT}) {
 94       break;
 95     }
 96  
 97     setPixel(snake[i][0], snake[i][1], CRGB::Green);
 98   }
 99  
100   for (uint8_t i = 0; i < 100; ++i) {
101     if (digitalRead(JOYSTICK_UP_PIN)) {
102       last_direction = 0; 
103     } else if (digitalRead(JOYSTICK_RIGHT_PIN)) {
104       last_direction = 1; 
105     } else if (digitalRead(JOYSTICK_DOWN_PIN)) {
106       last_direction = 2; 
107     } else if (digitalRead(JOYSTICK_LEFT_PIN)) {
108       last_direction = 3; 
109     }
110  
111     delay(1);
112   }
113 }

Etapes de fabrication

Etape 1

On prépare la carte Arduino puis on lui connecte le joystick.

SnakeIMG02.jpg SnakeIMG03.jpg

Etape 2

On connecte le haut-parleur au PCB amplificateur

SnakeIMG05.jpg

On connecte un câble d'alimentation USB à la matrice LED

SnakeIMG04.jpg


Etape 3

Dernière étape, on commence par connecter le tout à la carte Arduino

SnakeIMG06.jpg

Ensuite, on visse le joystick dans le compartiment arrondi

SnakeIMG10.jpg

Enfin, on place le cadre, on empile la matrice de LED puis la grille et enfin le diffuseur dans le compartiment carré

SnakeIMG11.jpg

Plus qu'à téléverser le programme et à vous amusez !

Difficultés rencontrées / Conseils

Les difficultés peuvent venir des nombreuses soudures et de l'adaptation du programme du joystick analogique vers le joystick TOR, génération de son à partir de la carte. Le câblage électrique est à vérifier avant de brancher la carte au PC, au risque de griller la carte. Il faut aussi penser à ajuster les dimensions du boitier si le câblage prend de la place. Ne pas oublier de mettre des points de colle aux coins du diffuseur pour qu'il ne se décolle pas pendant l'utilisation.

Sources et documentation complémentaire