Go Down

Topic: [RESOLU] Arduino Mega et Sd (Read 815 times) previous topic - next topic

OlivierDarn

Sep 01, 2011, 01:25 am Last Edit: Sep 08, 2011, 11:42 pm by OlivierDarn Reason: 1
Bonjour,

J'utilise un code qui semble assez utilisé dans la communauté mais chez moi il me répond un erreur. Savez-vous d'où cela peut venir?
Code: [Select]

#include <Client.h>
#include <Ethernet.h>
#include <Server.h>
#include <SPI.h>
// librairie pour stockage en mémoire flash programme
#include <Flash.h>
// attention : l'utilisation de F("chaine") necessite modification
// du fichier print.h
#include <SdFat.h>
#include <SdFatUtil.h>


Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

char rootFileName[] = "index.htm";

// store error strings in flash to save RAM
#define error(s) error_P(PSTR(s))


void error_P(const char* str) {
 PgmPrint("error: ");
 SerialPrintln_P(str);
 if (card.errorCode()) {
   PgmPrint("SD error: ");
   Serial.print(card.errorCode(), HEX);
   Serial.print(',');
   Serial.println(card.errorData(), HEX);
 }
 while(1);
}

//--- déclaration du tableau d'adresse MAC ---
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
//---- tableau de l'adresse IP de la carte Arduino
byte ip[] = { 192, 168, 0, 3 };    
//----- tableau de l'adresse de la passerelle ---
byte gateway[] = { 192, 168, 0, 254 };
//----- tableau du masque de sous réseau
byte subnet[] = { 255, 255, 255, 0 };

//--- création de l'objet serveur ----
// crée un objet serveur utilisant le port 80 = port HTTP
Server server = Server(80);

// variables globales utiles
String chaineRecue=""; // déclare un string vide global
int comptChar=0; // variable de comptage des caractères reçus
boolean toggle = false;



void setup()
{
  pinMode(13, OUTPUT);  
  digitalWrite(13, LOW);
 

 
 Serial.begin(115200);
 Serial.println("Communication serie ouverte.");
 
 PgmPrint("Free RAM: ");
 Serial.println(FreeRam());

 // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
 // breadboards.  use SPI_FULL_SPEED for better performance.
 pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
 digitalWrite(10, HIGH);                    // but turn off the W5100 chip!

 if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
 
 // initialize a FAT volume
 if (!volume.init(&card)) error("vol.init failed!");

 PgmPrint("Volume is FAT");
 Serial.println(volume.fatType(),DEC);
 Serial.println();
 
 if (!root.openRoot(&volume)) error("openRoot failed");

 // list file in root with date and size
 PgmPrintln("Files found in root:");
 root.ls(LS_DATE | LS_SIZE);
 Serial.println();
   
 // Recursive list of all directories
 PgmPrintln("Files found in all dirs:");
 root.ls(LS_R);
 
 Serial.println();
 PgmPrintln("Done");


 // initialise la connection ethernet
 Ethernet.begin(mac, ip, gateway, subnet);

 //---- initialise le serveur HTTP----
 server.begin();
}

// How big our line buffer should be. 100 is plenty!
#define BUFSIZ 100


void loop()
{
 
   char clientline[BUFSIZ];
 char *filename;
 int index = 0;
 int image = 0;

 Client client = server.available();
   if (client) {
   // an http request ends with a blank line
   boolean current_line_is_blank = true;
   
   // reset the input buffer
   index = 0;
   
     while (client.connected()) {
       if (client.available()) {
         char c = client.read();
         
       // If it isn't a new line, add the character to the buffer
       if (c != '\n' && c != '\r') {
         clientline[index] = c;
         index++;
         // are we too big for the buffer? start tossing out data
         if (index >= BUFSIZ)
           index = BUFSIZ -1;
           
         // continue to read more data!
         continue;
       }
         
       // got a \n or \r new line, which means the string is done
       clientline[index] = 0;
       filename = 0;
       
       // Print it out for debugging
       Serial.println(clientline);
       
       // Look for substring such as a request to get the root file
       if (strstr(clientline, "GET / ") != 0) {
         filename = rootFileName;
       }
       if (strstr(clientline, "GET /") != 0) {
         // this time no space after the /, so a sub-file
         
         if (!filename) filename = clientline + 5; // look after the "GET /" (5 chars)
         // a little trick, look for the " HTTP/1.1" string and
         // turn the first character of the substring into a 0 to clear it out.
         (strstr(clientline, " HTTP"))[0] = 0;
         
         // print the file we want
         Serial.println(filename);
         
         if (! file.open(&root, filename, O_READ)) {
           client.println("HTTP/1.1 404 Not Found");
           client.println("Content-Type: text/html");
           client.println();
           client.println("<h2>File Not Found!</h2>");
           break;
         }
         
         Serial.println("Opened!");
         
         client.println("HTTP/1.1 200 OK");
         if (strstr(filename, ".htm") != 0)
            client.println("Content-Type: text/html");
        else if (strstr(filename, ".css") != 0)
            client.println("Content-Type: text/css");
        else if (strstr(filename, ".png") != 0)
            client.println("Content-Type: image/png");
         else if (strstr(filename, ".jpg") != 0)
            client.println("Content-Type: image/jpeg");
        else if (strstr(filename, ".gif") != 0)
            client.println("Content-Type: image/gif");
        else if (strstr(filename, ".3gp") != 0)
            client.println("Content-Type: video/mpeg");
        else if (strstr(filename, ".pdf") != 0)
            client.println("Content-Type: application/pdf");
        else if (strstr(filename, ".js") != 0)
            client.println("Content-Type: application/x-javascript");
        else if (strstr(filename, ".xml") != 0)
            client.println("Content-Type: application/xml");
        else
            client.println("Content-Type: text");

         client.println();
         
         int16_t c;
         while ((c = file.read()) >= 0) {
             // uncomment the serial to debug (slow!)
             //Serial.print((char)c);
             client.print((char)c);
         }
         file.close();
       } else {
         // everything else is a 404
         client.println("HTTP/1.1 404 Not Found");
         client.println("Content-Type: text/html");
         client.println();
         client.println("<h2>File Not Found!</h2>");
          }
       break;
     }
   }
   // give the web browser time to receive the data
   delay(1);
   client.stop();
 }
}






et l'erreur :


Communication serie ouverte.
Free RAM: 6379
error: card.init failed!
SD error: 1,0


La carte SD fait 2Go et est formaté en FAT.


Merci pour votre aide!

Snootlab

Bonjour,

Quel est le shield SD que tu utilises ?

Lionel
- Distributeur officiel Arduino - France

OlivierDarn

#2
Sep 01, 2011, 10:56 am Last Edit: Sep 01, 2011, 11:04 am by OlivierDarn Reason: 1
C'est le Shield  ethernet  officiel avec le support sd. 

Artouste


C'est le Shield  ethernet  officiel avec le support sd. 

bonjour

pas de problème  avec un  uno, mais lire ça pour mega

Quote
Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 11, 12, and 13 on the Duemilanove 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.

Snootlab

Re-

je viens d'essayer ton sketch, il faut ajouter la ligne

Code: [Select]

pinMode(4, OUTPUT);                       // set the SD SS pin as an output (necessary!)


en dessous de ça
Code: [Select]
  // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  // breadboards.  use SPI_FULL_SPEED for better performance.
  pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH);                    // but turn off the W5100 chip!


et ça marche...

Quote
Communication serie ouverte.
Free RAM: 6381
Volume is FAT16

Files found in root:
DATALOG.TXT    2000-01-01 01:00:00 2758

Files found in all dirs:
DATALOG.TXT

Done


En effet, la pin CS de la carte SD sur l'ethernet shield est la pin 4

Lionel
- Distributeur officiel Arduino - France

OlivierDarn

C'est tout à fait ca. Merci pour votre aide.

jmatgou

Bonjour à tous, je ne sais pas si je suis dans le bon sujet mais j'ai un problème similaire.
J'ai une Arduino Mega et un shield ethernet avec le support SD (comme OlivierDarn en officiel)

J'ai bien pris note qu'avec la Arduino Mega il fallait mettre la pin 53 en sortie haute pour que le port SPI fonctionne, et qu'il fallait utiliser la pin 4 pour utiliser la carte SD.

Cependant, le même programme ne fonctionne pas toujours.
Je m'explique :

Je charge l'exemple "datalog" dans la Arduino, cela fonctionne très bien, mais si je touche à la carte (la déplace, ou la met dans ma main) plus rien ; même en faisant un reset ça ne repart pas toujours. C'est comme si il y avait un faut contact ou que la carte SD n'était pas tout le temps détectée.
En gros, un coups ça fonctionne et 2 coups la carte SD n'est pas détectée.

Est-ce qqun a déjà eu ce problème ? Est-ce un problème de la carte Arduino et/ou du Shield et/ou de la SD card ?

Merci pour vos lumière.
Arduino Mega 2560 R2
Shield Ethernet + SD
Arduino 1.0

Go Up