ENIB 2024 : Snake 16x16
Sommaire
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.
Outil et matériel
- Carte Arduino ESP8266: https://quai-lab.com/programmer-lesp201-carte-wifi-programmable/
- Matrice LED WS2812 16X16: https://www.az-delivery.de/fr/products/rgb-led-panel-ws2812b-16x16-256-leds-flexibel-led-modul-5050smd-ic-einzeladressierbare-vollfarbfunktionen-mit-dc5v-kompatibel-mit-raspberry-pi
- Joystick TOR: https://fabulous-arcade.com/fr/24-joysticks
- Cadre, boitier, diffuseur imprimé en 3d
- Câble USB
- Buzzer actif: https://letmeknow.fr/fr/audio/512-piezo-buzzer-actif-652733152190.html
Fichiers à télécharger
- Fichier du boitier: Fichier:Main Body.stl
- Fichier de la grille, du diffuseur, du cadre: https://www.thingiverse.com/thing:4127683
Circuit électrique
-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.
Etape 2
On connecte le haut-parleur au PCB amplificateur
On connecte un câble d'alimentation USB à la matrice LED
Etape 3
Dernière étape, on commence par connecter le tout à la carte Arduino
Ensuite, on visse le joystick dans le compartiment arrondi
Enfin, on place le cadre, on empile la matrice de LED puis la grille et enfin le diffuseur dans le compartiment carré
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
- Pour plus d'informations: https://projecthub.arduino.cc/vasiljevalentin/snake-led-16x16-matrix-game-15a475
- Tutoriel pour installer l'ESP8266 sur l'IDE Arduino: https://fr.macerobotics.com/developpeur/tutoriels/programmer-le-microcontroleur-esp8266-avec-lide-arduino/