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/06/29 15:23] damien.muti [Capteur de distance Ultrason Grove] |
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 1: | Ligne 1: | ||
- | ====== ARDUINO : COMMENT ENVOYER DES DONNÉES DE TYPE FLOAT OU DOUBLE VIA LE PORT SÉRIE | + | ====== ARDUINO : COMMENT ENVOYER DES DONNÉES DE TYPE FLOAT, DOUBLE |
* 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 | ||
- | |||
- | -----------------------------A terminer : voir tutoriel " | ||
===== introduction ===== | ===== introduction ===== | ||
- | + | ==== Les modes de communications entre Arduino et Processing ==== | |
- | Dans ce tutoriel, | + | La communication via le port série de la carte **Arduino** utilise principalement deux fonctions : |
- | ===== Capteurs | + | * [[https:// |
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | Lorsque la carte Arduino communique avec le logiciel **Processing**, | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | ==== Problème | ||
+ | |||
+ | 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 | ||
+ | |||
+ | ==== Solution 1 : envoi d'une String ==== | ||
+ | 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' | ||
+ | |||
+ | 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] = inByte; | ||
+ | serialCount++; | ||
+ | |||
+ | // If we have nbBytes=2 bytes: | ||
+ | if (serialCount > nbBytes-1 ) { | ||
+ | // concaténer les deux octets reçus | ||
+ | donneePortSerie = int(serialInArray[0] << 8) + int(serialInArray[1]) ; | ||
+ | |||
+ | // print the values (for debugging purposes only): | ||
+ | // | ||
+ | println(" | ||
+ | |||
+ | // Send a capital A to request new sensor readings: | ||
+ | myPort.write(' | ||
+ | // Reset serialCount: | ||
+ | serialCount = 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||