Arduino Mega 2560 & Arduino Ethernet Shield

Ciao a tutti,

sto avendo non poche difficoltà nel far funzionare queste due schede insieme anche se dovrebbero essere compatibili. Finchè utilizzo la parte ethernet funziona tutto perfettamente. Non appena carico uno Sketch che usa la scheda SD come questo:

/*
  SD card basic file example
 
 This example shows how to create and destroy an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
#include <SD.h>

File root;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(53, OUTPUT);

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  root = SD.open("/");
  
  printDirectory(root, 0);
  
  Serial.println("done!");
}

void loop()
{
  // nothing happens after setup finishes.
}

void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
   }
}

in primo luogo stampa "initialization failed!" ma oltretutto, se provo a caricare uno sketch che fino a due minuti prima funzionava e che usava la scheda ethernet, da questo momento non funziona più, e continua a non funzionare per qualche ora, nonostante vari riavvii (tolgo alimentazione e tutti i cavi per qualche secondo e rimetto, oppure provo a prendere il tasto reset sia della Mega che della Ethernet shield). Questo mi sembra a dir poco assurdo. Poi magari dopo due o tre ore di continui riavvii, ad un certo punto riprende a funzionare. Siamo sicuri che il comando

  if (!SD.begin(10)) {

sia corretto? Non dovrei passare anche qui la porta 53 dato che io uso la scheda Mega 2560? La cosa assurda è che qualche giorno fa (solo una volta) ha funzionato addirittura anche la lettura della scheda SD, ma spostandomi dalla cucina alla camera (quindi solo spegnendo e riaccendendo, senza cambiare il codice) ha smesso di funzionare.

Prova con
if (!SD.begin(4))
Leggo nei commenti dello sketch: " // On the Ethernet Shield, CS is pin 4."

Questo dovresti lasciarlo:
pinMode(53, OUTPUT)
perché il pin SS mappato in hardware deve essere sempre impostato come output.

se le vuoi usare insieme hai dimenticato un po di robetta

#include <SPI.h>
#include <Ethernet.h>

nel setup non inizializzi i pin

pinMode(SS_PIN, OUTPUT);
  digitalWrite(SS_PIN, HIGH);
  pinMode(10, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(10, 1); // Turn off the W5100 chip! (wait for configuration)
  pinMode(4, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(4, 1); 	// Turn off the SD card! (wait for configuration)

questo sucuro, ma non basta, ora non sono al pc appena posso ....
vediti altri esempi, questo mi sembra un po' povero

ciao

Vi ringrazio tutti... Ho capito dove stava il problema... e dato che (secondo me) da nessuna parte c'è una spiegazione chiara, ho deciso di pubblicare un articolo su internet in modo che altri possano risolvere... Vi incollo la parte del setup

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
// indirizzo MAC della scheda Ethernet Shield (di solito si lascia questo)
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
 
// indirizzo ip da assegnare alla scheda Ethernet Shield (modificarlo a piacimento)
IPAddress ip(192, 168, 0, 2);
 
// 8080 indica la porta sulla quale il servizio risponderà... in questo caso http://192.168.0.2:8080/ 
// impostando 80 al posto di 8080 l'indirizzo diventa http://192.168.0.2/
EthernetServer server(8080);
 
void setup() {
  //inizializzazione della comunicazione seriale (per poter loggare messaggi nel Monitor Seriale del menu strumenti)
  Serial.begin(9600);
 
  //OBBLIGATORIO per l'uso della SD. Dato che arduino comunica alla scheda SD ed alla scheda ethernet con gli stessi pin, 
  //solo una delle due può essere utilizzata alla volta. Tramite il pin 53 impostato ad HIGH si disattiva la scheda ethernet 
  //in modo da poter usare la scheda SD e viceversa. impostando il pin 53 a OUTPUT si fa in modo che la libreria SD abbia la capacità
  //di gestire in automatico l'attivazione e la disattivazione di questa (in modo da non doverlo fare noi ogni volta) ma questa
  //gestione automatica del pin 53 da parte della libreria SD inizia solo dopo aver inizializzato la libreria con il comando SD.begin(4)
  pinMode(53, OUTPUT);
 
  //all'avvio di arduino, se notate, prima ancora che il codice parta la scheda ethernet si attiva e inizia a "comunicare" con 
  //il router o dispositivo a cui è collegato. Ma la libreria SD per partire correttamente ha bisogno di avere accesso alla scheda SD. Per
  //far questo occorre che noi a mano disattiviamo la scheda ethernet (i led che indicano che il cavo ethernet è connesso saranno lo stesso accesi)
  //portando ad HIGH il pin 53. Omettendo questo comando è obbligatorio collegare il cavo LAN solo dopo che si è sicuri che la scheda SD è stata
  //inizializzata
  digitalWrite(53, HIGH);
 
  // il comando begin inizializza la scheda SD e ritorna true in caso di successo, altrimenti false. Da questo momento in poi sarà la libreria
  // della scheda SD a preoccuparsi di portare il pin 53 ad HIGH (disattivando la scheda ethernet) quando avete bisogno di accedere alla scheda SD
  // e di portarlo a LOW quando avete smesso di leggere/scrivere file in modo da riattiavere l'ethernet
  if (SD.begin(4))
  {
    Serial.println("SD inizializzata");     
  }
  else
  {
    Serial.println("SD non inizializzata"); 
  }
 
  //inizializza la scheda ethernet impostando l'indirizzo ip desiderato. Non passando fra i parametri l'indirizzo ip (usando quindi Ethernet.begin(mac);)
  //la scheda ethernet impiega più tempo ad avviarsi perchè deve interrogare il server DHCP per chiedere un indirizzo IP valido che potrebbe cambiare ogni
  //volta rendendo inoltre l'utilizzo più scomodo
  Ethernet.begin(mac, ip);
  Serial.print("In ascolto all'indirizzo: ");
  //Stampo l'indirizzo ip assegnato alla scheda ethernet
  Serial.println(Ethernet.localIP());
 
  //metto in ascolto il servizio sulla porta 8080 (impostata nell'inizializzazione della variabile)
  server.begin();  
}

da nessuna parte c'è una spiegazione chiara, ho deciso di pubblicare un articolo su internet in modo che altri possano risolvere... Vi incollo la parte del setup

Non vorrei deluderti ma, ce ne sono alla nausea di spiegazioni chiare su come inizializzare una ethernet shield e SD, se dici che non trovi un web server serio senza problemi allora ti posso venire incontro nella comprensione :slight_smile:

// indirizzo ip da assegnare alla scheda Ethernet Shield (modificarlo a piacimento)
IPAddress ip(192, 168, 0, 2);

Non è proprio corretto dire "a piacimento", allora ci posso scrivere 44.78.52.151? No, vanno in base al mask e al gateway della propria rete.

//OBBLIGATORIO per l'uso della SD. Dato che arduino comunica alla scheda SD ed alla scheda ethernet con gli stessi pin,
//solo una delle due può essere utilizzata alla volta. Tramite il pin 53 impostato ad HIGH si disattiva la scheda ethernet
//in modo da poter usare la scheda SD e viceversa. impostando il pin 53 a OUTPUT si fa in modo che la libreria SD abbia la capacità
//di gestire in automatico l'attivazione e la disattivazione di questa (in modo da non doverlo fare noi ogni volta) ma questa
//gestione automatica del pin 53 da parte della libreria SD inizia solo dopo aver inizializzato la libreria con il comando SD.begin(4)
pinMode(53, OUTPUT);

il pin 53 non lo devi nemmeno nominare per i setup della shield, ti devi preoccupare del 4 e del 10 come ti ho scritto prima

// 8080 indica la porta sulla quale il servizio risponderà... in questo caso http://192.168.0.2:8080/
// impostando 80 al posto di 8080 l'indirizzo diventa http://192.168.0.2/
EthernetServer server(8080);

questo lo puoi anche eliminare è di default l'utilizzo della porta 80 in locale

Ti ripeto, la configurazione dei pin corretta è

  pinMode(SS_PIN, OUTPUT);
  digitalWrite(SS_PIN, HIGH);
  pinMode(10, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(10, 1); // Turn off the W5100 chip! (wait for configuration)
  pinMode(4, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(4, 1); 	// Turn off the SD card! (wait for configuration)

Prima che tu chieda cos'è SS_PIN:

Note about Slave Select (SS) pin on AVR based boards

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.

//inizializzazione della comunicazione seriale (per poter loggare messaggi nel Monitor Seriale del menu strumenti)
Serial.begin(9600);

Diciamo che l'istruzione non è stata pensata per scrivere testi nel Monitor Seriale del menu strumenti, invia byte sulla seriale, poi ne fai ciò che vuoi, se vuoi leggere i pensierini, va bene lo stesso :slight_smile:

Ho capito dove stava il problema...

Siccome si legge tra le righe un leggero livello di nevrosi, secondo me non hai ancora capito dove sta il problema..... non hai come molti altri imparato a usare i motori di ricerca!

ciao

@pablos:
noi vecchi utenti del forum ti conosciamo e sappiamo che dietro il tuo modo diretto c'è comunque sempre una certa franchezza ed il rispetto. Ma chi non ti conosce può considerare i tuoi richiami in modo negativo se non peggio.
So che non volevi offendere nessuno però sarebbe il caso di farsi conoscere da una persona prima di emettere certe sentenze, non trovi?

@db89:
pablos non vuole essere maleducato, lo conosco e l'ho apprezzato. Ha solo un modo un po' troppo rude alle volte di esprimersi.

Non ti preoccupare il 99% dei new fanno la domanda e spariscono senza nemmeno dire "grazie mi è servito" o "grazie non mi sei servito".
Semplicemente intendo che il treadh poteva continuare diversamente senza dare soluzioni inutili incomprensive come se nessuno avesse mai spiegato come si imposta una ethernet+sd... io scusa come newbie non mi sono mai permesso ne di mancare una risposta a chi mi ha aiutato ne di dire "adesso ti dico io come si fa".

sicuro di voler fare il moderatore :slight_smile: :slight_smile: :slight_smile:

ciao

Non vi conoscete, non sapete nessuno dei due il modo di proporsi dell'altro per cui secondo me c'è stato un grosso fraintendimento di entrambi. Spero che anche db89 sia sulla stessa lunghezza d'onda.
Ma d'altronde siamo noi inquilini che dobbiamo fare gli onori di casa ai nuovi arrivati :wink: