lundi 13 août 2018

NRF24L01 et ARDUINO UNO, NANO, MINI

  RF24L01 et ARDUINO UNO, NANO, MINI

Beaucoup de personnes, y compris moi-même ont été confrontées à des problèmes de communication entre un module NRF24L01 et une carte ARDUINO, spécialement lorsqu'il s'agit de modèles UNO ou NANO.

Je parle ici de problèmes de communication SPI et non pas de difficultés de communication sur la fréquence 2.4GHz.

1. Le NRF24L01

IMPORTANT : L'alimentation d'un NRF24L01 en 5V provoque la mort de celui-ci.

Ce module doit être alimenté au maximum sous 3.6V, donc l'alimenter par la sortie 3.3V d'une NANO ne semble pas une mauvaise idée.

Un petit condensateur de découplage de 100nF entre 3.3V et masse au plus près du NRF24L01 est une sage précaution.

Certains clones de NRF24L01 sont de qualité moyenne et réclament un découplage plus fort, 10µF au tantale à faible ESR ou à défaut un 47µF électrolytique de bonne qualité.

En alimentant le NRF24L01 sur la sortie 3.3V d'une NANO, avec 100nF je n'ai jamais eu de problème, mais cela peut certainement arriver avec certains clones.

Personnellement j'utilise beaucoup de PRO MINI 3.3V + NRF24L01 alimentés en 3.3V. L'alimentation est composée d'une batterie LITHIUM-ION + un régulateur externe du type LM2936-3.3V 50mA.

Ce régulateur réclame un découplage de 10µF électrolytique. Je n'ai pas de problème malgré des pointes de courant allant jusqu'à plus de 30mA.

Ce module est tolérant au 5V sur son bus SPI. On pourrait être tenté de croire que cela va bien se passer lorsqu'on le connecte directement sur le bus SPI d'un ARDUINO UNO ou NANO.

Mais il subsiste un doute. Si le niveau des signaux envoyés sur le bus SPI par l'ARDUINO est plus que suffisant (5V), celui des signaux envoyés par le NRF24L01 peuvent ne pas convenir car trop faibles (3.3V). Ceci est une supposition.

2. Montage direct ARDUINO NANO & NRF24L01

Ce montage utilise une breadboard sur laquelle un NRF24L01 est câblé directement sur les broches d'un ARDUINO NANO, ceci à l'aide de fils DUPONT.

L'ARDUINO est alimenté dans un premier temps par le câble USB, le temps de charger le sketch.

Ensuite l'USB est débranché et il est alimenté à l'aide d'une alimentation variable par sa broche 5V bien entendu.

Les broches sont connectées comme CECI.

Le code de test utilisé est celui d'un thermomètre comme CELUI-CI, utilisant un DS18B20.

L'ARDUINO NANO est donc alimenté par sa broche 5V et le NRF24L01 par la broche 3.3V de la NANO. Cette tension mesurée est de 3.26V.

Il ne reste plus qu'à faire varier la tension. J'obtiens un fonctionnement correct entre 4.4V et 6V.

Cela aurait tendance à prouver qu'il est possible de communiquer en SPI entre un NRF24L01 et un processeur en 5V.

Mais j'ai déjà eu un montage qui ne fonctionnait pas avec un chargeur USB fournissant 5.6V alors qu'il fonctionnait sur l'USB de mon PC.

On peut certainement mettre en  cause la qualité du chargeur et en déduire une certaine sensibilité à la qualité de l'alimentation.

Dans tous les cas, essayer d'utiliser une breadboard de qualité et des fils Dupont en bon état et le plus courts possible.

Si vous êtes obligé de forcer comme un bœuf pour enficher l'ARDUINO NANO ou MINI sur la breadboard, cela commence mal. C'est un signe que les problèmes ne font que commencer.

L'idéal est de se fabriquer une carte comme celle-ci, avec un vrai PCB. Il est facile de s'en inspirer pour créer une carte à base d'ARDUINO NANO.

3. Montage direct PRO MINI & NRF24L01

Ce montage est celui que j'utilise le plus souvent.

Voici quelques exemples :

Détecteur de mouvement MYSENSORS sur batterie

Prise connectée MYSENSORS

Thermomètre MYSENSORS sur batterie

Il fonctionne à coup sûr.

4. Dépannage

Alors comment s'en sortir ?

Je vous conseille de vérifier à l'aide d'un exemple simple le fonctionnement du couple ARDUINO / NRF24L01.

Branchez le NRF24L01 comme indiqué ICI.

Installez cette librairie RF24. Même si vous envisagez d'utiliser uniquement MYSENSORS, cela ne sera pas inutile.

Ensuite dans l'IDE ARDUINO chargez l'exemple de la bibliothèque nommé starping.

Modifiez-le comme ceci :

  // recherchez cette ligne
  radio.begin();
  // ajoutez ceci :
  Serial.print("Radio connected: ");
  Serial.println(radio.isChipConnected() ? "YES" : "NO !!!");

La méthode isChipConnected est récente. Elle permet de vérifier que le chip NRF24L01 est bien visible sur le bus SPI.

Téléversez le code et ouvrez la console.

Deux messages peuvent apparaître :

Radio connected: NO !!!

Vous avez un problème de communication sur le bus SPI.

Radio connected: YES

Votre bus SPI fonctionne. Vous pouvez envisager la suite avec sérénité.

ATTENTION : il existe deux librairies :

Actuellement lorsque l'on clone https://github.com/TMRh20/RF24.git github renvoie sur https://github.com/nRF24/RF24.

Par contre si vous faites une mise à jour de https://github.com/TMRh20/RF24.git celle-ci sera bien effectuée sur cette URL.

En cas de doute je vous conseille d'effacer votre répertoire RF24 et de refaire une installation propre.

5. Possibilités

Vérifiez et revérifiez votre câblage.

Ne faites pas passer de câbles sous l'antenne du NRF24L01.

Évitez les câbles trop longs.

Vérifiez votre tension d'alimentation. Alimentez votre ARDUINO avec un régulateur de qualité.

Si vous utilisez un ARDUINO ou un module radio ayant déjà servi, il se peut qu'il ait souffert de précédentes expérimentations. Essayez d'en changer.

Êtes-vous sûr de n'avoir pas inversé MISO / MOSI ?

Cela arrive ...

Si vous instanciez comme ceci :

RF24 radio(9,10);

Êtes-vous sûr que tes pins 9 et 10 sont reliées à CE et CS du NRF24L01 ?

6. Références

Librairie RF24 : https://github.com/nRF24/RF24

7. Mises à jour

21/09/2019 :  4. Dépannage (ATTENTION)


11 commentaires:

  1. Bonjour! Une tension de 3,3 V est correctement interprétée comme un niveau logique haut par l'Arduino Uno. Il faudrait que la tension soit inférieure à 2,6 V pour que l'Arduino ne la considère pas comme un niveau haut.

    RépondreSupprimer
    Réponses
    1. Merci de ta remarque.
      Je pense qu'il faut plutôt raisonner en pourcentage de la tension d'alimentation.
      Cela m'est déjà arrivé d'avoir des problèmes ou non sur le même montage, en fonction du niveau de tension 5V.

      Supprimer
    2. Impressionnant ton blog. Il y a du monde. Il faut que j'explore.

      Supprimer
    3. Tiens je voulais le bookmarker mais c'était déjà fait. FaceBook sans doute.
      Bonne continuation @+

      Supprimer
  2. Bonjour,
    J'ai respecté à la lettre votre article 4 dépannage, et après plusieurs vérifications, j'ai le message d'erreur suivant : ...void value not ignored as it ought to be... à la ligne ...done = radio.read( &got_time, sizeof(unsigned long) );...
    Je suis bloqué ! pouvez-vous m'aider ?

    RépondreSupprimer
    Réponses
    1. Je vous conseille de réinstaller la librairie :
      https://github.com/nRF24/RF24
      Et d'ouvrir l'exemple starping avec l'IDE : fichier / exemples / RF24 / starping

      Supprimer
  3. A mon avis l'exemple de cette librairie a été compilé :
    https://github.com/nRF24/RF24
    Alors que cette autre librairie est installée :
    https://github.com/TMRh20/RF24
    Il vaut mieux utiliser les exemples de la librairie installée plutôt que de faire des mélanges.

    RépondreSupprimer
  4. Bonjour, Je parcours les forums et sites depuis un certain temps sur le nrf24 et n'ai pas encore trouvé une explication claire et simple sur l'ouverture / adressage des tunnels en emmission reception entre deux modules nrf 24, plus particulierement le chiffre 1 avant le nom du tunnel par lequel on va communiquer dans l'instruction :
    pour l"emetteur - 1er module
    radio.openWritingPipe(adresses[0]);
    radio.openReadingPipe(1, adresses[1]); <<< a quoi correspont ce 1 ???


    merci d'avance pour votre réponse, en excluant les faux contacts c'est un systeme qui fonctionne tres bien

    RépondreSupprimer
  5. void RF24::openReadingPipe(uint8_t number, uint64_t address);
    Il est possible d'ouvrir 6 pipes (0 à 5) en réception.

    Au niveau réception, il y a deux méthodes available() :
    bool RF24::available(void);
    bool RF24::available(uint8_t *pipe_num);

    La deuxième, moins connue, permet de récupérer le N° de pipe de l'émetteur, en lui passant l'adresse d'un byte.
    Si au départ les adresses des pipes sont stockées dans un tableau il est facile ensuite de connaître l'adresse de l'émetteur, par l'index.
    Un petit exemple :
    https://www.instructables.com/NRF24L01-Multiceiver-Network/

    RépondreSupprimer
  6. Bonjour,

    Merci pour votre réponse tres clair
    bonne journée

    RépondreSupprimer