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:tutoriels:processing:processing_10:processing_10 [2020/11/13 15:49] damien.muti |
wiki:tutoriels:processing:processing_10:processing_10 [2020/11/15 14:40] (Version actuelle) damien.muti [Processing] |
||
---|---|---|---|
Ligne 8: | Ligne 8: | ||
===== Présentation ===== | ===== Présentation ===== | ||
- | En s' | + | En s' |
On choisit exemple un [[wiki: | On choisit exemple un [[wiki: | ||
Ligne 27: | Ligne 27: | ||
==== Programme Arduino ==== | ==== Programme Arduino ==== | ||
+ | |||
+ | Le programme consiste à : | ||
+ | * Mesurer la distance via un capteur ultrason (Grove Ultrasonic Ranger) | ||
+ | * Envoyer les données mesurées sur le port Bluetooth via le module HC-06 | ||
+ | |||
+ | Le code Arduino est le suivant : {{ : | ||
+ | |||
+ | < | ||
+ | /* Mesurer la distance via un capteur ultrason (Grove Ultrasonic Ranger) | ||
+ | | ||
+ | */ | ||
+ | // module Bluetooth HC06 | ||
+ | #include < | ||
+ | SoftwareSerial hc06(2, 3); | ||
+ | // Capteur de distance ultrason Grove Ultrasonic Ranger | ||
+ | #include " | ||
+ | Ultrasonic ultrasonic(7); | ||
+ | |||
+ | // données lue sur le capteur de distance | ||
+ | long distance=0; | ||
+ | |||
+ | // Gestion de la led | ||
+ | byte led = 13; | ||
+ | int Tblink = 100; | ||
+ | float isBlink = false; // drapeau pour lancer le clignotement... ou non | ||
+ | |||
+ | void setup() { | ||
+ | // pin 13 OUTPUT | ||
+ | pinMode(led, | ||
+ | // | ||
+ | Serial.begin(9600); | ||
+ | // | ||
+ | hc06.begin(9600); | ||
+ | } | ||
+ | void loop() { | ||
+ | |||
+ | // Lecture de la valeur du capteur | ||
+ | distance = ultrasonic.MeasureInCentimeters(); | ||
+ | |||
+ | //Write sensor data to HC06 | ||
+ | hc06.println(distance); | ||
+ | |||
+ | // patienter xx ms entre deux mesures et envoies | ||
+ | delay(250); | ||
+ | } | ||
+ | |||
+ | void clignoterLed(int led, int Ta, int Te) { // led : patte connécéet à la led, Ta: temps d' | ||
+ | digitalWrite(led, | ||
+ | delay(Ta); | ||
+ | digitalWrite(led, | ||
+ | delay(Te); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
===== Carte 2 - connectée au PC ===== | ===== Carte 2 - connectée au PC ===== | ||
+ | |||
+ | Lorsque le PC utilisé ne comporte pas de module Bluetooth intégré, il suffit d' | ||
+ | |||
==== Montage ==== | ==== Montage ==== | ||
La carte Arduino comporte uniquement : | La carte Arduino comporte uniquement : | ||
Ligne 39: | Ligne 97: | ||
==== Programme Arduino ==== | ==== Programme Arduino ==== | ||
- | Le programme Arduino permettant la réception des données envoyées par la Carte 1 est le suivant : | + | Le programme Arduino permettant la réception des données envoyées par la Carte 2 est le suivant : {{ : |
< | < | ||
- | /* Réception des données issues du port Bluetooth - Module HC06 | + | /* Réception |
Envoie des données reçues via le port série vers le programme Processing*/ | Envoie des données reçues via le port série vers le programme Processing*/ | ||
Ligne 90: | Ligne 149: | ||
</ | </ | ||
- | Le code Arduino est directement disponible sur le lien suivant : {{ :wiki: | + | ==== Connexion des deux cartes en Bluetooth ==== |
+ | Voir tutoriel | ||
+ | * [[http://www.martyncurrey.com/ | ||
==== Programme Processing ==== | ==== Programme Processing ==== | ||
- | Le programme Processing permettant la réception et le traitement des données envoyées par la Carte 2 est le suivant : | + | 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 animation, 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' | ||
+ | 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; | ||
+ | String | ||
+ | int donneePortSerie; | ||
+ | |||
+ | // seuil de détection | ||
+ | float seuil = 25; // distance de seuil = 25cm | ||
+ | |||
+ | |||
+ | void setup() { // initialisation des paramètres d' | ||
+ | size(500, 500); | ||
+ | noStroke(); | ||
+ | background(0); | ||
+ | |||
+ | // initialisation des variables globales | ||
+ | im = loadImage(" | ||
+ | |||
+ | // chargement du son | ||
+ | son = new SoundFile(this, | ||
+ | // | ||
+ | |||
+ | // chargement de la video | ||
+ | vid = new Movie(this, " | ||
+ | |||
+ | /// 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, | ||
+ | } | ||
+ | |||
+ | 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' | ||
+ | // choisir le média à lancer : | ||
+ | // son | ||
+ | // | ||
+ | // video | ||
+ | gestionVideo(" | ||
+ | // animation | ||
+ | gestionAnimation(); | ||
+ | | ||
+ | // affichage de la vidéo //////////////////////////////////////// | ||
+ | if (video_active) { | ||
+ | image(vid, 0, 0, width, height); | ||
+ | } else { | ||
+ | background(0); | ||
+ | } | ||
+ | // affichage de l' | ||
+ | if (animation_active) { | ||
+ | lancerAnimation(); | ||
+ | } | ||
+ | } | ||
+ | ////////////////////////////////////// | ||
+ | void movieEvent(Movie movie) { //// gestion de la vidéo | ||
+ | vid.read(); | ||
+ | } | ||
+ | //////////////////////////////////////////////// | ||
+ | void gestionSon(String nomDuSon) { | ||
+ | if (donneePortSerie < seuil && donneePortSerie> | ||
+ | // 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(" | ||
+ | // 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, | ||
+ | // jouer le son 1 | ||
+ | son.loop(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //////////////////////////////////////////////// | ||
+ | void gestionVideo(String nomVideo) { | ||
+ | if (donneePortSerie < seuil && donneePortSerie> | ||
+ | // 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(" | ||
+ | // 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; | ||
+ | } | ||
+ | } | ||
+ | //////////////////////////////////////////////// | ||
+ | void gestionAnimation() { | ||
+ | if (donneePortSerie > 100) { // on appuie sur la touche " | ||
+ | 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() { | ||
+ | // | ||
+ | // 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(); | ||
+ | } | ||
+ | // | ||
+ | if (inBuffer != null) { // si la chaine de caractère n'est pas nulle | ||
+ | // | ||
+ | |||
+ | donneePortSerie=int(inBuffer); | ||
+ | |||
+ | // affichage de la distance en cm | ||
+ | println(" | ||
+ | } | ||
+ | } | ||
+ | |||
</ | </ | ||
Ce programme est identique à celui effectué pour les objets interactifs : [[wiki: | Ce programme est identique à celui effectué pour les objets interactifs : [[wiki: | ||
+ | |||
+ | ===== PC comportant une connexion Bluetooth | ||
+ | |||
+ | ==== Processing ==== | ||
+ | Sur un PC sur Windows 10, le système d' | ||
+ | {{ : | ||
+ | |||
+ | Par la suite, Processing ne sait pas qu’il s’agit d’une communication série sur Bluetooth, série sur USB ou autre… il s’agit simplement d’une communication série sur un port COM. | ||
+ | |||
+ | Il est donc possible de faire communiquer Processing (fonctionnant sur le PC) avec la Carte Arduino 1 (connectée à l' | ||
+ | * {{ : | ||
+ | |||
+ | |||
+ | Quelques recherches sur le forum Processing : | ||
+ | * [[https:// | ||
+ | * https:// | ||
+ | ==== Une API JAVA pour la communication Bluetooth ==== | ||
+ | Dans le cas où le PC utilisé comporte un module Bluetooth, il faut adapter le programme Processing précédant en faisant en sorte que les données envoyée par la Carte 1 en Bluetooth soit directement reçues par le PC. | ||
+ | |||
+ | Pour cela, il faudrait utiliser une Librairie Processing permettant de contrôler le module Bluetooth du PC. Cependant au moment de l' | ||
+ | |||
+ | La solution est d' | ||
+ | |||
+ | Il existe plusieurs API JAVA permettant la gestion de la communication Bluetooth : | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ==== Quelques exemples ==== | ||
+ | Voici quelques exemples de programme utilisant l'API JAVAX : | ||
+ | |||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ==== Quelques vidéos ==== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||