UNE RADIOCOMMANDE WIFI ESP32 – ESP8266

nous allons voir ici comment réaliser une télécommande WIFI basique à partir de 2 ESP32 Wroom AZ-Delivery., et une version plus light avec un ESP32 en emission et un ESP8266 en reception.

l’idée c’est d’utiliser le protocole wifi en liaison directe point a point entre un ESP32 émetteur et un ESP32 récepteur . la portée théorique de ce couple émetteur/récepteur est de l’ordre de 200m en espace libre avec des ESP32 simples . elle peut etre augmentée a priori a environ 300m avec des ESP muni d’antennes type ESP 32U ( connecteur antenne externe sur la carte au lieu de l’antenne intégrée).

PINOUT de l’ESP32

SCHEMA DE CABLAGE

coté emetteur, nous allons faire un dispositif similaire a une petite radio commande du commerce avec 2 joystick . voici le cablage :

les cables Vcc et GND des Joystick sont reliés respectivement au 3,3V et au GND de l’ESP32, et les broches VRX et VRY de chaque Joystick reliées aux broches 34 -35 et 36-39 de l’ESP32 .

le port USB de l’ESP32 est a brancher sur un port USB PC pour fournir le 5V , permettre le téléchargement du programme et de faire des test préliminaires via le moniteur série si nécessaire

coté récepteur , rien de particulier pour un montage proto , on se contente de relier l’ESP32 au PC via un port USB , ce qui va permettre le téléversement du programme, de fournir la masse et le 5V de l’USB PC et de permetre la visualisation des données reçues via le moniteur série .

LE MONTAGE PROTO

petite photo du montage proto réaliser pour les tests .

l’ESP 32 émétteur a ete monté sur une plaque de contreplaqué pour simuler l’ergonomie une manette type PS4 afin de rendre la manipulation des joystick plus facile.

les 2 ESP sont reliés au PC via un Hub USB . l’ESP émétteur est sur le port COM3 et le récepteur sur le port COM6.

LES PROGRAMMES DE TEST:

les programme émetteur et récepteur sont relativement similaires. ils sont basés sur les librairies WIFI et ESP_NOW . ils ont ete construits a partir des exemples ESP_NOW fournis dans l’IDE ARDUINO une fois l’environnement ESP32 installé et les bibliotheques adéquates installées. le principe est construit sur les bases d’une connexion directe “Peer to peer”.

on va lire la valeur des 4 potentiomètres des 2 joysticks coté émetteur , puis envoyer les valeurs entieres (int) “myData n” ( n de 1 a 4) dans un message de données , qui sera reçu coté récepteur puis coté récepteur on demandera l’impression dans le moniteur série .

RAPPEL: pour telecharger un programme ARDUINO via L’IDE dans un ESP 32 , apres la compilation , quand l’IDE cherche a se connecter a l’ESP32 , il faut appuyer sur la touche BOOT a droite du port USB de l’ESP . on peut relacher tout de suite , la procedure de televersement se fait ensuite toute seule.

Ne pas oublier de bien selectionner le type de carte ESP32 dans l’option OUTILS de l’IDE et de selectionner le PORT COM adéquat (celui sur lequel est rélié l’ESP sur lequel on televerse ). c’est une cause frequente de disfonctionnement surtout quand 2 ESP sont reliés en meme temps au PC sur un HUB USB.

#include <esp_now.h>
#include <WiFi.h>
// config Mac Adress du recepteur
uint8_t broadcastAddress[] = {0x2,40x6F, 0x28, 0xB4, 0x62, 0x7C};
// Structure d'envoi de données
typedef struct struct_message {int a;int b;int c;int d;} struct_message;
// creation de la structure du message => nom = myData
struct_message myData;
esp_now_peer_info_t peerInfo;
 
void setup() {
  pinMode(36, INPUT);
  pinMode(39, INPUT);
  pinMode(34, INPUT);
  pinMode(35, INPUT);
  Serial.begin(115200); 
  // ESP32 en station wifi
  WiFi.mode(WIFI_STA);
  // Init ESP-NOW
  esp_now_init();
  // enregistrement  peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;  
  // ajout peer
  esp_now_add_peer(&peerInfo);     
}
 
void loop() {
  // Set values to send
  myData.c = analogRead(36);
  myData.d = analogRead(39);
  myData.a = analogRead(34);
  myData.b = analogRead(35);

  Serial.print("J1: ");
  Serial.print(myData.a);  
  Serial.print("-");
  Serial.print(myData.b);
  Serial.print(" J2: ");
  Serial.print(myData.c);
  Serial.print("-");
  Serial.println(myData.d);
  // Send message via ESP-NOW
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
  delay(2000);
}
#include <esp_now.h>
#include <WiFi.h>
// Structure de reception données(doit correspondre a celle d'envoi)
typedef struct struct_message {int a;int b;int c;int d;} struct_message;
// creation de la structure du message => nom = myData
struct_message myData;
// function executée en reception de données
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("J1: ");
  Serial.print(myData.a);
  Serial.print("-");
  Serial.print(myData.b);
  Serial.print("  J2: ");
  Serial.print(myData.c);
  Serial.print("-");
  Serial.println(myData.d);
  }
 void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);  
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  // Init ESP-NOW
  esp_now_init();  
  // enregistrement pour reception des données
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {
}

le résultat quand on ouvre le moniteur série coté récepteur et que l’on manipules les 2 joystick coté émetteur , les valeurs de position sont affichées et varient au gres des déplacements des 2 joysticks .

pour commander 4 servos , il suffit tout simplement de charger la librairie servo.h et , de connecteur 4 servo commande a 4 broches de l’ESP récepteur et d’utiliser ces valeurs reçues pour faire tourner des servo moteurs a l’angle désiré via une fonction map() qui va convertir la plage de valeurs potards( 0 – 4095) en plage angulaire PWM.

pour memo , ci dessous lien vers une page qui explique la commande d’un servo :

https://www.e-techno-tutos.com/2020/12/05/arduino-servo-libre/

un ESP 8266 comme Récepteur:

un ESP32 wroom , compte tenu de sa taille et du nombre de broche est un peu riche ou contraignant en terme de poids comme organe de réception , nous allons voir ici une version plus light avec un ESP8266 D1 mini qui offre malgré tout 11 GPIO ce qui permet déjà pas mal d’actionneurs .

ci dessous une photo comparative des 2 versions : l’un pese 10gr avec ses barettes de broches , l’autre 4 gr sans les broches.

ESP8266 D1 mini pinout

LE PROGRAMME:

le programme de réception est un quasi copy/paste de celui de l’ESP32 a 2 différences prés (en rouge dans le code pgme ci dessous) ;

  • les 2 bibliothèques “espnow.h” et “ESP8266WiFi.h” remplacent celles de l’ESP32, elles sont spécifiques a l’ESP8266
  • une petite modification de la synthaxe de la fonction OnDataRecv()

#include <espnow.h>
#include <ESP8266WiFi.h>
// Structure de reception données(doit correspondre a celle d'envoi)
typedef struct struct_message {int a;int b;int c;int d;} struct_message;
// creation de la structure du message => nom = myData
struct_message myData;
// function executée en reception de données
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("J1: ");
  Serial.print(myData.a);
  Serial.print("-");
  Serial.print(myData.b);
  Serial.print("  J2: ");
  Serial.print(myData.c);
  Serial.print("-");
  Serial.println(myData.d);
  }
 void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);  
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  // Init ESP-NOW
  esp_now_init();  
  // enregistrement pour reception des données
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {
}

Si on ouvre le moniteur serie du recepteur , le resultat est identique avec le meme affichage des valeurs de potards J1 et J2 .

pour piloter des servo , meme chose qu’avec un ESP32 , il suffit de les connecter a des broches GPIO du D1 mini et de modifier le programme en consequence => librairie servo et declaration et instructions spécifiques a la gestion du ou des servos.

NOTA: de la meme façon il est possible de remplacer l’ESP32 emetteur par un ESP8266 classique mais il ne sera pas adapté car la gamme ESP8266 ne possède qu’une seule entrée analogique , ce qui est insuffisant pour par exemple 2 joystick qui nécessitent a minima 4 entrées analogiques . il serait envisageable d’utiliser un multiplexeur pour brancher plusieurs actionneurs analogiques , mais cela fait perdre l’interet d’un ESP8266 , ne serait ce qu’en terme de cout , autant prendre un ESP32 .