Ceci est une ancienne révision du document !
En s'inspirant des affiches interactives, il est possible de créer des objets interactifs capables de réagir en lançant un médiat (son, vidéo, animation). Cette interaction intervient par exemple lorsque la valeur renvoyée par la mesure d'un paramètre associée à un capteur est inférieure à un seuil.
On choisit exemple un capteur de distance à ultrason.
Le système comporte deux cartes Arduino équipée chacune d'un module Bluetooth leur permettant de communiquer.
La carte Arduino comporte :
Le schéma de câblage est le suivant :
Le code Fritzing est le suivant : envoie_donnees_distance_bt.fzz.zip
La carte Arduino comporte uniquement :
Le schéma de câblage est le suivant :
Le code Fritzing est le suivant : reception_donneesbt_et_envoie_vers_processing.fzz.zip
Le programme Arduino permettant la réception des données envoyées par la Carte 1 est le suivant :
/* Réception des données issues du port Bluetooth - Module HC06 Envoie des données reçues via le port série vers le programme Processing*/ #include <SoftwareSerial.h> SoftwareSerial hc06(2, 3); // réception des données envoyées sur le port bluetooth String cmd = ""; int distance = 0; // Gestion de la led byte led = 13; int Tblink = 20; // période de clignotement float isBlink = false; // drapeau pour lancer le clignotement... ou non void setup() { // pin 13 OUTPUT pinMode(led, OUTPUT); //Initialiser le Serial Monitor Serial.begin(9600); //Initialiser le Bluetooth Serial Port hc06.begin(9600); } void loop() { //Lecture des données depuis le module HC06 while (hc06.available() > 0) { cmd += (char)hc06.read(); } //Select function with cmd if (cmd != "") { // convertir la comande en un entier distance = cmd.toInt(); // conversion de la chaine de caractère en un entier : distance mesurée cmd = ""; //reset cmd } // envoie des données sur le port Série -> Processing Serial.println(distance); clignoterLed(led, Tblink, Tblink); // allumer la led à chaque envoie de donnée // patienter x ms delay(100); } void clignoterLed(int led, int Ta, int Te) { // led : patte connécéet à la led, Ta: temps d'allumage, Te: temps led éteinte digitalWrite(led, HIGH); delay(Ta); digitalWrite(led, LOW); delay(Te); }
Le code Arduino est directement disponible sur le lien suivant : reception_donnees_capteur_hc06_1.zip
Le programme Processing permettant la réception et le traitement des données envoyées par la Carte 2 est le suivant :
/** Objet interactif - On reçoit une donnée du port série, on teste la valeur de cette donnée, cela lance une image, une vidéo, une annim, un son, etc... */ /// librairies import processing.sound.*; import processing.video.*; 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 String inBuffer; // Data received from the serial port int donneePortSerie; // entier converti de la chaine de caractère reçue sur le port série // seuil de détection float seuil = 25; // distance de seuil = 25cm void setup() { // initialisation des paramètres d'affichage & chargement des sons, vidéos, etc. size(500, 500); 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: printArray(Serial.list()); String portName = Serial.list()[0]; myPort = new Serial(this, portName, 9600); } 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(); } //////////////////////////////////////////////// Son /////////////////////////////////////////////////// void gestionSon(String nomDuSon) { if (donneePortSerie < seuil && donneePortSerie>0 && !son.isPlaying()) { // son // jouer le son SSI la distance est inférieur à un seuil, strictement supérieure à 0 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(); } } void lancerSon(String nomDuSon) { if (!son.isPlaying()) { // le son ne joue pas // chargement du son 1 son = new SoundFile(this, nomDuSon); // jouer le son 1 son.loop(); } } //////////////////////////////////////////////// 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); } void lectureDonneePortSerie() { //String inBuffer=""; // lecture des données 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) } //conversion des données String -> int if (inBuffer != null) { // si la chaine de caractère n'est pas nulle //println("inBuffer="+inBuffer +"(String)"); //afficher la chaine de caractère inBuffer 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 } }
Ce programme est identique à celui effectué pour les objets interactifs : Objet interactif avec détection de distance grâce une carte Arduino et un capteur de distance à ultrasons. Dans ce dernier exemple, les capteurs sont directement branchés à la carte Arduino qui est connectée au PC, sans passer par un module Bluetooth.