Le Cocci-Bot et le Bluetooth
Introduction
Présentation
Ce tutoriel a pour objectif de créer une application pour diriger le robot en Bluetooth.
L’application enverra des « commandes » au module Bluetooth de type Crius
Cette application se fera à l’aide du logiciel en ligne «App Inventor 2», qui se divise en deux parties :
- une partie dédiée exclusivement à l’interface graphique
- une seconde partie dédiée à la gestion des données et à leurs envois/réceptions
(positionnement des boutons, etc).
\noindent
Nous verrons donc comment faire une interface spécifique pour le Cocci-Bot.
Remarque importante
Il est impératif que le téléphone portable tactile soit sous le système d’exploitation Android et qu’il dispose de la fonctionnalité Bluetooth
Par exemple, si j’appuie sur un bouton «avancer», je veux que l’application envoie en Bluetooth la donnée qui permettra à l’Arduino de comprendre l’instruction à l’aide du module Bluetooth.
Liste du matériel
Pour cette première partie, nous aurons besoin de :
- Un téléphone portable, comme dit précédemment, étant tactile et fonctionnant sous Android. Les dimensions importent peu, pourvu que celui-ci dispose du mode Bluetooth
- Un module Bluetooth de type Crius (Alimentation en 5V)
- Une carte Arduino
- Des fils de connexion pour brancher le module à la carte
- Une connexion internet
Et c’est tout… pour le moment.
Cahier des Charges
Maintenant que nous avons la liste du matériel nécessaire, ce serait bien de mettre en place un cahier des charges afin de savoir ce que le robot sera capable de faire…
1) L’application devra se connecter au module Bluetooth du robot.
Pour cela, on se connectera à un module en passant par la liste des modules Bluetooth disponibles.
Cette méthode permet de se connecter sans avoir l’adresse MAC. En revanche, l’étape de l’appairage est indispensable. (Chapitre \ref{appairage})
2) Le robot devra être contrôlé de façon manuelle, il y aura donc 5 boutons de commande :
- 1 bouton «Avancer»
- 1 bouton «Reculer»
- 1 bouton «Droite»
- 1 bouton «Gauche»
- 1 bouton «Stop»
3) Le robot devra également se diriger de façon autonome grâce à ses capteurs (distance, lumière). Il y aura donc un bouton «automatique» pour déclencher ce mode.
Application facultative
Le robot pourra également indiquer l’état de la batterie (en \%, sur l’écran LCD) par simple appui d’un bouton. Cette section ne sera pas abordée içi.
\index{Appairage}
Point-clé
Avant de créer l’application, il faut tout d’abord que le portable puisse reconnaître le module Bluetooth. Pour cela, il faut «l’appairer», c’est à dire que l’on va définir que le module sera apte à recevoir les données envoyées par le portable. Cette étape est très rapide et ne sera effectuée qu’à chaque changement de module Bluetooth.
1) Tout d’abord, branchez le module : la broche +5V du module est reliée à la broche 5V de la carte Arduino et la broche GND du module est reliée à la GND de la carte.
2) Démarrez le Bluetooth sur votre téléphone portable puis allez dans paramètres > Bluetooth
Faites « rechercher » afin de trouver un périphérique.
Vous devriez trouver un périphérique « BT Crius ». Cliquez dessus et faites « associer ».
A ce moment là, on vous demandera un mot de passe, qui par défaut, est 0000 (ou 1234).
Lorsqu’il est entré, faites « valider » et au bout de quelques secondes, le clignotement du module devrait se stopper pour qu’il n’y ait qu’une lumière continue
Et voila, le module est appairé.
Préparation
\index{App Inventor}
Maintenant que nous nous sommes assurés que la communication s’effectuera, il est temps de faire l’application et de préparer notre outil (enfin, me direz-vous!)
\noindent
Tout d’abord, saisissez dans un moteur de recherche l’adresse suivante :
http://appinventor.mit.edu/ (Site App Inventor 2» )
Une page comme ceci devrait apparaître :
Ensuite, cliquez en haut à gauche sur : Create App
Cela devrait vous diriger vers ceci :
Puis connectez vous avec votre compte Google (ou Gmail). Si vous n’en avez pas, sa création est rapide… (create account).
Vous tombez ensuite sur une interface similaire :
\noindent
Pour démarrer votre projet, cliquez sur « Start new project » (onglet « Projects »)et là, cette page apparaît :
\noindent
Avant toute chose, réglez la langue du site en français. Pour cela, sélectionnez l’onglet English et choisissez « français ».
Sauvegarde du projet
Avant toute chose, voici une étape non négligeable : la sauvegarde du projet
Remarque importante
L’application App Inventor étant en ligne, un problème de réseau peut ruiner votre projet en cas de mauvaise sauvegarde. Il convient de sauvegarder régulièrement votre travail
Il faut se reporter au menu du haut et aller dans Projets puis Enregistrer le projet
Quant à l’interface, un petit tour d’horizon s’impose.
Présentation des éléments graphiques
Par convention, dans ce tutoriel :
- la partie orange sera la partie menu
- la partie bleue sera l’interface
- la partie grise sera la partie composants
- la partie verte sera la partie propriétés
- la partie rouge garde son nom : blocks
- la partie magenta est la partie « graphique » (regroupement des quatre premières parties
Maintenant, prenons un \colors{orange}{sélectionneur de liste} dans le menu, et faisons le glisser sur l’interface.
Pour cela, maintenez enfoncé le« sélectionneur de liste » dans le menu et faites le glisser sur l’écran virtuel. Relâchez ensuite la souris. On obtient :
Veuillez cliquer sur Sélecteur\_de\_list1
Principaux elements
Maintenant, on peut voir que le menu offre plusieurs choix d’objets. Voici les plus importants :
Il vous est notamment possible de faire les actions suivantes :
- Créer un bouton
- Créer une case à cocher
- Sélectionner une date
- Afficher une image
- Afficher du texte
- Créer une liste de selection
- Créer une liste classique
- Envoyer une notification
- Afficher un curseur
- Créer une zone de saisie de texte (mot de passe…)
- Sélectionner l’heure
Présentation des propriétés
Nous allons présenter les propriétés principales des composants mis à notre disposition.
\noindent
Tout d’abord, gardez le \colors{orange}{sélectionneur de liste} sur l’écran.
Ensuite, pour centrer la liste, allez dans le menu composants, sélectionnez screen 1.
Dans l’onglet propriété → alignement horizontal, sélectionner la liste sur centrer.
Vous pouvez également changer la forme du bouton.
Allez dans \colors{gray}{Composants} → sélectionneur de liste et dans Propriétés, trouvez l’onglet forme
et sélectionnez celle voulue.
Voici quelques paramètres de mise en forme :
- Vous pouvez modifier la couleur de la liste en sélectionnant Couleur de fond
- Pour modifier la taille de la liste, il suffit de rentrer la taille en pixels ou en \% de l’écran (Hauteur, Largeur) Il vaut mieux préciser en \% afin que l’application soit compatible au niveau du format sur tous les appareils.
Enfin, pour décider du titre de la liste sur l’application, sélectionner la liste Selectionneur\_de\_liste1 et dans ses propriétés, modifier l’onglet texte et écrivez, par exemple « Connexion »
Renommer les élements
Dans un souci de clarté, il convient de renommer les éléments que nous plaçons sur l’écran.
Pour renommer le sélectionneur de liste, il faut allez dans les composants de l’interface, et sélectionnez « Renommer »
Je l’ai renommé en « connexion ».
Astuce
Pour changer la couleur d’arrière-plan de l’application, allez dans composants → screen1 et dans propriétés, sélectionnez couleur de fond
Ajouter un client Bluetooth
Par la suite, nous allons utiliser le client Bluetooth d’App Inventor.
Pour le trouver, il suffit d’explorer le menu latéral. Un ensemble d’éléments est disponible à la suite des principaux éléments énumérés dans la section \ref{menu}.
Le client Bluetooth se situe dans la section Connectivité
Pour l’ajouter à noter application, il suffit de glisser le client Bluetooth sur l’interface.
A ce moment là, sous l’écran virtuel, le client Bluetooth apparaît.
Et voila, le client Bluetooth est mis en place.
Premier rendu et agencement des élements
En faisant toutes ces étapes, on obtient :
En ajoutant un bouton (glisser-déposer un bouton disponible dans le menu latéral) et en modifiant ses propriétés (forme, couleur…), on obtient ceci :
Générer un espace entre deux élements
On souhaite maintenant espacer le bouton « Connexion » et le bouton « Avancer »
Rien de plus simple ! Il suffit de placer un élément label
(outil dans menu) entre les deux boutons puis de
choisir ses dimensions, ce qui correspondra à l’espacement des boutons.
Pour que le label ne soit pas visible, il suffira de mettre son texte vide.
Et voilà le résultat :
Alignement des éléments
Maintenant, ce serait bien de pouvoir aligner des boutons (ou autre)
horizontalement afin d’obtenir quelque chose comme ceci :
Ne vous inquiétez pas, le cadre noir n’apparaîtra pas sur l’application ; c’est juste un moyen de distinguer les alignements.
Pour faire ceci, allez dans le menu et sélectionnez l’onglet Disposition
Une fenêtre comme ceci apparaît :
Ensuite, faites glisser l’outil Arrangement Horizontal
sous la liste « Connexion » et vous devriez avoir ceci :
Vous pouvez dorénavant faire glisser des boutons dans ce carré et ils se mettront automatiquement côte à côte. Il suffit de régler la taille des boutons sélectionnés dans propriétés.
Astuce
Il est possible de changer les dimensions de l’outil « Arrangement Horizontal »
En revanche, il y a un fond blanc pour l’objet Arrangement Horizontal :
En allant dans les propriétés de l’objet Arrangement Horizontal, mettez la couleur d’arrière-plan en « aucun »
Mise en place de l’ensemble des boutons
Après avoir mis les boutons « Droite« , « Stop« , « Gauche« , « Reculer« , « Batterie » et « Auto » et mis un peu de couleur, vous pouvez obtenir une interface de ce type :
Remarque importante
Par la suite, veuillez mettre l’arrière-plan de « connexion » en rouge (non représenté ici)
Nous avons réalisé et mis en place tous nos élément graphiques. Il ne nous reste donc plus qu’a les faire interagir afin d’envoyer les données Bluetooth.
\noindent
Pour cela, commencez par aller dans la section Bloc, disponible en haut à droite de la page
\newpage
Présentation
A l’ouverture du menu Bloc, voici le rendu
Sur le menu de gauche, nous retrouvons une liste de blocs
mais également nos élements graphiques agencés précédemment :
En cliquant sur chaque onglet (Contrôle, Logique, Math…), une liste de blocs apparaît :
(ici, en cliquant sur Contrôle)
Tous ces blocs sont faits pour pouvoir être glissés dans la partie blanche centrale…
Configuration de la liste des périphériques Bluetooth
Principe
Nous allons configurer notre liste Connexion afin qu’elle nous indique les modules Bluetooth disponibles.
Cette étape se fera en deux temps :
- Configuration de la liste avant le choix de l’utilisateur
- Mise à jour de la liste après le choix de l’utilisateur
Commencer par sélectionner la liste Connexion dans le menu latéral
Le menu suivant apparaît :
- Le « Quand connexion.Avant prise » représente le bloc qui contiendra les instructions de la liste, c’est à dire que dans ce bloc, nous annoncerons que la liste contiendra toutes les adresses Bluetooth disponibles.
- Le « Quand connexion.Après prise » représente le bloc d’instructions après avoir choisi le module Bluetooth dans la liste. Dans ce bloc, après avoir récupéré l’adresse du module, nous nous connecterons à ce dernier.
Il faut donc placer ces deux blocs dans la zone blanche (glisser-déposer).
Définir les clients Bluetooth disponibles
Le bloc pour définir les élements de la liste Connexion est le suivant :
Il attend en argument (zone de puzzle à droite) une liste.
Nous allons lui donner une liste des modules Bluetooth disponibles grâce à notre Client Bluetooth installé (Section \ref{bluetooth_install}).
Ce bloc est disponible dans le menu latéral, partie BluetoothClient1
Puis
Au final, on obtient le bloc suivant :
Connexion au module Bluetooth
Une fois que l’utilisateur a sélectionner le module auquel il souhaite se connecter, il faudra mettre à jour l’état de la liste et se connecter au module Bluetooth
Principe
Une fois que la personne a fait son choix dans « Connexion« , on vérifie la couleur de l’arrière plan de connexion :
- Si la couleur est rouge (par défaut), cela veut dire que nous ne sommes pas connectés.
- Si la couleur est verte , cela veut dire que nous sommes déjà connectés. Il faut donc remettre la couleur et le texte d’origine (« connexion ») et se déconnecter
On remplace donc le mot « Connexion » par l’adresse MAC[note] sélectionnée et on définit la couleur d’arrière-plan en vert, pour obtenir ceci :
Visuellement, on sait que nous sommes connectés.
Ensuite, pour se connecter réellement, on établit une connexion Bluetooth sécurisée à l’adresse donnée par la sélection de la liste «connexion».
Quand c’est fait, on envoie en Bluetooth la lettre « c » que l’Arduino se chargera d’interpréter, et pourra, en conséquent, jouer une mélodie pour confirmer la connexion.
Emplacement des blocs
Dans le bloc Quand connexion.Après prise, nous allons avoir besoin d’une structure de contrôle, c’est à dire en l’occurrence un bloc conditionnel Si-Alors-Sinon
Nous aurons également besoin d’un bloc de comparaison :
Les blocs de couleurs sont disponibles à l’emplacement suivant :
Enfin, les chaînes de caractères sont disponibles à l’emplacement suivant :
Astuce
Pour savoir où se situe une instruction, il faut regarder le nom de l’instruction. Elle sera de la forme nomInstruction.fonction. Le « nomInstruction » sera affiché dans un des onglets de gauchePar exemple, pour « mettre Connexion.elements », il faut aller dans l’onglet « Connexion »
Maintenant que vous savez ou trouver les blocs, je vous invite à recopier ce bloc d’instructions, qui n’est que la mise en pratique de la partie « Principe » de cette section
Le plus dur est fait, reste maintenant à gérer les boutons directionels.
Gestion des boutons de direction
Nous allons sélectionner le bouton Avancer dans le menu de gauche
A l’intérieur de ce bloc, on mettra les instructions pour envoyer le mot « c » en Bluetooth
Pour le langage Arduino, c’est l’équivalent de :
if (bouton==appui) {allumer led ;}
Après, nous avons d’autres paramètres (appui long, après avoir retiré le doig, sur le bouton…)
Placez le « Quand avancer. Click » sur la page blanche.
Ensuite, nous allons vérifier si nous sommes connectés. Pour cela, nous mettrons un « Si connexion.Couleur\_de\_fond = vert » afin d’attester la connexion.
Enfin, sélectionnez l’onglet « BluetoothClient1 » et insérez la fonction « envoyer texte » en mettant le mot « a » (comme avancer) en texte à envoyer. [note]
Pour obtenir ceci :
Il suffit de réaliser la même étape pour tous les boutons. Il faudra juste changer le « Quand avancer.Click » en « Quand ’bouton’.Click » et ne pas oublier de changer le texte à envoyer.
Par exemple, un deuxième bouton donnerait : (« g » pour gauche, « d » pour droite, « r » pour reculer, « s » pour stop, « b » pour batterie, « A » pour automatique)
Après avoir fait ceci pour les autres boutons, l’application est terminée…
Nous pouvons donc passer à l’installation de l’application sur votre téléphone
Installation de MIT App Inventor
Pour installer l’application que vous avez réalisé, il est préférable d’installer l’application MIT AI2 Companion disponible sur Play Store.
Cette application (relativement légère (50 Mo) va faire le lien entre le site App Inventor et votre téléphone.
Une fois que votre application est terminée, voici la façon la plus simple pour l’installer :
- Installer MIT AI2 Companion sur votre téléphone
- Lancer l’application MIT AI2 Companion lorsque’elle est installée sur votre téléphone
- Connecter vous au réseau Wifi de votre maison depuis votre téléphone
- Ouvrez votre application (Cocci-Bot) dans App Inventor (http://appinventor.mit.edu/) depuis votre ordinateur
- Rendez-vous dans le menu du haut, sélectionner Construire puis App ( Donnez le code QR pour fichier .apk )
- Il est temps de scanner le code avec l’application MIT AI2 Companion sur votre téléphone (« Scan with QRCode »). Une fois le processus terminé, vous pouvez cliquer sur ok, il faudra suivre les consignes sur votre téléphone portable (gestion des autorisations…)
- Et voila !
Une barre de progression devrait apparaître.
Une fois la barre de progression disparue, un QR Code apparaît. {\color{red}Ne surtout pas cliquer sur ok}
Nous pouvons passer au code Arduino et au traitement des données.
Branchements
Comme dit au chapitre \ref{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
Point-clé
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);
}
Remarque importante
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
On obtient :
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.
{\color{red} 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);
}
else{robot.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();}
Conclusion
Le programme complet du cocci-bot, l’application (que vous pourrez modifier) ainsi que les branchements se situent en annexe du dossier