Catégorie « Serial »


Cette catégorie regroupe des sketchs traitant de la communication entre l’Arduino Uno et l’ordinateur hôte par liaison série.

 

1. Serial_Char_Send (Programme pour la réception d’un caractère par l’Arduino)

 

La fonction ”print()” de la classe ”Serial” permet d’envoyer des données depuis la carte Arduino vers le moniteur série.

Il est également possible d’envoyer des données du moniteur série vers la carte Arduino.

Dans cette activité, le code demande à l’utilisateur de saisir un caractère dans le moniteur série:

. ‘R’, ‘V’ ou ‘B’ pour allumer respectivement la DEL rouge, verte ou bleue
. ‘0’ pour éteindre les DELs

Le caractère envoyé est lu et l’action correspondante est effectuée. Le programme ne fait rien si le caractère lu n’est pas un des caractères attendus.

const int PinLEDR = 11;
const int PinLEDB = 10;
const int PinLEDV = 9;

const char LedR = ‘R’;
const char LedV = ‘V’;
const char LedB = ‘B’;
const char Off = ‘0’;
char c=’ ‘;

void setup() {
Serial.begin(9600);
pinMode (PinLEDR, OUTPUT);
pinMode (PinLEDB, OUTPUT);
pinMode (PinLEDV, OUTPUT);
Serial.println (”Pour allumer la DEL rouge, envoyer: R”);
Serial.println (”Pour allumer la DEL verte, envoyer: V”);
Serial.println (”Pour allumer la DEL bleue, envoyer: B”);
Serial.println (”Pour eteindre les DELs, envoyer: 0”);
}

void loop() {
if (Serial.available() > 0) {
c = Serial.read();
}

if (c == LedR) {
Serial.println (c);
digitalWrite(PinLEDR,1);
digitalWrite(PinLEDV,0);
digitalWrite(PinLEDB,0);
}
if (c == LedV) {
Serial.println (c);
digitalWrite(PinLEDR,0);
digitalWrite(PinLEDV,1);
digitalWrite(PinLEDB,0);
}
if (c == LedB) {
Serial.println (c);
digitalWrite(PinLEDR,0);
digitalWrite(PinLEDV,0);
digitalWrite(PinLEDB,1);
}
if (c == Off) {
Serial.println (c);
digitalWrite(PinLEDR,0);
digitalWrite(PinLEDV,0);
digitalWrite(PinLEDB,0);
}
Serial.flush();
c=’ ‘;
}

 

2. Serial_Conversion_atoi (Conversion d’une chaine de charactères en nombre par la fonction atoi())

 

Dans les programmes pour Arduino, Il est souvent nécessaire de convertir des chaines de caractères en une variable représentant un nombre entier ou à virgule pour effectuer des calculs.

Il existe, pour cela, trois fonctions ”atoi()”, ”atol()” et ”atof()”, permettant respectivement de transformer une chaine de caractères en nombre entier court, en nombre entier long et en nombre à virgule.

Attention cependant, car par défaut ces fonctions retournent une valeur nulle en cas d’erreur (comme par exemple, si on essaye de convertir des lettres en nombre) et donc se pose le problème de savoir si la valeur retournée est bien un zéro saisi ou un zéro d’erreur…

En application, ce programme, utilisant la fonction ”atoi()”, permet de régler la luminosité de la
DEL rouge du circuit d’étude, en retour d’une chaine de caractères envoyé depuis le moniteur série dont la conversion en nombre entier doit être compris entre 1 et 255.

const int PinLEDR = 11;
int Luminosite = 0;


void setup() {
Serial.begin(9600);
pinMode (PinLEDR, OUTPUT);
digitalWrite(PinLEDR,0);
}

void loop() {
while(Luminosite<1 || Luminosite>255)
{
int Val=0;
char tampon[10]=””;
Serial.println(”Veuillez saisir la luminosite de la DEL rouge (valeur entre 1 et 255):”);
while(!Val)
{
delay(200);
Val=Serial.available();
}
for (int i=0; i < Val; i++)
{
tampon[i]=Serial.read();
delay(15);
}
Luminosite = atoi(tampon);
}
Serial.print(”Luminosite de la DEL rouge choisie : ”); Serial.println(Luminosite);
Serial.println(””);
analogWrite(PinLEDR,Luminosite);
Luminosite=0;
}

 

3. Serial_Conversion_parseInt (Conversion d’une chaine de charactères en nombre par la fonction parseInt())

 

Dans les programmes pour Arduino, Il est souvent nécessaire de convertir des chaines de caractères en une variable représentant un nombre entier ou à virgule pour effectuer des calculs.

Avec les méthodes de conversion utilisant les fonctions « atoi() » et « sscanf() », les chaines de caractères envoyés depuis le moniteur série sont dans un premier temps reçue telles quelles par l’Arduino puis sont converties en nombre si celles-ci le permettent.

Il est également possible de convertir directement les chaines de caractères en entier long avant la réception par l’Arduino avec la fonction ”parseInt()” de la classe ”Serial”

Cette fonction retourne le premier entier long du tampon de la liaison série. Les caractères lettres ou le signe ”-” sont ignorés. Au-delà, d’un certain temps (par défaut, 1 s), la fonction se termine et retourne « 0 « . Le temps d’attente pour recevoir les données peut être réglé avec la fonction « setTimeout() » en ms.

En application, le programme suivant, utilisant la fonction ”parseInt()”, permet de régler la luminosité de la DEL rouge du circuit d’étude, en retour d’une chaine de caractères envoyé depuis le moniteur série dont la conversion en nombre entier doit être compris entre 1 et 255.

const int PinLEDR = 11;
int Luminosite = 0;

void setup() {
Serial.begin(9600);
pinMode (PinLEDR, OUTPUT);
digitalWrite(PinLEDR,0);
Serial.println(”Veuillez saisir la luminosite de la DEL rouge (valeur entre 1 et 255):”);
Serial.println(””);
Serial.setTimeout(100);
}

void loop() {
while(Luminosite<1 || Luminosite>255)
{
Luminosite=Serial.parseInt();
}
Serial.print(”Luminosite de la DEL rouge choisie : ”); Serial.println(Luminosite);
Serial.println(””);
analogWrite(PinLEDR,Luminosite);
Luminosite=0;
}

 

4. Serial_Conversion_sscanf (Conversion d’une chaine de charactères en nombre par la fonction sscanf()

 

Dans les programmes pour Arduino, Il est souvent nécessaire de convertir des chaines de caractères en une variable représentant un nombre entier ou à virgule pour effectuer des calculs.

Après la fonction ”atoi()”, une autre méthode de conversion est d’utiliser la fonction ”sscanf()” qui
permet de couper et de convertir une chaine de caractères en une série de variables allant du caractère unique (type ”char”) au nombres décimaux (type ”int”, ”float”).

En application, ce programme, utilisant la fonction ”sscanf()”, permet de régler la luminosité de la
DEL rouge du circuit d’étude, en retour d’une chaine de caractères envoyé depuis le moniteur série dont la conversion en nombre entier doit être compris entre 1 et 255.

const int PinLEDR = 11;
int Luminosite = 0;


void setup() {
Serial.begin(9600);
pinMode (PinLEDR, OUTPUT);
digitalWrite(PinLEDR,0);
}

void loop() {
while(Luminosite<1 || Luminosite>255)
{
int Val=0;
char tampon[10]=””;
Serial.println(”Veuillez saisir la luminosite de la DEL rouge (valeur entre 1 et 255):”);
while(!Val)
{
delay(200);
Val=Serial.available();
}
for (int i=0; i < Val; i++)
{
tampon[i]=Serial.read();
delay(15);
}
int N=0;
char c;
N = sscanf(tampon, ”%d %c”, &Luminosite, c);
if (N!=1){
Luminosite=0;
}
}
Serial.print(”Luminosite de la DEL rouge choisie : ”); Serial.println(Luminosite);
Serial.println(””);
analogWrite(PinLEDR,Luminosite);
Luminosite=0;
}

 

5. Serial_String (Programme pour la réception d’une chaine de caractères)

 

La réception d’une chaine de caractères envoyée depuis le moniteur série, peut être considérée comme un envoi successif de caractères uniques que l’on peut stocker dans un tableau de caractères afin de reconstituer la chaine.

Dans cette activité, le code demande à l’utilisateur de saisir une chaine de caractères dans le moniteur série.

La chaine de caractère saisie est ensuite affichée.

void setup() {
Serial.begin(9600);
}

void loop() {
int Val=0;
char tampon[20]=””;
Serial.println(”Veuillez saisir une chaine de caracteres.”);
while(Val==0)
{
delay(200);
Val=Serial.available();
}
for (int i=0; i < Val; i++)
{
tampon[i]=Serial.read();
delay(15);
}
Serial.println(”La chaine de caracteres recue est:”);
Serial.println(tampon);
Serial.flush();
}

 

6. Serial_readString (Programme pour la réception d’une chaine de caractères)

 

Une autre méthode pour recevoir une chaine de caractères depuis le moniteur série est d’utiliser la fonction ”readString()” qui lit les caractères contenus dans la mémoire tampon du port série et retourne une chaine de caractère. Au-delà, d’un certain temps (par défaut, 1 s), la fonction se termine. Le temps d’attente pour recevoir les données peut être réglé avec la fonction ”setTimeout()” en ms.

Dans cette activité, on va demander à l’utilisateur d’envoyer un message. Si le message est ”ON”, la DEL rouge s’allume, et si c’est ”OFF”, la DEL rouge s’éteint.

const int PinLEDR = 11;
String msg=””;

void setup() {
Serial.begin(9600);
pinMode (PinLEDR, OUTPUT);
Serial.println (”Pour allumer la DEL rouge, envoyer: ON”);
Serial.println (”Pour eteindre la DEL rouge, envoyer: OFF”);
Serial.setTimeout(100);
}

void loop() {
if (Serial.available() > 0) {
msg = Serial.readString();
}
if (msg == ”ON”) {
Serial.println (msg);
digitalWrite(PinLEDR,1);
}
if (msg == ”OFF”) {
Serial.println (msg);
digitalWrite(PinLEDR,0);
}
Serial.flush();
msg=””;
}