Problème de communication nrf24l01+

bonjour je souhaite faire un projet avec deux nrf24l01 avec antenne et une carte intermédiaire pour gérer l'alimentation du module nrf24. pour tester la communication j'ai sortie deux Arduinos nano fraichement reçu.et j'ai tester un code de ce site.

Code de programmation émetteur Hello World :

/*
   ______               _                  _///  _           _                   _
  /   _  \             (_)                |  __\| |         | |                 (_)
  |  [_|  |__  ___  ___ _  ___  _ __      | |__ | | ___  ___| |_ _ __ ___  _ __  _  ___  _   _  ___
  |   ___/ _ \| __|| __| |/ _ \| '_ \_____|  __|| |/ _ \/  _|  _| '__/   \| '_ \| |/   \| | | |/ _ \
  |  |  | ( ) |__ ||__ | | ( ) | | | |____| |__ | |  __/| (_| |_| | | (_) | | | | | (_) | |_| |  __/
  \__|   \__,_|___||___|_|\___/|_| [_|    \____/|_|\___|\____\__\_|  \___/|_| |_|_|\__  |\__,_|\___|
                                                                                      | |
                                                                                      \_|
  Fichier:      HelloWorldNRF24L01-Emetteur
  Description:  Emission d'un "Hello World" via un NRF24L01
  Auteur:       Passion-Électronique

  Librairie utilisée : https://github.com/nRF24/RF24

  Créé le 19.03.2021
*/
#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 !
}

Code de programmation récepteur Hello World :

/*
   ______               _                  _///  _           _                   _
  /   _  \             (_)                |  __\| |         | |                 (_)
  |  [_|  |__  ___  ___ _  ___  _ __      | |__ | | ___  ___| |_ _ __ ___  _ __  _  ___  _   _  ___
  |   ___/ _ \| __|| __| |/ _ \| '_ \_____|  __|| |/ _ \/  _|  _| '__/   \| '_ \| |/   \| | | |/ _ \
  |  |  | ( ) |__ ||__ | | ( ) | | | |____| |__ | |  __/| (_| |_| | | (_) | | | | | (_) | |_| |  __/
  \__|   \__,_|___||___|_|\___/|_| [_|    \____/|_|\___|\____\__\_|  \___/|_| |_|_|\__  |\__,_|\___|
                                                                                      | |
                                                                                      \_|
  Fichier:      HelloWorldNRF24L01-Recepteur
  Description:  Réception d'un message "Hello World" depuis un autre arduino nano, via un NRF24L01
  Auteur:       Passion-Électronique

  Librairie utilisée : https://github.com/nRF24/RF24

  Créé le 19.03.2021
*/
#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 !
  }
}

et je ne recrois rien . avec un autre code généré lui par GPT j'ai pu voir que mes module étaient détecté mais ne communiquaient juste pas(erreur : Échec de l'envoi !).

//émetteur
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9
#define CSN_PIN 10

RF24 radio(CE_PIN, CSN_PIN);
const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  if (!radio.begin()) {
    Serial.println("NRF24L01+ non détecté !");
    while (1);
  }
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_250KBPS); // Réduction de la vitesse pour fiabilité
  radio.stopListening();
}

void loop() {
  const char text[] = "Hello, Receiver!";
  if (radio.write(&text, sizeof(text))) {
    Serial.println("Message envoyé !");
  } else {
    Serial.println("Échec de l'envoi !");
  }
  delay(1000);
}

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

#define CE_PIN 9
#define CSN_PIN 10

RF24 radio(CE_PIN, CSN_PIN);
const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  if (!radio.begin()) {
    Serial.println("NRF24L01+ non détecté !");
    while (1);
  }
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_250KBPS); // Réduction de la vitesse pour fiabilité
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.print("Message reçu : ");
    Serial.println(text);
  } else {
    Serial.println("En attente de messages...");
  }
  delay(1000);
}

après des recherches j'ai vue qu'il était recommander de l'alimenter avec une autre alimentation que l'usb .donc j'ai utilisé un arduino mega alimenté avec une alim 12 v et j'ai connecté les deux vin de la mega et de la nano ensembles et deux GND aussi.toujours rien.

merci de vos futures reponces.

Bonjour eectronath24

Dans ce code (ChatGPT) de test tu as:

#define CE_PIN 9
#define CSN_PIN 10

et dans tes codes:

#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

Cordialement
jpbbricole

merci j'avais remarqué et j'ai fait les changement a chaque fois de plus j'ai tout débranché et rebrancher pour exclure le câble
mal branché

edit: je n'ai pas utilisé de breadboard pour éviter de mauvais branchements

J’ai deux exemples dans les tutos

merci mais le premier programme me met une erreur "erreur d'envoi" j'ai legérement modifié le code sur l'arduino mega pour rajouter une ligne puisque je n'ai pas de pad pour les boutons.je n'ai pas fait attention a quelle arduino étais le 1,est ce que c'est grave?

edit : @J-M-L j'avais deja suivit un de vos post dans cette conversation qui n'avais pas resolut mon probleme.

faudrait avoir le détail exact de votre code et de votre montage et qualité d'alimentation

  // On attache la fonction boutonXClick() comme callBack en cas de simple click rapide
  // ou si le bouton est tenu longtemps appuyé (au relachement)
  // il existe 3 callback attachLongPressStart, attachLongPressStop, attachDuringLongPress
  bouton1.attachClick(bouton1Click);  bouton1.attachLongPressStop(bouton1Click);
  bouton2.attachClick(bouton2Click);  bouton2.attachLongPressStop(bouton2Click);
  bouton3.attachClick(bouton3Click);  bouton3.attachLongPressStop(bouton3Click);
  bouton4.attachClick(bouton4Click);  bouton4.attachLongPressStop(bouton4Click);
  envoyerMessage(5);
}


brachement :
nano:
ce > 7(j'ai fait attention de le modifier dans le code si s'était pas deja ça
csn>8
sck>13
M0>11
M1>12
ir0> rien

mega:
ce >7
CSN>8
SCK>52
M0>51
M1>50

???

je suis sensé voir quoi ?

"""
envoyerMessage(5);
"""

mes exemples datent de 2017, je ne les ai plus en tête.

vous pouvez poster tous les code ?

et pour votre autre code

rien n'est communiqué

je parle du premier lien

// ************* La Radio *************
#include <SPI.h>
#include <RF24.h> // voir http://tmrh20.github.io/RF24/

// Configurer vos radio nRF24L01+ sur le bus SPI et mettre  CE sur D7 et CSN sur D8
RF24 radio(7, 8);

// Le nom des "pipes" de communication, un en lecture, un en écriture
const byte adresses[][6] = {"0pipe", "1pipe"}; // Pipes 1-5 should share the same address, except the first byte. Only the first byte in the array should be unique

// A CONFIGURER sur la pin A0
// si A0 est à GND alors rôle = 0 --> le premier Arduino
// si A0 est à  3.3V ou 5V alors rôle = 1 --> pour le second
const byte configurationPin = A0;
uint8_t role;


// ****************** Les Boutons ******************
// library = https://github.com/mathertel/OneButton
// documentation = http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

#include <OneButton.h>

OneButton bouton1(4, true); // true pour le mettre en INPUT_PULLUP
OneButton bouton2(3, true);
OneButton bouton3(6, true);
OneButton bouton4(5, true);

// *************  Deux Leds avec résitances de limiation de courant *************
const byte pinLed0 = 9;
const byte pinLed1 = 10;


// ----------------------------------------------------------------------------------------
void bouton1Click()
{
  Serial.println(F("Bouton 1 local, envoi du message 1"));
  envoyerMessage((uint8_t) 1);
}

void bouton2Click()
{
  Serial.println(F("Bouton 2 local, envoi du message 2"));
  envoyerMessage((uint8_t) 2);
}

void bouton3Click()
{
  Serial.println(F("Bouton 3 local, envoi du message 3"));
  envoyerMessage((uint8_t) 3);
}

void bouton4Click()
{
  Serial.println(F("Bouton 4 local, envoi du message 4"));
  envoyerMessage((uint8_t) 4);
}

// ----------------------------------------------------------------------------------------

void verifierBoutons()
{
  bouton1.tick();
  bouton2.tick();
  bouton3.tick();
  bouton4.tick();
}

// ----------------------------------------------------------------------------------------
// envoi d'un octet vers l'autre radio
// ----------------------------------------------------------------------------------------

void envoyerMessage(uint8_t nombre)
{
  radio.stopListening();   // On arrête d'écouter pour qu'on puisse émettre

  if (!radio.write( &nombre, sizeof(nombre) )) {
    Serial.println(F("erreur d'envoi"));
  }
  radio.startListening(); // On se remet en mode écoute
}

// ----------------------------------------------------------------------------------------
// vérifie si on a reçu une commande de la part de l'autre radio (1 octet)
// ----------------------------------------------------------------------------------------
uint8_t ecouterRadio()
{
  uint8_t message = 0; // 0 = pas de commande

  if ( radio.available()) {
    while (radio.available()) {
      radio.read( &message, sizeof(message) );  // on lit l'octet reçu (si plusieurs messages on ne conserve que le dernier)
    }
    Serial.print(F("J'ai recu ")); Serial.println(message);
  }
  return message;
}

// ----------------------------------------------------------------------------------------

void executerAction(uint8_t messageRecu)
{
  if (messageRecu >= 1 && messageRecu <= 4) {
    switch (messageRecu) {
      case 1:
        Serial.println(F("Action Bouton 1 distant"));
        digitalWrite(pinLed0, LOW);
        digitalWrite(pinLed1, LOW);
        break;
      case 2:
        Serial.println(F("Action Bouton 2 distant"));
        digitalWrite(pinLed0, HIGH);
        digitalWrite(pinLed1, LOW);
        break;
      case 3:
        Serial.println(F("Action Bouton 3 distant"));
        digitalWrite(pinLed0, LOW);
        digitalWrite(pinLed1, HIGH);
        break;
      case 4:
        Serial.println(F("Action Bouton 4 distant"));
        digitalWrite(pinLed0, HIGH);
        digitalWrite(pinLed1, HIGH);
        break;
    }
    // on envoie un accusé de réception qui vaut 100 + la valeur du message
    envoyerMessage((uint8_t) 100 + messageRecu);
  } else if (messageRecu >= 100) { // c'est un ACK d'une action distante
    Serial.print(F("Confiramtion Execution action distante Bouton "));
    Serial.println(messageRecu - 100);
  }

}

// ------------------------------------------------------------------
// ------------------------------------------------------------------
// ------------------------------------------------------------------

void setup() {
  pinMode(pinLed0, OUTPUT);
  pinMode(pinLed1, OUTPUT);
  pinMode(A0, INPUT);

  Serial.begin(115200);

  role = (digitalRead(configurationPin) == LOW) ? 0 : 1 ;
  Serial.print(F("\nMon Role = ")); Serial.println(role);

  // On configure la radio
  radio.begin();
  // pour le test on règle le niveau d'énergie à RF24_PA_LOW pour éviter les interférences
  // mettre à RF24_PA_MAX si on veut la puissance d'émission max
  radio.setPALevel(RF24_PA_LOW);

  // On ouvre un pipe de lecture et un d'écriture avec des noms opposés en fonction du rôle
  // comme ça un parle sur "pipe0" et l'autre écoute sur "pipe0"
  // et l'autre parle sur "pipe1" tandisque Le premier écoute sur "pipe1"

  radio.openWritingPipe(adresses[role]); // role doit être 0 ou 1
  radio.openReadingPipe(1, adresses[1 - role]); // 1 - role = l'autre adresse

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

  // On attache la fonction boutonXClick() comme callBack en cas de simple click rapide
  // ou si le bouton est tenu longtemps appuyé (au relachement)
  // il existe 3 callback attachLongPressStart, attachLongPressStop, attachDuringLongPress
  bouton1.attachClick(bouton1Click);  bouton1.attachLongPressStop(bouton1Click);
  bouton2.attachClick(bouton2Click);  bouton2.attachLongPressStop(bouton2Click);
  bouton3.attachClick(bouton3Click);  bouton3.attachLongPressStop(bouton3Click);
  bouton4.attachClick(bouton4Click);  bouton4.attachLongPressStop(bouton4Click);
  envoyerMessage(5);
}

// ------------------------------------------------------------------

void loop() {
  uint8_t messageRecu;
  verifierBoutons(); // regarde si les boutons sont enfoncés et déclenche une action dans ce cas

  if (messageRecu = ecouterRadio()) // si on a reçu un message
    executerAction(messageRecu);    // on execute l'action associée
}

vous avez fait cela ?

oui je l'ai fait

OK et donc si vous tapez

coucou

dans PUTTY du côté emétteur, que voyez vous ?


ça n'attend pas que j'appuis sur une seconde touche pour envoyer le message d'erreur.

Edit : pour faire des tests je n'alimente que la méga avec une alimentation externe en plus de l'USB de 12 volts.

pas compris ce que ça veut dire - pourquoi une alim en plus ?

pouvez vous détailler le circuit exact de chaque côté et les alims ?

(le message que vous voyez dit qu'il n'a pas réussi à joindre l'autre radio donc vous avez un souci de montage sans doute)

brachement :
nano:
ce > 7(j'ai fait attention de le modifier dans le code si s'était pas deja ça
csn>8
sck>13
M0>11
M1>12
ir0> rien

mega:
ce >7
CSN>8
SCK>52
M0>51
M1>50

L'alimentation est un chargeur d'appareil photo qui vient sur le port dédié de L'arduino. j'ai lu qu'il en fallait une pour les nrf avec antenne.c'est un 12V

La question c’est plus de savoir comment sont alimentées les radios

Ils sont alimentés via une carte intermédiaire pour les condensateurs et le régulateur de tension elle-même connecté au 5 volts et GND de la carte Arduino.