Collegare 3 arduini tra loro con NRF24L01

Ciao ragazzi
sto provando a mettere in collegamento un telecomando fatto con arduino uno e 2 joistick dove ogni joistick comanda un arduino uno e un arduino nano. Ogno arduino ha un NRF24L01.

Ho realizzato il tutto ma con entrambi i joistick creo solo interferenze sui due arduino.

Lo sketch che ho realizzato è il seguente dove ho creato 2 indirizzi diversi:

// NRF24L01
#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);                      // define the object to control NRF24L01
const byte addresses_tilt[6] = "Free2"; // indirizzo per NRF24L01 per il pan tilt
const byte addresses[6] = "Free1";      // define communication address which should correspond to remote control
// wireless communication
int dataWrite_tilt[3];
int dataWrite[3];                 // define array used to save the write data
// pin
const int joystickXPin_tilt = A0,           // define joystickXPin_tilt
          joystickYPin_tilt = A1,           // define joystickYPin_tilt
          joystickZPin_tilt = 8,            //define pin for direction Z of joystick_tilt
          
          joystickXPin = A2,      // define pin for direction X of joystick
          joystickYPin = A3,      // define pin for direction Y of joystick
          joystickZPin = 7;       // define pin for direction Z of joystick
   
          /*
          led1Pin = 6,            // define pin for LED1 which is close to POT1 and used to indicate the state of POT1
          led2Pin = 5,            // define pin for LED2 which is close to POT2 and used to indicate the state of POT2
          led3Pin = 8;            // define pin for LED3 which is close to NRF24L01 and used to indicate the state of NRF24L01
          */
          
void setup() {
  // NRF24L01
  radio.begin();                      // initialize RF24
  radio.setPALevel(RF24_PA_MAX);      // set power amplifier (PA) level
  radio.setDataRate(RF24_1MBPS);      // set data rate through the air
  radio.setRetries(0, 15);            // set the number and delay of retries
  radio.openWritingPipe(addresses);   // open a pipe for writing
  radio.openReadingPipe(1, addresses);// open a pipe for reading
  radio.openWritingPipe(addresses_tilt);   // open a pipe for writing
  radio.openReadingPipe(1, addresses_tilt);// open a pipe for reading
  radio.stopListening();              // stop listening for incoming messages
  
// pin
  pinMode(joystickZPin, INPUT);       // set led1Pin to input mode
  pinMode(joystickZPin_tilt, INPUT);       // set led1Pin to input mode
 // pinMode(s1Pin, INPUT);              // set s1Pin to input mode
 // pinMode(s2Pin, INPUT);              // set s2Pin to input mode
  //pinMode(s2Pin, INPUT);              // set s3Pin to input mode
  //pinMode(led1Pin, OUTPUT);           // set led1Pin to output mode
  //pinMode(led2Pin, OUTPUT);           // set led2Pin to output mode
  //pinMode(led3Pin, OUTPUT);           // set led3Pin to output mode
}

void loop()
{
  // put the values of rocker, switch and potentiometer into the array
  //dataWrite[0] = analogRead(pot1Pin); // save data of Potentiometer 1
  //dataWrite[1] = analogRead(pot2Pin); // save data of Potentiometer 2
  dataWrite[0] = analogRead(joystickXPin);  // save data of direction X of joystick
  dataWrite[1] = analogRead(joystickYPin);  // save data of direction Y of joystick
  dataWrite[2] = digitalRead(joystickZPin); // save data of direction Z of joystick

  dataWrite_tilt[0] = analogRead(joystickXPin_tilt);  // save data of direction X of joystick
  dataWrite_tilt[1] = analogRead(joystickYPin_tilt);  // save data of direction Y of joystick
  dataWrite_tilt[2] = digitalRead(joystickZPin_tilt); // save data of direction Z of joystick
  //dataWrite[5] = digitalRead(s1Pin);        // save data of switch 1
  //dataWrite[6] = digitalRead(s2Pin);        // save data of switch 2
  //dataWrite[7] = digitalRead(s3Pin);        // save data of switch 3

  // write radio data
  radio.writeFast(&dataWrite, sizeof(dataWrite));
  delay(20);

  radio.writeFast(&dataWrite_tilt, sizeof(dataWrite_tilt));
delay(20);
  // make LED emit different brightness of light according to analog of potentiometer

}

Avete idee come si può fare?
In pratica da un NRF24L01 collegato su Arduino UNO voglio comandare 2 NRF24L01 montati ognuno su altri 2 Arduini

Nessuno mi può aiutare?

Ho avuto lo stesso problema utilizzando 3 NRF e 3 Mega (1 master e 2 slave). Ad una distanza non superiore ai 10 mt funzionavano a singhiozzo, e, avvicinandoli, non migliorava l'affidabilità.

Ho risolto il tutto utilizzando degli HC12, più economici, con più semplice piedinatura e utilizzabili oltre i 100 mt.

Enrico

Ciao, in passato ho creato un progettino simile al tuo, dove con un nrf24l01 trasmettitore, avevo due diversi ricevitori, ognuno dei quali ovviamente aveva un suo nrf24l01.

A differenza tua però, utilizzavo questa libreria

Mi sono trovato bene con questa libreria, perchè ti permette di selezionare canali, sulla frequenza 2,4GHz, differenti e quindi puoi avere tanti arduinI riceventi e solo quelli che imposti sullo stesso canale ricevono il messaggio. Inoltre ti premette di settare il nome dell'arduino destinatario, in modo tale che chi non si chiama con quel nome, ignora automaticamente il messaggio.

Da quel che ho capito, tu vorresti fare l'opposto di quello che feci io, ossia:
uno manda e tutti ricevono ed interpretano il comando.
Quindi con questa libreria, non dovresti fare altro che settare lo stesso canale a tutti i riceventi (tipo il 90) e chiamare tali ricevitori tutti con lo stesso nome (tipo: FreeX), ammesso che tu voglia avere solo un trasmittente e molti riceventi.

Quando inziai a smanettare con questi rice-trasmettitori mi aiutò molto questa guida
che utilizza proprio la libreria che ti ho detto prima.
Spero di esserti stato d'aiuto.

Provato anche la MIRF, ma proprio non mi sono trovato.

Resto della mia idea, con lo HC-12 non sono “legato” alla piedinatura, ho meno cavi, posso collegare (ovviamente su diversi canali) più HC ad ogni arduino, non ho problemi sull’utilizzo di basette per ridurre la tensione, potrei superare (in campo libero) i 500 mt (provato!) e, se ben ricordo, sono più economici.

saluti

Enrico

Ok grazie ragazzi ci provo

ciao, nel tuo codice non ho trovato il comando radio.setChannel(Canale);
se hai intenzione di inviare più segnali in contemporanea a riceventi diversi potresti porre:

trasmittente 1 canale 45 --> ricevente 1 canale 45
trasmittente 2 canale 100 --> ricevente 2 canale 100

oppure:
trasmittente 1 canale 45 --> ricevente 1 canale 45
radio.stopListening();
radio.setChannel(100);
radio.openWritingPipe(addres);
--> ricevente 2 canale 100