Passerelle.infini: Totem : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Catégories)
 
(16 révisions intermédiaires par le même utilisateur non affichées)
Ligne 27 : Ligne 27 :
  
 
==Les créatures==
 
==Les créatures==
Un cube, un véhicule, une boule et un nénuphar.
+
Ces sont créature son diverses :
 +
* CUBE
 +
* GOULE A FACETTE
 +
* TOUFFU
 +
* NENUPHAR
 +
===CUBE===
  
==Sources==
+
[[Fichier:Passerelle.infiniCube.JPG|300px]]
pour la fleur : https://www.instructables.com/Blooming-Marvelous-Flower-Lamp/
+
 
 +
====Code CUBE====
 +
<syntaxhighlight lang="Arduino" line>
 +
/////////////
 +
//  CUBE  //
 +
/////////////
 +
// CUBE est un cube interactif générateur de sons.
 +
// Il a été réalisée dans le cadre du hackathon "Passerelle.infini" les 24 & 25 février 2022
 +
// Le hackathon "Passerelle.infini" est organisé par le Centre d'Art Passerelle, Les petits débrouillards
 +
// Avec la participation de Tyfenn Leluc - designeuse et Thibault Beugin formateur
 +
 
 +
// Le programme est inspiré du programme "Basic demo for accelerometer readings" de Adafruit MPU6050
 +
/*
 +
 
 +
                                    BROCHAGE
 +
                                _________________
 +
                              /    D1 mini    \
 +
                          -  |[ ]RST        TX[ ]| -
 +
                          -  |[ ]A0  -GPIO  RX[ ]| -
 +
                              |[ ]D0-16    5-D1[X]| - SCL MPU6050
 +
                RX MP3-TF-16P |[X]D5-14    4-D2[X]| - SDA MPU6050
 +
resistance 1K - TX MP3-TF-16P |[X]D6-12    0-D3[ ]| - Bouton Poussoir
 +
                          -  |[ ]D7-13    2-D4[ ]| LED_BUILTIN
 +
                          -  |[ ]D8-15    GND[X]| - GND (MPU6050, MP3-TF-16P)
 +
                          -  |[ ]3V3 .      5V[X]| - MPU6050, MP3-TF-16P, Bouton Poussoir
 +
                              |      +---+      |
 +
                              |_______|USB|_______|
 +
 
 +
 
 +
                              +-------\_/--------+
 +
                          +5V |[X] MP3-TF-16P [ ]|
 +
            resistance 1K - TX |[X]            [ ]|
 +
                            RX |[X] __________ [ ]|
 +
                              |[ ]|          |[ ]|
 +
                              |[ ]|  CARTE  |[ ]|
 +
                  Haut-Parleur |[X]|    SD    |[ ]|
 +
                          GND |[X]|          |[ ]|
 +
                  Haut-Parleur |[X]|          |[ ]|
 +
                              |___|__________|___|
 +
                             
 +
 
 +
 
 +
                                _________________
 +
                              |    MPU6050  ()|
 +
                          +5V |[X]VCC          |
 +
                          GND |[X]GND        G |
 +
                            D1 |[X]SCL  ___  Y |
 +
                            D2 |[X]SDA  |  |  | |
 +
                              |[ ]XCA  |___|  5 |
 +
                              |[ ]XCL .      2 |
 +
                              |[ ]ADO      Y  1 |
 +
                              |[ ]INT  ->X |    |
 +
                              |_______________()| 
 +
                             
 +
 
 +
Matériel :
 +
- des fils dupont.
 +
- un Wemos D1 mini
 +
- un lecteur MP3 MP3-TF-16P
 +
- une carte SD microSD
 +
- un shield batterie 18650
 +
- une batterie 18650
 +
- un cable USB
 +
- un capteur gyroscopique GY-521 MPU6050
 +
- un bouton poussoir de type arcade
 +
 
 +
  ___
 +
/ ___ \
 +
|_|  | |
 +
    /_/
 +
    _  ___  _
 +
    |_| |___|_| |_
 +
        ___|_  _|
 +
        |___| |_|
 +
Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
 +
Antony Le Goïc-Auffret 25 février 2022
 +
*/
 +
 
 +
 
 +
#include <Adafruit_MPU6050.h>
 +
#include <Adafruit_Sensor.h>
 +
#include <Wire.h>
 +
#include "Arduino.h"
 +
#include "SoftwareSerial.h"
 +
#include "DFRobotDFPlayerMini.h"
 +
 
 +
#define poussoir D3 // broche du bouton poussoir
 +
 
 +
// D6 est le RX du ESP8266, connecte au TX du MP3-TF-16P
 +
// D5 est le TX du ESP8266, connecte au RX du MP3-TF-16P
 +
SoftwareSerial mySoftwareSerial(14, 12); // RX, TX
 +
DFRobotDFPlayerMini myDFPlayer;
 +
 
 +
int antirebond = 150 // durée du délai anti-rebond pour le poussoir
 +
 
 +
Adafruit_MPU6050 mpu;
 +
 
 +
float X;
 +
float Y;
 +
float Z;
 +
 
 +
int son = 0;
 +
 
 +
void initialisation(){
 +
  Serial.println();
 +
  Serial.println(F("TCUBE"));
 +
  Serial.println(F("Initialisation du lecteur mp3 ... (peut prendre 3 a 5 secondes)"));
 +
 
 +
  if (!myDFPlayer.begin(mySoftwareSerial)) {  // utilise softwareSerial pour communiquer avec le MP3-TF-16P.
 +
    Serial.println(F("Incapable de demarrer:"));
 +
    Serial.println(F("1. Verifiez les connexions!"));
 +
    Serial.println(F("2. Inserez la carte SD!"));
 +
    while (true);
 +
  }
 +
  Serial.println(F("CUBE est prêt !"));
 +
 
 +
  myDFPlayer.setTimeOut(500); // place la communication serie time out 500ms
 +
  myDFPlayer.volume(26);      // regle le volume (de 0 a 30).
 +
  myDFPlayer.play(1);        // joue le premier fichier son.
 +
}
 +
 
 +
void setup(void) {
 +
  mySoftwareSerial.begin(9600);
 +
  Serial.begin(115200);
 +
 
 +
  while (!Serial)
 +
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
 +
 
 +
  Serial.println("Démarrage de CUBE");
 +
 
 +
  // Try to initialize!
 +
  if (!mpu.begin()) {
 +
    Serial.println("Je n'arrive pas trouver le gyroscope MPU6050 ");
 +
    while (1) {
 +
      delay(10);
 +
    }
 +
  }
 +
  Serial.println("MPU6050 trouvé !");
 +
 
 +
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
 +
  Serial.print("Accelerometer range set to: ");
 +
  switch (mpu.getAccelerometerRange()) {
 +
  case MPU6050_RANGE_2_G:
 +
    Serial.println("+-2G");
 +
    break;
 +
  case MPU6050_RANGE_4_G:
 +
    Serial.println("+-4G");
 +
    break;
 +
  case MPU6050_RANGE_8_G:
 +
    Serial.println("+-8G");
 +
    break;
 +
  case MPU6050_RANGE_16_G:
 +
    Serial.println("+-16G");
 +
    break;
 +
  }
 +
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
 +
  Serial.print("Gyro range set to: ");
 +
  switch (mpu.getGyroRange()) {
 +
  case MPU6050_RANGE_250_DEG:
 +
    Serial.println("+- 250 deg/s");
 +
    break;
 +
  case MPU6050_RANGE_500_DEG:
 +
    Serial.println("+- 500 deg/s");
 +
    break;
 +
  case MPU6050_RANGE_1000_DEG:
 +
    Serial.println("+- 1000 deg/s");
 +
    break;
 +
  case MPU6050_RANGE_2000_DEG:
 +
    Serial.println("+- 2000 deg/s");
 +
    break;
 +
  }
 +
 
 +
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
 +
  Serial.print("Filter bandwidth set to: ");
 +
  switch (mpu.getFilterBandwidth()) {
 +
  case MPU6050_BAND_260_HZ:
 +
    Serial.println("260 Hz");
 +
    break;
 +
  case MPU6050_BAND_184_HZ:
 +
    Serial.println("184 Hz");
 +
    break;
 +
  case MPU6050_BAND_94_HZ:
 +
    Serial.println("94 Hz");
 +
    break;
 +
  case MPU6050_BAND_44_HZ:
 +
    Serial.println("44 Hz");
 +
    break;
 +
  case MPU6050_BAND_21_HZ:
 +
    Serial.println("21 Hz");
 +
    break;
 +
  case MPU6050_BAND_10_HZ:
 +
    Serial.println("10 Hz");
 +
    break;
 +
  case MPU6050_BAND_5_HZ:
 +
    Serial.println("5 Hz");
 +
    break;
 +
  }
 +
 
 +
  Serial.println("");
 +
  delay(100);
 +
 
 +
  initialisation();
 +
 
 +
  pinMode (poussoir, INPUT_PULLUP);  // active la resistance de pull-up interne
 +
 
 +
}
 +
 
 +
void loop() {
 +
 
 +
  /* récupère les information du capteur gyroscopique */
 +
  sensors_event_t a, g, temp;
 +
  mpu.getEvent(&a, &g, &temp);
 +
 
 +
  X = a.acceleration.x;
 +
  Y = a.acceleration.y;
 +
  Z = a.acceleration.z;
 +
 
 +
  /* on écrit les valeurs sur le moniteur série */
 +
  Serial.print("Acceleration X: ");
 +
  Serial.print(X);
 +
  Serial.print(", Y: ");
 +
  Serial.print(Y);
 +
  Serial.print(", Z: ");
 +
  Serial.print(Z);
 +
  Serial.println(" m/s^2");
 +
 
 +
  Serial.println("");
 +
  delay(500);
 +
// déclanchement X
 +
  if ((abs(X)>8) & (abs(Y)<8) &(abs(Z)<8)) {
 +
    son = 1;
 +
    Serial.print("son = ");
 +
    Serial.println(son);
 +
    myDFPlayer.play(son);        // joue le fichier son.
 +
  }
 +
// déclanchement Y
 +
    if ((abs(X)<8) & (abs(Y)>8) &(abs(Z)<8)) {
 +
    son = 2;
 +
    Serial.print("son = ");
 +
    Serial.println(son);
 +
    myDFPlayer.play(son);        // joue le fichier son.
 +
  }
 +
// déclanchement Z
 +
    if ((abs(X)<8) & (abs(Y)<8) &(abs(Z)>8)) {
 +
    son = 3;
 +
    Serial.print("son = ");
 +
    Serial.println(son);
 +
    myDFPlayer.play(son);        // joue le fichier son.
 +
  }
 +
 
 +
    if ( digitalRead(poussoir) == LOW ) { // lorqu'on appuie sur le bouton
 +
    delay(antirebond);
 +
    Serial.println("Appuis Bouton");      // info sur le moniteur serie
 +
    son = 4;
 +
    Serial.print("son = ");
 +
    Serial.println(son);
 +
    myDFPlayer.play(son);                //joue le son
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
===TOUFFU===
 +
Dans le coin en bas à gauche
 +
 
 +
[[Fichier:Passerelle.infiniTouffu.JPG|300px]]
 +
====Code TOUFFU====
 +
<syntaxhighlight lang="Arduino" line>
 +
///////////////
 +
//  TOUFFU  //
 +
///////////////
 +
// TOUFFU est une créature réalisée dans le cadre du hackathon "Passerelle.infini" les 24 & 25 février 2022.
 +
// Le hackathon "Passerelle.infini" est organisé par le Centre d'Art Passerelle, Les petits débrouillards.
 +
// Avec la participation de Tyfenn Leluc - designeuse et Thibault Beugin formateur.
 +
 
 +
// Ce programme est inspiré du petit bot, un programme pédagogique
 +
// des petits débrouillards ?=+ pour gérer le robot "Petit Bot"
 +
// Voir sur http://wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi
 +
// Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf
 +
// Sous licence CC-By-Sa - Les petits débrouillards.
 +
 
 +
////////////////////////////////////////////////////////////////////////////////
 +
//                          /!\  ATTENTION  /!\                            //
 +
//        Le code n'est pas terminé, il faut ajouter la gestion du HC-SR04    //
 +
//                                                                            //
 +
////////////////////////////////////////////////////////////////////////////////
 +
/*
 +
*                                      D1 mini
 +
                                    BROCHAGE                           
 +
                                _________________                       
 +
                              /    D1 mini    \                     
 +
                              |[ ]RST        TX[ ]|                 
 +
                              |[ ]A0  -GPIO  RX[ ]|                   
 +
                TRIG  HC-SR04 |[X]D0-16    5-D1[X]| SCL - servogauche                 
 +
                ECHO  HC-SR04 |[X]D5-14    4-D2[X]| SDA - servodroit             
 +
                              |[ ]D6-12    0-D3[ ]|             
 +
                              |[ ]D7-13    2-D4[ ]| LED_BUILTIN         
 +
                              |[ ]D8-15    GND[X]|           
 +
                              |[ ]3V3 .      5V[X]|         
 +
                              |      +---+      |                   
 +
                              |_______|USB|_______| 
 +
 
 +
                            _________________________
 +
                          |  ___    (__)    ___  |
 +
                          | //  \\ HC-SR04 //  \\ |
 +
                          ||(    )|      |(    )||
 +
                          | \\___//        \\___// |
 +
                          |    VCC TRIG ECHO GND    |
 +
                          |------[X][X][X][X]-------| 
 +
                                      |  |
 +
                                    D0  D5
 +
 
 +
Matériel :
 +
- des fils dupont.
 +
- un shield petit bot
 +
- un Wemos D1 mini
 +
- 2 servo à rotation continue
 +
- un capteur de distance HC-SR04
 +
- un shield batterie 18650
 +
- une batterie 18650
 +
- un cable USB
 +
 
 +
Schéma de l'Arduino en ASCII-ART CC-By http://busyducks.com/ascii-art-arduinos
 +
Sous licence CC-By-Sa (http://creativecommons.org/licenses/by-nc-sa/3.0/)
 +
*/
 +
/*
 +
  ___
 +
/ ___ \
 +
|_|  | |
 +
    /_/
 +
    _  ___  _
 +
    |_| |___|_| |_
 +
        ___|_  _|
 +
        |___| |_|
 +
Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
 +
Antony Le Goïc-Auffret 25 février 2022
 +
*/
 +
 
 +
// on appelle la bibliothèque qui gère le Wemos D1 mini
 +
#include <ESP8266WiFi.h>
 +
 
 +
// Gestion du Wifi
 +
#include <ESP8266WebServer.h>
 +
#include <DNSServer.h>
 +
#include <ESP8266mDNS.h>
 +
#include <WiFiClient.h>
 +
 
 +
//  Definition du WiFi
 +
const char *nomDuReseau = "TOUFFU";    // Nom du réseau wifi du petit bot
 +
const char *motDePasse = "";    // Mot de passe du réseau wifi du petit bot
 +
// ATTENTION - le mot de passe doit faire soit 0 caractères soit 8 ou plus sinon
 +
// La configuration de votre réseau wifi ne se fera pas (ni mot de passe, ni nom de réseau !).
 +
//création du monServeur
 +
ESP8266WebServer monServeur(80);              // Création de l'objet monServeur
 +
 
 +
//Gestion des servomoteurs
 +
#include <Servo.h>  //appel de la bibliothèque qui gère les servomoteurs
 +
// création des servomoteurs
 +
Servo servogauche;  // Nom du servo qui gère la première roue
 +
Servo servodroit;    // Seconde roue
 +
 
 +
//déclaration des Variables
 +
//int --- en cours
 +
int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...).
 +
 
 +
void setup(){
 +
  delay(1000);
 +
  Serial.begin(9600); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur
 +
  Serial.println();
 +
  Serial.println(); 
 +
  configDuWifi();
 +
  servodroit.detach();  // Place les servos hors tension
 +
  servogauche.detach();
 +
  pinMode(LED_BUILTIN, OUTPUT);    //met la led du Wemos en sortie
 +
  digitalWrite(LED_BUILTIN, LOW);  //met la led du Wemos sur le niveau bas ce qui l'allume.
 +
}
 +
 
 +
void loop(){
 +
    val = -1;
 +
    monServeur.handleClient();
 +
}
 +
 
 +
///////////////////////GESTION DES INSTRUCTIONS///////////////////////////
 +
void GestionDesClics() {
 +
  monServeur.on("/avance", HTTP_GET, []() {
 +
  val = 1;
 +
  Serial.println("avance");   
 +
  redactionPageWeb();
 +
  });
 +
 
 +
  monServeur.on("/recule", HTTP_GET, []() {
 +
  val = 2;
 +
  Serial.println("recule");
 +
  redactionPageWeb();
 +
  });
 +
 
 +
  monServeur.on("/droite", HTTP_GET, []() {
 +
  val = 4;
 +
  Serial.println("droite");
 +
  redactionPageWeb();
 +
  });
 +
 
 +
  monServeur.on("/gauche", HTTP_GET, []() {
 +
  val = 3;
 +
  Serial.println("gauche");
 +
  redactionPageWeb();
 +
  });
 +
 
 +
  monServeur.on("/stop", HTTP_GET, []() {
 +
  val = 0;
 +
  Serial.println("stop");
 +
  redactionPageWeb();
 +
  });
 +
 
 +
  monServeur.on("/", HTTP_GET, []() {
 +
  val = -1;
 +
  redactionPageWeb();
 +
  });
 +
 
 +
}
 +
 
 +
///////////////////////////LA PAGE WEB DE CONROLE DU PETIT BOT/////////////////////////////////////////
 +
void redactionPageWeb(){
 +
  // Prépare la page web de réponse (le code HTML sera écrit dans la chaine de caractère "pageWeb").
 +
  String pageWeb = "<!DOCTYPE HTML>\r\n";
 +
  pageWeb += "<html>\r\n";
 +
  pageWeb += "<center>";    //On ouvre la balise qui va centrer les boutons
 +
  pageWeb += "<h1 style=\"font-size:300%;\"\> Le petit bot ";
 +
  pageWeb += "<style type=\"text/css\">  body { color: #212121; background-color: #CC0C59 } </style>";
 +
 
 +
  // On finalise l'écriture de la page Web et on donne les instructions aux servos
 +
  pageWeb += instruction(val); // pour cela on appelle la fonction "instruction"
 +
 
 +
  // On termine l'écriture de la page Web
 +
  pageWeb += "</h1>";
 +
  pageWeb += "<br>"; //aller à la ligne
 +
  pageWeb += "<br>"; //aller à la ligne
 +
  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
 +
  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"...
 +
  pageWeb += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Recule </button></a>\r\n";
 +
  pageWeb += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Droite </button></a>\r\n";
 +
  pageWeb += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Gauche </button></a><br />\r\n";
 +
  pageWeb += "</center>"; // tout est centré sur la page
 +
  pageWeb += "</html>\n"; //Fin de la page Web
 +
 
 +
  // On envoie la page web
 +
  monServeur.send(200, "text/html", pageWeb);
 +
  delay(1);
 +
}
 +
 
 +
///////////////////INSTRUCTIONS/////////////////////////////////////////////////////////
 +
String instruction(int valeur){ //Cette fonction traite les instructions qui sont reçues
 +
  int gauche;                          // Variable dont la valeur 180 ou 0 fera tourner le servo gauche dans un sens ou l'autre
 +
  int droite;                          // Idem pour le servo droit
 +
  String completePage;                  // Déclaration de la chaine de caractère qui sera renvoyée par cette fonction pour compléter la page web
 +
  switch(valeur){                      // En fonction de la variable valeur on va donner un ordre aux servos
 +
    case 0 :                            // et un texte à la chaine de caractère "completePage"
 +
    completePage = " est a l&rsquo;arr&ecirc;t ";
 +
    droite = 90;
 +
    gauche = 90;
 +
    break;
 +
    case 1 :
 +
    completePage = " avance ";
 +
    droite = 180;
 +
    gauche = 0;
 +
    break;
 +
    case 2 :
 +
    completePage = " recule ";
 +
    droite = 0;
 +
    gauche = 180;
 +
    break;
 +
    case 3 :
 +
    completePage = " tourne a gauche ";
 +
    droite = 180;
 +
    gauche = 180;
 +
    break;
 +
    case 4 :
 +
    completePage = " tourne a droite ";
 +
    droite = 0;
 +
    gauche = 0;
 +
    break;
 +
    // que faire du cas ou val = -1 ? marquer ici ce qui doit être fait.
 +
  }
 +
  servogauche.attach(5);    // Broche D1
 +
  servodroit.attach(4);      // Broche D2
 +
  servogauche.write(gauche);
 +
  servodroit.write(droite);
 +
  return completePage;        // on renvoie la chaine de caractère pour compléter la page web
 +
}
 +
////////////////////////CONFIGURATION WIFI///////////////////////////////////////////////
 +
void configDuWifi(){  // Fonction de configuratio du Wifi
 +
  WiFi.mode(WIFI_AP); // le wemos est en mode "Point d'Accès" (il déploie un réseau wifi)
 +
  WiFi.softAP(nomDuReseau, motDePasse, 2); // on démarre le "Point d'Accès".
 +
  MDNS.begin(nomDuReseau);                // gérer les DNS ce qui rendra votre petit bot accessible
 +
  MDNS.addService("http", "tcp", 80);      // via http://nomDuReseau.local
 +
  IPAddress monIP = WiFi.softAPIP();      // on récupère l'adresse IP du petit Bot
 +
  Serial.print("Adresse IP de ce Point d'Accès : ");
 +
  Serial.println(monIP);                  // on l'écrit sur le moniteur série
 +
  GestionDesClics();
 +
  monServeur.begin();                      //Démarrage du monServeur
 +
  Serial.println("Serveur HTTP démarré");
 +
  return;                                  // on retourne à l'endroit ou la fonction a été appelée.
 +
}
 +
</syntaxhighlight>
 +
 
 +
===GOULE A FACETTE===
 +
un boule faite de texture, tissus et autre matières scintillantes.
 +
 
 +
[[Fichier:Passerelle.infiniGouleAFacette.JPG|200px]]
 +
 
 +
===NENUPHAR===
 +
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
 +
 
 +
[[Fichier:Passerelle.infiniNenuphar.JPG|400px]]
  
 
==Catégories==
 
==Catégories==
 
[[Catégorie:Passerelle.infini]]
 
[[Catégorie:Passerelle.infini]]
 +
 +
[[Catégorie:Arduino]]

Version actuelle datée du 15 janvier 2024 à 16:04

Les petites créatures sensorielles

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 !

HackathonPasserelleTotem.jpg

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

Ces sont créature son diverses :

  • CUBE
  • GOULE A FACETTE
  • TOUFFU
  • NENUPHAR

CUBE

Passerelle.infiniCube.JPG

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

Dans le coin en bas à gauche

Passerelle.infiniTouffu.JPG

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&rsquo;arr&ecirc;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 }

GOULE A FACETTE

un boule faite de texture, tissus et autre matières scintillantes.

Passerelle.infiniGouleAFacette.JPG

NENUPHAR

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

Passerelle.infiniNenuphar.JPG

Catégories