Test longue portée
Test longue portée (1km+) sans fil nRF24L01 2.4GHz 250kbps | ESP32
Electronique | IOT
Le projet
Au fond de mes tiroirs se trouvaient quelques modules nRF24L01 que je voulais tester depuis longtemps. Ces modules sans fil de chez Nordic sont réputés pour leur longue portée et leur bas coût (à peine quelques euros). L’objectif du test : s’assurer qu’il était possible d’établir une liaison sans fil stable à 1km en LOS (line of sight) sans gros problème d’effet Fresnel, car on est à 2.4Ghz tout de même !
Cette fréquence de 2.4Ghz m’intéressait tout particulièrement car la législation est souple, contrairement aux fréquences Sub-GHz (433MHz, 866MHz ou 915Mhz), qui sont longue portée mais limité à 1% de duty cycle en Europe. Les fréquences qu’utilisent Lora et SigFox pour ne citer qu’eux ne peuvent être utilisées qu’un pourcent du temps.
D’un autre côté il est souvent difficile, voir impossible, d’atteindre une telle portée avec un protocole en 2.4Ghz (Bluetooth, Wifi…). D’où le test !
Attention : si vous souhaitez reproduire ce test, prenez les modules nRF24L01 PA LNA, ils contiennent un amplificateur et un atténuateur de bruit leur permettant cette portée. De plus tous les modules et antennes ne se valent pas comme le prouvent de nombreux tests que vous pouvez retrouver sur Youtube.
Le code source et infos pour l’ESP32
Le code de test utilise notamment la librairie RF24 qui est très bien documentée avec de nombreux exemples pour faire des Gateway sur Raspberry Pi, des réseaux de type Mesh et autre..
Le module nRF24L01 PA LNA est connecté en SPI sur le port par défaut (MOSI 23, MISO 19, SCLK 18, CS 16, CE 17).
L’écran OLED SSD1306 sur le récepteur utilise les ports I2C (SDA 21, SCL 22).
Pour l’ESP32 j’ai des modules NodeMCU, cependant n’importe quel module Arduino fera l’affaire (même un Attiny !).
L’émetteur envoie un timestamp toutes les secondes et le récepteur l’affiche sur l’écran et le port série.
Code de l’émetteur
#include <Arduino.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(17, 16); // pin CE, CSN à connecter sur les GPIO 17 et 16
const byte address[6] = "00001"; // Adresse d'envoie (bien mettre la même dans le récepteur)
char buf[16];
void setup() {
radio.begin(); // Démarrage de la radio
radio.openWritingPipe(address); // On lui donne son adresse de communication
radio.setDataRate( RF24_250KBPS );// Vitesse a 250kbps
radio.setPALevel(RF24_PA_MAX); // Puissance maximale pour le test de portée
radio.stopListening(); // Met le module en mode transmission
}
void loop()
{
char buf[16];
ltoa(millis(),buf,10);
radio.write(&buf, sizeof(buf)); // Envoie d'un timestamp toutes les secondes
delay(1000);
}
Code du Récepteur
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
Adafruit_SSD1306 screen(128, 64, &Wire, -1); // Ecran sur port I2C
RF24 radio(17, 16); // pin CE, CSN à connecter sur les GPIO 22 et 21
const byte address[6] = "00001"; // Adresse d'envoie (bien mettre la même dans l'émetteur)
void setup() {
Serial.begin(115200); // Communication série pour afficher le Ping
radio.begin();
radio.openReadingPipe(0, address); // On lui donne son adresse de communication
radio.setDataRate( RF24_250KBPS ); // Vitesse a 250kbps
radio.setPALevel(RF24_PA_MAX); // Puissance maximale pour le test de portée
radio.startListening(); // Met le module en mode réception
// Démarrage de la connexion à l'écran
if(!screen.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Screen SSD1306 Not found"));
}
else
{
Serial.println(F("Screen SSD1306 Found"));
screen.clearDisplay();
screen.setTextSize(3); // Normal 1:1 pixel scale
screen.setTextColor(SSD1306_WHITE); // Draw white text
screen.setCursor(0, 0); // Start at top-left corner
screen.cp437(true); // Use full 256 char 'Code Page 437' font
}
}
void loop()
{
if (radio.available()) // A-t-on reçu quelque chose...
{
char text[32] = "";
radio.read(&text, sizeof(text)); // Lecture de la donnée recue
Serial.println(text); // Affichage sur moniteur serie
screen.clearDisplay();
screen.setCursor(0, 0);
screen.print(text); // Affichage sur écran
screen.display();
}
}
Voilà qui conclu ce post. Le test est validé, j’ai pu dépasser les 1km tout en ayant perdu la LOS ce qui me laisse à penser qu’on pourrait facilement aller plus loin. Si vous cherchez des solutions 2.4Ghz à moyenne portée je vous conseille d’aller voir la suite de chez Nordic que j’utilise sur plusieurs projets depuis longtemps. Notamment les nRF52 pour le Bluetooth 5, Enhanced Shockburst etc, qui sont beaucoup plus récents que le nRF24L01 et inclus un microcontrolleur ARM, des cryptocells et pleins de fonctionnalitées supplémentaires.
Vous avez un projet ou besoin d'information?
N'hésitez pas à nous contacter !
contact@torrusvr.com
Bordeaux / Paris
Développement d'Expériences Immersives
Plan du site
Technologies immersives
Realité Virtuelle (RV)
Realité Augmentée (RA)
Action Game / Escape Game
Metaverse
Computer Vision
Projection Mapping
Jeux vidéos
Système embarqué
Internet des objets (IoT)
Industry 4.0
Système embarqué sur Unités Centrales (UC) Conception de Circuit Electronique (PCB)
IoT Gateway
Contact
contact@torrusvr.com