Go Down

Topic: RÉSOLU Problème de transmissions de données avec le module nrf24L01 (Read 385 times) previous topic - next topic

mr_fabrice

Jun 06, 2020, 05:30 pm Last Edit: Jun 22, 2020, 12:19 pm by mr_fabrice Reason: Adding code inside message
Bonjour, débutant travaillant sur un projet perso qui implique la transmission de données de températures, j'ai un problème de réception des données: lorsque je transmet des valeurs numériques quelque soit le type (int, float), je ne récupère que des 0. Je n'ai pas de message d'erreur.
Pour le code je me suis inspiré de l'exemple suivant, et je n'ai pas l'impression d'avoir fait des erreurs.

https://forum.arduino.cc/index.php?topic=421081

Pour le projet original j'utilisais une arduino nano pour la transmission et une arduino mega pour la réception, mais comme cela ne marchait pas, j'ai repris pour faire des tests comme sur l'exemple deux arduino uno.
J'utilise les ports 9 à 13 pour connecter le module nrf (je suis tombé sur des posts qui suggéraient d'autres ports pour les cartes nano et mega, mais en définitive les seuls ou je pouvais tracer un résultat étaient les ports 9 à 13 quelque soit le modèle de carte).
J'ai ensuite ajouté un adaptateur de tension pour module nrf24L01 du type suivant:

MakerHawk NRF24L01 Module sans fil adaptateur 3.3V pour NRF24L01 + microcontrôleur sans fil émetteur-récepteur 51 et bricolage (4PCS) https://www.amazon.fr/dp/B0716ZLPZQ/ref=cm_sw_r_cp_tau_n862EbRK49MDZ

et passé l'alimentation du 3.3v au 5v des cartes, mais cela n'a strictement rien changé.
Du coup je suis un peu perdu, j'ai vérifié les connexions à plusieurs reprises sans remarquer d'erreur, mais vu que cela ne fonctionne pas j'ai forcément fait une erreur quelque part, mais je ne vois pas où chercher.
Je joint les 2 fichiers ino de tests pour la transmission et la réception.
Pour la transmission, la sortie se rafraichit régulièrement avec les bonnes valeurs transmises, pour la réception, je n'ai que des 0.00.
Pour tester les 2 sorties en simultanées, j'utilise 2 instances d'arduino (avec teensyduino et arduino), voici les codes utilisés pour:

la transmission:
Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const byte cePin = 9;
const byte csnPin = 10;
const byte meteoAdrs[5] = "bcsth";
const byte rfChannel = 51;

RF24 radio(cePin, csnPin);

float meteo[2];

void setup() {
  meteo[0] = 25.70;
  meteo[1] = 57.90;
  Serial.begin(9600);
  radio.begin();
  radio.setChannel(rfChannel);
  radio.openWritingPipe(meteoAdrs);
  radio.setPALevel(RF24_PA_MAX);
  //radio.setDataRate( RF24_250KBPS ); //RF24_250KBPS //RF24_1MBPS //RF24_2MBPS
  //radio.setRetries(15, 15);
  radio.stopListening();
}

void loop() {
  if (radio.available()) {
    radio.write(&meteo, sizeof(meteo));
    String s = "sending: " + String(meteo[0]) + "° - " + String(meteo[1]) + "%";
    Serial.println(s);
  }
  delay(100);
}


et la réception:
Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const byte cePin = 9;
const byte csnPin = 10;
const byte meteoAdrs[5] = "bcsth";
const byte rfChannel = 51;

RF24 radio(cePin, csnPin);

float meteo[2];

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setChannel(rfChannel);
  radio.openReadingPipe(0, meteoAdrs);
  radio.setPALevel(RF24_PA_MAX);
  //radio.setDataRate( RF24_250KBPS ); //RF24_250KBPS //RF24_1MBPS //RF24_2MBPS
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    radio.read(&meteo, sizeof(meteo));
    String s = "meteo: " + String(meteo[0]) + "° - " + String(meteo[1]) + "%";
    Serial.println(s);
  }
  delay(100);
}

hbachetti

Je ne vois pas pourquoi tu ne pars pas tout simplement d'un exemple de la librairie, starping par exemple.
Cela permet principalement de vérifier que le hardware fonctionne.

Vois ici : https://riton-duino.blogspot.com/2018/08/le-nrf24l01-avec-arduino-uno-nano-et.html
Paragraphe  4. Dépannage.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Lacuzon

Même avis que hbachetti parce qu'on est sûr que les exemples fonctionnent. J'ajoute un point, as-tu veillé à ce qu'émetteur et récepteur soient éloignés de plusieurs mètres l'un de l'autre ? Sinon gros risque de saturation.

mr_fabrice

Merci pour ces retours, en fait mes cablages étaient erronés ce que j'ai pu comprendre grâce à radio.isChipConnected qui me renvoyait false. J'ai refais mes connexions. Maintenant radio.chipIsConnected est true. Mais radio.available() ne l'est jamais. Maintenant que je suis apparemment bien connecté, je ne trace plus rien dans la partie du code radio.available.

Concernant l'exemple starping, je n'ai pas bien compris si il fallait que je branche le grd du module sur le pin 7? Mais de toute façon, cet exemple génère des erreurs de compilation du fait qu'il attend un bool sur l'appel de la fonction radio.read alors que celle-çi renvoie void. Du coup on ne peut pas compiler cet exemple sans devoir intervenir sur le code de la librairie

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

mr_fabrice

#5
Jun 09, 2020, 01:57 am Last Edit: Jun 09, 2020, 02:15 am by mr_fabrice Reason: Word correction
J'utilise bien la dernière la librairie.
Voici la portion de code erronée dans l'exemple starping:
Code: [Select]

bool done = false;
while (!done)
{
    // Fetch the payload, and see if this was the last one.
    done = radio.read( &got_time, sizeof(unsigned long) );

    // Spew it
    printf("Got payload %lu from node %i...",got_time,pipe_num+1);
}


comme radio.read ne renvoie rien cet exemple ne peut-être téléversé

hbachetti

Effectivement, j'ai modifié le code de l'exemple (je n'en avais pas souvenir, il y a plus d'un an).
On ne modifie jamais le code de la librairie.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

mr_fabrice

Je n'ai pas modifié le code de la librairie. Du coup je reste bloqué sur le fait que mon radio.chipIsConnected mais que radio is not available. Pour l'instant les tests se font avec une alimentation via le port usb. Qu'est-ce qui pourrait causer un tel problème maintenant que les connexions sont bonnes?

hbachetti

Cela fait longtemps que je n'utilise plus RF24 mais je n'ai jamais eu de problème pour faire fonctionner les exemples, gettingstarted par exemple.
Depuis plusieurs années j'utilise la librairie MYSENSORS qui me permet de remonter les infos à mon serveur DOMOTICZ, ou d'en recevoir.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

mr_fabrice

Getting started me renvoie sur la sortie une succession de "?" ponctués par quelques ")"

La librairie MYSENSORS semble bien complète, mais bien grosse par rapport à mes besoins et l'accès à la doc. pas facilitée (doc en ligne plus accessible et nécessité de compiler la doc et donc de faire un projet juste pour accéder à la doc?); j'imagine que je vais finir par la tester si je n'arrive pas à faire marcher la lib RF24 et que je ne trouve pas d'autre lib.

hbachetti

La doc :
https://www.mysensors.org/download/sensor_api_20

Les exemples :
https://www.mysensors.org/build/temp

MYSENSORS est une librairie permettant le dialogue entre un certain nombre de capteurs / actionneurs et une passerelle connectée à un serveur domotique (DOMOTICZ, JEEDOM, etc.).
Ce n'est pas une librairie faite pour communiquer simplement entre deux ARDUINOs.

Est-ce que cela convient ?
Impossible à dire puisque tu ne décris par ton projet.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

mr_fabrice

J'ai finalement résolu mon problème en passant de mon mac sur linux, ce qui m'a permis de voir une erreur de code qui ne remontait pas sur mac: adress[5] au lieu de adress[6]. Au final il s'agissait d'une erreur de code. Dès que j'ai corrigé cette erreur, les données ont pu être transmises sans problème.
Sinon merci pour ton aide, j'ai appris des tas de choses sur ton blog riton-duino et je ne manquerai pas de m'y replonger pour approfondir mes connaissances

hbachetti

Code: [Select]
const byte meteoAdrs[5] = "bcsth";

Oui effectivement je ne l'avais pas vue celle-là.

Quote
en passant de mon mac sur linux
Étonnant s'il s'agit de la même version d'IDE.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up