Comunicazione wireless con NRF24L01 + 5v Adapter

Salve a tutti, sto provando a far comunicare due arduino e mi succede una cosa alquanto strana:

Un arduino nano fa da ricevitore, un uno fa da trasmettitore. Il codice è banale, l'uno manda la stringa "test" e la nano la stampa sul seriale alla ricezione.

Il problema è che, l'arduino uno invia la stringa una volta sola precisamente quando apro il monitor seriale dall'IDE. Se chiudo e riapro il seriale ne rimanda un'altra, e così via.. Tutto ciò mi stranizza perché la funzione loop è veramente banale (ha solo la funzione write del modulo praticamente) e il codice è identico a mille mila sketch trovati sul web.

La mia idea è che sia un problema di potenza (uso entrambi gli arduino alimentati dal mio portatile) e quando apro il monitor seriale la porta usb dia più corrente all'uno e quindi il modulo funzioni.. ma è un'idea. Pareri? :confused:

Stiamo ancora aspettando che ti presenti.

Quindi , nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:

Fatto, scusate per la dimenticanza.

ora per completare l'opera basta solo che posti il codice altrimenti diventa difficile risponderti :slight_smile:

e...
magari anche il circuito :wink:

Ricevitore

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

//CE 5 e CSN 10
RF24 radio(5,10);

const uint64_t pipe = 0xE8E8F0F0E1LL;

int msg[1];

void setup(){
  radio.begin();                   
  radio.openReadingPipe(1, pipe);   
  radio.startListening();          
  Serial.begin(9600);
  Serial.println("Start");
  }

void loop(){
  if(radio.available()){            
    bool done = false;             
    while (!done) {
      done = radio.read(msg, 1);
      Serial.write(msg[0]);
    }
  }
}

Trasmettitore

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


//CE 5 e CSN 10
RF24 radio(5,10);                                                   
const uint64_t pipe = 0xE8E8F0F0E1LL;

int msg[1]; 

void setup(void){
  radio.begin();                      
  radio.openWritingPipe(pipe);       
}

void loop(void){
  msg[0] = 42; 
  radio.write(msg, 1);
}

Il circuito è semplicissimo, ci sono solo collegati i due moduli ai due arduino (ho smontato tutti gli altri componenti perché non riesco a trovare l'errore).

PS: Questo sketch è preso da internet, ma uguale al mio, ed inoltre una volta solo ha funzionato. trovo il tutto molto strano.

boh non conosco bene il protocollo ma ho trovato questo :slight_smile:

// read and write expect a reference to the payload (& symbol)
// second argument is the packet length in bytes (sizeof(int) == 2)

radio.write(&transmitterId, 2);

tu msg l'hai dichiarato int ma sia in read che write hai messo 1 inoltre msg non l'hai passato per referenza

io l'ho tratto da qui

in più non essendoci nemmeno una pausa il messaggio viene trasmesso (teoricamente) migliaia di volte al secondo, immagino si incricchi qualcosa...

Allora, ho modificato il codice di conseguenza (ma il risultato non è cambiato, anzi, ora non mi fa più nemmeno il giochetto con il monitor seriale)

trasmitter

#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

int transmitterId;

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
//Contacts from the radio to connect NRF24L01 pinamnam -> Arduino

//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9

RF24 radio(9, 10);

// this is not the channel address, but the transmitter address
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(void) {
        Serial.begin(9600);
	// CHANGE THIS PER EACH TRANSMITTER, from 0 to 4
	transmitterId = 42;
	radio.begin();

	// the following statements improve transmission range
	radio.setPayloadSize(2); // setting the payload size to the needed value
	radio.setDataRate(RF24_250KBPS); // reducing bandwidth

	radio.openWritingPipe(pipe); // set the transmitter address

}

void loop(void) {
	radio.powerUp();
	if(radio.write(&transmitterId, 2)){
          Serial.println("Mandato");
        }else{
          Serial.println("Errore");
        }
        delay(50);
}

receveir

#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

int senderId;

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
//Contacts from the radio to connect NRF24L01 pinamnam -> Arduino

//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9

RF24 radio(9, 10);

// this is not the channel address, but the transmitter address
const uint64_t pipe = 0xE8E8F0F0E1LL;

//LEDs connected to these pins
// ENSURE YOU HAVE THE RIGHT DIGITAL PINS HERE
int LEDpins[5] = { 2, 3, 4, 5, 6 };

void setup(void) {
	Serial.begin(9600);

	radio.begin();

	// the following statements improve transmission range
	radio.setPayloadSize(2); // setting the payload size to the needed value
	radio.setDataRate(RF24_250KBPS); // reducing bandwidth

	radio.openReadingPipe(1, pipe); // Open one of the 6 pipes for reception

	radio.startListening(); // begin to listen
        Serial.println("START:");
}

void loop(void) {
	if (radio.available()) {

		// this while is here to throw away all the packets but the last one
		bool done = false;
		while (!done) {

			// read and write expect a reference to the payload (& symbol)
			// second argument is the packet length in bytes (sizeof(int) == 2)
			done = radio.read(&senderId, 2);
		}
                Serial.print("Ricevuto: ");
                Serial.println(senderId);
		delay(50);
	}
}

Nella documentazione della libreria ho letto che radio.write() restituisce true se va a buon fine, in effetti noto che sulla seriale del trasmettitore leggo sempre "Errore"

si ma anche un'attsa di 50 millisecondi è pochina, significa una trasmissione di 20 volte al secondo.

comunque prova questi codici (tx e rx) e vedi se funziona...

qui