NRF24 + modulo SD

Ciao a tutti! :slight_smile:

E' da qualche giorno che sto diventando matto per far funzionare assieme il modulo NRF24 e il modulo SD e poi guardando nelle caratteristiche del modulo SD leggo: "Si prega di fare attenzione durante l'uso contemporaneo di più apparecchi SPI, ne può essere attivo solo uno alla volta." :o
Ora vi chiedo non si può in alcun modo farli funzionare assieme con un arduino mega? neanche collegando il modulo SD con arduino nano e a sua volta collegarlo all arduino mega?

Grazie

Sarebbe bene che ti studiassi come funziona il BUS SPI ...
... comincia da QUI e prosegui QUI e ... capirai sia cosa significa la frase "attivo solo uno alla volta", sia come far funzionare i vari devices. :slight_smile:

Guglielmo

grazie per la risposta, da quello che ho capito l unico pin da settare è il SS perchè gli altri rimangono gli stessi ... ho letto in qualche post vecchio che basta settare il pin SS come HIGH o LOW per abilitare o disabilitare il modulo, è corretto?

MrToldo:
grazie per la risposta, da quello che ho capito l unico pin da settare è il SS perchè gli altri rimangono gli stessi ...

Esatto, tutti i devices sono sempre collegati al BUS, ma solo quello che selezioni con il pin SS ne ha l'uso.

La libreria SD gestisce lei il suo pin di SS (normalmente il 10, ma puoi cambiarlo al momento dell'inizializzazione), per altri devices dipende da chi ha scritto la libreria se lo ha gestito o meno (... di solito si). Se NON usi una libreria, allora dovrai farlo tu a mano.

Guglielmo

utilizzo una libreria SD della Adafruit/Sparkfun, se non erro nel file della libreria non vedo da nessuna parte l'assegnazione del pin CS (infatti lo si assegna poi nello sketch).
Premetto una cosa però, utilizzando questa libreria e con i suoi esempi funziona tutto regolarmente (assegnando anche pin diversi per il CS) il problema sorge quando utilizzo in un Arduino mega sia il modulo SD che quello NRF24 (con pin CS sul 53 ed integrando il codice con quello del modulo NRF24), anche se cambio il CS o mantengo il 10 il modulo non viene inizializzato, mentre funziona il modulo NRF24

Domande:

  1. perché non usi la libreria standard SD ?

  2. link alla libreria SD che usi

  3. link alla libreria nFR24 che usi

  4. pin che stai utilizzando per i due moduli sulla MEGA

Guglielmo

gpb01:
Domande:

  1. perché non usi la libreria standard SD ?

  2. link alla libreria SD che usi

  3. link alla libreria nFR24 che usi

  4. pin che stai utilizzando per i due moduli sulla MEGA

Guglielmo

  1. se non ricordo male non mi funzionava lo sketch o non la trovavo fra le predefinite
  2. GitHub - arduino-libraries/SD: SD Library for Arduino
  3. GitHub - maniacbug/RF24: Arduino driver for nRF24L01
  4. il pin CS 10 per il modulo SD e il pin CS 53 per il modulo NRF24, MISO MOSI SCK uso quelli predefiniti per il mega

la NRF24-master è quella con cui mi sono trovato bene fin da subito mentre quella dell SD è la prima che ho trovato

La libreria SD non la devi scaricare, fa parte di quelle di base, basta che fai:

// include the SD library:
#include <SPI.h>
#include <SD.h>

e la puoi usare.

Se usi il 53 con il nRF24 prova a cambiare pin per la SD ed a NON usare il pin 10, ma dichiaralo comunque come pin di OUTPUT "pinMode(10, OUTPUT);" anche se poi NON lo usi.

Vedi cosa succede ...

Guglielmo

Ok provo appena ho un po’ di tempo.... quindi dichiaro sia il pin 10 che il pin 4 (che userò come CS)come output, ma il discorso dell pin HIGH e LOW serve poi specificarlo nel void loop?

MrToldo:
... ma il discorso dell pin HIGH e LOW serve poi specificarlo nel void loop?

Normalmente dovrebbero gestire il tutto le librerie, quindi no ::slight_smile:

Guglielmo

gpb01:
Normalmente dovrebbero gestire il tutto le librerie, quindi no ::slight_smile:

Guglielmo

ho provato a dichiarare sia il pin 10 che il pin 4 come OUTPUT e a collegare nel 4 il pin CS del modulo SD, con lo sketch getting started riesco ad utilizzare normalmente il modulo ma quando integro il codice con quello del NRF24 il modulo SD non funziona
Mi pare strano sia il codice errato perchè sono poche righe di codice per creare e scrivere su un file .txt, per me c'è qualcosa di errato nei collegamenti

MrToldo:
Mi pare strano sia il codice errato perchè sono poche righe di codice per creare e scrivere su un file .txt, per me c'è qualcosa di errato nei collegamenti

Beh ... proviamo ad esaminare lo schema dei collegamenti (anche un disegno fatto a mano purché leggibile) ed il codice che usi per fare il test (... un codice minimo ridotto all'osso e, mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

gpb01:
Beh ... proviamo ad esaminare lo schema dei collegamenti ...

Guglielmo

Qui l' immagine con lo schema del circuito (spero si capisca)

Qui invece il codice getting started funzionante

#include <SD.h>
#include <SPI.h>
File myFile;
int pinCS = 4;
void setup() {
 Serial.begin(9600);
 pinMode(pinCS, OUTPUT);
 if (SD.begin()){
    Serial.println("SD card is ready to use.");
 } else{
    Serial.println("SD card initialization failed");
 return;
 }
 myFile = SD.open("test.txt", FILE_WRITE);
 if (myFile) {
    Serial.println("Writing to file...");
    myFile.println("prova 26/10/2017");
    myFile.close();
    Serial.println("Done.");
 }
 else {
    Serial.println("error opening test.txt");
 }

} 
void loop() {
  // empty
}

E qui il codice che ho scritto per la stazione meteo con modulo NRF24 e modulo SD (più LED, DHT11, BMP085, RTC)

#include <DHT.h> 
#include <printf.h> 
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h> 
#include <Wire.h>
#include "Adafruit_BMP085.h"
#include "RTClib.h"
#include <SD.h>
#define DHTPIN 7
#define DHTTYPE DHT11

Adafruit_BMP085 bmp;
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(53,48);
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
File myFile;


//variabili massimi e minimi
float tempmax = 0;
float tempmin = 100;
float humimax = 0;
float humimin = 120;
float presmax = 0;
float presmin = 120000;

int anno = 0;
int mese = 0;
int giorno = 0;
int ora = 0;
int minuti = 0;

void setup()
{
  Serial.begin(115200);
  SPI.begin();
  SD.begin();
  dht.begin();
  bmp.begin();
  radio.begin();
  rtc.begin();
  myFile = SD.open("Stazione_Meteo.txt", FILE_WRITE); //Crea il file Stazione meteo sulla SD
  radio.openWritingPipe(pipe);
  pinMode(4, OUTPUT); //PIN CS modulo microSD
  pinMode(10, OUTPUT);
  pinMode(23, OUTPUT); //LED rosso per l'OFFLINE
  pinMode(25, OUTPUT); //LED verde per l'ONLINE
  pinMode(27, OUTPUT); //LED arancio per bip trasferimento dati
  delay(1000);

  
  //CODICE RTC
  if (rtc.lostPower()) {
    Serial.println("Reinserire data e ora");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop()  
{
  delay(100);
  
  //CODICE SETTAGGIO VARIABILI
  float tempdht = dht.readTemperature(); //variabile temperatura sensore dht
  float tempbmp = bmp.readTemperature(); //variabile temperatura sensore bmp
  float temp = (tempdht + tempbmp) / 2.0; //media fra le due temperature calcolate dai sensori
  int humi = dht.readHumidity(); //variabile umidità
  float pres = bmp.readPressure(); //variabile pressione
  
  //CODICE DATA E ORA
  DateTime now = rtc.now();
  anno = (now.year());
  mese = (now.month());
  giorno = (now.day());
  ora = (now.hour());
  minuti = (now.minute());

  delay(100);
  
  //CODICE PER CONTROLLO MASSIMI E MINIMI
  if (temp >= tempmax){
    tempmax = temp;
  }
  else if (temp <= tempmin){
    tempmin = temp;
  }
  if (humi >= humimax){
    humimax = humi;
  }
  else if (humi <= humimin){
    humimin = humi;
  }
  if (pres >= presmax){
    presmax = pres;
  }
  else if (pres <= presmin){
    presmin = pres;
  }
  delay(100);
  
  //CODICE INVIO DATI AD ALTRO ARDUINO IN ASCOLTO
  float data[14];
  bool ok;
  data[0]= temp;
  data[1]= humi;
  data[2]= pres;
  data[3] = anno;
  data[4] = mese;
  data[5] = giorno;
  data[6] = ora;
  data[7] = minuti;
  data[8] = tempmax;
  data[9] = tempmin;
  data[10] = humimax;
  data[11] = humimin;
  data[12] = presmax;
  data[13] = presmin;
  
  ok = radio.write(&data, sizeof(data));
  digitalWrite(27, HIGH); //accende LED arancio per invio dato
  delay(100);
  digitalWrite(27, LOW); //spegne LED arancio per invio dato
  delay(100);  
    if (ok){
      Serial.println("---ONLINE---");
      digitalWrite(25, HIGH); //accende  LED verde
      digitalWrite(23, LOW);// spegne led rosso
    } else {
      Serial.println("---OFFLINE---");
      digitalWrite(23, HIGH);//accende  LED rosso
      digitalWrite(25, LOW); //spegne led verde
      
    } 
  delay(100);
  
  //CODICE PRINT SU SERIAL MONITOR PER VERIFICA CORRETTEZZA
  Serial.println ("Sto inviando: ");
  Serial.print ("T: ");
  Serial.print (temp);
  Serial.print (" / TMAX: ");
  Serial.print (tempmax);
  Serial.print (" / TMIN: ");
  Serial.print (tempmin);
  Serial.println (" C°");
  Serial.print ("H: ");
  Serial.print (humi);
  Serial.print (" / HMAX: ");
  Serial.print (humimax);
  Serial.print (" / HMIN: ");
  Serial.print (humimin);
  Serial.println (" %");
  Serial.print ("P: ");
  Serial.print (pres);
  Serial.print (" / PMAX: ");
  Serial.print (presmax);
  Serial.print (" / PMIN: ");
  Serial.print (presmin);
  Serial.println (" Pa"); 
  
  //CODICE DATA E ORA RTC
  Serial.print(anno);
  Serial.print('/');
  Serial.print(mese);
  Serial.print('/');
  Serial.print(giorno);
  Serial.print(" - ");
  Serial.print(ora);
  Serial.print(':');
  Serial.println(minuti);

 
  //CODICE PER LOG su SD
  if(myFile){
    myFile.println(String(temp));
    myFile.close();
  Serial.println("SD Datalogger Eseguita");
  }else{
    Serial.println("errore SD");
  }


  
  //Ultima parte di codice
  Serial.println("");
  Serial.println("-------------");
  delay(2000);
  }

Lo sketch ultimo è quello della stazione meteo che fà da "trasmettitore" ed invia poi i dati ad un altro arduino mega "ricevitore" tramite connessione WiFi, il modulo SD lo uso come datalogger collegato al primo arduino.
Praticamente il led ONLINE e OFFLINE viene attivato se il secondo Arduino Mega è collegato e riescono a comunicare fra loro

Qualcuno riesce ad aiutarmi?

Facendo un po' di ricerche ho scoperto che non sei il solo ad aver avuto problemi con schede SD e nRF24 ... se fai una ricerca con Google trovi alcuni thread, QUESTO, ad esempio, è il primo che mi è capitato, ma ce ne sono altri, come QUESTO, ecc. ecc.

Cerca per "arduino nrf24 and SD" ...

Guglielmo