Buongiorno a tutti.
Gentili signori del forum,
come si comprende dal titolo ho qualche problema nel far funzionare assieme i moduli NRF24L01+ e microSD.
Dopo aver trascorso un week end leggendo, provando, smontando, rileggendo e riprovando, mi permetto di disturbarvi alla ricerca di una possibile soluzione alla questione (grazie in anticipo).
Veniamo al dunque:
Su una millefori con un Atmega328 a 8MHz (quindi senza quarzo) ho attaccato un modulo per la scrittura su microSD ed un modulo NRF24L01+ (vedere immagini allegate) ... anche un LCD su I2C, ma non è il discriminante. Nella configurazione hardware descritta, caricando uno sketch per far funzionare solamente la microSD, la scrittura funziona a dovere. Stessa situazione positiva se viene caricato uno sketch per far funzionare il solo modulo NRF24L01+ (la configurazione hardware non è stata modificata).
Il problema nasce se carico uno sketch con il quale si voglia utilizzare entrambi i moduli. Vi allego il codice:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <SD.h>
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x27,20,4);
File myFile;
// nRF24L01+
// RF24 radio(CE, CS)
RF24 radio(8, 7);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 0;
// Address of the other node
const uint16_t other_node = 1;
// Structure of our payload
struct payload_t
{
unsigned long ms;
unsigned long counter;
unsigned long Postazione;
double Valore;
};
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("RF24Network/examples/helloworld_rx/");
SPI.begin();
radio.begin();
network.begin(/*channel*/ 90, /*node address*/ this_node);
// LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// SD, inizializzazione
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("Initialization failed!");
return;
}
Serial.println("Initialization done.");
myFile = SD.open("test.txt", FILE_WRITE);
// SD, fine inizializzazione
}
void loop()
{
// LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Millis: ");
lcd. print(millis(), DEC);
// SD, inizio scrittura
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
myFile.print(millis());
myFile.println("\t1234567890");
lcd.setCursor(0, 2);
lcd.print("SD OK");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening file");
lcd.setCursor(0, 2);
lcd.print("SD Fail");
}
// SD, fine scrittura
Serial.println("Punto A");
// Pump the network regularly
network.update();
Serial.println("Punto B");
// Is there anything ready for us?
while ( network.available() )
{
// If so, grab it and print it out
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
Serial.print("Received packet #");
Serial.print(payload.counter);
Serial.print(" at ");
Serial.print(payload.ms);
Serial.print(" Postazione ");
Serial.print(payload.Postazione);
Serial.print(" Valore ");
Serial.println(payload.Valore,4);
}
delay(2000);
}
Il processo si blocca alla riga "network.update();" ed a monitor compaiono le scritte che indicano la corretta inizializzazione dell'SDcard "Initialization done." ed in seguito la scritta "Punto A". Se nel codice vengono commentate tutte le righe relative alla scrittura su SD, il processo cicla a dovere, comunicando correttamente con un altro trasmettitore NRF24L01+ montato su un'altra scheda Arduino.
Comprendo che entrambi i moduli siano sul bus SPI e che pertanto occorre qualche accorgimento in più che non riesco a trovare.
Come si vede dal codice, il CE e CS del modulo NRF sono 8 e 7, mentre per la microSD abbiamo dedicato il pin 4 e il 10. Chiaramente i pin MOSI, MISO e SCK sono in comune.
Le librerie che utilizzo sono:
<SD.h> per la microSD
<RF24Network.h> e <RF24.h> (maniacbug · GitHub) per il modulo NRF24L01+
Sistema:
IDE 1.0.3, Windows XP
Alimentazione:
I moduli prendono corrente direttamente dall'alimentatore che eroga fino a 1A
Codici:
Ho copiato, incollato e modificato gli esempi che sono all'interno delle librerie utilizzate.
Ecco quindi esposta la questione, grazie per l'aiuto.
Buon inizio di settimana.
Tredipunta.