UKOnline

Module radio nRF24L01+

Pour réaliser une communication sans fil entre l'Arduino et la Raspberry Pi, on va utiliser à un module radio qui permet d'émettre et recevoir des signaux sans fil. Le module que l'on va utiliser se base sur une antenne et sur le circuit intégré nRF24L01+, un émetteur-récepteur 2,4 GHz conçu pour des applications sans fil à très faible consommation. La figure 1 montre une photo du module radio basé sur nRF24L01+.

Module radio nRF24L01+
Le module radio basé sur le circuit intégré nRF24L01+ de la société Nordic Semiconductor permet d'émettre et de recevoir des données en se basant sur une communication sans fil qu'il gère intégralement.

Pour connaitre les caractéristiques de ce module radio, comprendre son mode de fonctionnement et obtenir des instructions quant à son utilisation, on va se référer à la datasheet du circuit intégré nRF24L01+ et trouver de la documentation de plus haut niveau sur le module, comme on a fait avec le module de détection sonore à la section 1.4.

La figure 2 montre la première page d'un résumé technique présentant le nRF24L01+ de Nordic Semiconductor. On y retrouve une description générale du composant, quelques caractéristiques et des exemples d'applications pour lesquelles il est pertinent.

Documentation module radio nRF24L01+
La première page d'un bref résumé technique du module radio basé sur le circuit intégré nRF24L01+ de Nordic Semiconductor fournit une description générale du module, présente quelques caractéristiques et donne des exemples d'applications.

Caractéristique

Le module radio nRF24L01+ est capable d'effectuer des émissions et réceptions de données par les airs, en utilisant des ondes radios dont la fréquence se situe autour de 2,4 GHz. Il s'agit d'une bande de fréquence dite ISM, c'est-à-dire, utilisable dans le monde entier sans devoir acquérir de licence, pour autant que l'utilisation soit faite dans un espace réduit et pour des applications industrielles, scientifiques ou médicales.

Le nRF24L01+ a été conçu pour créer des applications sans fil à très faible consommation. En effet, on voit dans sa datasheet qu'il ne tire qu'entre 900 nA et 13,5 mA selon le mode de fonctionnement. Comme résumé dans la figure 3, il y a quatre principaux modes : minimal (power down), en attente (standby), en émission et en réception.

Mode Courant Configuration
Power down 900 nA
Standby-I 26 µA
Transmission 11,3 mA Puissance de sortie de 0 dBm
Réception 13,5 mA Débit de 2 Gbps
Le circuit intégré nRF24L01+ a besoin de plus ou moins de courant selon le mode de fonctionnement dans lequel il se trouve.

Dans le mode minimal, le circuit intégré ne fait pas grand-chose et peut être réveillé à tout moment, en vue d'une transmission, ce qui prend environ 1,5 ms. Dans le mode standby-I, tout est prêt pour une transmission, qui peut démarrer en environ 130 µs, ce qui fait que la consommation est un peu plus élevée. Enfin, en émission ou réception, le circuit intégré a besoin d'encore plus de courant, notamment pour gérer le protocole de transmission de données.

Le nRF24L01+ utilise une modulation GFSK (la modulation « Gaussian Frequency-Shift Keying » (GFSK) est une modulation de fréquence qui transmet un signal numérique par des changements discrets de la fréquence de la porteuse, et utilisant un filtre Gaussien pour lisser les transitions) pour encoder les signaux à transmettre. Trois paramètres, dont les valeurs possibles sont reprises dans la figure 4, peuvent être configurés : la fréquence du canal, la puissance de sortie de le débit de données dans l'air. Les 126 canaux disponibles ne se chevauchent pas et font moins de 1 MHz de large à 250 kbps et 1 Mbps et moins de 2 MHz à 2 Mbps. Concernant le débit de données dans l'air, un moins élevé donne une meilleure sensibilité du récepteur, mais un plus élevé donne une consommation de courant plus faible et diminue le risque de collision dans l'air.

Paramètre Valeurs possibles
Fréquence du canal 126 canaux entre 2,4 GHz et 2,525 GHz
Puissance de sortie 0 dBm, -6 dBm, -12 dBm ou -18 dBm
Débit de données dans l'air 250 kbps, 1 Mbps ou 2 Mbps
Trois paramètres peuvent être configurés pour la modulation GFSK utilisée par le circuit intégré nRF24L01+ pour réaliser les transmissions de données.

Pour communiquer avec le circuit intégré depuis l'Arduino, notamment pour le configurer et gérer l'émission et la réception de données, on utilise l'interface SPI (l'interface de communication « Serial Peripheral Interface » (SPI) est typiquement utilisée pour des communications à courte distance et à haut débit) haut débit du nRF24L01+ qui offre une vitesse de transmission pouvant atteindre jusqu'à 10 Mbps.

Enfin, concernant les conditions d'utilisation du nRF24L01+, il suffit de l'alimenter avec une tension comprise entre 1,9 V et 3,6 V pour qu'il soit utilisable. De plus, sa température de fonctionnement doit se situer entre -40 °C et 85 °C. Sous ces conditions, et sans aucun obstacle ou interférence, il est possible de réaliser une communication avec une portée allant jusqu'à environ 100 m.

Utilisation

Le module radio basé sur le circuit intégré nRF24L01+ est assez simple à utiliser. Il faut tout d'abord l'alimenter avec une tension comprise entre 1,9 V et3,6 V pour qu'il se mette à fonctionner.

Il reste à connecter l'interface SPI, composée de SCK, MOSI, MISO et CSN, ainsi que l'entrée qui contrôle l'émission et la réception, à savoir CE, sur des pins numériques. La sortie IRQ, qui est optionnelle, permet au circuit intégré d'envoyer une interruption lorsqu'il y a des données à traiter qui sont disponibles. À part $V_{CC}$ et la masse, les autres entrées/sorties tolèrent une tension jusqu'à 5 V. La figure 5 reprend les huit connexions possibles du module radio nRF24L01+.

Circuit avec module radio nRF24L01+
Le module radio basé sur le circuit intégré nRF24L01+ de la société Nordic Semiconductor permet d'émettre et de recevoir des données en se basant sur une communication sans fil qu'il gère intégralement.

Câblage

Connecter le module radio à l'Arduino est plus complexe qu'avec les capteurs précédents. Comme le montre la figure 6, il y a huit connexions en tout, dont une n'est pas nécessaire et ne sera pas utilisée (IRQ) et dont celle encadrée en haut à gauche est la masse.

Pins du nRF24L01+
Le module radio nRF24L01+ possède huit connexions : la masse (GND) et la tension d'alimentation (VCC), l'interface SPI (SCK, MISO, MOSI, CSN), le contrôle de l'activation du module (CE) et l'interruption (IRQ).

Pour connecter le module radio nRF24L01+ à l'Arduino, on ne peut pas utiliser n'importe quelle pin. Tout d'abord, il est important de connecter VCC sur le 3,3 V, sans quoi il y a un risque de griller le module. Toutes les autres connexions supportent le 5 V et peuvent être connectées sur les pins numériques sans soucis. Concernant la connexion de l'interface SPI, il faut utiliser les bonnes pins, on n'a pas le choix. Sur l'Arduino Uno, il faut utiliser la correspondance suivante :

  • SCK sur la pin numérique 13 (ou sur la pin ICSP 3 (les pins ICSP sont celles du bloc de six situé tout à droite de l'Arduino lorsqu'il est orienté comme sur la figure 6),
  • MOSI sur la pin numérique 11 (ou sur la pin ICSP 4),
  • MISO sur la pin numérique 12 (ou sur la pin ICSP 1),
  • et CSN sur la pin numérique 10.

Enfin, il n'y a aucune contrainte pour CE qui doit juste aller sur une pin numérique. Par souci d'élégance, on va simplement la connecter sur la pin 9 de sorte que toutes les connexions restent proches. La figure 7 montre le schéma de câblage, où l'on peut voir tout cela.

Câblage du LM35
Pour connecter le module radio à une Arduino, il suffit de sept connexions : la masse (GNC) et la tension d'alimentation (VCC), l'entrée pour activer ou non la puce (CE) et les quatre connexions pour l'interface SPI (SCK, MOSI, MISO et CSN).

Sketch

Pour pouvoir utiliser le module radio, il faut passer par l'interface SPI et suivre le protocole du module. Pour rendre cette tâche plus aisée, on va se baser sur la librairie Arduino RF24 (le site web officiel de la librairie RF24 est https://tmrh20.github.io/RF24 et son code source est disponible sur GitHub) proposée par TMRh20. Grâce à cette librairie, on va pouvoir utiliser le module radio pour émettre et recevoir des données, sans devoir maitriser les détails de l'interface SPI et du protocole du module. Pour illustrer le fonctionnement de base de la librairie RF24, on va effectuer une communication unidirectionnelle entre deux Arduinos, chacune étant équipée d'un module radio.

Réception de données

Commençons par écrire un sketch qui va recevoir des données. Dans l'en-tête, on commence par inclure la librairie de gestion de l'interface SPI et la librairie RF24, qui est composée d'un fichier principal et d'un fichier spécifique aux modules de la famille nRF24L01.

On déclare ensuite une variable radio de type RF24, en précisant les numéros des pins sur lesquelles sont reliés, dans l'ordre, le CE et le CSN et on déclare une variable address contenant une adresse qui permettra à l'émetteur de l'atteindre et de lui envoyer des données.

Ensuite, dans la fonction d'initialisation, on configure d'abord le port série pour pouvoir afficher les données reçues. Ensuite, on initialise la radio avec la fonction begin, on ouvre un canal de lecture sur l'adresse choisie avec la fonction openReadingPipe et on met le module radio en mode écoute avec la fonction startListening.

Enfin, la fonction boucle principale teste en permanence si des données ont été reçues, grâce à la fonction available, pour ensuite les récupérer, le cas échéant, avec la fonction read.

Envoi de données

Maintenant que l'on a une Arduino en mode réception, on peut écrire un sketch qui va émettre des données. L'en-tête est exactement la même que précédemment, avec une variable i en plus, pour gérer une séquence de nombre entiers qui seront envoyés par le module radio.

Ensuite, dans la fonction d'initialisation, on initialise le module radio avec la fonction begin, on ouvre un canal d'écriture sur l'adresse choisie avec la fonction openWritingPipe et on s'assure que le module n'est pas en mode écoute, en coupant ce dernier avec la fonction stopListening.

Enfin, la fonction boucle principale envoie, toutes les secondes, le nombre suivant de la séquence $1, 2, 3, ...$ à l'aide de la fonction write.

Une fois ces deux sketches chargés sur des Arduinos équipées d'un module radio, on peut démarrer le récepteur et l'émetteur pour qu'elles se mettent à s'échanger des données par les airs, comme on voit à la figure 8 montrant le moniteur série de l'Arduino récepteur.

Communication Arduinos avec module radio nRF24L01+
Deux Arduino peuvent s'échanger des données via les airs grâce au module radio nRF24L01+, comme dans cet exemple où une Arduino envoie la séquence de nombres $1, 2, 3, ...$ à une autre Arduino, à raison d'un nombre par seconde.

Configuration

Lorsque l'on crée la variable radio, des valeurs par défaut sont choisies pour les paramètres du module radio. On peut consulter et modifier ces valeurs à l'aide de getters et setters. La fréquence du canal s'obtient avec getChannel et est modifiée avec setChannel, avec un nombre entier compris entre $0$ et $125$. La puissance de sortie se gère avec getPALevel et setPALevel, avec une constante parmi RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH et RF24_PA_MAX. Enfin le débit de données dans l'air est géré avec getDataRate et setDataRate, avec une valeur parmi RF24_1MBPS, RF24_2MBPS et RF24_250KBPS. Pour connaitre les valeurs par défaut, il suffit de les afficher dans la fonction d'initialisation, par exemple juste après avoir exécuté l'instruction radio.begin(). Le module est, par exemple, configuré sur le canal 76, avec une puissance de sortie de 0 dBm et un débit de données dans l'air de 1 Mbps (la valeur $3$ de la puissance de sortie correspond à RF24_PA_MAX et la valeur $0$ du débit de données dans l'air correspond à RF24_1MBPS).

Channel:   76
PA Level:  3
Data rate: 0