Outils pour utilisateurs

Outils du site


wiki:tutoriels:arduino:evoyer_float_via_port_serie

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:arduino:evoyer_float_via_port_serie [2020/11/05 10:44]
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 25: Ligne 25:
 Ceci contraint fortement le dialogue entre la carte Arduino et le logiciel Processing car, dès lors, il n'est possible  d'envoyer et de recevoir que des nombres entiers compris entre 0 et 255. Ceci contraint fortement le dialogue entre la carte Arduino et le logiciel Processing car, dès lors, il n'est possible  d'envoyer et de recevoir que des nombres entiers compris entre 0 et 255.
  
-==== Solution ====+==== 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 (//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. 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.
  
Ligne 33: Ligne 33:
   * [[https://forum.processing.org/one/topic/converting-string-to-int.html|Forum Processing : Converting String to int]]   * [[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 =====+==== Solution 2 : envoi des différents octets ==== 
 +Une autre solution est d'envoyer les différents octets composant le nombre (//float, int, long, double//, etc.) sur le port série via la méthode [[https://www.arduino.cc/reference/en/language/functions/communication/serial/write/|Serial.write()]], du coté de la carte Arduino. Par exemple, un //int// sous Arduino est codé sur deux octets. Il suffira donc d'envoyer les deux octets départements, l'un à la suite de l'autre. 
 + 
 +Du coté de la réception sur l'application Processing, on réceptionne les différents octets correspondant au nombre envoyé par la carte. On concatène les octets reçus dans la variable adéquate.   
 + 
 +===== Application : 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 39: Ligne 44:
 {{ :wiki:tutoriels:arduino-capteurs:capteur_dist_ultrason_arduino_connection_grove.jpg?400 |}} {{ :wiki:tutoriels:arduino-capteurs:capteur_dist_ultrason_arduino_connection_grove.jpg?400 |}}
  
- +==== Solution 1 : envoi d'une String ==== 
-==== code Arduino ====+=== code Arduino ===
 Le code Arduino est le suivant : Le code Arduino est le suivant :
 <code> <code>
Ligne 61: Ligne 66:
 Le code est disponible sur le lien suivant : {{ :wiki:tutoriels:arduino:ultrasonic_envoie_donn_es_port_serie.ino.zip |}}  Le code est disponible sur le lien suivant : {{ :wiki:tutoriels:arduino:ultrasonic_envoie_donn_es_port_serie.ino.zip |}} 
  
-==== code Processing ====+=== code Processing ===
 Le code Processing est le suivant : Le code Processing est le suivant :
  
Ligne 115: Ligne 120:
  
 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:arduino:lecture_donnees_port_serie.pde.zip |}}
 +
 +==== 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:tutoriels:processing:processing_9:processing_9|objets interactifs]]. 
 +
 +=== code Arduino ===
 +Le code Arduino est le suivant : {{ :wiki:tutoriels:arduino:ultrasonic_envoie_donnees_port_serie_1.zip |}}
 +
 +<code>
 +#include "Ultrasonic.h"
 +
 +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();  // send a byte to establish contact until receiver responds
 +
 +  // création du tableau d'octets 
 +}
 +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("distance=");
 +      Serial.print(distance);//0~400cm
 +      Serial.println("cm");
 +    }
 +    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);// octet de poids faible
 +      
 +      
 +    }
 +    //delay(10);
 +  }
 +}
 +
 +void establishContact() {
 +  while (Serial.available() <= 0) {
 +    Serial.print('A');   // send a capital A
 +    delay(300);
 +  }
 +}
 +</code>
 +=== code Processing ===
 +Le programme global correspondant à un [[wiki:tutoriels:processing:processing_9:processing_9|objet interactif]] est le suivant : {{ :wiki:tutoriels:arduino:detection_porte_2.zip |}}
 +
 +
 +Nous ne présentons ici que la partie de réception des données par la méthode //serialEvent()//. Le code Processing est le suivant : 
 +
 +<code>
 +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've
 +  // had first contact from the microcontroller. 
 +  // Otherwise, add the incoming byte to the array:
 +  if (firstContact == false) {
 +    if (inByte == 'A') { 
 +      myPort.clear();          // clear the serial port buffer
 +      firstContact = true;     // you've had first contact from the microcontroller
 +      myPort.write('A');       // ask for more
 +    } 
 +  } 
 +  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(serialInArray[0] + "\t" + serialInArray[1]+"\t" + donneePortSerie);
 +      println("distance=" + donneePortSerie + "cm");
 +
 +      // Send a capital A to request new sensor readings:
 +      myPort.write('A');
 +      // Reset serialCount:
 +      serialCount = 0;
 +    }
 +  }
 +}
 +</code>
 +
wiki/tutoriels/arduino/evoyer_float_via_port_serie.1604569491.txt.gz · Dernière modification: 2020/11/05 10:44 de damien.muti