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+.
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.
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 |
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 |
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+.
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.
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.
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.
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