Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comportement erratique moniteur série

Arduino, NRF24L01

6 août 2021 à 0:26:45

Bonsoir,

Je cherche à mettre au point un système en utilisant des modules NRF24L01 (sans fil) pour communiquer entre deux arduinos. Pour cela je suis le tuto de : https://passionelectronique.fr/tutorial-nrf24l01/#explication-rapide-concernant-le-nrf24

Au moment de tester la communication entre les deux arduinos à travers les modules, il est donné un code pour transmettre le message 'Hello world'.

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

#define pinCE   7             // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN  8             // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel  "PIPE1"       // On définit un "nom de tunnel" (5 caractères), pour pouvoir communiquer d'un NRF24 à l'autre

RF24 radio(pinCE, pinCSN);    // Instanciation du NRF24L01

const byte adresse[6] = tunnel;               // Mise au format "byte array" du nom du tunnel
const char message[] = "Hello World !!!";     // Message à transmettre à l'autre NRF24 (32 caractères maxi, avec cette librairie)


void setup() {
  radio.begin();                      // Initialisation du module NRF24
  radio.openWritingPipe(adresse);     // Ouverture du tunnel en ÉCRITURE, avec le "nom" qu'on lui a donné
  radio.setPALevel(RF24_PA_MIN);      // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
  radio.stopListening();              // Arrêt de l'écoute du NRF24 (signifiant qu'on va émettre, et non recevoir, ici)
}

void loop() {
  radio.write(&message, sizeof(message));     // Envoi de notre message
  delay(1000);                                // … toutes les secondes !
}

et pour la réception :

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

#define pinCE   7             // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN  8             // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel  "PIPE1"       // On définit le "nom de tunnel" (5 caractères) à travers lequel on va recevoir les données de l'émetteur

RF24 radio(pinCE, pinCSN);    // Instanciation du NRF24L01

const byte adresse[6] = tunnel;       // Mise au format "byte array" du nom du tunnel
char message[32];                     // Avec cette librairie, on est "limité" à 32 caractères par message

void setup() {
  // Initialisation du port série (pour afficher les infos reçues, sur le "Moniteur Série" de l'IDE Arduino)
  Serial.begin(9600);
  Serial.println("Récepteur NRF24L01");
  Serial.println("");

  // Partie NRF24
  radio.begin();                      // Initialisation du module NRF24
  radio.openReadingPipe(0, adresse);  // Ouverture du tunnel en LECTURE, avec le "nom" qu'on lui a donné
  radio.setPALevel(RF24_PA_MIN);      // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
  radio.startListening();             // Démarrage de l'écoute du NRF24 (signifiant qu'on va recevoir, et non émettre quoi que ce soit, ici)
}

void loop() {
  // On vérifie à chaque boucle si un message est arrivé
  if (radio.available()) {
    radio.read(&message, sizeof(message));                        // Si un message vient d'arriver, on le charge dans la variable "message"
    Serial.print("Message reçu : "); 
    Serial.println(message);                                      // … et on l'affiche sur le port série !
  }
}




Je l'ai strictement copié-collé et mis dans mon IDE Arduino. J'ai téléversé le programme émetteur sur mon Arduino Uno, puis le récepteur sur la Nano Every, chacune reliée à un NRF. J'ai là enchainé des erreurs incompréhensibles, mais qui semblent passées, j'arrive désormais à téléverser correctement sur les deux. Toutefois, lorsque j'affiche le moniteur série du port censé accueillir l'arduino réceptrice, celui enchaine les "Message reçu :" à toute vitesse (aussi vite qu'il peut l'afficher).

Or, comme vous pouvez le voir dans les codes, il ne doit afficher ce "Message reçu" qu'à la réception d'un message, message qui est lui envoyé toutes les secondes. Sauf que si le message était reçu, il devrait s'afficher 'Hello World' après les deux points. Autrement dit, ça n'a aucun sens. Qui plus est, en débranchant l'Arduino émettrice, le moniteur continue son comportement..

A noter que dans l'IDE, lors de la sélection du port, il s'affiche 'COM3 (Arduino Uno)' et 'COM4' (Ports série est grisé) et non pas 'COM4 (Arduino Nano Every)'. J'ai donc fait les sélections de port, de cartes et de processeurs manuellement. Le gestionnaire de périphérique me dit que les COM3 et COM4 fonctionnent correctement et que les pilotes sont à jour (Win10 64bits).

Bref, ça devait me prendre 15 minutes, et cela fait plus de 2h que j'épluche tous les forums dans toutes les langues que je connais pour trouver une solution et rien n'y fait. Pouvez-vous m'expliquer ?

Merci

  • Partager sur Facebook
  • Partager sur Twitter
6 août 2021 à 2:22:01

Tout débord, étant donné que tes variables message sont des buffer, tu ne devrais pas avoir à mettre un & devant car il s'agit déjà d'un pointeur.

Cela est valable pour l'émetteur et pour le récepteur :

radio.write(message, sizeof(message));

radio.read(message, sizeof(message));

Ensuite, il faut savoir qu'en C, les chaine de caractères doivent se terminer par un \0, donc bien que celui-ci soit effectivement envoyé, si jamais il y a un problème de transmission, alors ton code de reception va faire n'importe quoi lors de l'affichage.

Il pourrait être judicieux de le forcer au cas où bien que cela puisse très certainement marcher sans ce forçage.

  • Partager sur Facebook
  • Partager sur Twitter
6 août 2021 à 11:20:44

Bonjour,

Merci, erreur corrigée au niveau des pointeurs "message". Cependant, le moniteur série continue d'afficher des "message reçu :" à l'infini et de manière automatique, rien à voir avec ce qui lui est demandé.

J'ai réessayé plusieurs fois, il est peu probable qu'une telle erreur de transmission se soit reproduis plusieurs fois d'affilée.

Avez-vous une idée ?

EDIT : avec un delay(1000) dans le programme du récepteur, j'ai pu confirmer que le moniteur série agit de manière complètement isolée. Il effectue le porgramme dans la loop à l'infini, sans considération pour le if.

EDIT2 : je viens de supprimer le if du code, et ça n'a aucune influence sur le résultat, et je ne comprends pas pourquoi

-
Edité par Archerlite 6 août 2021 à 15:48:54

  • Partager sur Facebook
  • Partager sur Twitter
7 août 2021 à 15:39:31

Le module est peut être mal cablé ou il y a peut être un faux contact quelque part, faisant en sorte que l'arduino lit toujours n'importe quoi en provenance du module.
  • Partager sur Facebook
  • Partager sur Twitter