Traitement des données
Sommaire du chapitre
Traitement des données
Branchements
Comme dit au chapitre appairage, il faut relier le « +5V » du module au 5 Volts de la carte Arduino et la masse du module à celle de la carte.
Ensuite, nous allons relier la broche TX du module à la broche 12 de la carte et la broche RX à la broche 10.
Voilà, le branchement est terminé.
Code Arduino
Afin de lire les données du module, nous allons "émuler" une voie série, en l’occurrence les broches 10 et 12.
C'est-à-dire que nous allons déclarer que ces broches recevront et enverront des données.
Pour cela, il faut utiliser la bibliothèque SoftwareSerial. Dans le logiciel Arduino, allez dans croquis puis inclure une bibliothèque et sélectionnez SotfwareSerial.

Maintenant, nous allons définir les broches du module (toujours avant le « void setup ») :
const int RX = 10;
const int TX = 12
Après ceci, il faut déclarer un objet SoftwareSerial qui prendra en argument respectivement les broches TX et Rx, un peu comme lors de la déclaration d'un écran LCD (« LiquidCrystal lcd (RS,E,D4,D5,D6,D7); »).
On obtient donc :
#include
const int RX = 10;
const int TX = 12;
SoftwareSerial crius(RX,TX);
Bien entendu, "crius" peut être remplacé par ce que vous voulez.
Ensuite, on déclare que la communication carte-module peut débuter avec "crius.begin(115200) ;"
Où 115200 correspond à la vitesse de transmission en bauds (comme "Serial.begin(115200);") ;
SoftwareSerial crius(RX,TX);
void setup()
crius.begin(115200);
Par la suite, en cas d'erreurs de transmission Bluetooth (pas de données...), il conviendra de vérifier le branchement des broches RX et TX (essayer de les intervertir) et d'éventuellement changer la vitesse de communication car certains modules communiquent à 9600 bauds !
Pour lire les données du module, ce sont presque les mêmes fonctions que pour le port série :
En effet :
Pour le port série :
Serial,begin(115200);
Serial.available();
Serial.read();
Serial.print();
Serial.println();
Pour le module Bluetooth :
crius,begin(115200);
crius.available();
crius.read();
crius.print();
crius.println();
Tant que des données (caractères) sont disponibles, nous allons les assembler en une chaîne de caractère (concaténation).
Ensuite, avec un if, nous allons voir si cette chaîne en question correspond par exemple à "a".
Si c'est la cas, nous allons appeler la fonction robot.enAvant(100);
Il faut donc définir un caractère x et une chaîne de caractère. Donc dans le programme Arduino, avant la fonction setup, on rajoute :
#include
const int RX = 10;
const int TX = 12;
char c;
String message;
La boucle while va permettre de lire les données : Dans la boucle loop : on écrit :
void loop() {
while()
//Fin while
}//Fin void loop
Maintenant que la boucle va attendre des données, il suffit de les lire et de les transformer en chaîne de caractère.
Pour cela :
on lit le premier caractère c
on définit que la chaîne message = message + c
void loop() {
while(crius.available()>0)
c = crius.read();
message = message + c;
//Fin while
}//Fin void loop
La structure conditionnelle est très simple :
Après la boucle « while », mettez :
void loop() {
while(crius.available()>0)
c = crius.read();
message = message + c;
//Fin while
if(message=="c")
message="";
Melodie(1);
//Fin if message=="c"
}//Fin void loop
« c » correspond au message envoyé par l'application lors de l'appui du bouton connexion.
Attention !!! il est important de vider la chaîne de caractère avec "message= '' '' ;", sinon, lorsque le module recevra un autre message (par exemple "s"), la chaîne sera égale à "cs"
Après avoir fait ceci pour les boutons connexion, avancer, droite, gauche, stop, batterie et reculer, voici le résultat :
void loop() {
while(crius.available()>0)
c = crius.read();
message = message + c;
//Fin while
if(message=="c")
message="";
Melodie(1);
//Fin if message=="c"
if(message=="c") message="";
Melodie(1);
else if(message=="a")message="";
robot.enAvant(100);
etatMoteurs=true;
else if(message=="r") message="";
robot.enArriere(100);
etatMoteurs=false;
else if(message=="d") message="";
robot.tourneDroite(100);
etatMoteurs=true;
else if(message=="g") message="";
robot.tourneGauche(100);
else if(message=="s") message="";
robot.arret();
else if(message=="b") message="";
TestBatterie();
else if(message=="A") gestion_mouvement();
}//Fin void loop
Pour finir, nous allons nous occuper de la partie automatique, qui s'activera avec l'appui sur le bouton auto.
Le début est le même, avec le if, en revanche, cette fois-ci, nous ne viderons pas la chaîne de caractère.
void gestion_mouvement() {
while(message=="A") {
robot.enAvant(100);
distance = moyenneMesure(30, A2);
fin_automatique();
if(distance>500) {
robot.tourneGauche(100);
delay(1500);
distance = moyenneMesure(30, A2);
fin_automatique();
if(distance>500) {
robot.tourneDroite(100);
delay(3000);
distance = moyenneMesure(30, A2);
fin_automatique();
if(distance>500)
robot.tourneGauche(100);
delay(1500);
elserobot.enAvant(100);
}
else robot.enAvant(100);
}
else robot.enAvant(100);
}//fin while
}//fin gestion mouvement
On remarque que dans cette fonction, il y a une boucle "while".
La boucle "while(message== "A") " s’exécutera tant que l'on n’appuiera pas sur un autre bouton ;
En effet, si j'appuie sur le bouton stop, la chaîne message ne sera plus égale à "A", la boucle "while" ne sera plus respectée et le robot s’arrêtera.
Afin de sortir de la boucle "while", il faut intercaler dans l'algorithme plusieurs fois une fonction fin\_automatique » qui comprend :
void fin_automatique() {
if(bluetooth.available()>0)
robot.arret();
message="";
etatMoteurs=false;
//fin if
}//fin fin_automatique
Dès qu'une donnée est présente, cela arrête le robot, vide la chaîne de caractère. Le programme revient donc à la boucle "while" de départ, au tout début du void loop.
Si vous voulez ajouter un bouton sur l'application, vous savez le faire. Pour ajouter ce bouton dans le code Arduino, il suffit de rajouter une ligne :
if(message=="valeur envoyée depuis l'application") message="";
action();