mardi 14 février 2017

Communication par nRF24L01 entre deux cartes Arduino


Aujourd'hui, nous établissons une communication sans fil entre deux cartes Arduino, au moyen d'une paire de récepteurs-émetteurs nRF24L01.

Les habitués de ce blog me feront peut-être remarquer (à juste titre) qu'un tutoriel similaire avait déjà été publié dans un lointain passé. Mais à l'époque, j'avais utilisé la veille bibliothèque "mirf", qui est devenue quelque peu désuète. Cette fois-ci, j'utilise la bibliothèque RF24, plus récente.

Un aspect intéressant de cette bibliothèque, c'est qu'elle peut aussi être installée sur un Raspberry Pi, ce qui facilite grandement l'établissement d'une communication entre un Arduino et un Raspberry Pi.

Installation de la bibliothèque RF24

J'ai utilisé la version de la bibliothèque RF24 mise au point par TMRh20 (d'après la bibliothèque créée par ManiacBug).   Après l'avoir téléchargée, vous l'installez dans l'IDE Arduino de la façon habituelle.

Les connexions du nRF24L01

Chaque module nRF24L01 peut émettre et recevoir des données.  Il existe principalement deux modèles sur le marché:  l'un d'entre eux est vert, alors que l'autre est noir.  Le schéma ci-dessous pourrait vous être utile pour identifier les connecteurs du module, particulièrement si vous utilisez le modèle noir (sur lequel les broches ne sont pas identifiées).


Connexion du nRF24L01 à l'Arduino

Ce circuit doit être réalisé en deux exemplaires, de façon à obtenir un circuit émetteur, et un circuit récepteur.

Le module nRF24L01 fonctionne a un  niveau logique de 3,3 V, mais il supporte les signaux logiques de 5 V.  Il peut donc être branché directement aux sorties numériques de l'Arduino sans qu'il soit nécessaire d'utiliser un convertisseur de niveau logique.  Par contre, il est important de l'alimenter en 3,3 V et non en 5 V.

C'est une bonne idée d'ajouter un condensateur d'environ 10 μF branché en parallèle avec l'alimentation, question de stabiliser la tension.  Dépendant du matériel dont vous disposez, l'ajout de ce condensateur peut s'avérer nécessaire, préférable ou carrément superflu.  Pendant la réalisation de cet article, toute communication était impossible si ma carte réceptrice n'était pas munie d'un tel condensateur.  Pour l'autre carte, la présence ou l'absence du condensateur d'entraînait pas la moindre différence.

Les connexions entre le module nRF24L01 et la carte Arduino Uno sont:

GND du nRF24L01 : GND de l'Arduino
Vcc du nRF24L01 : 3V3 de l'Arduino
CE du nRF24L01 : pin 7 de l'Arduino
CSN du nRF24L01 : pin 8 de l'Arduino
SCK du nRF24L01 : pin 13 de l'Arduino
MOSI du nRF24L01:  pin 11 de l'Arduino
MISO du nRF24L01:  pin 12 de l'Arduino

Les pins CE et CSN peuvent être branchées ailleurs à la condition de modifier les sketches ci-dessous.  En ce qui concerne les pins consacrées au protocole SPI (11, 12, 13), elle sont différentes sur certains modèles d'Arduino (comme, par exemple, le Mega).




Exemples fournis avec la bibliothèque


De nombreux exemples sont fournis avec la bibliothèque.

Parmi ceux-ci, j'ai essayé l'exemple intitulé "GettingStarted", avec un succès mitigé:  la connexion entre les deux cartes s'établissait, mais au moins 10% des transmissions se terminaient en queue de poisson ("failed").

J'ai donc entrepris de rédiger une paire de sketches présentant le strict minimum:  un émetteur simple qui envoie chaque seconde un nombre croissant, et un récepteur simple qui affiche dans le moniteur série tous les messages qu'il reçoit.

Il n'y a aucune vérification d'erreurs, et le récepteur n'envoie pas d'accusé de réception à l'émetteur.

Ces sketches sont donc loin d'utiliser à fond les possibilités des modules nRF24L01.  Toutefois, je crois qu'ils sont facile à comprendre, et pendant mes tests ils fonctionnaient à la perfection, sans le moindre échec de transmission.

Le sketch de l'émetteur

Chaque seconde, un nombre entier augmente d'une unité.  Le nombre est diffusé par le module nRF24L01, et affiché dans le moniteur série.







Le sketch du récepteur

Chaque fois que le récepteur reçoit un message en provenance de l'émetteur, il l'affiche dans le moniteur série.



Si certains messages n'arrivent pas à destination, c'est facile de le constater:  certains nombres seront manquants.

Yves Pelletier   (TwitterFacebook)

6 commentaires:

  1. extra comme tuto...
    ca fonctionne très bien,comment coder pour actionner un relais piloté par un simple inter ?.
    merci.

    RépondreSupprimer
  2. Petite question, lorsque je met en route le programme il marche, mais lorsque je met le moniteur série pour voir ce qu'il envoie, il me met pendant les 3 premières lignes ce qu'il faut, mais après il me met des caractères inconnus ou des lettre, tout ça sur la même ligne. Aurais-tu une solution face a ce problème stp ?

    Mise a part cela, excellent tuto, cela m'a fortement aidé dans mon projet

    RépondreSupprimer
    Réponses
    1. baudrate effectivement, dans ce sketch on est en 115200 et non pas en 9600. On le règle dans le moniteur série (ou on le change dans le code)

      Supprimer
    2. à quoi sert "itoa " ??

      Supprimer
  3. bjr s'il vous palis je voeux utilser NRF 24L 01 UN EMMETEUR ET DEUX RECPTEUR ECSQUE C4EST FAISABLE AVEC TROIS CARTE ARDUINO??

    RépondreSupprimer