Arduino Mega + Ethernet Shield

In questi giorni ho provato l'arduino uno con l'ethernet shield e non ho avuto nessun problema. Ethernet e SD card funzionano benissimo. Purtroppo la memoria non è sufficiente e ho perso un arduino mega, ma ho qualche problema. In sostanza dovrebbe leggere le pagine dall'sd card, ma dopo un paio di pagina visualizzate, mi da tutto bianco. Allora ho provato l'esempio CardInfo e mi da "initialization failed". Sul forum ho trovato che devo aggiungere la riga:

digitalWrite(10, HIGH);

dopo:

pinMode(10, OUTPUT);

Ed effettivamente in questo modo funziona. ma appena inserisco le righe di codice ethernet, in particolare queste:

Ethernet.begin(mac, ip);
server.begin();

Tutto smette di funzionare e ricevo nuovamente il messaggio "initialization failed". C'è qualche incompatibilità tra arduino mega e shield ethernet? e come la risolvo?

Grazie per l'aiuto!

Mi auguro che tu abbia tenuto conto delle differenze tra la UNO e la Mega, come descritto nel reference della scheda :

"Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work. Note that because the W5100 and SD card share the SPI bus, only one can be active at a time. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries. If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it. For the W5100, set digital pin 10 as a high output."

Guglielmo

Come faccio a far utilizzare i pin 50, 51 e 52? Ho provato collegando il 50 al 12, il 51 all'11, il 52 al 13 e il 53 al 10 (come scritto qui) tramite jumpers, ma nulla :(

Leggi bene ... NON li devi collegare, li prende tramite il connettore ICSP.

La cosa più importante è quello che segue ... "On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work." !

E ricordati che comunque ... "On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card."

Guglielmo

k, sono ancora più confuso :D. Dovrei mettere sia il 10 che il 53 in ouput in questo modo?

pinMode(10, OUTPUT);
pinMode(53, OUTPUT);

Non solo, anche il pin 4 ... che è il pin SS per la SD Card ! XD

Guglielmo

Allora... ho messo tutti e tre in output e non andava. Mettendoli tutti e tre anche in high la lettura della sd card va... ma appena inserisco le righe:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 55 };

Ethernet.begin(mac, ip);
server.begin();

Mi dice "initialization failed!".

Però caro ragazzo se ci scrivi una riga alla volta, forse in un anno risolvi .... metti lo sketch, magari qualcuno lo carica e ti sa rispondere con certezza.

ciao

Hai ragione, scusami :). In sostanza ho preso l’esempio CardInfo e ho cercato di aggiungere l’esempio WebServer:

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

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 4;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 55 };
EthernetServer server(80);

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.print("\nInitializing 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);
  pinMode(10, OUTPUT);
  pinMode(53, OUTPUT);
  digitalWrite(4, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(53, HIGH)

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {

}

Mettendo il pin 10 in HIGH la lettura della sd card funziona, ma appena implemento le righe dell’esempio webserver (che nel codice qui sopra sono già inserite), non mi legge la card.

il pin 4 deve essere messo in HIGH nel setup non LOW .... 4 low = apri il canale con la sd, tutto deve essere chiuso, poi saranno le lib ad aprire le comunicazioni con la periferica sd o ethernet quando serve.

Poi le linee

Ethernet.begin(mac, ip);
  server.begin();

lavorano su dei pin che (dal tuo sketch) ancora non hai impostato, dato che lo fai dopo. Prima si impostano i pin poi si lanciano le funzioni che riguardano l'utilizzo di quei pin. Se osservi gli esempi noterai che i passaggi sono sempre questi.

questi puoi anche toglierli

pinMode(53, OUTPUT);
 digitalWrite(53, HIGH)

ciao

Come sempre non avevo capito nulla... i migliaia di topic di 4 anni fa e le guide mi avevano confuso :P. Adesso funziona tutto alla perfezione, grazie mille per l'aiuto :)

pablos: questi puoi anche toglierli

pinMode(53, OUTPUT);
 digitalWrite(53, HIGH)

Non secondo le specifiche fornite nel reference che dice chiaramente :

"On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work."

.... quindi, onde evitare qualsiasi problema e visto che sono ininfluenti .. vanno lasciati.

Guglielmo

Su alcuni topic inglesi ho letto che la documentazione è errata e che non serve metterlo in output... ma se metterlo in output non crea problemi, per sicurezza lo faccio

kingmauri:
Su alcuni topic inglesi ho letto che la documentazione è errata e che non serve metterlo in output… ma se metterlo in output non crea problemi, per sicurezza lo faccio

Mah … se guardi il pezzo di schema che allego (parte in alto a sinistra dello schema generale dell’Arduino Mega) vedi che :

PB0 : SS
PB1 : SCK
PB2 : MOSI
PB3 : MISO

e, nel connettore tutto a sinistra, risulta chiaramente che PB0 (SS) è il pin 53 … quindi … io nel dubbio lo metterei OUTPUT e anche ad HIGH … poi, se non serve … meglio :grin:

Guglielmo

io non l'ho mai messo e ha funzionato sempre bene, quindi fidati ometti quelle 2 linee, non avrai problemi.

pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. [u]On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card[/u], but it must be kept as an output or the SPI interface won't work.

tradotto Sulle Mega, l' SS pin hardware 53, non viene utilizzato per selezionare il W5100 o la scheda SD. Non va usato però per altri scopi, nel tuo caso va lasciato scollegato.

gpb01 , io sono per la precisione e la chiarezza però ci sono dei range :) , comunque tu se vuoi usa il 53 e vedi se funziona ahahahahhahahahahaha

ciao

Non puoi mica farti le traduzioni come ti pare eh ... :D

... al paese mio "but it must be kept as an output or the SPI interface won't work." significa che DEVE essere mantenuto come output ... altrimenti avrebbero usato un altro verbo (... tipo ... can be used o ... should be used)

Che poi a te funzioni, buon per te ... ... ma ad un utente SI DEVE consigliare quanto è conforme ai reference e, al limite indicare, come proprie [u]opinioni[/u] personali altre informazioni !

Guglielmo