Passerelle.infini: Totem
Les petites créatures sensorielles
Sommaire
L'historique
L'idée est de réaliser des petites créatures sensorielles en utilisant les sens. En premier abord, la vue et le toucher !
Recherche de surprises, d'inattendu et de fun. L'objet va produire quelque chose de nouveau quand il sera manipulé. Un jeu de manipulation d'objets: seul mais aussi plusieurs objets assemblés.
En bref des créatures vivantes qui nous emportent dans le monde de nos sens.
Les objectifs
Découvrir ou redécouvrir un langage, avec nos sens. Pouvoir manipuler les objets (se donner le droit) Créer tout seul ou à plusieurs. Apporter de la vie, du fun
Le public
Tous le monde est concerné, des enfants aux séniors, chacun peut découvrir de nouvelles expériences en accueillant ses émotions. Les familles ou les structures d'accueil pourront utiliser ces oeuvres.
Les créatures
CUBE
Code CUBE
1 /////////////////////
2 // CUBE //
3 /////////////////////
4 // CUBE est un cube interactif générateur de sons.
5 // Il a été réalisée dans le cadre du hackathon "Passerelle.infini" les 24 & 25 février 2022
6 // Le hackathon "Passerelle.infini" est organisé par le Centre d'Art Passerelle, Les petits débrouillards
7 // Avec la participation de Tyfenn Leluc - designeuse et Thibault Beugin formateur
8
9 // Le programme est inspiré du programme "Basic demo for accelerometer readings" de Adafruit MPU6050
10 /*
11
12 BROCHAGE
13 _________________
14 / D1 mini \
15 - |[ ]RST TX[ ]| -
16 - |[ ]A0 -GPIO RX[ ]| -
17 |[ ]D0-16 5-D1[X]| - SCL MPU6050
18 RX MP3-TF-16P |[X]D5-14 4-D2[X]| - SDA MPU6050
19 resistance 1K - TX MP3-TF-16P |[X]D6-12 0-D3[ ]| - Bouton Poussoir
20 - |[ ]D7-13 2-D4[ ]| LED_BUILTIN
21 - |[ ]D8-15 GND[X]| - GND (MPU6050, MP3-TF-16P)
22 - |[ ]3V3 . 5V[X]| - MPU6050, MP3-TF-16P, Bouton Poussoir
23 | +---+ |
24 |_______|USB|_______|
25
26
27 +-------\_/--------+
28 +5V |[X] MP3-TF-16P [ ]|
29 resistance 1K - TX |[X] [ ]|
30 RX |[X] __________ [ ]|
31 |[ ]| |[ ]|
32 |[ ]| CARTE |[ ]|
33 Haut-Parleur |[X]| SD |[ ]|
34 GND |[X]| |[ ]|
35 Haut-Parleur |[X]| |[ ]|
36 |___|__________|___|
37
38
39
40 _________________
41 | MPU6050 ()|
42 +5V |[X]VCC |
43 GND |[X]GND G |
44 D1 |[X]SCL ___ Y |
45 D2 |[X]SDA | | | |
46 |[ ]XCA |___| 5 |
47 |[ ]XCL . 2 |
48 |[ ]ADO Y 1 |
49 |[ ]INT ->X | |
50 |_______________()|
51
52
53 Matériel :
54 - des fils dupont.
55 - un Wemos D1 mini
56 - un lecteur MP3 MP3-TF-16P
57 - une carte SD microSD
58 - un shield batterie 18650
59 - une batterie 18650
60 - un cable USB
61 - un capteur gyroscopique GY-521 MPU6050
62 - un bouton poussoir de type arcade
63
64 ___
65 / ___ \
66 |_| | |
67 /_/
68 _ ___ _
69 |_| |___|_| |_
70 ___|_ _|
71 |___| |_|
72 Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
73 Antony Le Goïc-Auffret 25 février 2022
74 */
75
76
77 #include <Adafruit_MPU6050.h>
78 #include <Adafruit_Sensor.h>
79 #include <Wire.h>
80 #include "Arduino.h"
81 #include "SoftwareSerial.h"
82 #include "DFRobotDFPlayerMini.h"
83
84 #define poussoir D3 // broche du bouton poussoir
85
86 // D6 est le RX du ESP8266, connecte au TX du MP3-TF-16P
87 // D5 est le TX du ESP8266, connecte au RX du MP3-TF-16P
88 SoftwareSerial mySoftwareSerial(14, 12); // RX, TX
89 DFRobotDFPlayerMini myDFPlayer;
90
91 int antirebond = 150 // durée du délai anti-rebond pour le poussoir
92
93 Adafruit_MPU6050 mpu;
94
95 float X;
96 float Y;
97 float Z;
98
99 int son = 0;
100
101 void initialisation(){
102 Serial.println();
103 Serial.println(F("TCUBE"));
104 Serial.println(F("Initialisation du lecteur mp3 ... (peut prendre 3 a 5 secondes)"));
105
106 if (!myDFPlayer.begin(mySoftwareSerial)) { // utilise softwareSerial pour communiquer avec le MP3-TF-16P.
107 Serial.println(F("Incapable de demarrer:"));
108 Serial.println(F("1. Verifiez les connexions!"));
109 Serial.println(F("2. Inserez la carte SD!"));
110 while (true);
111 }
112 Serial.println(F("CUBE est prêt !"));
113
114 myDFPlayer.setTimeOut(500); // place la communication serie time out 500ms
115 myDFPlayer.volume(26); // regle le volume (de 0 a 30).
116 myDFPlayer.play(1); // joue le premier fichier son.
117 }
118
119 void setup(void) {
120 mySoftwareSerial.begin(9600);
121 Serial.begin(115200);
122
123 while (!Serial)
124 delay(10); // will pause Zero, Leonardo, etc until serial console opens
125
126 Serial.println("Démarrage de CUBE");
127
128 // Try to initialize!
129 if (!mpu.begin()) {
130 Serial.println("Je n'arrive pas trouver le gyroscope MPU6050 ");
131 while (1) {
132 delay(10);
133 }
134 }
135 Serial.println("MPU6050 trouvé !");
136
137 mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
138 Serial.print("Accelerometer range set to: ");
139 switch (mpu.getAccelerometerRange()) {
140 case MPU6050_RANGE_2_G:
141 Serial.println("+-2G");
142 break;
143 case MPU6050_RANGE_4_G:
144 Serial.println("+-4G");
145 break;
146 case MPU6050_RANGE_8_G:
147 Serial.println("+-8G");
148 break;
149 case MPU6050_RANGE_16_G:
150 Serial.println("+-16G");
151 break;
152 }
153 mpu.setGyroRange(MPU6050_RANGE_500_DEG);
154 Serial.print("Gyro range set to: ");
155 switch (mpu.getGyroRange()) {
156 case MPU6050_RANGE_250_DEG:
157 Serial.println("+- 250 deg/s");
158 break;
159 case MPU6050_RANGE_500_DEG:
160 Serial.println("+- 500 deg/s");
161 break;
162 case MPU6050_RANGE_1000_DEG:
163 Serial.println("+- 1000 deg/s");
164 break;
165 case MPU6050_RANGE_2000_DEG:
166 Serial.println("+- 2000 deg/s");
167 break;
168 }
169
170 mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
171 Serial.print("Filter bandwidth set to: ");
172 switch (mpu.getFilterBandwidth()) {
173 case MPU6050_BAND_260_HZ:
174 Serial.println("260 Hz");
175 break;
176 case MPU6050_BAND_184_HZ:
177 Serial.println("184 Hz");
178 break;
179 case MPU6050_BAND_94_HZ:
180 Serial.println("94 Hz");
181 break;
182 case MPU6050_BAND_44_HZ:
183 Serial.println("44 Hz");
184 break;
185 case MPU6050_BAND_21_HZ:
186 Serial.println("21 Hz");
187 break;
188 case MPU6050_BAND_10_HZ:
189 Serial.println("10 Hz");
190 break;
191 case MPU6050_BAND_5_HZ:
192 Serial.println("5 Hz");
193 break;
194 }
195
196 Serial.println("");
197 delay(100);
198
199 initialisation();
200
201 pinMode (poussoir, INPUT_PULLUP); // active la resistance de pull-up interne
202
203 }
204
205 void loop() {
206
207 /* récupère les information du capteur gyroscopique */
208 sensors_event_t a, g, temp;
209 mpu.getEvent(&a, &g, &temp);
210
211 X = a.acceleration.x;
212 Y = a.acceleration.y;
213 Z = a.acceleration.z;
214
215 /* on écrit les valeurs sur le moniteur série */
216 Serial.print("Acceleration X: ");
217 Serial.print(X);
218 Serial.print(", Y: ");
219 Serial.print(Y);
220 Serial.print(", Z: ");
221 Serial.print(Z);
222 Serial.println(" m/s^2");
223
224 Serial.println("");
225 delay(500);
226 // déclanchement X
227 if ((abs(X)>8) & (abs(Y)<8) &(abs(Z)<8)) {
228 son = 1;
229 Serial.print("son = ");
230 Serial.println(son);
231 myDFPlayer.play(son); // joue le fichier son.
232 }
233 // déclanchement Y
234 if ((abs(X)<8) & (abs(Y)>8) &(abs(Z)<8)) {
235 son = 2;
236 Serial.print("son = ");
237 Serial.println(son);
238 myDFPlayer.play(son); // joue le fichier son.
239 }
240 // déclanchement Z
241 if ((abs(X)<8) & (abs(Y)<8) &(abs(Z)>8)) {
242 son = 3;
243 Serial.print("son = ");
244 Serial.println(son);
245 myDFPlayer.play(son); // joue le fichier son.
246 }
247
248 if ( digitalRead(poussoir) == LOW ) { // lorqu'on appuie sur le bouton
249 delay(antirebond);
250 Serial.println("Appuis Bouton"); // info sur le moniteur serie
251 son = 4;
252 Serial.print("son = ");
253 Serial.println(son);
254 myDFPlayer.play(son); //joue le son
255 }
256 }
TOUFFU
Code TOUFFU
1
2 ///////////////
3 // TOUFFU //
4 ///////////////
5 // TOUFFU est une créature réalisée dans le cadre du hackathon "Passerelle.infini" les 24 & 25 février 2022.
6 // Le hackathon "Passerelle.infini" est organisé par le Centre d'Art Passerelle, Les petits débrouillards.
7 // Avec la participation de Tyfenn Leluc - designeuse et Thibault Beugin formateur.
8
9 // Ce programme est inspiré du petit bot, un programme pédagogique
10 // des petits débrouillards ?=+ pour gérer le robot "Petit Bot"
11 // Voir sur http://wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi
12 // Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf
13 // Sous licence CC-By-Sa - Les petits débrouillards.
14
15 ////////////////////////////////////////////////////////////////////////////////
16 // /!\ ATTENTION /!\ //
17 // Le code n'est pas terminé, il faut ajouter la gestion du HC-SR04 //
18 // //
19 ////////////////////////////////////////////////////////////////////////////////
20 /*
21 * D1 mini
22 BROCHAGE
23 _________________
24 / D1 mini \
25 |[ ]RST TX[ ]|
26 |[ ]A0 -GPIO RX[ ]|
27 TRIG HC-SR04 |[X]D0-16 5-D1[X]| SCL - servogauche
28 ECHO HC-SR04 |[X]D5-14 4-D2[X]| SDA - servodroit
29 |[ ]D6-12 0-D3[ ]|
30 |[ ]D7-13 2-D4[ ]| LED_BUILTIN
31 |[ ]D8-15 GND[X]|
32 |[ ]3V3 . 5V[X]|
33 | +---+ |
34 |_______|USB|_______|
35
36 _________________________
37 | ___ (__) ___ |
38 | // \\ HC-SR04 // \\ |
39 ||( )| |( )||
40 | \\___// \\___// |
41 | VCC TRIG ECHO GND |
42 |------[X][X][X][X]-------|
43 | |
44 D0 D5
45
46 Matériel :
47 - des fils dupont.
48 - un shield petit bot
49 - un Wemos D1 mini
50 - 2 servo à rotation continue
51 - un capteur de distance HC-SR04
52 - un shield batterie 18650
53 - une batterie 18650
54 - un cable USB
55
56 Schéma de l'Arduino en ASCII-ART CC-By http://busyducks.com/ascii-art-arduinos
57 Sous licence CC-By-Sa (http://creativecommons.org/licenses/by-nc-sa/3.0/)
58 */
59 /*
60 ___
61 / ___ \
62 |_| | |
63 /_/
64 _ ___ _
65 |_| |___|_| |_
66 ___|_ _|
67 |___| |_|
68 Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
69 Antony Le Goïc-Auffret 25 février 2022
70 */
71
72 // on appelle la bibliothèque qui gère le Wemos D1 mini
73 #include <ESP8266WiFi.h>
74
75 // Gestion du Wifi
76 #include <ESP8266WebServer.h>
77 #include <DNSServer.h>
78 #include <ESP8266mDNS.h>
79 #include <WiFiClient.h>
80
81 // Definition du WiFi
82 const char *nomDuReseau = "TOUFFU"; // Nom du réseau wifi du petit bot
83 const char *motDePasse = ""; // Mot de passe du réseau wifi du petit bot
84 // ATTENTION - le mot de passe doit faire soit 0 caractères soit 8 ou plus sinon
85 // La configuration de votre réseau wifi ne se fera pas (ni mot de passe, ni nom de réseau !).
86 //création du monServeur
87 ESP8266WebServer monServeur(80); // Création de l'objet monServeur
88
89 //Gestion des servomoteurs
90 #include <Servo.h> //appel de la bibliothèque qui gère les servomoteurs
91 // création des servomoteurs
92 Servo servogauche; // Nom du servo qui gère la première roue
93 Servo servodroit; // Seconde roue
94
95 //déclaration des Variables
96 //int --- en cours
97 int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...).
98
99 void setup(){
100 delay(1000);
101 Serial.begin(9600); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur
102 Serial.println();
103 Serial.println();
104 configDuWifi();
105 servodroit.detach(); // Place les servos hors tension
106 servogauche.detach();
107 pinMode(LED_BUILTIN, OUTPUT); //met la led du Wemos en sortie
108 digitalWrite(LED_BUILTIN, LOW); //met la led du Wemos sur le niveau bas ce qui l'allume.
109 }
110
111 void loop(){
112 val = -1;
113 monServeur.handleClient();
114 }
115
116 ///////////////////////GESTION DES INSTRUCTIONS///////////////////////////
117 void GestionDesClics() {
118 monServeur.on("/avance", HTTP_GET, []() {
119 val = 1;
120 Serial.println("avance");
121 redactionPageWeb();
122 });
123
124 monServeur.on("/recule", HTTP_GET, []() {
125 val = 2;
126 Serial.println("recule");
127 redactionPageWeb();
128 });
129
130 monServeur.on("/droite", HTTP_GET, []() {
131 val = 4;
132 Serial.println("droite");
133 redactionPageWeb();
134 });
135
136 monServeur.on("/gauche", HTTP_GET, []() {
137 val = 3;
138 Serial.println("gauche");
139 redactionPageWeb();
140 });
141
142 monServeur.on("/stop", HTTP_GET, []() {
143 val = 0;
144 Serial.println("stop");
145 redactionPageWeb();
146 });
147
148 monServeur.on("/", HTTP_GET, []() {
149 val = -1;
150 redactionPageWeb();
151 });
152
153 }
154
155 ///////////////////////////LA PAGE WEB DE CONROLE DU PETIT BOT/////////////////////////////////////////
156 void redactionPageWeb(){
157 // Prépare la page web de réponse (le code HTML sera écrit dans la chaine de caractère "pageWeb").
158 String pageWeb = "<!DOCTYPE HTML>\r\n";
159 pageWeb += "<html>\r\n";
160 pageWeb += "<center>"; //On ouvre la balise qui va centrer les boutons
161 pageWeb += "<h1 style=\"font-size:300%;\"\> Le petit bot ";
162 pageWeb += "<style type=\"text/css\"> body { color: #212121; background-color: #CC0C59 } </style>";
163
164 // On finalise l'écriture de la page Web et on donne les instructions aux servos
165 pageWeb += instruction(val); // pour cela on appelle la fonction "instruction"
166
167 // On termine l'écriture de la page Web
168 pageWeb += "</h1>";
169 pageWeb += "<br>"; //aller à la ligne
170 pageWeb += "<br>"; //aller à la ligne
171 pageWeb += "<a href=\"/stop\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Stop </button></a>\r\n"; // créer un bouton "Stop", qui envoie sur l'URL /stop
172 pageWeb += "<a href=\"/avance\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Avance </button></a>\r\n"; // créer un bouton "Avance"...
173 pageWeb += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Recule </button></a>\r\n";
174 pageWeb += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Droite </button></a>\r\n";
175 pageWeb += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Gauche </button></a><br />\r\n";
176 pageWeb += "</center>"; // tout est centré sur la page
177 pageWeb += "</html>\n"; //Fin de la page Web
178
179 // On envoie la page web
180 monServeur.send(200, "text/html", pageWeb);
181 delay(1);
182 }
183
184 ///////////////////INSTRUCTIONS/////////////////////////////////////////////////////////
185 String instruction(int valeur){ //Cette fonction traite les instructions qui sont reçues
186 int gauche; // Variable dont la valeur 180 ou 0 fera tourner le servo gauche dans un sens ou l'autre
187 int droite; // Idem pour le servo droit
188 String completePage; // Déclaration de la chaine de caractère qui sera renvoyée par cette fonction pour compléter la page web
189 switch(valeur){ // En fonction de la variable valeur on va donner un ordre aux servos
190 case 0 : // et un texte à la chaine de caractère "completePage"
191 completePage = " est a l’arrêt ";
192 droite = 90;
193 gauche = 90;
194 break;
195 case 1 :
196 completePage = " avance ";
197 droite = 180;
198 gauche = 0;
199 break;
200 case 2 :
201 completePage = " recule ";
202 droite = 0;
203 gauche = 180;
204 break;
205 case 3 :
206 completePage = " tourne a gauche ";
207 droite = 180;
208 gauche = 180;
209 break;
210 case 4 :
211 completePage = " tourne a droite ";
212 droite = 0;
213 gauche = 0;
214 break;
215 // que faire du cas ou val = -1 ? marquer ici ce qui doit être fait.
216 }
217 servogauche.attach(5); // Broche D1
218 servodroit.attach(4); // Broche D2
219 servogauche.write(gauche);
220 servodroit.write(droite);
221 return completePage; // on renvoie la chaine de caractère pour compléter la page web
222 }
223 ////////////////////////CONFIGURATION WIFI///////////////////////////////////////////////
224 void configDuWifi(){ // Fonction de configuratio du Wifi
225 WiFi.mode(WIFI_AP); // le wemos est en mode "Point d'Accès" (il déploie un réseau wifi)
226 WiFi.softAP(nomDuReseau, motDePasse, 2); // on démarre le "Point d'Accès".
227 MDNS.begin(nomDuReseau); // gérer les DNS ce qui rendra votre petit bot accessible
228 MDNS.addService("http", "tcp", 80); // via http://nomDuReseau.local
229 IPAddress monIP = WiFi.softAPIP(); // on récupère l'adresse IP du petit Bot
230 Serial.print("Adresse IP de ce Point d'Accès : ");
231 Serial.println(monIP); // on l'écrit sur le moniteur série
232 GestionDesClics();
233 monServeur.begin(); //Démarrage du monServeur
234 Serial.println("Serveur HTTP démarré");
235 return; // on retourne à l'endroit ou la fonction a été appelée.
236 }
La Goule à facette
un boule faite de texture, tissus et autre matières scintillantes.
Nénuphar
Le nénuphar est basé sur une forme pre-existante : https://www.instructables.com/Blooming-Marvelous-Flower-Lamp/ A nécessité près de 20h d'impression 3D (beaucoup de pièces) à partir des fichiers 3D trouvés ici : https://www.thingiverse.com/thing:1805365