ARDUINO : COMMENT ENVOYER DES DONNÉES DE TYPE FLOAT, DOUBLE OU INT SUPÉRIEUR 255 VIA LE PORT SÉRIE

Porteur(s) du projet : Damien MUTI DESGROUAS

Date : 26/03/2020

Licence : libre !

Contexte : Apprentissage

introduction

Les modes de communications entre Arduino et Processing

La communication via le port série de la carte Arduino utilise principalement deux fonctions :

Serial.write() : Écrit des données binaires sur le port série. Ces données sont envoyées sous forme d'octet ou de série d'octets.

Serial.print() : Imprime les données sur le port série sous forme de texte ASCII lisible par l'homme. Cette commande peut prendre plusieurs formes. Les nombres sont imprimés en utilisant un caractère ASCII pour chaque chiffre. Les flottants sont imprimés de la même manière sous forme de chiffres ASCII, avec par défaut deux décimales. Les octets sont envoyés sous la forme d'un seul caractère. Les caractères et les chaînes sont envoyés tels quels.

Serial.println() : Imprime les données sur le port série sous forme de texte ASCII lisible par l'homme suivi d'un caractère de retour chariot (ASCII 13 ou '\ r') et d'un caractère de nouvelle ligne (ASCII 10 ou '\ n'). Cette commande prend les mêmes formes que Serial.print().

Lorsque la carte Arduino communique avec le logiciel Processing, ce dernier utilise la librairie Serial. Pour lire une donnée sur le port série il est possible d'utiliser plusieurs méthodes :

read() : Cette méthode renvoie un nombre compris entre 0 et 255 codé uniquement sur un octet. Elle renvoie -1 lorsque le port est vide et qu'il n'y a aucune donnée reçue. Pour contourner ce dernier problème, il convient d'abord de tester si une donnée est disponible sur le port série grâce à la méthode available().

readString() : Cette méthode renvoie toutes les données contenue dans le buffer du port série sous forme de d'une chaîne de caractère (String) ou renvoie null aucune donnée n'est disponible sur le port série. Cette méthode suppose que les caractères entrants sont codés en ASCII.

Problème

Pour envoyer des nombres, Arduino est contraint de les coder uniquement sur un octet, via la méthode Serial.write(). De même, le logiciel Processing ne peut recevoir que des nombres codés sur un octet via la méthode read() issue de la librairie Serial.

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

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 Serial.print(), du coté de la carte Arduino.

Du coté de la réception sur l'application Processing, la chaîne de caractère envoyée par la carte Arduino sur le port série est d'abord lue par la méthode readString() de la librairie Serial. Ensuite, la chaîne est convertie en un entier grâce à la méthode int(), ou en un nombre flottant grâce à la méthode float().

Mise en œuvre : Envoie de la distance lue par un capteur à ultrason

Montage

On utilise un capteur à ultrason Grove pour mesurer une distance. On envoie ensuite la distance mesurée à l'application Processing. Il convient de brancher le capteur Grove sur l'entrée digitale D7. Le montage est le suivant :

code Arduino

Le code Arduino est le suivant :

#include "Ultrasonic.h"
Ultrasonic ultrasonic(7);
void setup() {
Serial.begin(9600);
}
void loop() {
long distance;
distance = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(distance);//0~400cm
//Serial.println(" cm");
delay(250);
}