Passerelle.Infini 2025 : Communication non verbale démocratique : Différence entre versions
(→code) |
|||
Ligne 1 : | Ligne 1 : | ||
− | + | ||
==résumé du projet== | ==résumé du projet== | ||
Notre projet est un système de communication non verbale destiné aux "groupes-classes" : le contentiomètre. | Notre projet est un système de communication non verbale destiné aux "groupes-classes" : le contentiomètre. |
Version du 24 mars 2025 à 19:21
Sommaire
[masquer]résumé du projet
Notre projet est un système de communication non verbale destiné aux "groupes-classes" : le contentiomètre. Celui-ci permet aux jeunes de s'exprimer spontanément et anonymement, et de se rendre compte du mood du groupe.
membres du projet
Bibliographie et webographie sur le projet
Mettre ici des exemples trouvés sur le web de projets qui ressemblent et des technologies qui s'en rapprochent ou qui peuvent servir d'inspiration.
pistes explorée, abandonnées ou fertiles
Au démarrage du projet nous avons envisagé plusieurs idées et exploré diverses pistes. Notre idée de départ était de fabriquer un objet qui suscite la communication par la découverte de l'objet. Nous voulions créer: _ un objet ludique _ qui nécessite d'être 2 pour fonctionner. _ qui implique une collaboration _ avec pour but l'inclusion. _ qui pourrait fonctionner en tandem. _ qui serait dans l'espace public. _ ce serait un objet transportable. Nous avons pensé à conceptualiser: _Un dispositif où il faudrait être 2 pour ouvrir une porte (portes de tram, porte donnant accès à un endroit de l'espace public - Capucins, MJC...) qui s'adapterait à n'importe quel système d'ouverture de porte. Ce dispositif fonctionnerait avec des aimants ou des capteurs thermiques. _ un dispositif ou système ( pourquoi pas de bascule?) pour descendre où monter les escaliers _ un dispositif pour bancs publics.
Nous avons ensuite repenser notre public cible et redéfini le lieu où notre objet serait utilisé et décidé que cet objet serait dans un foyer, une cantine, un EPHAD ou une école. Finalement nous avons choisi les ados comme public cible et de penser notre objet pour un lycée (cantine, foyer de jeune, classe) Nous avons envisager d'imaginer un objet qui s'inscrit dans un rituel: _ un dispositif où il faut être deux pour activer la machine à café/ ou machine à smoothie. _ un dispositif pour fontaine à eau _ un système qui apporte les plateaux repas tout seul au self _ un canapé inclinable où il faut âtre deux et communiquer sans se voir pour l'activer... Après réflexion, nous nous sommes dit que toutes ces idées avait toutes une notions de "tortures" ou du moins de contraintes.
Nous nous sommes donc recentrés sur les caractéristiques des adolescents: _ Les adolescents ont la "flemme". _ C'est une période où on a facilement honte et où on a peur d'être jugé par le groupe. _ Les adolescents ont du mal à exprimer verbalement vis à vis de leurs émotions et il leur est difficile de prendre la parole devant les autres.
De ces réflexions ont émergé l'idée de créer un système qui permettrait aux jeunes d'exprimer anonymement et spontanément leurs émotions de manière non verbale. Dans la classe, on installe un boitier doté de boutons (ou d'un potentiomètre) sur chaque table qui est relié à un tableau de leds lumineuses affichées au dessus du tableau. Chaque jeune est libre d'appuyer sur le bouton qui correspond à son mood du moment: content/ pas compris/ pas d'accord et ainsi de s'exprimer anonymement. On aurait ainsi le mood de la classe.
prototype qu'on souhaite réaliser
Notre prototype sera un système composé d'un tableau lumineux associé à des consoles de commandes. Celles-ci afficheront des leds de couleurs différentes avec des formes différentes. Le tableau est composé de 4 sections de 9 leds et 4 consoles avec chacune un potentiomètre qui contrôle la lumière donc l'émotion que l'on veut exprimer.
NOTICE Le contentiomètre est un outil d'expression démocratique et spontané pour les groupes-classes. Fabrication : 1) Conception _ Découper et assembler un nombre de boitiers correspondants au nombre des membres du groupe. _ Effectuer les branchements électroniques et téléverser le programme sur le arduino. _ Afficher le panneau led au dessus du tableau. 2) Installation: _ Disposer un boîtier sous chaque table. _ Accrocher le panneau led au mur Mise en application : _Présenter l'outil au groupe ;expliquer qu'il leur permet de communiquer silencieusement et instantanément une émotion au groupe en réaction avec ce qui se passe en classe. _ Pour exprimer son émotion chaque élève à accès à un bouton pouvant se positionner en trois états. Un état correspond à une émotion qui s'affichera en direct sur une des sections du panneau de led.
Utilisations de bases et dérivées : _ Possibilité d'établir un "code de l'émotion" commun au groupe classe (ex : rose=content, jaune=pas content, bleu=confus). _ Possibilité de proposer au groupe de décider du code, par discussion ou en laissant se faire un accords tacite. _ Possibilité de complexifier le contentiomètre par ajout de couleurs ou programmation de formes afin d'inclure différentes acuités visuelles.
photos de la réalisation du projet
code
1
2 /////////////////////////////////////////////
3 // communication non verbale démocratique //
4 /////////////////////////////////////////////
5 /* matériel
6 arduino uno,
7 potentiomètre
8 marice de led 16X16
9
10 projet conçu et réalisé lors du hacakthon Passerelle.Infini en Mars 2025
11 projet : https://wiki.lesfabriquesduponant.net/index.php?title=Passerelle.Infini_2025_:_Communication_non_verbale_d%C3%A9mocratique
12 ___
13 / ___ \
14 |_| | |
15 /_/
16 _ ___ _
17 |_| |___|_| |_
18 ___|_ _|
19 |___| |_|
20 Les petits Débrouillards - mars 2025 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
21
22 */
23 #include <Adafruit_NeoPixel.h>
24
25 #define broche 9 // broche 9 de l'Arduino UNO sur laquelle est connecté le ruban
26
27 // Nombre de led de matrice de led
28 #define nbpixels 256
29
30 // Lors de la configuration de la bibliothèque NeoPixel,
31 // nous lui indiquons combien de pixels,
32 // et quelle broche utiliser pour envoyer des signaux.
33 Adafruit_NeoPixel pixels(nbpixels, broche, NEO_GRB + NEO_KHZ800);
34 // pour configurer le ruban :
35 // nomDuRuban (nombreDePixels, NumeroDeLaBroche, typeDeRuban)
36 // Les différents types de ruban :
37 // NEO_KHZ800 800 KHz bitstream (la plupart des produits Neopixel ou références de LED w/WS2812)
38 // NEO_KHZ400 400 KHz (classic 'v1' (pas v2) FLORA pixels, drivers WS2811)
39 // NEO_GRB Pixels cablés pour GRB bitstream (la plupart des produits Neopixel)
40 // NEO_RGB Pixels cablés pour RGB bitstream (v1 FLORA pixels, pas les v2)
41 // NEO_RGBW Pixels cablés pour RGBW bitstream (produits NeoPixel RGBW)
42
43 #define delai 30 // durée de la pause en millisecondes
44
45 const int brochePotard1 = A0; // la broche du potentiomètre
46 int valPot1; // valeur mesurée pour le potentiomètre
47 int val1;
48 int temps1;
49 const int brochePotard2 = A1; // la broche du potentiomètre
50 int valPot2; // valeur mesurée pour le potentiomètre
51 int val2;
52 int temps2;
53 const int brochePotard3 = A2; // la broche du potentiomètre
54 int valPot3; // valeur mesurée pour le potentiomètre
55 int val3;
56 int temps3;
57 const int brochePotard4 = A3; // la broche du potentiomètre
58 int valPot4; // valeur mesurée pour le potentiomètre
59 int val4;
60 int temps4;
61 int humeur; // 1 = pas compris/confus/perdu - 2 - pas d'accord - 3 - content/d'accord
62 int R=0; // 1 = bleu (G,B), 2 = jaune(R,G) 3 = rose (R,B)
63 int G=0;
64 int B=0;
65 unsigned long debut;
66
67 void setup() {
68 Serial.begin(9600); //démarrae la communication série
69 pinMode(brochePotard1, INPUT);
70 pinMode(brochePotard2, INPUT);
71 pinMode(brochePotard3, INPUT);
72 pinMode(brochePotard4, INPUT);
73 pixels.begin(); // INITIALISE l'object ruban NeoPixel
74 pixels.show(); // éteint tout les pixels aussi vite que possible.
75 pixels.setBrightness(100); // met la luminosité à 1/5 (max = 255)
76 debut = millis();
77 val1 = analogRead(brochePotard1);
78 val2 = analogRead(brochePotard2);
79 val3 = analogRead(brochePotard3);
80 val4 = analogRead(brochePotard4);
81 }
82
83
84 void loop() {
85 valPot1 = analogRead(brochePotard1);
86 //affichage des valeurs dans la console
87 Serial.print("valPot1 : ");
88 Serial.println(valPot1);
89
90 valPot2 = analogRead(brochePotard2);
91 //affichage des valeurs dans la console
92 Serial.print("valPot2 : ");
93 Serial.println(valPot2);
94
95 valPot3 = analogRead(brochePotard3);
96 //affichage des valeurs dans la console
97 Serial.print("valPot3 : ");
98 Serial.println(valPot3);
99
100 valPot4 = analogRead(brochePotard4);
101 //affichage des valeurs dans la console
102 Serial.print("valPot4 : ");
103 Serial.println(valPot4);
104
105 if (abs(val1-valPot1)>10){
106 val1=valPot1;
107 choixHumeur(valPot1, 1);
108 temps1 = millis();
109 }
110 delay(100);
111 if (abs(val2-valPot2)>10){
112 val2=valPot2;
113 choixHumeur(valPot2, 2);
114 temps2 = millis();
115 }
116 delay(100);
117 if (abs(val3-valPot3)>10){
118 val3=valPot3;
119 choixHumeur(valPot3, 3);
120 temps3 = millis();
121 }
122 delay(100);
123 if (abs(val4-valPot4)>10){
124 val4=valPot4;
125 choixHumeur(valPot4, 4);
126 temps4 = millis();
127 }
128 delay(100);
129
130 if ((millis()-temps1) > 120000){
131 R=0; G=0; B=0;
132 carreBD();
133 pixels.show(); // met à jour le ruban
134 }
135
136 if ((millis()-temps2) > 120000){
137 R=0; G=0; B=0;
138 carreBG();
139 pixels.show(); // met à jour le ruban
140 }
141
142 if ((millis()-temps3) > 120000){
143 R=0; G=0; B=0;
144 carreHD();
145 pixels.show(); // met à jour le ruban
146 }
147
148 if ((millis()-temps4) > 120000){
149 R=0; G=0; B=0;
150 carreHG();
151 pixels.show(); // met à jour le ruban
152 }
153 }
154
155 void choixHumeur(int hum, int pot)
156 {
157 //==choix de l'humeur==
158 if (hum<=330) {
159 humeur=1; // 1 = pas compris/confus/perdu - 2 - pas d'accord - 3 - content/d'accord
160 Serial.print("humeur : ");
161 Serial.println(humeur);
162 R = 0;G= 50; B = 50;
163 }
164 if ((331<=hum) && (hum<=661)) {
165 humeur=2; // 1 = pas compris/confus/perdu - 2 - pas d'accord - 3 - content/d'accord
166 Serial.print("humeur : ");
167 Serial.println(humeur);
168 R = 50;G= 50; B = 0;
169 }
170 if ((662<=hum) && (hum<=1023)) {
171 humeur=3; // 1 = pas compris/confus/perdu - 2 - pas d'accord - 3 - content/d'accord
172 Serial.print("humeur : ");
173 Serial.println(humeur);
174 R = 50;G= 0; B = 50;
175 }
176 if (pot==1){
177 carreBD();
178 }
179 if (pot==2){
180 carreBG();
181 }
182 if (pot==3){
183 carreHD();
184 }
185 if (pot==4){
186 carreHG();
187 }
188 pixels.show(); // met à jour le ruban
189 }
190
191 void carreBD()
192 {
193 for(int i=0; i<=7; i++) { // Les pixels sont numérotés de 0 à ...
194 pixels.setPixelColor(i, pixels.Color(R, G, B));
195 }
196 for(int i=24; i<=39; i++) { // Les pixels sont numérotés de 0 à ...
197 pixels.setPixelColor(i, pixels.Color(R, G, B));
198 }
199 for(int i=56; i<=71; i++) { // Les pixels sont numérotés de 0 à ...
200 pixels.setPixelColor(i, pixels.Color(R, G, B));
201 }
202 for(int i=88; i<=103; i++) { // Les pixels sont numérotés de 0 à ...
203 pixels.setPixelColor(i, pixels.Color(R, G, B));
204 }
205 for(int i=120; i<=127; i++) { // Les pixels sont numérotés de 0 à ...
206 pixels.setPixelColor(i, pixels.Color(R, G, B));
207 }
208 }
209
210 void carreBG()
211 {
212 for(int i=128; i<=135; i++) { // Les pixels sont numérotés de 0 à ...
213 pixels.setPixelColor(i, pixels.Color(R, G, B));
214 }
215 for(int i=152; i<=167; i++) { // Les pixels sont numérotés de 0 à ...
216 pixels.setPixelColor(i, pixels.Color(R, G, B));
217 }
218 for(int i=184; i<=199; i++) { // Les pixels sont numérotés de 0 à ...
219 pixels.setPixelColor(i, pixels.Color(R, G, B));
220 }
221 for(int i=214; i<=231; i++) { // Les pixels sont numérotés de 0 à ...
222 pixels.setPixelColor(i, pixels.Color(R, G, B));
223 }
224 for(int i=248; i<=255; i++) { // Les pixels sont numérotés de 0 à ...
225 pixels.setPixelColor(i, pixels.Color(R, G, B));
226 }
227 }
228
229 void carreHD()
230 {
231 for(int i=8; i<=23; i++) { // Les pixels sont numérotés de 0 à ...
232 pixels.setPixelColor(i, pixels.Color(R, G, B));
233 }
234 for(int i=40; i<=55; i++) { // Les pixels sont numérotés de 0 à ...
235 pixels.setPixelColor(i, pixels.Color(R, G, B));
236 }
237 for(int i=72; i<=87; i++) { // Les pixels sont numérotés de 0 à ...
238 pixels.setPixelColor(i, pixels.Color(R, G, B));
239 }
240 for(int i=104; i<=119; i++) { // Les pixels sont numérotés de 0 à ...
241 pixels.setPixelColor(i, pixels.Color(R, G, B));
242 }
243 }
244
245 void carreHG()
246 {
247 for(int i=136; i<=153; i++) { // Les pixels sont numérotés de 0 à ...
248 pixels.setPixelColor(i, pixels.Color(R, G, B));
249 }
250 for(int i=168; i<=183; i++) { // Les pixels sont numérotés de 0 à ...
251 pixels.setPixelColor(i, pixels.Color(R, G, B));
252 }
253 for(int i=200; i<=213; i++) { // Les pixels sont numérotés de 0 à ...
254 pixels.setPixelColor(i, pixels.Color(R, G, B));
255 }
256 for(int i=232; i<=247; i++) { // Les pixels sont numérotés de 0 à ...
257 pixels.setPixelColor(i, pixels.Color(R, G, B));
258 }
259 }