Tests de modules nRF24L01+

Matériel

Les modules présentés sur les photos de cet article ont l’antenne intégrée au PCB. C’est bien pour faire des tests à moindre coût ou si les modules doivent communiquer dans la même pièce. Pour des applications plus robustes, je conseille de choisir un modèle avec antenne.

Modèle avec antenne PCB

Modèle avec antenne externe

Caractéristiques techniques

Le module nRF24L01+ est un émetteur-récepteur (= transceiver) RF 2.4 GHz à très basse consommation et très faible coût qui convient particulièrement bien pour les applications DIY. Il fonctionne avec une tension d’alimentation de 3.3 V, mais ses signaux sont tolérants au 5 V et il peut donc être utilisé avec un Arduino Uno par exemple.

Comparé au ZigBee, le nRF24L01+ est moins performant, propose moins de fonctionnalités, mais il est beaucoup moins cher. Il permet de créer des réseaux en étoile et en arbre.

Résumé des caractéristiques

  • Fréquence : 2.4 GHz ISM (Industrial, Scientific and Medical) band
  • Tension d’alimentation : 1.9 à 3.6 V
  • Interface SPI jusqu’à 10 Mb/s (tolérant 5 V)
  • Vitesses de transmission : 250 kb/s¹, 1 Mb/s et 2 Mb/s
  • Très basse consommation (plusieurs mois, voire années avec une pile bouton ou des piles AA/AAA). 900 nA deep sleep mode. 13.3 mA Radio RX at 2 Mb/s on-air data-rate.
  • Peut être utilisé avec des microcontrôleurs très basiques comme l’ATtiny
  • Prix inférieur à 1$
  • Portée : quelques mètres avec une antenne PCB (modèle présenté ici) et jusqu’à un kilomètre avec une antenne externe (et beaucoup de chance).
  • Protocole propriétaire Enhanced ShockBurst™ qui permet la communication bidirectionnelle avec mise en mémoire tampon des paquets de données, confirmation des paquets reçus et retransmission automatique des paquets perdus.

¹ Modèle nRF24L01+ uniquement

Spécifications techniques de Nordic Semiconductor

Note

Préférer le modèle nRF24L01+ au modèle nRF24L01 (sans le +). Pour savoir quel est le type d’un module, utiliser le programme d’exemple pingpair_ack.ino, ou le programme printDetails.ino ci-dessous. Une des différences notables est la possibilité de descendre à 250 kb/s pour le modèle +. En plus de ça, Nordic indique dans la spec du nRF24L01+ : Intermodulation and wideband blocking values in nRF24L01+ are much improved in comparison to the nRF24L01 and the addition of internal filtering to nRF24L01+ has improved the margins for meeting RF regulatory standards.

// printDetails.ino
// Permet de différencier un nRF24L01 d’un nRF24L01+

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

RF24 radio( 9, 10 );

void setup()
{
  Serial.begin( 115200 );
  printf_begin();
  radio.begin();
  radio.printDetails();
}

void loop(){}

Module nRF24L01+ avec antenne PCB

D’après le programme printDetails.ino, ce module acheté chez AliExpress est un nRF24L01+.

Module nRF24L01+ sur Arduino UNO

Le bouton sur les shields est connecté à la broche A0. Le brochage du nRF24 est disponible dans le tableau ci-dessous. Il faut connecter un condensateur électrolytique de 3.3 µF à 10 µF en parallèle sur l’alim (pas visible sur l’image).

Module nRF24L01+ brochage

Brochage

Pour les brochages de l’ATtiny et du RPi, voir https://tmrh20.github.io/RF24/.

Broche nRF24L01+ Arduino UNO Launchpad MSP430
1 GND GND ¹ GND
2 VCC 3.3V ¹ VCC
3 CE 9 ² P2.0
4 CSN 10 ² P2.1
5 SCK 13 P1.5
6 MOSI 11 P1.7
7 MISO 12 P1.6
8 IRQ - P2.2

¹ Ajouter un condensateur électrolytique de 3.3 µF à 10 µF en parallèle sur l’alim. ² Les broches pour CE et CSN, peuvent être configurée logiciellement lors de l’initialisation du RF24 avec l’instruction RF24 radio(9,10);. Par défaut, TMRh20 utilise les broches 7 et 8 (RF24 radio(7,8);). Il faut donc modifier les exemples en fonction du choix de brochage.

Description des signaux

Voir les pages 11 et 50 de la spec nRF24L01

Signal Direction Description
CE input Chip Enable
Ce signal est actif à 1 et sert à configurer le module en mode de réception (RX) ou de transmission (TX)
CSN input SPI Chip Select
SCK input SPI Clock
MOSI input SPI Slave Data Input
MISO output SPI Slave Data Output, with tri-state option
IRQ output Maskable interrupt pin
Ce signal est actif à 0 et contrôlé par trois sources d’interruption masquables

nRF24L01+ dans l’IDE Arduino

L’IDE Arduino v.1.6.9 propose d’installer 4 bibliothèques nRF24 écrites par TMRh20. Pour les installer avec l’IDE, aller dans Croquis/Inclure une bibliothèque/Gérer les bibliothèques, chercher nRF24 et installer les 4 bibliothèques de TMRh20.

J’indique également les liens directs vers ces bibliothèques ci-dessous. Elles comprennent de nombreux exemples et c’est par là qu’il faut commencer. Elles sont optimisées pour Arduino et pour Raspberry Pi.

À noter que TMRh20 propose d’autres bibliothèques pour le nRF24L01+ sur son compte GitHub.

Ça vaut aussi la peine de lire cette page sur le blog de TMRh20

Liens

Maniacbug

Maniacbug a un très bon tuto sur le nRF24. Les bibliothèques de TMRh20 sont un fork de celles de Maniacbug.

Radiohead

La bibliothèque Radiohead de Mike McCauley permet de communiquer via une quantité impressionnante de protocoles différents, y compris le nRF24.

Autres

mysensors.org propose plein de recettes pour utiliser le RF24

Et sur cet autre blog, l’auteur décrit tous les problèmes qu’il a rencontrés. Il insiste beaucoup sur le condensateur à connecter à l’alimentation.

nRF24L01+ sur Launchpad MSP430

J’ai fait un test rapide sur Launchpad MSP430 et ça fonctionne.

Module nRF24L01+ sur Launchpad MSP430

On ne voit qu’un Launchpad sur la photo, mais pour les tests, j’en ai préparé deux identiques.

nRF24L01+ sur ESP8266

Ça marche aussi sur l’ESP8266 12-E et sur le WEMOS V2.

J’ai testé avec deux configurations différentes pour le brochage de CSN. Ça fonctionne dans les deux cas, il suffit d’adapter le code en conséquence :

RF24 radio( CE, CSN ); par exemple : RF24 radio( 0, 2 ); ou RF24 radio( 0, 15 );

nRF24L01+ ESP8266 12-E
VCC VCC
GND GND
CSN GPIO 2 (D4) ou GPIO 15 (D8)
CE GPIO 0 (D3)
MOSI HMOSI (D7)
SCK HSCLK (D5)
IRQ
MISO HMISO (D6)

Voir aussi le brochage de l’ESP8266 12-E

Liens pour l’ESP8266