Comprendre la mobilité du futur avec les voitures robots, partie 3
Bienvenue dans le troisième épisode de notre série de blogs sur les voitures robots. Dans le première partie nous avons découvert les bases du véhicule de base. Dans deuxième partie nous avons développé un système de code universel pour définir les étapes de conduite de la voiture robot et réalisé une commande à distance simple avec une télécommande infrarouge. En raison des limites physiques de cette télécommande, je souhaite montrer dans cet épisode la transmission des instructions de conduite avec Bluetooth, par exemple d'un smartphone vers le récepteur BT HC-05. Bluetooth est un signal radio de 2,4 GHz à courte portée. Sûr jusqu'à environ 10m et sans interférences à la lumière du soleil.
Le module Bluetooth HC-05 est en fait un émetteur-récepteur=transmetteur+ récepteur. Mais nous ne l'utilisons que comme récepteur, pour envoyer les instructions de conduite, nous utilisons une APP Bluetooth sur un smartphone Android (à cause de la voie spéciale d'Apple pour le Bluetooth, cela ne fonctionne pas avec un iPhone). Il est en principe possible de construire aussi une télécommande Bluetooth avec le HC-05 ; mais pour cela, il faut un deuxième HC-05, d'autres microcontrôleurs et un périphérique d'entrée (contrôleur de joystick).
Sur les six broches du module HC-05, seules quatre sont nécessaires : VCC (5V) et GND pour l'alimentation du module, ainsi que RXD et TXD pour la connexion à deux broches du microcontrôleur, sur lesquelles SoftwareSerial est configuré. Cependant, tu ne peux pas ignorer l'inscription LEVEL : 3.3V pour ne pas endommager le module. Sur notre microcontrôleur avec logique 5V, nous avons besoin, au moins pour la broche RXD, d'un diviseur de tension de 5V à 3,3V, donc par exemple des résistances de 1 kohm et 2,2 kohm.
Le schéma de câblage : Module HC-05 sur le microcontrôleur
Les commandes AT du module HC-05 pour les microcontrôleurs Arduino
A gauche du connecteur marqué Key se trouve un petit bouton (button) qui est important pour la configuration. En appuyant sur ce bouton lors de l'allumage, nous entrons dans le mode de commande AT (la LED clignote lentement au rythme de 2s), dans lequel nous effectuons les réglages avec ce que l'on appelle les commandes AT (pour Attention, Attention). Pour cela, nous utilisons un programme d'exemple modifié, dans lequel l'interface sérielle habituelle est connectée au moniteur sériel de l'Arduino IDE et au HC-05 via SoftwareSerial.
/*
Software serial multiple serial test
Reçoit de la série matérielle, envoie à la série logicielle.
Reçoit du software serial, envoie au hardware serial.
Le circuit :
* RX est la broche numérique 10 (se connecte à TX d'un autre appareil)
* TX est la broche numérique 11 (connexion à RX d'un autre appareil) // diviseur de tension !
créé en arrière dans le temps
modifié le 25 mai 2012
par Tom Igoe
basé sur l'exemple de Mikal Hart
Cet exemple de code est dans le domaine public.
*/
#include <SoftwareSerial .h>
SoftwareSerial BTSerial(10, 11) ; // RX, TX // mySerial changé en BTSerial
char c=' '; // Déclaration de la variable pour la transmission
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600); // Baud rate changed to 9600
Serial.println("Serial started!");
// set the data rate for the SoftwareSerial port
BTSerial.begin(38400); // Baud rate for BT 38400
Serial.println("BTSerial started!");
}
void loop() { // run over and over
if (BTSerial.available()) {
c=BTSerial.read();
Serial.write(c);
}
if(Serial.available()) {
c=Serial.read();
BTSerial.write(c);
Serial.write(c); // re-transmission of input in Serial Monitor
}
}
Les commandes AT essentielles sont utilisées dans l'image suivante. L'interlocuteur, le HC-05, envoie une réponse le cas échéant et acquitte avec OK.
Nous sommes surtout intéressés par le nom et l'adresse HEX afin d'identifier clairement le module plus tard sur le smartphone. Les commandes AT sont saisies dans le moniteur série du microcontrôleur. Dans l'image ci-dessous, tu peux voir le moniteur série de l'IDE Arduino.
Si tu le souhaites, tu peux changer le mot de passe par défaut 1234 avec"AT+PSWD=xxxx", où x représente un chiffre de 0 à 9. Vérifier ensuite avec"AT+PSWD ?" si la saisie a réussi.
Une fois les saisies terminées, le module est brièvement coupé du courant. Après la remise en marche sans appuyer sur le bouton, le module HC-05 se trouve en mode standard. La LED clignote rapidement (environ 5 fois/s).
Modifications de la voiture RC : autre Motorshield
Passons maintenant à la voiture robot. Après avoir utilisé la dernière fois le contrôleur de moteur V2, qui ne nécessite que les deux connecteurs I2C SDA=A4 et SCL=A5 pour les signaux de commande, je voudrais cette fois-ci présenter le contrôleur de moteur V1, plus ancien, qui bloque de nombreuses broches numériques mais que l'on peut souvent acheter à un prix d'aubaine.
J'ai également modifié un peu ce motorhield pour avoir accès aux capteurs et aux récepteurs radio. Du côté des broches numériques, il n'y a qu'une seule broche qui est accessible à l'aide d'un connecteur coudé : La broche 2. C'est bien pour ceux qui veulent y connecter le récepteur IR. Il y a plus de possibilités d'extension de l'autre côté, où l'on peut accéder à toutes les entrées analogiques et à l'alimentation électrique à l'aide de connecteurs à ressort (également appelés connecteurs femelles).
Comme toutes les entrées analogiques peuvent également être utilisées comme entrées ou sorties numériques, nous avons ici la possibilité de connecter nos récepteurs radio. Cela fonctionne parfaitement avec l'émetteur-récepteur 433 MHz HC-12 (voir l'épisode suivant), mais avec des restrictions pour le récepteur BT HC-05. Premièrement, nous ne pouvons pas connecter directement la broche RXD, nous avons besoin du diviseur de tension, et deuxièmement, les broches ne fournissent pas assez de courant pour alimenter le module sur ces broches.
Sur l'image suivante, tu peux voir un petit adaptateur fait maison qui alimente le HC-05 en 5V et en ground à partir des connecteurs correspondants, connecte TXD directement à RX de l'interface SoftwareSerial A1 =D15 et RXD à A2 = D16 via le diviseur de tension.
Le schéma de câblage : Module HC-05 avec L293D Motorshield sur le microcontrôleur Arduino
Le circuit peut bien sûr aussi être réalisé sur une mini breadboard avec des câbles jumper.
Comme la dernière fois, le code pour les instructions de conduite est augmenté ou diminué en appuyant sur un bouton ; cette fois-ci seulement, pas avec la télécommande IR, mais avec la fonction tactile dans l'APP du smartphone et l'interrogation Bluetooth via SoftwareSerial.
Couplage du module Bluetooth HC-05 avec une application Android (APP)
Avant que l'APP puisse se connecter à la voiture robot, nous devons effectuer l'appairage avec le module Bluetooth dans les paramètres. Cela devrait être très simple, car nous avons auparavant demandé le nom et l'adresse HEX du HC-05 avec les commandes AT.
Si l'appairage a fonctionné et qu'une application BT appropriée a été installée, celle-ci peut être lancée et configurée. En tapant sur la loupe dans l'image de gauche, les appareils appropriés s'affichent. On tape sur le HC-05 et on obtient le message "connecté". L'application que j'utilise propose plusieurs interfaces pour l'utilisation (image du milieu). J'ai opté pour le contrôleur de jeu. Sur l'image du milieu en haut à droite, il y a deux flèches qui forment un petit cercle. Touche ici si tu as perdu la connexion.
Sur l'image de droite, les boutons d'une manette de jeu sont représentés. Avant la première utilisation, il faut attribuer aux boutons les valeurs numériques qui seront transmises lorsque tu taperas.
Pour les boutons du curseur, j'ai donné les valeurs numériques 1 à 4 dans le sens des aiguilles d'une montre. J'ai attribué la valeur numérique 5 aux autres boutons. Ces valeurs sont transmises dans le sketch à la variable blueToothVal et conduisent dans lesinstructions if de la fonction loop() à la détermination du code pour le niveau de conduite.
Les changements de l'infrarouge au Bluetooth et du contrôleur de moteur V2 à V1 provoquent quelques modifications dans la partie principale du sketch. Par contre, presque rien ne change dans la fonction motor(). C'est seulement au niveau de l'écriture que les fonctions motor1->setSpeed() deviennent motor1.setSpeed() en raison des différentes bibliothèques de programmes (libraries).
Le code du programme : Construire une voiture RC pour Arduino
* Sample Code for Robot Car with Motor Shield V1 and BT receiver HC-05, as of 20220515
* based on Adafruit Motor shield V2 library, copyright Adafruit Industries LLC
* ce code est dans le domaine public, enjoy !
* modifié pour Funduino
* Pins
* BT VCC vers Arduino 5Vout.
* BT GND vers GND
* Arduino A1=15 (SS RX) - BT TX pas besoin de diviseur de tension
* Arduino A2=16 (SS TX) - BT RX par un diviseur de tension(5và 3.3v)
*/
#include <AFMotor .h>
AF_DCMotor motor1(2) ;
AF_DCMotor motor2(3) ;
#include <SoftwareSerial .h>
// initialize HC-05
SoftwareSerial BTSerial(15, 16) ; // RX, TX en croix sur TX, RX(voltage divider)
char blueToothVal ;
int x = 0;
int y = 0;
int gauche = 0;
int droite = 0;
int code = 5555;
int speedL = 0;
float factor = 1.8; // Correction pour speedLevel 255/100 * 6V/VBatt
void setup() {
Serial.begin(9600); // set up Serial Monitor at 9600 bps
Serial.println("Motor test!");
BTSerial.begin(9600); // set up transmission speed for HC-12
Serial.println("SoftwareSerial initialized!");
} // end setup
void loop() {
if(BTSerial.available()) //si des données sont reçues. ..
Serial.print("available") ;
{
blueToothVal=BTSerial.read();//..sollen diese ausgelesen werden
Serial.println(blueToothVal);
}
if (blueToothVal=='1') //si le module Bluetooth reçoit un "1"...
{
if (code<9000) code = code + 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal='2') //si le module Bluetooth reçoit un "2"...
{
if ((code-1000*int(code/1000))<900) code = code + 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal='3') //si le module Bluetooth reçoit un "3".
{
if (code>2000) code = code - 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal='4') //si le module Bluetooth reçoit un "4".
{
if (code-1000*int(code/1000) > 200) code = code - 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal='5') //si le module Bluetooth reçoit "5"...
{
code = 5555;
Serial.print("Code = ");
Serial.println(code);
}
delay(200) ; //petit délai pour une meilleure communication en série et pour éviter les rebonds
moteur() ;
} // fin de la boucle
void motor(){
int speedLevel[9]={-100,-80,-60,-40,0,40,60,80,100};
y = int(code / 1000) ;
x = int((code - 1000*y) / 100) ;
speedL = speedLevel[y-1] ;
Serial.print("code = ") ;
Serial.print(code) ;
Serial.print(" y = ") ;
Serial.print(y) ;
Serial.print(" x = ") ;
Serial.print(x) ;
Serial.print(" speedL = ") ;
Serial.println(speedL) ;
//Correction des niveaux de vitesse pour les virages
if (x==1){
right = speedL+20;
left = speedL-20;
}
else if (x==2){
right = speedL+15;
left = speedL-15;
}
else if (x==3) {
right = speedL+10;
left = speedL-10;
}
else if (x==4) {
right = speedL+5;
left = speedL-5;
}
else if (x==6) {
right = speedL -5;
left = speedL+5;
}
else if (x==7) {
right = speedL-10;
left = speedL+10;
}
else if (x==8) {
right = speedL-15;
left = speedL+15;
}
else if (x==9) {
right = speedL-20;
left = speedL+20;
}
else {
right = speedL;
left = speedL;
}
//Entrer les niveaux de déplacement pour "left" et "right"
Serial.print("left = ") ;
Serial.print(left) ;
Serial.print(" right = ") ;
Serial.println(right) ;
if (left < 40 & left > -40) {
motor1.run(RELEASE);
}
if (right < 40 & right > -40) {
motor2.run(RELEASE);
}
if (left>=40) {
if (left>100) left=100;
motor1.run(FORWARD);
motor1.setSpeed(left * factor);
}
if (right>=40) {
if (right>100) right=100;
motor2.run(FORWARD);
motor2.setSpeed(right * factor);
}
if (left<= -40) {
if (left<-100) left=-100;
motor1.run(BACKWARD);
left = -left;
motor1.setSpeed(left * factor);
}
if (right<= -40) {
if (right<-100) right=-100;
motor2.run(BACKWARD);
right = -right;
motor2.setSpeed(right * factor);
}
} // end motor
Voilà la deuxième solution la plus économique pour une voiture robot avec télécommande (à condition d'avoir un smartphone Android). La prochaine fois, je veux montrer à quel point il est facile d'intégrer un émetteur-récepteur HC-12 de 433 MHz. Cela permet même d'obtenir une portée de plusieurs centaines de mètres. Cependant, les coûts augmentent, car il faut maintenant deux émetteurs-récepteurs et un autre microcontrôleur. A bientôt.