Préparation de l'IDE Arduino
Puisque l'ESP sera programmé avec l'IDE Arduino, les cartes appropriées doivent avoir été installées dans l'IDE au moyen du gestionnaire de cartes (voir les instructions détaillées pour l'ESP8266 et pour l'ESP32).
La bibliothèque RF24 mise au point par TMRh20 doit également être installée (ça peut se faire par l'entremise du gestionnaire de bibliothèques). Il s'agit de la même bibliothèque qu'on utilise pour une carte Arduino conventionnelle (Uno, etc.).

La figure ci-contre pourrait se révéler utile pour identifier les connecteurs du module nRF24L01.
Certains modèles, généralement verts, comportent 10 broches alors que d'autres, généralement noirs, en comportent 8.
La répartition des broches sur deux rangées ne permettent pas l'insertion du module sur une breadboard.
Connexions du nRF24L01 à l'ESP32
J'ai branché le module nRF24L01 à ma carte ESP32 de la façon suivante:
- GND du nRF24L01 - GND de l'ESP32
- VCC du nRF24L01 - 3V3 de l'ESP32
- CE du nRF24L01 - D4 de l'ESP32
- CSN du nRF24L01 - D5 de l'ESP32
- SCK du nRF24L01 - D18 de l'ESP32
- MOSI du nRF24L01 - D23 de l'ESP32
- MISO du nRF24L01 - D19 de l'ESP32
- IRQ du nRF24L01 - Pas branché
Connexions du nRF24L01 à l'ESP8266
J'ai branché le module nRF24L01 à ma carte Wemos D1 Mini de la façon suivante:
- GND du nRF24L01 - GND de l'ESP8266
- VCC du nRF24L01 - 3V3 de l'ESP8266
- CE du nRF24L01 - GPIO4 (D2) de l'ESP8266
- CSN du nRF24L01 - GPIO5 (D1) de l'ESP8266
- SCK du nRF24L01 - GPIO14 (D5) de l'ESP8266
- MOSI du nRF24L01 - GPIO13 (D7) de l'ESP8266
- MISO du nRF24L01 - GPIO12 (D6) de l'ESP8266
- IRQ du nRF24L01 - Pas branché
Sketch #1: émission d'un message
Voici un sketch minimaliste pour l'émission d'un message (il s'agit du même sketch déjà publié pour l'utilisation d'un nRF24L01 avec un Arduino, seule la numérotation des broches est différente).
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************* | |
Chaque seconde, un nombre est émis par un module nRF24L01 | |
branché à une carte ESP32 ou ESP8266. | |
********************************************************************/ | |
#include <SPI.h> | |
#include "nRF24L01.h" | |
#include "RF24.h" | |
int compteur = 0; | |
RF24 radio(4, 5); | |
const uint64_t addresse = 0x1111111111; | |
const int taille = 32; | |
char message[taille + 1]; | |
void setup(void) | |
{ | |
Serial.begin(115200); | |
Serial.println("Emetteur de donnees"); | |
radio.begin(); | |
radio.openWritingPipe(addresse); | |
} | |
void loop(void) | |
{ | |
compteur++; | |
itoa(compteur, message, 10); | |
Serial.print("J'envoie maintenant "); // pour débogage | |
Serial.println(message); | |
radio.write( message, taille ); // émission du message via nRF24L01 | |
delay(1000); | |
} |
Sketch #2: réception d'un message
Voici un deuxième sketch minimaliste qui rapporte dans le moniteur série tous les messages reçus par le nRF24L01.
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*********************************************************** | |
Sketch permettant à un ESP32 ou un ESP8266 de recevoir des messages | |
en provenance d'un autre microcontrôleur par l'entremise d'un | |
module nRF24L01. | |
Les messages reçus sont affichés dans le moniteur série. | |
*************************************************************/ | |
#include <SPI.h> | |
#include "nRF24L01.h" | |
#include "RF24.h" | |
RF24 radio(4, 5); | |
const uint64_t adresse = 0x1111111111; | |
const int taille = 32; | |
char message[taille + 1]; | |
void setup(void) | |
{ | |
Serial.begin(115200); | |
Serial.println("Recepteur RF24"); | |
radio.begin(); | |
radio.openReadingPipe(1, adresse); | |
radio.startListening(); | |
} | |
void loop(void) | |
{ | |
while ( radio.available() ) | |
{ | |
radio.read( message, taille ); | |
Serial.print("Message recu : "); | |
Serial.println(message); | |
} | |
} |
Sketch #3: réception d'un message et publication dans une page web
Ce troisième exemple utilise également les possibilités WiFi de l'ESP32 ou de l'ESP8266: les messages reçus par le nRF24L01 sont publiés dans une page web. On peut ainsi concevoir un réseau de microcontrôleurs qui transmettraient les mesures de leurs capteurs à un ESP32 ou un ESP8266 qui se chargerait de transmettre les données par WiFi (les données peuvent être émises par une carte Arduino ou par un carte STM32, par exemple).
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Le message reçu par nRF24L01 en provenance | |
d'un autre microcontrôleur est affiché dans | |
une page web. | |
*/ | |
// inclusion des bibliothèques utiles... | |
// ...pour le nRF24L01 | |
#include <SPI.h> | |
#include "nRF24L01.h" | |
#include "RF24.h" | |
// ...pour la communication WiFi | |
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266 | |
#include <ESP8266WiFi.h> | |
#include <ESP8266WebServer.h> | |
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32 | |
#include "WiFi.h" | |
#include <WebServer.h> | |
#endif | |
#include <WiFiClient.h> | |
const char* ssid = "**********"; | |
const char* password = "**********"; | |
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266 | |
ESP8266WebServer server(80); | |
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32 | |
WebServer server(80); | |
#endif | |
RF24 radio(4, 5); | |
const uint64_t adresse = 0x1111111111; | |
const int taille = 32; | |
char message[taille + 1]; | |
void handle_root() { | |
// C'est ici qu'on construit la page web: | |
server.send(200, "html", "<head> <title>ESP8266 / ESP32</title> <meta http-equiv=Refresh content=2></head> " | |
"<body> <H1>ESP8266 / ESP32</H1>" | |
"<p>Valeur du compteur: " + String(message) + " </p>" | |
"<p>Visitez <a href=http://electroniqueamateur.blogspot.ca/>Électronique en Amateur</a>!</p></body>"); | |
delay(100); | |
} | |
void setup(void) | |
{ | |
// Affichage dans le moniteur série: | |
Serial.begin(115200); | |
// Connexion au réseau WiFi | |
WiFi.begin(ssid, password); | |
Serial.print("\n\r \n\rConnection au reseau en cours"); | |
// On attend la connexion | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
Serial.println(""); | |
Serial.print("Nom du reseau WiFi: "); | |
Serial.println(ssid); | |
Serial.print("Adresse IP de la page web: "); | |
Serial.println(WiFi.localIP()); | |
server.on("/", handle_root); | |
server.begin(); | |
Serial.println("Le serveur web est en fonction."); | |
radio.begin(); | |
radio.openReadingPipe(1, adresse); | |
radio.startListening(); | |
} | |
void loop(void) | |
{ | |
while ( radio.available() ) | |
{ | |
radio.read( message, taille ); // réception du message nRF24L01 | |
Serial.print("Message recu : "); // dans le moniteur série, pour débogage | |
Serial.println(message); | |
} | |
server.handleClient(); // mise à jour de la page web | |
} |
L'adresse IP de l'ESP32 ou de l'ESP8266 s'affiche dans le moniteur série au démarrage du programme.
En recopiant cette adresse dans un navigateur web, on atteint une page web qui indique le message le plus récent reçu par le module nRF24L01.
À lire également
Dans le passé, j'ai aussi utilisé le nRF24L01 pour fabriquer un véhicule téléguidé et un système MIDI sans fil.
Finalement vous trouverez sur cette page une liste de tous les articles impliquant l'ESP32 et l'ESP8266.
Yves Pelletier (Twitter, Facebook)
Gros avantage de cette technologie, c'est la communication bi-directionelle. En plus c'est du 2.4GHz, c'est bien pour la distance moins pour les parasites.
RépondreSupprimerQuelques précisions en vrac :
RépondreSupprimer- Le NRF ne sait transférer que des paquets de 32 octets max il ne faut pas choisir un buffer de taille supérieure sinon le reste du paquet sera perdu
- Le NRF aime la stabilité en tension d'alimentation, un petit condo genre 10uF ne lui fera pas de mal
- Son alimentation n'est pas du tout tolérante au 5V mais accepte de fonctionner bien en dessous de 3.3V (les specs indiquent 1.9V min), par contre ses broches logiques sont tolérantes donc utilisables en communication 5V
- Descendre sa vitesse d'émission à 250Kbps permet d'augmenter sa portée car cela augmente sa sensibilité (modèle NRF24L01+ car NRF24L01 tout court qui ne descend pas aussi bas)
- Attention à la largeur de bande de fréquence si vous utilisez plusieurs NRF, à 2Mbps vous devez laisser u espace de 2Mhz entre chaque canal mais un seul à 250Kbps
- le NRF peut agir en mode hub récepteur et recevoir un signal de plusieurs NRF émettant sur des canaux différents
- En cas d'environnement radio "bruyant" tapez plutôt dans les 25 canaux supérieurs.
- Contrairement aux modules wifi habituels dans la bande des 2.4Ghz ce NRF 2.4Ghz est vraiment peu gourmand avec seulement 26mA en émission et moins de 30uA en écoute et devient donc très intéressant pour le coupler à un ESP pour lequel on voudrait consommer moins en communication radio
- méfiez-vous des imitations, celles-ci consomment souvent plus et portent moins loin
- The end ...
À tout ça on peut aussi rajouter mysensor ( https://mysensors.org ). Très bien pour faire des objets connectés diy qui consomment peu !
SupprimerBonjour je cherche une solution radio RF avec possibilité de cryptage ? Existe-il une solution pour un ESP32 ? Merci
RépondreSupprimer