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

          Technologies immersives

          Realité Virtuelle (RV)
          Realité Augmentée (RA)
          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