Nrf24L01+ - bibliothèque Network et RF24

Bonsoir,

Je suis en train de tester un réseau sans fil via des modules Nrf24L01+ et la bibliothèque RF24Network de TMRh20, et je rencontre un problème que je n'arrive pas à résoudre. Je me suis servi des codes Networkrx et Networktx que j'ai légèrement adapté à mon usage.

En gros, j'utilise 3 arduino chacun relié à un pc différent pour activer le moniteur série, l'un est activé avec le rx auquel j'ai ajouté un bouton poussoir pour envoyer le paquet à l'un ou l'autre des récepteurs. Les 2 récepteurs sont activés avec le même code modulo l'adresse du "node" (03 pour l'un et 02 pour l'autre).

Mon PB est le suivant, l'emetteur envoie bien le signal à l'un ou l'autre selon que j'appuie sur le bouton, et les recepteurs me signalent bien la reception du signal. Sauf que le code emetteur attend un retour (bool ok = xxxxxx) qui renvoie systématiquement un "failed" sur le 1er et pas sur le second. j'ai changé d'antenne, de cable, d'arduino, j'ai inversé les codes des nodes en récéption. Ca ne change rien. Auriez vous une idée de méthodologie pour essayer de savoir où ça déconne ? ou ce qui cloche dans le code (en sachant qu'il est identique à peu de chose près au code initial.

voici les 2 codes :

TX

/*
  Copyright (C) 2012 James Coliz, Jr. <maniacbug@ymail.com>
  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  version 2 as published by the Free Software Foundation.

  Update 2014 - TMRh20
*/

/**
   Simplest possible example of using RF24Network

   TRANSMITTER NODE
   Every 2 seconds, send a payload to the receiver node.
*/

#include <RF24Network.h>
#include <RF24Network_config.h>
#include <Sync.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

RF24 radio(9, 10);                   // nRF24L01(+) radio attached using Getting Started board

RF24Network network(radio);          // Network uses that radio

const uint16_t this_node = 00;        // Address of our node in Octal format
const uint16_t other_node3 = 03;      // Address of the other node in Octal format
const uint16_t other_node2 = 02;
boolean BP = 0;
int bouton = 2;

const unsigned long interval = 2000; //ms  // How often to send 'hello world to the other unit

unsigned long last_sent;             // When did we last send?
unsigned long packets_sent;          // How many have we sent already


struct payload_t {                  // Structure of our payload
  unsigned long ms;
  unsigned long counter;
};

void setup(void)
{
  Serial.begin(115200);
  Serial.println("RF24Network/examples/helloworld_tx/");

  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
  pinMode (bouton, INPUT_PULLUP);
}

void loop() {

  network.update();                          // Check the network regularly


  unsigned long now = millis();              // If it's time to send a message, send it!
  if ( now - last_sent >= interval  )
  {
    last_sent = now;
    BP = digitalRead (bouton);
    if (BP==1) {
      Serial.print("Sending to node 03...");
      payload_t payload3 = { millis(), packets_sent++ };
      RF24NetworkHeader header3(/*to node*/ other_node3);
      bool ok = network.write(header3, &payload3, sizeof(payload3));
      if (ok)
        Serial.println("ok node 3.");
      else
        Serial.println("failed.");
    }
    else if (BP==0) {
      Serial.print("Sending to node 02...");
      payload_t payload2 = { millis(), packets_sent++ };
      RF24NetworkHeader header2(/*to node*/ other_node2);
      bool ok = network.write(header2, &payload2, sizeof(payload2));
      if (ok)
        Serial.println("ok node 2.");
      else
        Serial.println("failed.");
    }
  }
}

code recepteurs (pour les deux, c'est le même code sauf pour l'adresse :

/*
 Copyright (C) 2012 James Coliz, Jr. <maniacbug@ymail.com>
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 
 Update 2014 - TMRh20
 */

/**
 * Simplest possible example of using RF24Network,
 *
 * RECEIVER NODE
 * Listens for messages from the transmitter and prints them out.
 */

#include <RF24Network.h>
#include <RF24Network_config.h>
#include <Sync.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>


RF24 radio(9,10);                // nRF24L01(+) radio attached using Getting Started board 

RF24Network network(radio);      // Network uses that radio
const uint16_t this_node = 02;    // Address of our node in Octal format ( 04,031, etc) 01 pour l'autre node
const uint16_t other_node = 00;   // Address of the other node in Octal format

struct payload_t {                 // Structure of our payload
  unsigned long ms;
  unsigned long counter;
};


void setup(void)
{
  Serial.begin(115200);
  Serial.println("RF24Network/examples/helloworld_rx/");
 
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop(void){
  
  network.update();                  // Check the network regularly

  
  while ( network.available() ) {     // Is there anything ready for us?
    
    RF24NetworkHeader header;        // If so, grab it and print it out
    payload_t payload;
    network.read(header,&payload,sizeof(payload));
    Serial.print("Received packet #");
    Serial.print(payload.counter);
    Serial.print(" at ");
    Serial.println(payload.ms);
  }
}

il n'a été changé que pour adapter l'adresse du module (02 ou 03) et les broches Ce et CsN à mon montage

Up.

J'ai encore modifié le code, ce coup ci, d'une part pour introduire une valeur aléatoire (de 1 à 4) et en augmentant le nombre de modules en réception (4 donc) d'autre part, chacun équipé d'une LED qui s'allume quand il reçoit le signal.

Les 4 modules ont la led qui s'allume quand ils sont sollicités, mais 3 sur les 4 ne renvoient pas "l'accusé reception". Ce coup ci, le node 01 renvoie bien le signal, les 3 autres passent en failed bien qu'ils aient tous la led qui s'allume lorsqu'ils sont tirés au sort.

Je ne connais pas la librairie RF24Network.
As-tu essayé l'exemple GettingStarted_CallResponse de la librairie RF24 ?

Non, mais du coup, je vais explorer cette piste ! Merci !