Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
wiki:flossmanuals:boitier-interactif-01:accueil [2021/05/30 08:02] damien.muti [Programmes] |
wiki:flossmanuals:boitier-interactif-01:accueil [2021/10/31 15:23] (Version actuelle) lise [Boîtier Interactif : Apprendre la profondeur dans un tableau] |
||
|---|---|---|---|
| Ligne 3: | Ligne 3: | ||
| * **Date** : 03/2021 | * **Date** : 03/2021 | ||
| * **Contexte** : projet " | * **Contexte** : projet " | ||
| - | * **Fichiers** : | + | * **Fichiers** : {{ : |
| * **Lien** : | * **Lien** : | ||
| * **Capteurs/ | * **Capteurs/ | ||
| Ligne 14: | Ligne 14: | ||
| ---- | ---- | ||
| - | |||
| - | A remplir... | ||
| ====== Intentions : explication du projet et objectifs ====== | ====== Intentions : explication du projet et objectifs ====== | ||
| - | Dans le cadre d'un projet avec le musée des Beaux Arts, l' | + | ==== Le Contexte ==== |
| - | ====== | + | Commande |
| + | Chaque élève propose des dispositifs qui pourraient s’insérer | ||
| + | ==== Les Objectifs | ||
| + | Permettre aux enfants d’appréhender la profondeur, la perspective, | ||
| + | ==== Le Dispositif ==== | ||
| + | Une tablette / un ordinateur tactile affiche le tableau d’Émile LOUBON. Elle est reliée à un boitier Arduino, avec des sliders, des potentiomètres et un capteur de distance. Ceux-ci permettent à l’utilisateur de déplacer un personnage dans le tableau. | ||
| + | Il peut le faire de deux différentes manières : | ||
| + | |||
| + | - de haut en bas : le personnage change de taille et de saturation | ||
| + | |||
| + | - de droite à gauche : le personnage ne change pas | ||
| + | |||
| + | Ainsi, le médiateur peut se servir du boitier pour démontrer la perspective aux enfants. | ||
| + | Ensuite, les enfants volontaires peuvent passer à tour de rôle pour s’en servir pendant que leurs camarades se servent du kit tampographique. | ||
| + | ====== Plans et schémas de fonctionnement ====== | ||
| + | {{ : | ||
| ====== Programmes ====== | ====== Programmes ====== | ||
| ===== Arduino ===== | ===== Arduino ===== | ||
| Le montage Arduino et le programme associé a pour but de mesurer les valeurs de plusieurs potentiomètres et sliders, d'un bouton et d'un capteur de distance à ultrason et de les envoyer au programme Processing pour traitement. | Le montage Arduino et le programme associé a pour but de mesurer les valeurs de plusieurs potentiomètres et sliders, d'un bouton et d'un capteur de distance à ultrason et de les envoyer au programme Processing pour traitement. | ||
| - | Le code est le suivant : | + | Le code est le suivant : {{ : |
| < | < | ||
| Ligne 169: | Ligne 182: | ||
| } | } | ||
| </ | </ | ||
| + | ===== Processing ===== | ||
| + | ==== Programme initial ==== | ||
| + | Le programme Processing a pour but de récupérer les différentes données envoyées par la carte Arduino. Chaque donnée constitue un paramètre d' | ||
| + | |||
| + | Le rendu est le suivant : | ||
| + | {{ : | ||
| + | |||
| + | Le programme est le suivant : {{ : | ||
| + | |||
| + | < | ||
| + | import processing.serial.*; | ||
| + | |||
| + | int bgcolor; | ||
| + | int fgcolor=255; | ||
| + | Serial myPort; | ||
| + | int NbData = 4; // nombre de données à récupérer de la carte Arduino | ||
| + | int[] serialInArray = new int[NbData]; | ||
| + | int serialCount = 0; // A count of how many bytes we receive | ||
| + | int ChoixPerso, CouleurPerso, | ||
| + | boolean firstContact = false; | ||
| + | float xPerso, yPerso, sPerso; | ||
| + | PImage loubon, bouvier, | ||
| + | color c =color(# | ||
| + | int r = 25, g = 42, b=118; | ||
| + | PImage imgMask; | ||
| + | |||
| + | void setup() { | ||
| + | size(1000, | ||
| + | noStroke(); | ||
| + | |||
| + | |||
| + | // Initialisation des variables | ||
| + | ChoixPerso=0; | ||
| + | CouleurPerso = 0; // | ||
| + | xPerso = 0.76*width; // Slider 1 | ||
| + | yPerso = 0.84*height; | ||
| + | sPerso = 2000; //Taille du personnage | ||
| + | SaturPerso = 255; | ||
| + | bouvier = loadImage(" | ||
| + | loubon= loadImage(" | ||
| + | img = createImage(bouvier.width, | ||
| + | image(loubon, | ||
| + | colorMode(HSB); | ||
| + | // Print a list of the serial ports, for debugging purposes: | ||
| + | printArray(Serial.list()); | ||
| + | imgMask = loadImage(" | ||
| + | imgMask = createImage(bouvier.width, | ||
| + | // I know that the first port in the serial list on my mac | ||
| + | // is always my FTDI adaptor, so I open Serial.list()[0]. | ||
| + | // On Windows machines, this generally opens COM1. | ||
| + | // Open whatever port is the one you're using. | ||
| + | String portName = Serial.list()[0]; | ||
| + | myPort = new Serial(this, | ||
| + | } | ||
| + | |||
| + | void draw() { /////////////////////////////////////// | ||
| + | |||
| + | imageMode(CENTER); | ||
| + | image(loubon, | ||
| + | if (ChoixPerso == 0) { // | ||
| + | bouvier = loadImage(" | ||
| + | img.mask(imgMask); | ||
| + | } | ||
| + | if (ChoixPerso == 1){ | ||
| + | | ||
| + | | ||
| + | } | ||
| + | if (ChoixPerso == 2){ | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | for (int i = 0; i < bouvier.pixels.length; | ||
| + | int r_i = (bouvier.pixels[i] >> 16) & 0xFF; // Faster way of getting red(argb) | ||
| + | int g_i = (bouvier.pixels[i] >> 8) & 0xFF; // Faster way of getting green(argb) | ||
| + | int b_i= bouvier.pixels[i] & 0xFF; // Faster way of getting blue(argb) | ||
| + | if (r_i == r && g_i == g && b_i == b) { | ||
| + | float h = CouleurPerso; | ||
| + | //float h = 128; | ||
| + | float s = SaturPerso; | ||
| + | float b =brightness(bouvier.pixels[i]); | ||
| + | |||
| + | // | ||
| + | |||
| + | img.pixels[i] = color(h, s, b); | ||
| + | } | ||
| + | |||
| + | img.updatePixels(); | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | image(bouvier, | ||
| + | |||
| + | image(img, xPerso, yPerso, sPerso, sPerso); | ||
| + | |||
| + | } | ||
| + | //for (int i = 0; i < img.pixels.length; | ||
| + | // img.pixels[i] = color(0, 90, 102, i % img.width * 2); | ||
| + | //} | ||
| + | void serialEvent(Serial myPort) { // gestion des données envoyées par la carte | ||
| + | // read a byte from the serial port: | ||
| + | int inByte = myPort.read(); | ||
| + | // if this is the first byte received, and it's an A, | ||
| + | // clear the serial buffer and note that you've | ||
| + | // had first contact from the microcontroller. | ||
| + | // Otherwise, add the incoming byte to the array: | ||
| + | if (firstContact == false) { | ||
| + | if (inByte == ' | ||
| + | myPort.clear(); | ||
| + | firstContact = true; // you've had first contact from the microcontroller | ||
| + | myPort.write(' | ||
| + | } | ||
| + | } else { | ||
| + | // Add the latest byte from the serial port to array: | ||
| + | serialInArray[serialCount] = inByte; | ||
| + | serialCount++; | ||
| + | |||
| + | // If we have NbData bytes: | ||
| + | if (serialCount > NbData-1) { | ||
| + | ChoixPerso=serialInArray[0]; | ||
| + | CouleurPerso = serialInArray[1]; | ||
| + | xPerso =0.2*width +2*serialInArray[2]; | ||
| + | yPerso = 0.53*height + serialInArray[3]; | ||
| + | sPerso = 12*serialInArray[3]; | ||
| + | SaturPerso = serialInArray[3]; | ||
| + | | ||
| + | // print the values (for debugging purposes only): | ||
| + | println(ChoixPerso + " | ||
| + | | ||
| + | // Send a capital A to request new sensor readings: Envoie d'une letter " | ||
| + | myPort.write(' | ||
| + | // Reset serialCount: | ||
| + | serialCount = 0; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| ====== Réalisation de la maquette ====== | ====== Réalisation de la maquette ====== | ||
| vidéos, photos du making of... | vidéos, photos du making of... | ||