Accueil > Arduino, Matériel > Utilisation du module nRF24L01+ avec l’Arduino

Utilisation du module nRF24L01+ avec l’Arduino

Je viens de commander 2 modules nRF24L01 chez Robotshop (4€65 le module) : http://www.robotshop.com/eu/module-emetteur-recepteur-24g-nrf24l01.html.

Ces modules sont des transceiver, c’est à dire qu’’ils peuvent émettre et réceptionner en radio fréquence de 2.4 GHz. On va tester leur utilisation sur 2 Arduino Uno.

Les caractéristiques techniques sont les suivantes :

– Interface Arduino via bus SPI (8 Mhz), autorisant le 5v.

– Alimentation 3.3v du module.

– Bande radio fréquence 2.4 GHz et possibilité de 126 canaux.

– Transmission / Réception à 1 ou 2 Mb/s.

– Puissance de transmission programmable : 0, –6, –12 ou –18 dBm.

– Consommation en émission à 0 dBm de 11.3 mA.

– Consommation en réception à 2 Mb/s de 12.3 mA.

Les modules se présentent comme suit :

image

Le schéma du module est le suivant :

image

La documentation du chipset se trouve à l’adresse : ftp://imall.iteadstudio.com/Modules/IM120606002_nRF24L01_module/DS_nRF24L01.pdf

La présentation est finie concernant le matériel.

Une librairie de nom ‘Mirf’ pour l’utilisation avec l’Arduino est fournie à l’adresse : http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01

Il suffit de télécharger le fichier Mirf.zip, de le décompresser et ensuite de copier le dossier ‘Mirf’ dans le dossier ‘libraries’ où se trouve votre IDE Arduino.

Le branchement du module avec l’Arduino sera le suivant et utilise le bus SPI :

Broche module Broche Arduino Fonction
1 GND Masse
2 3.3v VCC/3.3v
3 8 (configurable) CE
4 7 (configurable) CSN
5 13 SCK
6 11 MOSI
7 12 MISO
8 non connectée IRQ

Attention l’alimentation du module s’effectue en 3.3v (broche 2), les autres broches pour le dialogue via le bus SPI supporte le 5v.

Une petite image qui présente le module avec les broches :

image

Pour les tests, nous allons envoyer une valeur de type ‘integer’ côté émetteur.

Côté récepteur nous afficherons la valeur reçue pour vérifier le bon échange.

Le programme côté émetteur sera le suivant :

/*
    émission d’une valeur integer via module nRF24L01
*/

#include <SPI.h> // gestion du bus SPI
#include <Mirf.h> // gestion de la communication
#include <nRF24L01.h> // définition des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // communication SPI nRF24L01

int valeur = 770;  // contient la valeur à envoyer
byte valeur_octet[2]; // contient la valeur découpée en octet pour l’envoi

void setup()
{
  Mirf.cePin = 8; // CE sur broche 8
  Mirf.csnPin = 7; // CSN sur broche 7
  Mirf.spi = &MirfHardwareSpi; // utilisation du port SPI hardware
  Mirf.init(); // initialise le module SPI
  Mirf.channel = 0; // utilisation canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
  Mirf.payload = sizeof(unsigned int); // = 2, déclaration taille du message à transmettre, max 32 octets
  // RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s; puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=11–>0dBm;
  // d=0 pas de gain sur le bruit en réception
  Mirf.configRegister(RF_SETUP, 0x06); // 1 Mb/s et 0 dBm (puissance maximum)
  Mirf.config(); // configure le canal et la taille du message
  Mirf.setTADDR((byte *)"ardu2"); // définition adresse sur 5 octets de la 2ème carte Arduino
  Mirf.setRADDR((byte *)"ardu1"); // définition adresse sur 5 octets de la 1ere carte Arduino
}

void loop()
{
  while(Mirf.isSending())
  {
    // en cours d’émission
    delay(5);
  }
  valeur_octet[0] = valeur & 0xFF; // 1er octet
  valeur_octet[1] = (valeur & 0xFF00) >> 8; // 2ème octet
  Mirf.send(valeur_octet);
  delay(1000);
}

Le programme côté récepteur sera le suivant :

/*
    réception d’une valeur integer via module nRF24L01
*/

#include <SPI.h> // gestion du bus SPI
#include <Mirf.h> // gestion de la communication
#include <nRF24L01.h> // définition des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // communication SPI nRF24L01

int valeur = 0;  // contient la valeur à recevoir
byte valeur_octet[2]; // contient la valeur découpée en octet pour la réception

void setup()
{
  Mirf.cePin = 8; // CE sur broche 8
  Mirf.csnPin = 7; // CSN sur broche 7
  Mirf.spi = &MirfHardwareSpi; // utilisation du port SPI hardware
  Mirf.init(); // initialise le module SPI
  Mirf.channel = 0; // utilisation canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
  Mirf.payload = sizeof(unsigned int); // = 2, déclaration taille du message à transmettre, max 32 octets
  // RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s; puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=11–>0dBm;
  // d=0 pas de gain sur le bruit en réception
  Mirf.configRegister(RF_SETUP, 0x06); // 1 Mb/s et 0 dBm (puissance maximum)
  Mirf.config(); // configure le canal et la taille du message
  Mirf.setTADDR((byte *)"ardu1"); // définition adresse sur 5 octets de la 2ème carte Arduino
  Mirf.setRADDR((byte *)"ardu2"); // définition adresse sur 5 octets de la 1ere carte Arduino
  Serial.begin(9600);
}

void loop()
{
  while(!Mirf.dataReady())
  {
    // pas prêt à recevoir
    delay(5);
  }
  Mirf.getData(valeur_octet); // récupére 2 octets
  valeur = valeur_octet[0] + (valeur_octet[1] << 8); // transforme en int
  Serial.print(valeur, DEC);
  Serial.print(" ");
  Serial.print(valeur_octet[0]);
  Serial.print(" ");
  Serial.println(valeur_octet[1]);
  delay(1000);
}

J’ai testé l’émission et la réception à l’intérieur de ma maison; l’émetteur étant positionné au rez de chaussée; le récepteur capte sur tout le rez de chaussée; au 1er étage, je capte sur les pièces situées au dessus de la pièce où se situe l’émetteur; au sous-sol je capte également lorsque je me situe sous la pièce où se situe l’émetteur.

Conclusion : un bon module RF 2.4 GHz avec antenne intégrée.

D’autres articles viendront complétés l’utilisation de ce module.

Catégories :Arduino, Matériel Étiquettes : , ,
  1. SpoonS2K
    22/04/2014 à 18:58

    Salut, merci pour ton article. Il y a cependant une petite erreur :

    // RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s; puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=00–>0dBm;

    Le dernier BC = 11 pour 0dBm et non pas 00 😉

  2. tom
    09/10/2014 à 20:41

    boujour! j’essaie de transmettre depuis une arduino uno vers arduino mega 2560 mais cela ne marche pas je sait pas quoi faire pourriez vous m’aider svp ?!

  3. 27/10/2014 à 12:51

    Question très bête… il faut donc 2 arduino : un côté émetteur + un côté récepteur ?

  4. Jelis
    17/12/2014 à 09:12

    D’autres articles viendront complétés l’utilisation de ce module
    A remplacer par :
    D’autres articles viendront compléter l’utilisation de ce module

  5. David
    10/01/2015 à 15:27

    Bonjour, merci infiniment pour cet exemple qui fonctionne parfaitement.

    Meilleurs voeux 2015 !

  6. haythem
    16/04/2015 à 13:12

    bonjours pouvez vous nous montrer le branchement avec la carte arduino ? merci

  7. anis
    30/04/2015 à 16:36

    Bonjour, Merci pour votre article

    j’ai fait quelques modification a votre programe et je veux envoyer un message genre  » bien reçu  » lors du reception du valeur envoyé mais ça ne marche pas
    peux tu m’aider sur ce s’il vous plait

  8. Lichtenberger
    21/05/2015 à 00:04

    Bonjour
    Je suis débutant en arduino, et si quelqu’uun pouvait me dire ce que signifient à la compilation les 30 ou 40 lignes style

    « Arduino/sketch_may20e.ino:15: undefined reference to `Mirf' »

    ça me serait d’un grand secours

    Merci

    • lizaprod
      04/11/2015 à 14:58

      Bonjour,
      Cela signifie que la librairie MIRF est manquante, il faut l’installer.
      Si toutefois les secours ne sont toujours pas arrivés….

  9. Lichtenberger
    29/05/2015 à 17:46

    Bonjour

    Après avoir rajouté la ligne

    #include

    je n’ai plus d’erreur et je peux téléverser les programmes.

    Mais ça ne fonctionne pas, et impossible de savoir si ça vient de l’émission ou de la réception.

    Quelqu’un sait-il pourquoi j’ai dû rajouter cette ligne et si ce pourquoi explique le non fonctionnement ?

    Merci

  10. Lichtenberger
    29/05/2015 à 18:03

    La ligne à ajouter est
    #include

    Le MirfSpiDriver.h avait sauté

  11. 31/05/2015 à 09:01

    J’avais fait un répertoire MirfSpiDriver dans la librairie pour y mettre le .h
    En mettant MirfSpiDriver.h dans le répertoire Mirf, je n’ai plus besoin de mettre l’include.
    Mais ça marche toujours pas.
    Si je fini par trouver pourquoi, je ne manquerai pas de vous en faire part.

  12. 31/05/2015 à 12:20

    Cette fois ci c’est bon, ça marche.

    Un condensateurs de 4,7µF entre le +Vcc et le Gnd de chaque module nrf24L01 a résolu le problème.

    Ah oui : Je suis débutant en Arduino, mais ni en programmation ni en électronique.

    Un bon scope et un analyseur logique, ça aide…

    • Aneantisor
      22/01/2016 à 12:57

      Je valide la solution, une capa sur chaque carte et hop tout le monde communique !
      Merci

  13. Mestre
    04/03/2017 à 17:06

    bonjour j ai besoin aussi du module Nrf24l01 pour mon projet .
    nous avons besoin d’une valeur de frequence adapter pour une distance de 20m est ce que 2.4GHz suffit ?

  14. Gamin
    08/07/2017 à 15:13

    Merci beaucoup, grâce à cet exemple j’ai pu faire un bateau radiocommandé qui fonctionne parfaitement.
    Merci !

  15. Daniel
    14/03/2018 à 18:51

    Bonjour,

    Je voulais savoir s’il était possible d’utiliser ce module pour commander une lampe sans fil à distance ? J’ai regardé les solutions disponibles, pas trop fan du wifi sur le coup donc je me demandais s’il était possible d’utiliser ça. La lampe serait situé dans une salle au sous-sol et serait commandé par une télécommande situé au RDC.

    • 14/03/2018 à 23:57

      Bonsoir,
      Oui tout à fait possible

      • Daniel
        15/03/2018 à 13:34

        Une autre question, ce module est-il fiable en terme de « résistance » aux interférences ?
        Merci encore !

  16. Jacques
    27/04/2018 à 00:21

    Bonsoir,
    Un grand MERCI.
    Ça fonctionne super bien ! Je vais pouvoir développer des maquettes pour mes élèves de collège.
    A plus
    Jacques

  17. Valentin
    17/09/2018 à 18:36

    Un grand merci à itechnofrance pour ce tutoriel. Il fonctionne, par contre j’ai utilisé une source de tension externe de 3.3 V avec un condensateur (on en trouve pour moins de 3 euros sur eBay).

  1. 01/04/2014 à 11:45

Laisser un commentaire