ENIB 2024 : TwoSnakeBetterThanOne : Différence entre versions
(→troubleshouting) |
(→Les différents Joystick) |
||
Ligne 218 : | Ligne 218 : | ||
- 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 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). | - 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). | ||
+ | |||
+ | [[Fichier:Image Joystick TSBTO.jpg|200px]] | ||
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. | 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. |
Version du 31 janvier 2024 à 10:19
Titre de la fiche expérience :
Sommaire
description (résumé)
éventuelle photo de l'équipe
SNAKE
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 ?
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...