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:14] damien.muti [Montage] |
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 25: | Ligne 25: | ||
| 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 | ||
| ==== Montage ==== | ==== Montage ==== | ||
| On utilise un [[wiki: | On utilise un [[wiki: | ||
| - | Le montage est le [[wiki: | + | Il convient de brancher le capteur Grove sur l' |
| {{ : | {{ : | ||
| - | + | ==== Solution 1 : envoi d'une String ==== | |
| - | ==== code Arduino | + | === code Arduino === |
| Le code Arduino est le suivant : | Le code Arduino est le suivant : | ||
| < | < | ||
| Ligne 55: | Ligne 63: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | 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've | ||
| + | // 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; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||