Ciao a tutti, sono iscritto da tempo sul forum che consulto spesso ed è giunto il momento del mio primo post.
Mi sto divertendo con arduino per creare una piccola rete domestica wireless basata su moduli nrf24l01+ con antenna integrata (quelli piccoli).
Attualmente la situazione è questa (ovviamente tutti i moduli sono provvisti di nrf24l01+):
1 arduino nano che funge da master con collegamento seriale ad una linux box (PRX)
2 arduino nano PTX
3 modulo standalone atmega8 PTX
4 modulo standalone atmega328 PTX
5 arduino nano PTX
Gli sketch sono basati sulla libreria mirf ed erano impostati con payload 32byte, 250kbps , muticeiver&shockburst disabilitati.
Una volta posizionati nelle stanze mi sono reso conto che purtroppo alcuni moduli non erano nel range di copertura del master con conseguente perdita di pacchetti ed ho deciso di sostituire l'nrf24l01+ del master con uno NRF24L01+PA+LNA SMA . La situazione è nettamente migliorata ma a volte qualche pacchetto veniva perso comunque credo a causa di collissioni in trasmissione.
Dopo aver verificato l'alimentazione dei moduli su tutti gli arduino (saldando dei condensatori da 100nf direttamente sui moduli basati su arduino nano) ho consultato il datasheet ed ho deciso di provare ad abilitare le funzioni shockburst/multiceiver.
Inutile dire che se sto scrivendo questo post non sono riuscito a settare correttamente i registri.
Dopo averli variati purtroppo l'affidabilità è peggiorata ed in più ho notato che a volte ai ptx viene inviato un doppio comando quando in realtà ne dovrebbe arrivare solo uno.
Cercando su internet ho trovato un documento dove avvisa che effettivamente ci potrebbero essere dei problemi con la pipe0 e con i timing dell'ack.
Per farla breve, nonostante i miei sforzi, non solo non ho risolto il problema ma in più ho una gran confusione in testa.
In rete sono reperibili molte librerie con supporto multiceiver ma capirete che "mi prende il freddo" al solo pensiero di dover riadattare tutto il codice degli sketch specialmente perchè i moduli sono già posizionati nelle stanze e non è comodissimo riflashare i moduli, specialmente quelli standalone dove devo estrarre fisicamente il pic.
In più mi è sorto il dubbio che la libreria mirf non possa gestire il device in multiceiver.
Per il momento non entro nel dettaglio altrimenti rischierei di scrivere un pò troppo. Anche rileggendo più volte il datasheet ho ancora qualche dubbio sulla gestione delle pipe e come impostare correttamente i registri per poter avere una comunicazione wireless tra questi moduli senza perdere pacchetti.
Spero che qualcuno di voi possa darmi qualche suggerimento in merito perchè dopo una settimana di prove non sono riuscito a venirne a capo.
Ricapitolando....
Volendo impostare la rete a stella in questo modo:
250kbps
crc 2 byte
shockburst/multiceiver abilitato (se abilito shockburst di conseguenza è obbligatorio il multiceiver giusto?)
ART 15
ARD 4000uS
Di seguito parte dello sketch del PRX e del PTX.
sul PRX :
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
char * nodo[10] = {
"ard00","ard01","ard02","ard03","ard04","ard05","ard06","ard07","ard08","ard09"};
const byte nodoid = 0; // id del nodo assegnato a questo sketch
const byte destid = 1; // id del nodo al quale trasmettere - viene riassegnato nel loop
//Set the SPI Driver.
Mirf.cePin = 8;
Mirf.csnPin = 7;
Mirf.spi = &MirfHardwareSpi;
//Setup pins / SPI.
Mirf.init();
//Configure reciving address.
Mirf.setRADDR((byte *)nodo[nodoid]);
//set payload
Mirf.payload = 32;
//The RF channel frequency is set according to the following formula: F0= 2400 + RF_CH [MHz]
Mirf.channel = 90;
Mirf.config();
// imposto lunghezza indirizzo device a 5 bytes
//Mirf.configRegister(SETUP_AW, 0x03);
// imposto come PRX , power up, crc a 2bytes
Mirf.configRegister(CONFIG, 0x0F);
// imposto velocità a 250k, potenza finale al massimo 0dbm
Mirf.configRegister(RF_SETUP, 0x26);
// abilito l'auto acknowledgment su tutte le datapipe
Mirf.configRegister(EN_AA, 0x3F);
//abilito tutte le datapipe in ricezoine
Mirf.configRegister(EN_RXADDR, 0x3F);
//Mirf.configRegister(EN_RXADDR, 0x03);
// PAYLOAD = 32BYTE
Mirf.configRegister(RX_PW_P0, 0x20);
Mirf.configRegister(RX_PW_P1, 0x20);
Mirf.configRegister(RX_PW_P2, 0x20);
Mirf.configRegister(RX_PW_P3, 0x20);
Mirf.configRegister(RX_PW_P4, 0x20);
Mirf.configRegister(RX_PW_P5, 0x20);
// IMPOSTO GLI INDIRIZZI multiceiver
Mirf.configRegister(RX_ADDR_P0, *nodo[1]);
Mirf.configRegister(RX_ADDR_P1, *nodo[2]);
Mirf.configRegister(RX_ADDR_P2, '3');
Mirf.configRegister(RX_ADDR_P3, '4');
Mirf.configRegister(RX_ADDR_P4, '5');
Mirf.configRegister(RX_ADDR_P5, '6');
// imposto l'auto retransmit count a 15 ed il tempo di reinvio del pacchetto a 4000us ( per impostare a 2250 us = 0x8F )
Mirf.configRegister(SETUP_RETR, 0XFF);
sul PTX :
//Set the SPI Driver.
Mirf.cePin = 8;
Mirf.csnPin = 7;
Mirf.spi = &MirfHardwareSpi;
//Setup pins / SPI.
Mirf.init();
//Configure reciving address.
Mirf.setRADDR((byte *)nodo[nodoid]);
//set payload
Mirf.payload = 32;
//The RF channel frequency is set according to the following formula: F0= 2400 + RF_CH [MHz]
Mirf.channel = 90;
Mirf.configRegister(CONFIG, 0x0E);
Mirf.configRegister(RF_SETUP, 0x26);
Mirf.configRegister(EN_AA, 0x3F);
Mirf.configRegister(EN_RXADDR, 0x3F);
//Mirf.configRegister(EN_RXADDR, 0x03);
Mirf.configRegister(RX_PW_P0, 0x20);
Mirf.configRegister(RX_PW_P1, 0x20);
Mirf.configRegister(RX_PW_P2, 0x20);
Mirf.configRegister(RX_PW_P3, 0x20);
Mirf.configRegister(RX_PW_P4, 0x20);
Mirf.configRegister(RX_PW_P5, 0x20);
Mirf.configRegister(SETUP_AW, 0x03);
Mirf.configRegister(SETUP_RETR, 0XFF);
//Write channel and payload config then power up reciver.
Mirf.config();
Mirf.setTADDR((byte *)nodo[destid]);
Per avere il massimo della copertura e della affidabilità voi come impostereste i registri? ![]()