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:arduino:evoyer_float_via_port_serie [2020/11/04 18:00] damien.muti | wiki:tutoriels:arduino:evoyer_float_via_port_serie [2021/06/16 08:50] (Version actuelle) damien.muti [Solution 2 : envoi des différents octets] | ||
|---|---|---|---|
| Ligne 2: | Ligne 2: | ||
| * Porteur(s) du projet :  Damien MUTI DESGROUAS | * Porteur(s) du projet :  Damien MUTI DESGROUAS | ||
| - | * Date : 26/03/2020 | + | * Date : 03/11/2020 | 
| * Licence : libre ! | * Licence : libre ! | ||
| * Contexte : Apprentissage | * Contexte : Apprentissage | ||
| Ligne 21: | Ligne 21: | ||
| ==== Problème ==== | ==== Problème ==== | ||
| - | Pour envoyer des nombres, Arduino est contraint de les coder uniquement sur un octet, via la méthode | + | Pour envoyer des nombres, Arduino est contraint de les coder uniquement sur un octet, via la méthode [[https:// | 
| Ceci contraint fortement le dialogue entre la carte Arduino et le logiciel Processing car, dès lors, il n'est possible | Ceci contraint fortement le dialogue entre la carte Arduino et le logiciel Processing car, dès lors, il n'est possible | ||
| - | ==== Solution ==== | + | ==== Solution | 
| - | 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 (// | + | 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 (// | 
| - | Du coté de la réception sur l' | + | Du coté de la réception sur l' | 
| - | ===== Mise en œuvre | + | Référence : | 
| + | * [[https:// | ||
| + | |||
| + | ==== Solution 2 : envoi des différents octets | ||
| + | Une autre solution est d' | ||
| + | |||
| + | Du coté de la réception sur l' | ||
| + | |||
| + | ===== Application : Envoie de la distance lue par un capteur à ultrason ===== | ||
| + | ==== Montage ==== | ||
| + | On utilise un [[wiki: | ||
| + | Il convient de brancher le capteur Grove sur l' | ||
| + | {{ : | ||
| + | |||
| + | ==== Solution 1 : envoi d'une String ==== | ||
| + | === code Arduino === | ||
| + | Le code Arduino est le suivant : | ||
| + | < | ||
| + | #include " | ||
| + | |||
| + | Ultrasonic ultrasonic(7); | ||
| + | void setup() { | ||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | void loop() { | ||
| + | long distance; | ||
| + | |||
| + | distance = ultrasonic.MeasureInCentimeters(); | ||
| + | Serial.print(distance);// | ||
| + | // | ||
| + | delay(250); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Le code est disponible sur le lien suivant : {{ : | ||
| + | |||
| + | === code Processing === | ||
| + | Le code Processing est le suivant : | ||
| + | |||
| + | < | ||
| + | /* | ||
| + | références : https:// | ||
| + | */ | ||
| + | |||
| + | import processing.serial.*; | ||
| + | |||
| + | Serial myPort; | ||
| + | String | ||
| + | int inEntier; | ||
| + | |||
| + | void setup() { | ||
| + | size(200, 200); | ||
| + | // 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. | ||
| + | |||
| + | // Print a list of the serial ports, for debugging purposes: | ||
| + | printArray(Serial.list()); | ||
| + | |||
| + | String portName = Serial.list()[32]; | ||
| + | myPort = new Serial(this, | ||
| + | } | ||
| + | |||
| + | void draw() { | ||
| + | // 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 | ||
| + | println(" | ||
| + | inEntier=int(inBuffer); | ||
| + | println(" | ||
| + | } | ||
| + | |||
| + | // test des données | ||
| + | color c ; | ||
| + | if (inEntier< | ||
| + | c = color(255, | ||
| + | } | ||
| + | else{ | ||
| + | c = color(0, | ||
| + | } | ||
| + | fill(c); | ||
| + | rect(0, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Le code est disponible sur le lien suivant : {{ : | ||
| + | |||
| + | ==== Solution 2 : envoi des différents octets ==== | ||
| + | |||
| + | Le projet global consiste à lancer un événement (vidéo, son, animation) lorsque la distance détectée est inférieure à un seuil, ou sur une certaine plage de distance. Ce programme est inspiré de celui effectué sur pour les [[wiki: | ||
| + | |||
| + | === code Arduino === | ||
| + | Le code Arduino est le suivant : {{ : | ||
| + | |||
| + | < | ||
| + | #include " | ||
| + | |||
| + | Ultrasonic ultrasonic(7); | ||
| + | int distance =354; | ||
| + | int inByte = 0; // incoming serial byte | ||
| + | // debug | ||
| + | boolean debug = false; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(9600); | ||
| + | while (!Serial) { | ||
| + | ; // wait for serial port to connect. Needed for native USB port only | ||
| + | } | ||
| + | establishContact(); | ||
| + | |||
| + | // création du tableau d' | ||
| + | } | ||
| + | void loop() { | ||
| + | if (Serial.available() > 0) { | ||
| + | // get incoming byte: vider le port série | ||
| + | inByte = Serial.read(); | ||
| + | // lire la valeur de la distance | ||
| + | distance = ultrasonic.MeasureInCentimeters(); | ||
| + | // envoyer la distance sur la port série sous la forme d'une chaine de caractères | ||
| + | if (debug) { | ||
| + | Serial.print(" | ||
| + | Serial.print(distance);// | ||
| + | Serial.println(" | ||
| + | } | ||
| + | else { // envoie des données brutes : un int est sur 2 octets | ||
| + | Serial.write(0xFF & distance >> 8);// octet de poids fort | ||
| + | Serial.write(0xFF & distance);// | ||
| + | |||
| + | |||
| + | } | ||
| + | // | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void establishContact() { | ||
| + | while (Serial.available() <= 0) { | ||
| + | Serial.print(' | ||
| + | delay(300); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | === code Processing === | ||
| + | Le programme global correspondant à un [[wiki: | ||
| + | |||
| + | |||
| + | Nous ne présentons ici que la partie de réception des données par la méthode // | ||
| + | |||
| + | < | ||
| + | void serialEvent(Serial myPort) { | ||
| + | // 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' | ||
| + | // 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] | ||
| + | serialCount++; | ||
| + | |||
| + | // If we have nbBytes=2 bytes: | ||
| + | if (serialCount > nbBytes-1 ) { | ||
| + | // concaténer les deux octets reçus | ||
| + | donneePortSerie | ||
| + | |||
| + | // print the values (for debugging purposes only): | ||
| + | // | ||
| + | println(" | ||
| + | |||
| + | // Send a capital A to request new sensor readings: | ||
| + | myPort.write(' | ||
| + | // Reset serialCount: | ||
| + | serialCount | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||