ENIB 2024 : TwoSnakeBetterThanOne : Différence entre versions
(→Mettre du code Arduino) |
(→étapes de fabrication) |
||
Ligne 203 : | Ligne 203 : | ||
===étape 1=== | ===étape 1=== | ||
===étape 2=== | ===étape 2=== | ||
− | ===étape | + | ===étape 3=== |
+ | ===étape 4=== | ||
+ | ===étape 5=== | ||
+ | ===étape 6=== | ||
===troubleshouting=== | ===troubleshouting=== | ||
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ? | quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ? |
Version du 30 janvier 2024 à 16:12
Titre de la fiche expérience :
Sommaire
description (résumé)
éventuelle photo de l'équipe
"Le Général deGaulle n'avait pas dit que toutes la France avait été Résistante ?" "Il l'a dit... il l'a dit"
Introduction
éventuelle vidéo
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
étape 2
étape 3
étape 4
étape 5
étape 6
troubleshouting
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
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...