Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Dans ce tutoriel, nous allons apprendre à contrôler sans fil la voiture robot Arduino que nous avons réalisée dans la vidéo précédente. Je vous montrerai trois méthodes différentes de contrôle sans fil : en utilisant le module Bluetooth HC-05, le module transcepteur NRF24L01 et le module sans fil longue portée HC-12, ainsi qu'avec un smartphone et une application Android personnalisée. Vous pouvez regarder la vidéo suivante ou lire le tutoriel écrit ci-dessous pour plus de détails.

J'ai déjà des tutoriels sur la connexion et l'utilisation de chacun de ces modules avec Arduino, donc si vous avez besoin de plus de détails, vous pouvez toujours les consulter. Les liens vers chacun d'eux se trouvent dans l'article.

Contrôle de la voiture robot Arduino avec le module Bluetooth HC-05

Nous commençons par la communication Bluetooth, pour laquelle nous avons besoin de deux modules HC-05 configurés en maître et esclave.

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

On peut le faire facilement avec des commandes AT. J'ai configuré le joystick en maître et la voiture robot en esclave. Voici le schéma de câblage complet pour cet exemple :

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Vous pouvez vous procurer les composants nécessaires via les liens ci-dessous :

  • Module Bluetooth HC-05
  • Module Joystick
  • Batteries 18650
  • Chargeur batterie 18650
  • Driver L298N
  • Moteur DC 12V couple élevé
  • Carte Arduino

Code source

Nous utiliserons le même code que dans le tutoriel précédent, où nous contrôlions la voiture robot directement avec le joystick, avec quelques modifications.

Code HC-05 Maître (Joystick) :

/* Contrôle sans fil voiture robot Arduino avec HC-05 Bluetooth == MASTER - Joystick ==
by Dejan Nedelkovski, www.HowToMechatronics.com */
int xAxis, yAxis;

void setup() {
  Serial.begin(38400); // Baud rate par défaut du module Bluetooth
}

void loop() {
  xAxis = analogRead(A0); // Lecture axe X joystick
  yAxis = analogRead(A1); // Lecture axe Y joystick
  
  // Envoyer les valeurs via le port série vers l'esclave HC-05
  Serial.write(xAxis/4); // Division par 4 pour convertir 0-1023 en 0-255 (1 octet)
  Serial.write(yAxis/4);
  delay(20);
}

Le code du maître (joystick) est simple. On lit les valeurs X et Y du joystick qui régulent la vitesse des moteurs, et on les envoie via le port série vers l'esclave HC-05. Les valeurs analogiques 0-1023 sont converties en 0-255 par division par 4, car cette plage peut être envoyée sur 1 octet, plus facile à recevoir côté voiture robot.

Côté esclave, si le port série a reçu les 2 octets (X et Y), avec Serial.read() on les lit tous les deux.

// Code de la voiture robot Arduino
// Lecture des données entrantes du Joystick (maître Bluetooth)
while (Serial.available() >= 2) {
  x = Serial.read(); delay(10);
  y = Serial.read();
}

Il faut ensuite convertir les valeurs en 0-1023 pour le code de contrôle des moteurs ci-dessous, déjà expliqué dans la vidéo précédente.

// Convertir 0-255 vers 0-1023 pour le contrôle moteurs
xAxis = x * 4;
yAxis = y * 4;

Note : lors du téléversement du code, il faut déconnecter les broches RX et TX de l'Arduino.

Code complet HC-05 Esclave (Voiture robot) :

/* Contrôle sans fil voiture robot Arduino avec HC-05 Bluetooth == SLAVE - Voiture robot ==
by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9 #define in1 4 #define in2 5
#define enB 10 #define in3 6 #define in4 7

int xAxis, yAxis; unsigned int x = 0, y = 0;
int motorSpeedA = 0, motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT); pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);
  Serial.begin(38400);
}

void loop() {
  // Valeurs par défaut - pas de mouvement joystick au centre
  x = 510 / 4; y = 510 / 4;
  
  // Lecture données joystick (maître Bluetooth)
  while (Serial.available() >= 2) {
    x = Serial.read(); delay(10); y = Serial.read();
  }
  delay(10);
  
  // Conversion 0-255 vers 0-1023
  xAxis = x * 4; yAxis = y * 4;
  
  // Axe Y : avant/arrière
  if (yAxis < 470) { // Arrière
    digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  } else if (yAxis > 550) { // Avant
    digitalWrite(in1, LOW); digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  } else { // Centre
    motorSpeedA = 0; motorSpeedB = 0;
  }
  
  // Axe X : gauche/droite
  if (xAxis < 470) { // Gauche
    int xMapped = map(xAxis, 470, 0, 0, 255);
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    if (motorSpeedA < 0) motorSpeedA = 0;
    if (motorSpeedB > 255) motorSpeedB = 255;
  }
  if (xAxis > 550) { // Droite
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    if (motorSpeedA > 255) motorSpeedA = 255;
    if (motorSpeedB < 0) motorSpeedB = 0;
  }
  
  // Éviter le ronflement à basse vitesse (ajuster selon vos moteurs)
  if (motorSpeedA < 70) motorSpeedA = 0;
  if (motorSpeedB < 70) motorSpeedB = 0;
  
  analogWrite(enA, motorSpeedA);
  analogWrite(enB, motorSpeedB);
}

Contrôle de la voiture robot Arduino avec un smartphone et une application Android personnalisée

Voyons maintenant comment contrôler notre voiture robot avec une application Android personnalisée. Le schéma de la voiture robot est exactement le même que l'exemple précédent, avec le HC-05 en mode esclave.

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

De l'autre côté, avec MIT App Inventor en ligne, nous allons créer notre application Android. Voici à quoi elle ressemble.

L'application simule un joystick, dont l'apparence est composée de deux images (sprites).

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12
Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Si on regarde les blocs de l'app, quand le sprite joystick est déplacé, l'image de la bille du joystick se déplace à la position actuelle du doigt, et en même temps on envoie les valeurs X et Y via Bluetooth vers l'Arduino.

Ces valeurs sont reçues par l'Arduino de la même façon que l'exemple précédent, avec Serial.read().

// Lecture données smartphone Android App
while (Serial.available() >= 2) {
  x = Serial.read(); delay(10); y = Serial.read();
}

Il faut additionally convertir les valeurs X et Y reçues du smartphone en plage 0-1023 pour le code de contrôle moteurs. Ces valeurs dépendent de la taille du canevas ; les valeurs X et Y que je recevais de mon app allaient de 60 à 220, que j'ai facilement converties avec map().

// S'assurer de recevoir les bonnes valeurs
if (x > 60 && x < 220) {
  xAxis = map(x, 220, 60, 1023, 0);
}
if (y > 60 && y < 220) {
  yAxis = map(y, 220, 60, 0, 1023);
}

Dans les blocs de l'application, on voit aussi que quand le sprite est relâché, la bille du joystick revient au centre du canevas et les valeurs appropriées sont envoyées pour arrêter la voiture. Vous pouvez trouver et télécharger cette application sur l'article du site, ainsi que les deux images du joystick pour construire ou modifier votre propre app.

Vous pouvez télécharger l'application Android ci-dessous, ainsi que les deux images pour le joystick :

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Arduino_Robot_Car_Joystick_App.apk

1 fichier(s) 1.62 MB Télécharger Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Arduino_Robot_Car_Joystick_App_aia_file

1 fichier(s) 171.20 KB Télécharger Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Images Joystick App

1 fichier(s) 44.36 KB Télécharger

Code Arduino complet :

/* Contrôle sans fil voiture robot Arduino avec HC-05 Bluetooth et appli Android personnalisée == SLAVE - Voiture robot ==
by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9 #define in1 4 #define in2 5
#define enB 10 #define in3 6 #define in4 7

int xAxis, yAxis; int x = 0, y = 0;
int motorSpeedA = 0, motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT); pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);
  Serial.begin(38400);
}

void loop() {
  xAxis = 510; yAxis = 510; // Défaut : joystick au centre
  
  // Lecture données smartphone
  while (Serial.available() >= 2) {
    x = Serial.read(); delay(10); y = Serial.read();
  }
  delay(10);
  
  // Conversion valeurs smartphone vers 0-1023
  if (x > 60 && x < 220) { xAxis = map(x, 220, 60, 1023, 0); }
  if (y > 60 && y < 220) { yAxis = map(y, 220, 60, 0, 1023); }
  
  // Axe Y : avant/arrière
  if (yAxis < 470) { // Arrière
    digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  } else if (yAxis > 550) { // Avant
    digitalWrite(in1, LOW); digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  } else { motorSpeedA = 0; motorSpeedB = 0; }
  
  // Axe X : gauche/droite
  if (xAxis < 470) { // Gauche
    int xMapped = map(xAxis, 470, 0, 0, 255);
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    if (motorSpeedA < 0) motorSpeedA = 0;
    if (motorSpeedB > 255) motorSpeedB = 255;
  }
  if (xAxis > 550) { // Droite
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    if (motorSpeedA > 255) motorSpeedA = 255;
    if (motorSpeedB < 0) motorSpeedB = 0;
  }
  
  // Éviter ronflement basse vitesse
  if (motorSpeedA < 70) motorSpeedA = 0;
  if (motorSpeedB < 70) motorSpeedB = 0;
  
  analogWrite(enA, motorSpeedA);
  analogWrite(enB, motorSpeedB);
}

Contrôle sans fil voiture robot Arduino avec module transcepteur NRF24L01

Passons à la méthode suivante : contrôle sans fil avec les modules transcepteurs NRF24L01.

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12
Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Voici le schéma de câblage. Ces modules utilisent la communication SPI, donc par rapport à l'exemple précédent, j'ai dû déplacer les broches Enable A et Enable B du driver L298N vers les broches 2 et 3 de l'Arduino. Vous pouvez trouver le module NRF24L01 sur Amazon.

Code source

Pour cet exemple, il faut installer la bibliothèque RF24. De manière similaire à l'exemple précédent, après avoir défini quelques broches et configuré le module en émetteur, on lit les valeurs X et Y du joystick et on les envoie à l'autre module NRF24L01 sur la voiture robot.

On note que les lectures analogiques sont des Strings, qu'on place dans un tableau de caractères avec string.toCharArray(). Puis on envoie ce tableau avec radio.write().

Code Émetteur (Joystick) :

/* Contrôle sans fil voiture robot Arduino avec NRF24L01 == Émetteur - Joystick ==
by Dejan Nedelkovski, www.HowToMechatronics.com
Bibliothèque: TMRh20/RF24, https://github.com/tmrh20/RF24/ */
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(8, 9); // CE, CSN
const byte address[6] = "00001";
char xyData[32] = "";
String xAxis, yAxis;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  xAxis = analogRead(A0); // Axe X joystick
  yAxis = analogRead(A1); // Axe Y joystick
  
  // Valeur X
  xAxis.toCharArray(xyData, 5);
  radio.write(&xyData, sizeof(xyData)); // Envoyer X
  
  // Valeur Y
  yAxis.toCharArray(xyData, 5);
  radio.write(&xyData, sizeof(xyData)); // Envoyer Y
  delay(20);
}

Côté récepteur (voiture robot), après avoir configuré le module en récepteur, on reçoit les données avec radio.read(). Puis avec atoi() on convertit les données reçues (valeurs X et Y du joystick) en entiers pour le code de contrôle moteurs.

// Code voiture robot - Exemple NRF24L01
if (radio.available()) {
  radio.read(&receivedData, sizeof(receivedData));
  xAxis = atoi(&receivedData[0]); // Convertir X en entier
  delay(10);
  radio.read(&receivedData, sizeof(receivedData));
  yAxis = atoi(&receivedData[0]); // Convertir Y en entier
  delay(10);
}

C'est aussi simple que ça, mais bien sûr, si vous avez besoin de plus de détails sur la connexion et la configuration des modules, vous pouvez toujours consulter mon tutoriel dédié.

Code Récepteur (Voiture robot) :

/* Contrôle sans fil voiture robot Arduino avec NRF24L01 == Récepteur - Voiture robot ==
by Dejan Nedelkovski, www.HowToMechatronics.com
Bibliothèque: TMRh20/RF24, https://github.com/tmrh20/RF24/ */
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define enA 2 // Note: Pin 9 dans vidéo précédente (pin 10 utilisée pour SPI NRF24L01)
#define in1 4 #define in2 5
#define enB 3 // Note: Pin 10 dans vidéo précédente
#define in3 6 #define in4 7

RF24 radio(8, 9);
const byte address[6] = "00001";
char receivedData[32] = "";
int xAxis, yAxis;
int motorSpeedA = 0, motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT); pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    radio.read(&receivedData, sizeof(receivedData));
    xAxis = atoi(&receivedData[0]); delay(10);
    radio.read(&receivedData, sizeof(receivedData));
    yAxis = atoi(&receivedData[0]); delay(10);
  }
  
  // Axe Y : avant/arrière
  if (yAxis < 470) { // Arrière
    digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  } else if (yAxis > 550) { // Avant
    digitalWrite(in1, LOW); digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  } else { motorSpeedA = 0; motorSpeedB = 0; }
  
  // Axe X : gauche/droite
  if (xAxis < 470) { // Gauche
    int xMapped = map(xAxis, 470, 0, 0, 255);
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    if (motorSpeedA < 0) motorSpeedA = 0;
    if (motorSpeedB > 255) motorSpeedB = 255;
  }
  if (xAxis > 550) { // Droite
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    if (motorSpeedA > 255) motorSpeedA = 255;
    if (motorSpeedB < 0) motorSpeedB = 0;
  }
  
  // Éviter ronflement basse vitesse
  if (motorSpeedA < 70) motorSpeedA = 0;
  if (motorSpeedB < 70) motorSpeedB = 0;
  
  analogWrite(enA, motorSpeedA);
  analogWrite(enB, motorSpeedB);
}

Contrôle sans fil voiture robot Arduino avec transcepteur longue portée HC-12

Pour la dernière méthode, nous utiliserons les modules transcepteurs longue portée HC-12. Ces modules peuvent communiquer jusqu'à 1,8 km de distance.

Le schéma de câblage pour cet exemple est presque le même que pour les modules HC-05, car ils utilisent la même méthode de communication avec l'Arduino via le port série.

Contrôler sans fil votre voiture robot Arduino avec HC-05 Bluetooth, NRF24L01 et HC-12

Vous pouvez trouver le module transcepteur HC-12 sur Amazon.

Code source

Le code du Joystick est exactement le même que pour la communication Bluetooth. On lit simplement les valeurs analogiques du joystick et on les envoie à l'autre module avec Serial.write().

Code Émetteur (Joystick) :

/* Contrôle sans fil voiture robot Arduino avec HC-12 longue portée == Émetteur - Joystick ==
by Dejan Nedelkovski, www.HowToMechatronics.com */
int xAxis, yAxis;

void setup() {
  Serial.begin(9600); // Baud rate par défaut
}

void loop() {
  xAxis = analogRead(A0); // Axe X joystick
  yAxis = analogRead(A1); // Axe Y joystick
  Serial.write(xAxis/4); // Convertir 0-1023 vers 0-255 (1 octet)
  Serial.write(yAxis/4);
  delay(20);
}

Côté récepteur, avec une boucle while on attend l'arrivée des données, puis on les lit avec Serial.read() et on les reconvertit en 0-1023 pour le code de contrôle moteurs.

Code Récepteur (Voiture robot) :

/* Contrôle sans fil voiture robot Arduino avec HC-12 longue portée == Récepteur - Voiture robot ==
by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9 #define in1 4 #define in2 5
#define enB 10 #define in3 6 #define in4 7

int xAxis, yAxis; int x = 0, y = 0;
int motorSpeedA = 0, motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT); pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  xAxis = 510; yAxis = 510; // Défaut : joystick au centre
  
  // Attendre et lire données
  while (Serial.available() == 0) {}
  x = Serial.read(); delay(10);
  y = Serial.read(); delay(10);
  
  // Convertir 0-255 vers 0-1023
  xAxis = x * 4; yAxis = y * 4;
  
  // Axe Y : avant/arrière
  if (yAxis < 470) { // Arrière
    digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  } else if (yAxis > 550) { // Avant
    digitalWrite(in1, LOW); digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  } else { motorSpeedA = 0; motorSpeedB = 0; }
  
  // Axe X : gauche/droite
  if (xAxis < 470) { // Gauche
    int xMapped = map(xAxis, 470, 0, 0, 255);
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    if (motorSpeedA < 0) motorSpeedA = 0;
    if (motorSpeedB > 255) motorSpeedB = 255;
  }
  if (xAxis > 550) { // Droite
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    if (motorSpeedA > 255) motorSpeedA = 255;
    if (motorSpeedB < 0) motorSpeedB = 0;
  }
  
  // Éviter ronflement basse vitesse
  if (motorSpeedA < 70) motorSpeedA = 0;
  if (motorSpeedB < 70) motorSpeedB = 0;
  
  analogWrite(enA, motorSpeedA);
  analogWrite(enB, motorSpeedB);
}

C'est à peu près tout pour ce tutoriel. N'hésitez pas à poser vos questions dans les commentaires ci-dessous.

Processus de fabrication

  1. Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
  2. Construire une télécommande Android universelle avec Arduino, 1Sheeld et contrôle IR
  3. Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
  4. Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
  5. Contrôlez un rover Arduino avec Firmata et une manette Xbox One
  6. Compteur de stationnement intelligent : Suivi véhicule en temps réel avec Arduino, Processing et PHP
  7. Contrôler votre TV avec Alexa via Arduino IoT Cloud – Guide étape par étape
  8. Construire une Radio FM Compacte avec Arduino Nano et RDA5807M
  9. Shield de programmation Arduino sans fil avec Bluetooth HC-05 – Plus besoin d'USB