Outils pour utilisateurs

Outils du site


wiki:tutoriels:processing:processing_9:processing_9

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
wiki:tutoriels:processing:processing_9:processing_9 [2020/11/05 14:11]
damien.muti
wiki:tutoriels:processing:processing_9:processing_9 [2020/11/17 15:21] (Version actuelle)
damien.muti
Ligne 1: Ligne 1:
-====== ARDUINO : COMMENT ENVOYER DES DONNÉES DE TYPE FLOAT, DOUBLE OU INT SUPÉRIEUR 255 VIA LE PORT SÉRIE  ======+====== Objet interactif - Connexion USB  ======
  
   * Porteur(s) du projet :  Damien MUTI DESGROUAS    * Porteur(s) du projet :  Damien MUTI DESGROUAS 
Ligne 6: Ligne 6:
   * Contexte : Apprentissage   * Contexte : Apprentissage
  
-===== introduction =====+===== Introduction ===== 
 + 
 Ce tutoriel permet d'étendre la notion d'affiche interactive à des objets quelconques comme par exemple des vêtements. Ce tutoriel permet d'étendre la notion d'affiche interactive à des objets quelconques comme par exemple des vêtements.
  
 L'objectif est de lancer un média (son, vidéo, animation Processing) lorsque la distance détectée à l'aide d'un capteur de distance à ultrasons est inférieure à un seuil défini par l'utilisateur. L'objectif est de lancer un média (son, vidéo, animation Processing) lorsque la distance détectée à l'aide d'un capteur de distance à ultrasons est inférieure à un seuil défini par l'utilisateur.
  
-Un des enjeux est donc de lire les données issues du capteur de distance branchée sur la carte Arduino et d'envoyer ces données via le port série à l'application Processing. Ce problème est traité dans le tutoriel suivant : +Un des enjeux est donc de lire les données issues du **capteur de distance branchée sur la carte Arduino** et d'envoyer ces données via le port série à l'application Processing. Ce problème est traité dans le tutoriel suivant : 
 +  * [[wiki:tutoriels:arduino:Evoyer_Float_Via_Port_Serie|Envoyer un nombre à virgule float ou double via le port Série de la carte Arduino - réception sur l'application Processing ]]
  
 Le programme qui suit est fortement inspiré de celui développé pour la gestion de l'interactivité des [[wiki:tutoriels:affiche-interactive:accueil|affiches interactives]]. Le programme qui suit est fortement inspiré de celui développé pour la gestion de l'interactivité des [[wiki:tutoriels:affiche-interactive:accueil|affiches interactives]].
Ligne 18: Ligne 20:
 ==== Algorithme ==== ==== Algorithme ====
  
-Si +Si la distance détectée est inférieure à un seuil, alors lancer le média (son, vidéo, animation). Sinon arrêter le média.
  
-==== Solution ==== +===== Mise en œuvre =====
-Pour contourner ce problème, une des solution est de convertir le nombre (//float, int, long, double//, etc.) en une chaîne de caractère (//String//) et d'envoyer cette chaîne sur le port série via la méthode [[https://www.arduino.cc/reference/en/language/functions/communication/serial/print/|Serial.print()]], du coté de la carte Arduino. +
- +
-Du coté de la réception sur l'application Processing, la chaîne de caractère envoyée par la carte Arduino sur le port série est d'abord lue par la méthode [[https://www.processing.org/reference/libraries/serial/Serial_readString_.html|readString()]] de la librairie [[https://www.processing.org/reference/libraries/serial/index.html|Serial]]. Ensuite, la chaîne est convertie en un entier grâce à la méthode [[https://www.processing.org/reference/intconvert_.html|int()]], ou en un nombre flottant grâce à la méthode [[https://www.processing.org/reference/floatconvert_.html|float()]]. +
- +
-Référence : +
-  * [[https://forum.processing.org/one/topic/converting-string-to-int.html|Forum Processing : Converting String to int]] +
- +
-===== Mise en œuvre : Envoie de la distance lue par un capteur à ultrason =====+
 ==== Montage ==== ==== Montage ====
 On utilise un [[wiki:tutoriels:arduino-capteurs:arduino-capteurs#capteur_de_distance_ultrason_grove|capteur à ultrason Grove]] pour mesurer une distance. On envoie ensuite la distance mesurée à l'application Processing. On utilise un [[wiki:tutoriels:arduino-capteurs:arduino-capteurs#capteur_de_distance_ultrason_grove|capteur à ultrason Grove]] pour mesurer une distance. On envoie ensuite la distance mesurée à l'application Processing.
Ligne 57: Ligne 51:
  
 ==== code Processing ==== ==== code Processing ====
-Le code Processing est le suivant :+Le code Processing est le suivant :  {{ :wiki:tutoriels:processing:processing_9:objet_interactif.zip |}}
  
 <code> <code>
-/* +/**  Affiche tactile interactive -  
-références : https://forum.processing.org/one/topic/converting-string-to-int.html+ *  Quand on appuie sur une touche (UP, DOWN, RIGHT, LEFT et espace ' '), cela lance une image, une vidéo, une annim, un son, etc...
  */  */
 +/// librairies 
 +import processing.sound.*; 
 +import processing.video.*; 
 import processing.serial.*; import processing.serial.*;
  
 +
 +// variables globales
 +PImage im; // une image
 +SoundFile son; // un son - un seul lecteur CD audio
 +Movie vid; // une vidéo - un seul lecteur DVD vidéo
 +
 +// bouton image active ? // est-ce que l'image est active ? Si oui, on affiche l'image
 +boolean animation_active = false; // true ou false (2 valleurs possibles) => 1 bit (0 ou 1)
 +
 +// bouton son actif ?
 +boolean son_actif = false;
 +float tempsDebutSon = 0; // temps du début de la musique a été joué
 +
 +// bouton video active ?
 +boolean video_active = false;
 +
 +/// dialogue avec la carte Arduino
 Serial myPort;  // Create object from Serial class Serial myPort;  // Create object from Serial class
 String  inBuffer;      // Data received from the serial port String  inBuffer;      // Data received from the serial port
-int inEntier;+int donneePortSerie// entier converti de la chaine de caractère reçue sur le port série
  
-void setup() { +// seuil de détection 
-  size(200200); +float seuil = 25; 
-  // I know that the first port in the serial list on my mac + 
-  // is always my  FTDI adaptorso I open Serial.list()[0]. +// compteur boucle draw() 
-  // On Windows machines, this generally opens COM1+//int nbLoopDraw = 0; 
-  // Open whatever port is the one you're using.+ 
 +void setup() { // initialisation des paramètres d'affichage & chargement des sons, vidéos, etc. 
 +  size(500500); 
 +  noStroke(); 
 +  background(0); 
 + 
 +  // initialisation des variables globales 
 +  im = loadImage("images/chien.jpg"); 
 + 
 +  // chargement du son 
 +  son = new SoundFile(this"sons/beat.aiff"); 
 +  //println(son.duration()); 
 + 
 +  // chargement de la video 
 +  vid = new Movie(this, "videos/affiche.mp4");
  
 +  /// Port série
   // Print a list of the serial ports, for debugging purposes:   // Print a list of the serial ports, for debugging purposes:
   printArray(Serial.list());   printArray(Serial.list());
Ligne 85: Ligne 113:
  
 void draw() { void draw() {
 +  // lecture des données sur le port série : 
 +  lectureDonneePortSerie();
 +
 +  // test des données lues sur le port série et choix de l'interactivité (vidéo, son, animation)
 +  // choisir le média à lancer :
 +  // son
 +  //gestionSon("sons/beat.aiff"); 
 +  // video
 +  gestionVideo("videos/ArmstrongAlunissage.mp4"); // "videos/affiche.mp4"
 +  // animation
 +  gestionAnimation();
 +  
 +  // affichage de la vidéo ////////////////////////////////////////
 +  if (video_active) {
 +    image(vid, 0, 0, width, height);
 +  } else {
 +    background(0); // fond noir
 +  }
 +  // affichage de l'animation//////////////////////////////////////
 +  if (animation_active) {
 +    lancerAnimation();
 +  }
 +
 +}
 +//////////////////////////////////// Méthodes ////////////////////////
 +void movieEvent(Movie movie) { //// gestion de la vidéo
 +  vid.read();
 +}
 +
 +void lectureDonneePortSerie() { //////////// lecture et conversion des données issues du port série 
 +  //String  inBuffer="";
   // lecture des données sur le port série   // lecture des données sur le port série
   if ( myPort.available() > 0) {  // si une donnée est disponible sur le port série   if ( myPort.available() > 0) {  // si une donnée est disponible sur le port série
-    inBuffer = myPort.readString(); // lire la donnée et la stoquer dans inBuffer (chaine de caractères - String) +    inBuffer = myPort.readString(); // lire la donnée et la stoquer dans inBuffer (chaine de caractères - String)
   }   }
   //conversion des données String -> int   //conversion des données String -> int
   if (inBuffer != null) { // si la chaine de caractère n'est pas nulle   if (inBuffer != null) { // si la chaine de caractère n'est pas nulle
-    println("inBuffer="+inBuffer +"(String)"); //afficher la chaine de caractère inBuffer +    //println("inBuffer="+inBuffer +"(String)"); //afficher la chaine de caractère inBuffer 
-    inEntier=int(inBuffer); // convertir la chaine de caractère en un entier + 
-    println("inEntier="+inEntier+"(int)"); // afficher l'entier correcpondant+    donneePortSerie=int(inBuffer); // convertir la chaine de caractère en un entier 
 + 
 +    // affichage de la distance en cm 
 +    println("Distance = "+donneePortSerie+" cm"); // afficher l'entier correcpondant
   }   }
-   +
-  // test des données + 
-  color c ; +/////////////////////////////////////////////// Son /////////////////////////////////////////////////// 
-  if (inEntier<25){ +void gestionSon(String nomDuSon) { 
-    c = color(255,0,0);+  if (donneePortSerie seuil && donneePortSerie>0 && !son.isPlaying()) {  // son  
 +    // jouer le son SSI la distance est inférieur à un seuilstrictement supérieure à et si le son ne joue pas déjà 
 +    //affichage de la distance lue 
 +    println("Distance = "+donneePortSerie+" cm"); 
 +    // lancement du son 
 +    lancerSon(nomDuSon); 
 +  } else if (donneePortSerie > seuil && son.isPlaying()) { //si la distance est supérieure au seuil ET que le son joue : arrêter le son 
 +    son.stop();
   }   }
-  else+
-    color(0,0,255);+void lancerSon(String nomDuSon) { 
 +  if (!son.isPlaying()) { // le son ne joue pas 
 +    // chargement du son 1 
 +    son new SoundFile(thisnomDuSon); 
 +    // jouer le son 1 
 +    son.loop();
   }   }
-  fill(c); 
-  rect(0,0,width,height); 
 } }
 +
 +//////////////////////////////////////////////// Video ///////////////////////////////////////////////////
 +void gestionVideo(String nomVideo) {
 +  if (donneePortSerie < seuil && donneePortSerie>0 && !video_active) {  // video 
 +    // jouer le son SSI la distance est inférieur à un seuil, strictement supérieure à 0 et si la vidéo ne joue pas déjà
 +    //affichage de la distance lue
 +    println("Distance = "+donneePortSerie+" cm");
 +    // lancement du son
 +    lancerVideo(nomVideo);
 +  } else if (donneePortSerie > seuil && video_active) { //si la distance est supérieure au seuil ET que la video joue : arrêter la video
 +    vid.stop();
 +    clear();
 +    video_active = false;
 +  }
 +}
 +void lancerVideo(String nomVideo) {
 +  if (video_active == false) { // la vidéo 1 ne tourne pas
 +    // chargement de la video 1
 +    vid = new Movie(this, nomVideo );
 +    vid.loop();
 +    video_active = true;
 +  }
 +}
 +//////////////////////////////////////////////// animation ///////////////////////////////////////////////////
 +void gestionAnimation() {
 +  if (donneePortSerie > 100) { // on appuie sur la touche "espace" => lancer l'animation "image"
 +    animation_active = true;
 +  } else {
 +    animation_active = false;
 +  }
 +}
 +void lancerAnimation() {
 +  float x = 30 + random(-20, 20); // random sur la position
 +  float y = 30 + random(-20, 20);
 +  image(im, x, y, 200, 200);
 +}
 +
 +
 </code> </code>
  
-Le code est disponible sur le lien suivant : {{ :wiki:tutoriels:arduino:lecture_donnees_port_serie.pde.zip |}}+Le code est disponible sur le lien suivant : {{ :wiki:tutoriels:processing:processing_9:objet_interactif.zip |}} 
 + 
 +===== Discussion : mesure d'une autre grandeur que la distance ===== 
 +La grandeur physique mesurée dans cette étude est la distance.  
 + 
 +Le programmes Arduino précédent peut être aisément modifié si le capteur utilisé mesure une autre grandeur physique telle que la température (capteur CTN), la force de pression (capteur piézo-électrique), la flexion (capteur "flexo"), etc... 
 + 
 +En revanche le programme Processing peut être utilisé tel-quel en prenant simplement soin de bien définir la valeur du seuil de détection associée à la grandeur physique choisie. 
 + 
 +===== Des projets d'Étuduants ===== 
 +  * Margot Goutièrre DSAA2-2021 : Boite poétique interactive
wiki/tutoriels/processing/processing_9/processing_9.1604581885.txt.gz · Dernière modification: 2020/11/05 14:11 de damien.muti