Conflitto Webserver e SD ?

Salve a tutti, o sono scemo io o arduino!
Non riesco a far funzionare la Sd card su ethernel sheild con arduino duemilanove!
A volte funziona a volte no, ho provato con due sd card sandisk 256MB e 1GB

Con questo sketch funziona:

/*
  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(4, OUTPUT);

  if (!SD.begin(4)) {
    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);
     }
     entry.close();
   }
}

Funziona solo se modifico queste voci
da pinMode 10 a 4

  pinMode(4, OUTPUT);

  if (!SD.begin(4)) {

e questi sono i files dentro la SD.

Initializing SD card...initialization done.
C30~		0
ANDROI~1/
C18.TXT		854
C20.TXT		854
C21.TXT		854
C19.TXT		854
C17.TXT		854
C23.TXT		854
C27.TXT		854
C28.TXT		854
C24.TXT		854
C22.TXT		854
C25.TXT		854
F25.TXT		854
F26.TXT		854
C26.TXT		854
C29.TXT		854
C29~1.TXT		0
C30.TXT		855
F17.TXT		854
F18.TXT		854
F19.TXT		854
F20.TXT		854
F21.TXT		854
F22.TXT		854
F23.TXT		854
F27.TXT		854
F28.TXT		854
F24.TXT		854
F29.TXT		854
OFF.TXT		854
F30.TXT		854
done!

Se volessi leggere l’interno deii file però c’è un problema.
In un mio sketch con un webserver semplicissimo:

void loop(){
  EthernetClient client = server.available();

  if (client) {
    boolean currentLineIsBlank = true;

    while (client.connected()) {
      if (client.available()) {  
        char c = client.read();
        readString.concat(c);   
        if (c == '\n' && currentLineIsBlank) {
          Serial.print(readString);
        }
     }
  }
}

e in void setup in più questa riga:

  Ethernet.begin(mac, ip, gateway, subnet);

mi da errore nella lettura, però la sd la inizializza… sembra ci sia un conflitto con il webserver…
Potete aiutarmi per favore? Grazie

EDIT: Ho scoperto se commentando queta:
// Ethernet.begin(mac, ip, gateway, subnet);

funziona se la decommento non va!!
helpp :frowning:

L'inizializzazione è errata. Quella corretta è:

 Ethernet.begin(mac, ip, dns, gateway);

con subnet impastata di default a 255.255.255.0 oppure

 Ethernet.begin(mac, ip, dns, gateway, subnet);

con tutti i parametri. Se non hai il DNS allora metti:

 Ethernet.begin(mac, ip, gateway, gateway, subnet);

--> http://arduino.cc/en/Reference/EthernetBegin

Mmm…ma in ogni caso ho letto che deve essere utilizzata prima sd e stoppare il webserver o viceversa…
confermate?

roxdragon: ma in ogni caso ho letto che deve essere utilizzata prima sd e stoppare il webserver o viceversa... confermate?

si ma non lo devi fare tu nel tuo shetch, i pin per controllare i dialoghi con la SD e Ethernet alternativamente se li gestiscono le librerie.

Per lo sketch che hai pubblicato è sufficiente Ethernet.begin(mac, ip); senza complicarsi la vita con altre impostazioni

Molto probabilmente il problema lo avrai ancora, lascio a te cercare la soluzione, non per te, ma perchè sono 2 anni che dico che gli sketch di esempio dell'ide riguardanti la SD ed Ethernet andrebbero perfezionati, nonostante abbia scritto centinaia di volte quale è il difetto, alcuni utenti di un certo peso su questo forum che hanno partecipato alle discussioni lo ignorano o non ne danno il giusto peso. ]:D ]:D

ciao