RF Nano (NRF24L01 intégré sur Arduino Nano) : problème de stabilité de connexion

Bonjour à toutes et tous!

Je souhaiterais envoyer des données numériques entre deux Arduino.

Pour cela, j’ai donc acheté deux modules NRF24L01 + NA + LNA. Cependant, après de nombreuses heures et soirées à essayer de les faire fonctionner (aussi bien avec une Nano qu’avec une Mega), je suis arrivé au résultat suivant : la connexion n’est pas stable et ça ne fonctionne que lorsque je “trifouille” les fils. J’ai mis ça sur le compte de mes câbles, utilisés depuis peut être trop longtemps. Et ensuite, j’ai eu d’autres priorités et le projet est passé en “pause”.

Cependant, un peu par hasard quelques temps plus tard, j’ai découvert le module RF Nano. A quelques euros, je me suis dit que c’était une belle occasion d’avancer sur mon projet en attendant de résoudre mes problèmes de câbles, même si la portée annoncée n’est que de 50/100m au lieu de 1000m théorique.

J’ai reçu les cartes hier. Et les symptômes sont les mêmes : la connexion n’est pas stable du tout. J’arrive à envoyer uniquement de temps en temps, et ce uniquement lorsque je pose mon doigt quelque part sur les D9 à D12 environ. Mais ça reste erratique, sinon ça ne marche pas. Et impossible de recevoir les données envoyées.

Les programmes utilisés sont les suivants :

Emetteur :

//Transmitter program

#include <SPI.h>
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
Nrf24l Mirf = Nrf24l(10, 9);
int value;

void setup()
{
  Serial.begin(9600);
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  //Set your own address (sender address) using 5 characters
  Mirf.setRADDR((byte *)"ABCDE");
  Mirf.payload = sizeof(value);
  Mirf.channel = 1;              //Set the channel used
  Mirf.config();
}

void loop()
{
  Mirf.setTADDR((byte *)"FGHIJ");           //Set the receiver address
  value = random(255);                      //0-255 random number
  Mirf.send((byte *)&value);                //Send instructions, send random number value
  Serial.print("Wait for sending.....");
  while (Mirf.isSending()) delay(1);        //Until you send successfully, exit the loop
  Serial.print("Send success:");
  Serial.println(value);
  delay(1000);
}

Recepteur :

//Receiver program
#include <SPI.h>
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
Nrf24l Mirf = Nrf24l(10, 9);

int value;

void setup()
{
  Serial.begin(9600);
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.setRADDR((byte *)"FGHIJ"); //Set your own address (receiver address) using 5 characters
  Mirf.payload = sizeof(value);
  Mirf.channel = 1;             //Set the used channel
  Mirf.config();
  Serial.println("Listening...");  //Start listening to received data
}

void loop()
{
  if (Mirf.dataReady()) { //When the program is received, the received data is output from the serial port
    Mirf.getData((byte *) &value);
    Serial.print("Got data: ");
    Serial.println(value);
  }
}

Un autre élément important est que, lorsque j’ai reçu les cartes, il y avait déjà un programme chargé. Il affichait de manière alternative “ON” et “OFF”. Evidemment, en débranchant une carte, plus rien ne fonctionnait. Et là, c’était vraiment stable.
En gros, je ne comprends pas. J’ai l’impression que c’est un problème de hard, mais pourquoi le premier programme fonctionnait-il convenablement?

Merci pour votre aide!

même si la portée annoncée n'est que de 50/100m au lieu de 1000m théorique.

Les distances annoncées sont optimistes, en extérieur sans aucun obstacle, peut-être, sinon c'est improbable.
Chez moi, en installation domotique, j'atteins 8m entre un NRF24L01+PA+LNA et des modules avec antenne imprimée.
Avant tout, si de longues distances sont envisagées, changer de technologie (433MHz ?).

La librairie MIRF date un peu (plus maintenue depuis 10 ans).
J'ai utilisé avec succès la librairie RF24 avec le NRF24L01.

Une petite manip ici pour vérifier la connexion SPI : le-nrf24l01-avec-arduino-uno-nano-et-mini

Ne pas trop rapprocher émetteur et récepteur, afin d'éviter la saturation.

Bonjour,
J’ai déjà essayé deux RF-nanos et ça marche plutôt bien.
Je te conseille également de tester avec l’exemple GettingStarted de la librairie RF24.

Il peut y avoir des problèmes sur les modèles NRF24L01+PA+LNA qui demandent beaucoup de courant en émission. Cela peut se régler en baissant le niveau radio.setPALevel(RF24_PA_LOW);

Bon, j'ai essayé le code d'exemple "Getting Started" et ça semble plutôt bien fonctionner!

Ce ne serait donc qu'un problème de soft...Tant mieux!

Il ne me reste plus qu'à voir comment envoyer un tableau maintenant!

Merci beaucoup en tout cas!!!!

pour un tableau, c'est plutôt facile tu verras avec la fonction write. Il suffit de lui fournir le pointeur vers le tableau et la taille du tableau en octets.

Un pointeur? Bon, je vais aller m'instruire ! Mais je viens de regarder rapidement, ça n'a pas l'air méchant!

Je regarderais ça en détail demain!

Merci beaucoup pour la réactivité!!

Youpi! ça fonctionne! Effectivement, comme tu dis Etimou, rien de bien compliqué.

Si jamais ça peut servir à quelqu’un, voici le code, inspiré du code d’exemple “Getting Started” de la librairie RF24.h, séparé en un émetteur et un récepteur, en accord avec mon besoin.

Tout est clair pour moi à part cette partie là que je dois encore comprendre :

  if (radioNumber) {
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1, addresses[0]);
  } else {
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1, addresses[1]);
  }

Mais l’essentiel est que ça fonctionne!

Pour le code :

Emetteur

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

byte addresses[][6] = {"1Node", "2Node"};


/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 0;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7, 8);
/**********************************************************/

/**
  Create a data structure for transmitting and receiving data
  This allows many variables to be easily sent and received in a single transmission
  See http://www.cplusplus.com/doc/tutorial/structures/
*/

int tableau[] = {4, 5};

void setup() {

  Serial.begin(115200);

  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
  // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_MAX);

  // Open a writing and reading pipe on each radio, with opposite addresses
  if (radioNumber) {
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1, addresses[0]);
  } else {
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1, addresses[1]);
  }
}




void loop() {

  radio.stopListening();                                    // First, stop listening so we can talk.


  Serial.println(F("Now sending"));
  if (!radio.write( &tableau, sizeof(tableau) )) {
    Serial.println(F("failed"));
  }
  else
  {
    Serial.println("Message envoyé");
  }

  tableau[0] = tableau[0] + 1;
  tableau[1] = tableau[1] + 1;


  delay(500);

}

Recepteur :

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

byte addresses[][6] = {"1Node", "2Node"};


/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 1;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7, 8);
/**********************************************************/

/**
  Create a data structure for transmitting and receiving data
  This allows many variables to be easily sent and received in a single transmission
  See http://www.cplusplus.com/doc/tutorial/structures/
*/

int toto[2];

void setup() {

  Serial.begin(115200);
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
  // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_MAX);


  // Open a writing and reading pipe on each radio, with opposite addresses
  if (radioNumber) {
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1, addresses[0]);
  } else {
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1, addresses[1]);
  }

  // Start the radio listening for data
  radio.startListening();
}


void loop() {

  if ( radio.available()) {
    // Variable for the received timestamp
    while (radio.available()) {                          // While there is data ready
      radio.read( &toto, sizeof(toto) );             // Get the payload
    }

        Serial.print(millis());
    Serial.print("\t");
    Serial.print(toto[0]);
    Serial.print("\t");
    Serial.println(toto[1]);

    // }
  }

}

Je vais maintenant faire quelques tests de distance avec le module RF Nano, mais pour le moment ça ne semble effectivement pas être la folie…

Je vous tiendrai au courant, si ça peut en intéresser certains.

Merci encore !

int tableau = {4, 5};
radio.write(&tableau, sizeof(tableau))

tableau est un symbole représentant déjà une adresse. Pas la peine d'ajouter &

Je vais maintenant faire quelques tests de distance avec le module RF Nano, mais pour le moment ça ne semble effectivement pas être la folie...

Quel est le but à atteindre ?

Bon, je viens de faire le test.... Effectivement, module RF Nano donc avec l'antenne intégrée, c'est 4-5m en intérieur et sans obstacle! Donc rien de bien fou-fou.... Après c'est comme d'habitude, tout dépend de l'application.

Ensuite, avec le NRF24L01+PA+LNA montés sur des Nano clones, finalement, ça fonctionne très bien également avec la librairie RF24 :slight_smile: . Au niveau des distances, j'arrive à faire environ 55-60m avec le récepteur dans la maison et l'émetteur en extérieur. On est cependant très loin des 1000m annoncés sur la datasheet.... Peut-être qu'avec une alimentation de meilleure qualité ce sera mieux? Je n'ai pas le matériel pour essayer.

Le but à atteindre est environ 30-35m, donc c'est nickel. Sachant que pour me donner du gras, sur le montage final je mettrais l'antenne en extérieur et non posée sur le sol. Dis autrement, je suis large!

Voilà! Comme on m'aide beaucoup sur ce forum, j'espère que ces quelques informations données en retour serviront également!

Sujet clos, merci beaucoup pour votre aide!!!!!

55 à 60m c'est déjà pas mal. Chez moi j'atteins péniblement 8m en intérieur mais j'ai des murs de 40cm en pierre à traverser.
Tu peux aussi mixer NRF24L01+PA+LNA et NRF24L01+antenne imprimée.

Je n'ai pas l'impression que Nordic Semiconductor annonce une distance maxi dans la datasheet, par contre les sites vendeurs ne s'en privent pas.

Oui, c'est aussi une possibilité! Merci beaucoup pour ton aide en tout cas!

catsur:
Tout est clair pour moi à part cette partie là que je dois encore comprendre :

  if (radioNumber) {

radio.openWritingPipe(addresses[1]);
   radio.openReadingPipe(1, addresses[0]);
 } else {
   radio.openWritingPipe(addresses[0]);
   radio.openReadingPipe(1, addresses[1]);
 }

Il y a 2 adresses qui sont définies pour la communication. La première (n°0) sert à l'émission du radio number 0 et la réception du radio number 1. La deuxième (n°1) sert à l'émission du radio number 1 et la réception du radio number 0. C'est ceci qui est défini dans cette partie du code.