Avoir deux ou plusieurs cartes Arduino être en mesure de communiquer entre elles sans fil sur une distance ouvre beaucoup de possibilités comme la surveillance à distance des données des capteurs, le contrôle des robots, la domotique et la liste est longue. Et quand il s’agit d’avoir des solutions RF bidirectionnelles peu coûteuses mais fiables, personne ne fait un meilleur travail que le module émetteur-récepteur nRF24L01+ de Nordic Semiconductor.

Le module émetteur-récepteur nRF24L01+ (plus) peut souvent être obtenu en ligne pour moins de deux dollars, ce qui en fait l’une des options de communication de données les moins chères que vous pouvez obtenir. Et le meilleur de tous, ces modules sont super minuscules, ce qui vous permet d’incorporer une interface sans fil dans presque n’importe quel projet.

Synthèse du matériel

Fréquence radio

Le module émetteur-récepteur nRF24L01+ est conçu pour fonctionner dans la bande de fréquence ISM mondiale de 2,4 GHz et utilise la modulation GFSK pour la transmission des données. Le taux de transfert de données peut être l’un des 250kbps, 1Mbps et 2Mbps.

Qu’est-ce que la bande ISM 2,4 GHz ?

La bande 2,4 GHz est l’une des bandes industrielles, scientifiques et médicales (ISM) réservées au niveau international pour l’utilisation d’appareils de faible puissance sans licence. Par exemple, les téléphones sans fil, les appareils Bluetooth, les appareils de communication en champ proche (NFC) et les réseaux informatiques sans fil (WiFi) utilisent tous les fréquences ISM.

Consommation d’énergie

La tension de fonctionnement du module est de 1,9 à 3.6V, mais la bonne nouvelle est que les broches logiques sont tolérantes à 5 volts, donc nous pouvons facilement le connecter à un Arduino ou à tout microcontrôleur à logique 5V sans utiliser de convertisseur de niveau logique.

Le module prend en charge la puissance de sortie programmable viz. 0 dBm, -6 dBm, -12 dBm ou -18 dBm et consomme incroyablement environ 12 mA pendant la transmission à 0 dBm, ce qui est encore plus bas qu’une seule LED. Et le meilleur de tous, il consomme 26 µA en mode veille et 900 nA en mode hors tension. C’est pourquoi ils sont le dispositif sans fil par excellence pour les applications à faible consommation.

Interface SPI

Le module émetteur-récepteur nRF24L01+ communique sur une interface périphérique série (SPI) à 4 broches avec un débit de données maximal de 10 Mbps. Tous les paramètres tels que le canal de fréquence (125 canaux sélectionnables), la puissance de sortie (0 dBm, -6 dBm, -12 dBm ou -18 dBm) et le débit de données (250kbps, 1Mbps ou 2Mbps) peuvent être configurés via l’interface SPI.

Le bus SPI utilise un concept de maître et d’esclave, dans les applications les plus courantes notre Arduino est le maître et le module émetteur-récepteur nRF24L01+ est l’esclave. Contrairement au bus I2C, le nombre d’esclaves sur le bus SPI est limité, sur l’Arduino Uno, vous pouvez utiliser un maximum de deux esclaves SPI, c’est-à-dire deux modules émetteurs-récepteurs nRF24L01+.

Voici les spécifications complètes:

Plage de fréquences 2.4 GHz Bande ISM
Débit maximal de données aériennes 2 Mb/s
Format de modulation GFSK
Max. Puissance de sortie 0 dBm
Tension d’alimentation en fonctionnement 1,9 V à 3,6 V
Courant de fonctionnement max. Courant de fonctionnement 13,5mA
Courant min. Courant (mode veille) 26µA
Entrées logiques Tolérantes à 5V
Portée de communication 800+ m (ligne de vue)

Module nRF24L01+ Vs module PA/LNA nRF24L01+

Il existe une variété de modules disponibles basés sur la puce nRF24L01+. Voici les versions les plus populaires.

Module sans fil nRF24L01+

La première version utilise une antenne embarquée. Cela permet d’obtenir une version plus compacte du breakout. Cependant, l’antenne plus petite signifie également une gamme de transmission plus faible. Avec cette version, vous serez en mesure de communiquer sur une distance de 100 mètres. Bien sûr, il s’agit de l’extérieur dans un espace ouvert. Votre portée à l’intérieur, notamment à travers les murs, sera légèrement affaiblie.

nRF24L01+ PA LNA Wireless Transceiver Module with External Antenna

La deuxième version est livrée avec un connecteur SMA et une antenne canard mais ce n’est pas la vraie différence. La vraie différence est qu’elle est livrée avec une puce spéciale RFX2401C qui intègre le PA, le LNA et les circuits de commutation émission-réception. Cette puce d’extension de portée ainsi qu’une antenne canard aide le module à atteindre une portée de transmission significativement plus grande d’environ 1000m.

Qu’est-ce que le PA LNA ?

Le PA signifie amplificateur de puissance. Il ne fait que booster la puissance du signal transmis par la puce nRF24L01+. Tandis que le LNA signifie Low-Noise Amplifier (amplificateur à faible bruit). La fonction du LNA est de prendre le

diagramme de bloc PA/LNA du nRF24L01+

signal extrêmement faible et incertain de l’antenne (généralement de l’ordre du microvolt ou inférieur à -100 dBm) et de l’amplifier à un niveau plus utile (généralement environ 0.5 à 1V)

L’amplificateur à faible bruit (LNA) de la voie de réception et l’amplificateur de puissance (PA) de la voie d’émission se connectent à l’antenne via un duplexeur, qui sépare les deux signaux et empêche la sortie relativement puissante du PA de surcharger l’entrée sensible du LNA. Pour plus d’informations, consultez cet article sur digikey.com

Sauf cette différence, les deux modules sont compatibles drop-in. Ce qui signifie que si vous construisez votre projet avec l’un d’eux, vous pouvez simplement le débrancher et utiliser un autre sans avoir besoin d’apporter des modifications au système.

Comment fonctionne le module émetteur-récepteur nRF24L01+ ?

Fréquence du canal RF

Le module émetteur-récepteur nRF24L01+ transmet et reçoit des données sur une certaine fréquence appelée canal. Aussi, pour que deux ou plusieurs modules émetteurs-récepteurs puissent communiquer entre eux, il faut qu’ils soient sur le même canal. Ce canal peut être n’importe quelle fréquence dans la bande ISM de 2,4 GHz ou pour être plus précis, il peut être compris entre 2,400 et 2,525 GHz (2400 à 2525 MHz).

Chaque canal occupe une bande passante de moins de 1MHz. Cela nous donne 125 canaux possibles avec un espacement de 1MHz. Donc, le module peut utiliser 125 canaux différents ce qui donne une possibilité d’avoir un réseau de 125 modems fonctionnant indépendamment en un seul endroit.

Le canal occupe une bande passante de moins de 1MHz à 250kbps et 1Mbps de débit de données aériennes. Cependant, à 2Mbps de débit de données aériennes, une bande passante de 2MHz est occupée (plus large que la résolution du réglage de la fréquence du canal RF). Donc, pour assurer le non-chevauchement des canaux et réduire la diaphonie en mode 2Mbps, vous devez garder un espacement de 2MHz entre deux canaux.

La fréquence du canal RF de votre canal sélectionné est définie selon la formule suivante :

Freq(Selected) = 2400 + CH(Selected)

Par exemple, si vous sélectionnez 108 comme votre canal pour la transmission de données, la fréquence de canal RF de votre canal serait de 2508MHz (2400 + 108)

nRF24L01+ Réseau Multiceiver

Le nRF24L01+ fournit une fonctionnalité appelée Multiceiver. C’est une abréviation de Multiple Transmitters Single Receiver (émetteurs multiples et récepteur unique). Dans laquelle chaque canal RF est logiquement divisé en 6 canaux de données parallèles appelés Data Pipes. En d’autres termes, un Data Pipes est un canal logique dans le canal RF physique. Chaque canal de données a sa propre adresse physique (Data Pipe Address) et peut être configuré. Ceci peut être illustré comme indiqué ci-dessous.

nRF24L01+ Réseau multi-récepteur – Plusieurs émetteurs un seul récepteur

Pour simplifier le schéma ci-dessus, imaginez le récepteur primaire agissant comme un récepteur hub collectant les informations de 6 nœuds émetteurs différents simultanément. Le récepteur hub peut arrêter d’écouter à tout moment et agit comme un émetteur. Mais cela ne peut se faire qu’un tuyau/nœud à la fois.

Protocole ShockBurst amélioré

Le module émetteur-récepteur nRF24L01+ utilise une structure de paquets connue sous le nom de ShockBurst amélioré. Cette structure de paquet simple est décomposée en 5 champs différents, ce qui est illustré ci-dessous.

structure de paquet ShockBurst amélioré du nRF24L01+

La structure ShockBurst originale ne comprenait que les champs préambule, adresse, charge utile et le contrôle de redondance cyclique (CRC). Le ShockBurst amélioré a apporté une plus grande fonctionnalité pour des communications plus améliorées en utilisant un champ de contrôle de paquet (PCF) nouvellement introduit.

Cette nouvelle structure est formidable pour un certain nombre de raisons. Premièrement, elle permet des charges utiles de longueur variable avec un spécificateur de longueur de charge utile, ce qui signifie que les charges utiles peuvent varier de 1 à 32 octets.

Deuxièmement, elle fournit à chaque paquet envoyé un ID de paquet, ce qui permet au dispositif de réception de déterminer si un message est nouveau ou s’il a été retransmis (et peut donc être ignoré).

Enfin, et le plus important, chaque message peut demander l’envoi d’un accusé de réception lorsqu’il est reçu par un autre périphérique.

nRF24L01+ Automatic Packet Handling

Maintenant, discutons de trois scénarios pour mieux comprendre comment deux modules nRF24L01+ transigent entre eux.

Transaction avec accusé de réception et interruptionC’est un exemple de scénario positif. Ici, l’émetteur commence une communication en envoyant un paquet de données au récepteur. Une fois que tout le paquet est transmis, il attend (environ 130 µs) la réception du paquet d’accusé de réception (paquet ACK). Lorsque le récepteur reçoit le paquet, il envoie le paquet ACK à l’émetteur. A la réception du paquet ACK, l’émetteur active le signal d’interruption (IRQ) pour indiquer que les nouvelles données sont disponibles.

Transaction avec paquet de données perduC’est un scénario négatif où une retransmission est nécessaire en raison de la perte du paquet transmis. Après la transmission du paquet, l’émetteur attend la réception du paquet ACK. Si l’émetteur ne le reçoit pas dans le délai ARD (Auto-Retransmit-Delay), le paquet est retransmis. Lorsque le paquet retransmis est reçu par le récepteur, le paquet ACK est transmis, ce qui génère à son tour une interruption au niveau de l’émetteur.

Transaction avec accusé de réception perduC’est encore un scénario négatif où une retransmission est nécessaire en raison de la perte du paquet ACK. Ici, même si le récepteur reçoit le paquet lors de la première tentative, en raison de la perte du paquet ACK, l’émetteur pense que le récepteur n’a pas du tout reçu le paquet. Ainsi, une fois le délai de retransmission automatique écoulé, il retransmet le paquet. Maintenant, lorsque le récepteur reçoit le paquet contenant le même ID de paquet que le précédent, il le rejette et envoie à nouveau le paquet ACK.

Toute cette manipulation de paquets est faite automatiquement par la puce nRF24L01+ sans implication du microcontrôleur.

Pinout du module émetteur-récepteur nRF24L01+

Regardons le pinout des deux versions du module émetteur-récepteur nRF24L01+.

GND est la broche de masse. Elle est généralement marquée en encastrant la broche dans un carré afin qu’elle puisse être utilisée comme référence pour identifier les autres broches.

VCC fournit l’alimentation du module. Cela peut être n’importe où entre 1,9 et 3,9 volts. Vous pouvez le connecter à la sortie 3,3V de votre Arduino. Rappelez-vous que le connecter à une broche 5V détruira probablement votre module nRF24L01+!

CE (Chip Enable) est une broche active-HIGH. Lorsqu’elle est sélectionnée, le nRF24L01 transmettra ou recevra, selon le mode dans lequel il se trouve actuellement.

CSN (Chip Select Not) est une broche active-LOW et est normalement maintenue HIGH. Lorsque cette broche passe au niveau bas, le nRF24L01 commence à écouter sur son port SPI les données et les traite en conséquence.

SCK (Serial Clock) accepte les impulsions d’horloge fournies par le maître du bus SPI.

MOSI (Master Out Slave In) est l’entrée SPI du nRF24L01.

MISO (Master In Slave Out) est la sortie SPI du nRF24L01.

IRQ est une broche d’interruption qui peut alerter le maître lorsque de nouvelles données sont disponibles pour être traitées.

Câblage – Connexion du module émetteur-récepteur nRF24L01+ à Arduino UNO

Maintenant que nous avons une compréhension complète du fonctionnement du module émetteur-récepteur nRF24L01+, nous pouvons commencer à le connecter à notre Arduino !

Pour commencer, connectez la broche VCC du module à 3,3V sur l’Arduino et la broche GND à la masse. Les broches CSN et CE peuvent être connectées à n’importe quelle broche numérique de l’Arduino. Dans notre cas, elles sont connectées aux broches digitales n°8 et n°9 respectivement. Maintenant, nous restons avec les broches qui sont utilisées pour la communication SPI.

Comme le module émetteur-récepteur nRF24L01+ nécessite beaucoup de transfert de données, ils donneront la meilleure performance lorsqu’ils sont connectés jusqu’aux broches SPI matérielles sur un microcontrôleur. Les broches SPI matérielles sont beaucoup plus rapides que le ‘bit-banging’ du code d’interface en utilisant un autre ensemble de broches.

Notez que chaque carte Arduino a différentes broches SPI qui doivent être connectées en conséquence. Pour les cartes Arduino telles que l’UNO/Nano V3.0, ces broches sont les numériques 13 (SCK), 12 (MISO) et 11 (MOSI).

Si vous avez un Mega, les broches sont différentes ! Vous voudrez utiliser les numériques 50 (MISO), 51 (MOSI), 52 (SCK) et 53 (SS). Référez-vous au tableau ci-dessous pour une compréhension rapide.

MOSI MISO SCK
Arduino Uno 11 12 13
Arduino Nano 11 12 13
Arduino Mega 51 50 52

Dans le cas où vous utilisez une carte Arduino différente de celles mentionnées ci-dessus, il est conseillé de consulter la documentation officielle d’Arduino avant de poursuivre.

Câblage du module émetteur-récepteur sans fil nRF24L01+ à Arduino UNO
Câblage du module sans fil nRF24L01+ PA LNA à Arduino UNO

Rappellez-vous ! Vous devez réaliser deux de ces circuits. L’un agit comme un émetteur et l’autre comme un récepteur. Le câblage pour les deux est identique.

Une fois que vous avez tout branché, vous êtes prêt à partir!

Bibliothèque Arduino RF24 pour le module nRF24L01+

L’interfaçage avec le module émetteur-récepteur nRF24L01+ est un tas de travail, mais heureusement pour nous, il existe un certain nombre de bibliothèques disponibles. L’une des bibliothèques les plus populaires est RF24. Cette bibliothèque existe depuis plusieurs années. Elle est simple à utiliser pour les débutants, mais offre néanmoins beaucoup pour les utilisateurs avancés. Dans nos expériences, nous utiliserons la même bibliothèque.

Vous pouvez télécharger la dernière version de la bibliothèque sur le dépôt GitHub de RF24 fork ou, il suffit de cliquer sur ce bouton pour télécharger le zip :

Pour l’installer, ouvrez l’IDE Arduino, allez dans Sketch > Inclure une bibliothèque > Ajouter une bibliothèque .ZIP, puis sélectionnez le fichier RF24-master que vous venez de télécharger. Si vous avez besoin de plus de détails sur l’installation d’une bibliothèque, visitez ce tutoriel Installer une bibliothèque Arduino.

Code Arduino – Pour l’émetteur

Dans notre expérience, nous allons juste envoyer un message traditionnel ‘Hello World’ de l’émetteur au récepteur.

Voici le sketch que nous allons utiliser pour notre émetteur:

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ radio.begin(); //set the address radio.openWritingPipe(address); //Set module as transmitter radio.stopListening();}void loop(){ //Send message to receiver const char text = "Hello World"; radio.write(&text, sizeof(text)); delay(1000);}

Le sketch commence par inclure les bibliothèques. La bibliothèque SPI.h gère la communication SPI tandis que nRF24L01.h et RF24.h contrôlent le module.

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>

Puis, nous devons créer un objet RF24. L’objet prend deux numéros de broches comme paramètres auxquels les signaux CE et CSN sont connectés.

//create an RF24 objectRF24 radio(9, 8); // CE, CSN

Puis nous devons créer un tableau d’octets qui représentera l’adresse du tuyau par lequel deux modules nRF24L01+ communiquent.

//address through which two modules communicate.const byte address = "00001";

Nous pouvons changer la valeur de cette adresse à n’importe quelle chaîne de 5 lettres comme « node1 ». L’adresse est nécessaire si vous avez quelques modules dans un réseau. Grâce à l’adresse, vous pouvez choisir un module particulier auquel vous êtes intéressé à communiquer, donc dans notre cas nous aurons la même adresse pour l’émetteur et le récepteur.

Suivant dans la fonction de configuration : nous devons initialiser l’objet radio en utilisant radio.begin() et en utilisant la fonction radio.openWritingPipe() nous définissons l’adresse de l’émetteur.

//set the addressradio.openWritingPipe(address);

Enfin, nous utiliserons la fonction radio.stopListening() qui définit le module comme émetteur.

//Set module as transmitterradio.stopListening();

Dans la section boucle : nous créons un tableau de caractères auquel nous attribuons le message « Hello World ». En utilisant la fonction radio.write(), nous allons envoyer ce message au récepteur. Le premier argument ici est le message que nous voulons envoyer. Le deuxième argument est le nombre d’octets présents dans ce message.

const char text = "Hello World";radio.write(&text, sizeof(text));

Avec cette méthode, vous pouvez envoyer jusqu’à 32 octets à la fois. Car c’est la taille maximale d’un seul paquet que le nRF24L01+ peut gérer. Si vous avez besoin d’une confirmation que le récepteur a reçu des données, la méthode radio.write() renvoie une valeur bool. Si elle renvoie TRUE, les données ont atteint le récepteur. Si elle renvoie FAUX, les données ont été perdues.

la fonction radio.write() bloque le programme jusqu’à ce qu’il reçoive l’accusé de réception ou qu’il épuise toutes les tentatives de retransmission.

Code Arduino – Pour le récepteur

Voici le sketch que nous utiliserons pour notre récepteur

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ while (!Serial); Serial.begin(9600); radio.begin(); //set the address radio.openReadingPipe(0, address); //Set module as receiver radio.startListening();}void loop(){ //Read the data if available in buffer if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }}

Ce programme ressemble beaucoup à celui de l’émetteur à quelques modifications près.

Au début de la fonction setup nous démarrons la communication série. Ensuite, en utilisant la fonction radio.setReadingPipe(), nous définissons la même adresse que l’émetteur et de cette façon, nous activons la communication entre l’émetteur et le récepteur.

 //set the address radio.openReadingPipe(0, address);

Le premier argument est le numéro du flux. Vous pouvez créer jusqu’à 6 flux qui répondent à des adresses différentes. Nous n’avons créé qu’une seule adresse pour le flux numéro 0. Le deuxième argument est l’adresse à laquelle le flux réagira pour collecter les données.

L’étape suivante consiste à configurer le module en tant que récepteur et à commencer à recevoir des données. Pour ce faire, nous utilisons la fonction radio.startListening(). A partir de ce moment, le modem attend les données envoyées à l’adresse spécifiée.

//Set module as receiver radio.startListening();

Dans la fonction de boucle : Le sketch vérifie si des données sont arrivées à l’adresse en utilisant la méthode radio.available(). Cette méthode renvoie la valeur TRUE si nous toute donnée est disponible dans le tampon.

if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }

Si les données sont reçues, alors il crée un tableau de 32 caractères rempli de zéros (plus tard le programme le remplira avec les données reçues). Pour lire les données, nous utilisons la méthode radio.read (& text, sizeof (text)). Cela va stocker les données reçues dans notre tableau de caractères.

À la fin, nous imprimons juste le message reçu sur le moniteur série. Si vous avez tout fait correctement et qu’il n’y a pas d’erreurs dans les connexions, vous devriez voir quelque chose comme ceci dans votre moniteur série.

Sortie du transceiver nRF24L01+ sur le moniteur série

Amélioration de la portée du module transceiver nRF24L01+

Un paramètre clé pour un système de communication sans fil est la portée de communication. Dans de nombreux cas, c’est le facteur décisif pour le choix d’une solution RF. Donc, discutons de ce que nous pouvons faire pour obtenir une meilleure portée pour notre module.

Réduire le bruit de l’alimentation

Un circuit RF qui génère un signal de radiofréquence (RF), est très sensible au bruit de l’alimentation. S’il n’est pas contrôlé, le bruit de l’alimentation peut réduire considérablement la portée que vous pouvez obtenir.

Sauf si la source d’alimentation est une batterie autonome, il y a de fortes chances qu’il y ait du bruit associé à la génération de l’alimentation. Pour empêcher ce bruit de pénétrer dans le système, il est conseillé de placer un condensateur de filtrage de 10 µf sur la ligne d’alimentation, aussi près physiquement que possible du module nRF24L01+.

Un moyen le plus simple de s’en sortir est d’utiliser un module adaptateur pour nRF24L01 très bon marché.

Adaptateur nRF24L01+

Le module adaptateur possède un connecteur femelle à 8 broches pour vous permettre de brancher votre module nRF24L01. Il peut accueillir les deux modules dont nous avons parlé précédemment, celui avec antenne intégrée et l’autre avec antenne externe (PA/LNA). Il dispose également d’un connecteur mâle à 6 broches pour les connexions SPI et d’interruption et d’un connecteur à 2 broches pour l’entrée d’alimentation.

Le module adaptateur dispose de son propre régulateur de tension de 3,3 volts et d’un ensemble de condensateurs de filtrage, de sorte que vous pouvez l’alimenter avec une alimentation de 5 volts.

Changer la fréquence de votre canal

Une autre source potentielle de bruit pour un circuit RF est l’environnement extérieur, en particulier si vous avez des réseaux voisins réglés sur le même canal ou des interférences provenant d’autres appareils électroniques.

Pour éviter que ces signaux ne causent des problèmes, nous suggérons d’utiliser les 25 canaux les plus élevés votre module nRF24L01+. La raison en est que le WiFi utilise la plupart des canaux inférieurs.

La baisse du débit de données

Le nRF24L01+ offre la plus grande sensibilité de réception à la vitesse de 250Kbps qui est de -94dBm. Cependant, à un débit de 2MBps, la sensibilité du récepteur chute à -82dBm. Si vous parlez cette langue, vous savez que le récepteur à 250Kbps est presque 10 fois plus sensible qu’à 2Mbps. Cela signifie que le récepteur peut décoder un signal 10 fois plus faible.

Que signifie la sensibilité du récepteur (Rx) ?

La sensibilité du récepteur est le niveau de puissance le plus faible auquel le récepteur peut détecter un signal RF. Plus la valeur absolue du nombre négatif est grande, meilleure est la sensibilité du récepteur. Par exemple, une sensibilité de récepteur de -94 dBm est meilleure qu’une sensibilité de récepteur de -82 dBm de 12 dB.

Donc, la diminution du débit de données peut améliorer considérablement la portée que vous pouvez atteindre. De plus, pour la plupart de nos projets, une vitesse de 250Kbps est plus que suffisante.

Puissance de sortie plus élevée

Le réglage de la puissance de sortie maximale peut également améliorer la portée de communication. Le nRF24L01+ vous permet de choisir une des puissances de sortie, à savoir 0 dBm, -6 dBm, -12 dBm ou -18 dBm. La sélection de la puissance de sortie de 0 dBm envoie un signal plus fort dans l’air.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.