Pages: [1]   Go Down
Author Topic: [RESOLU] Arduino Mega et Sd  (Read 661 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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!
« Last Edit: September 08, 2011, 04:42:18 pm by OlivierDarn » Logged

Forum Moderator
Toulouse / France
Offline Offline
Full Member
*****
Karma: 2
Posts: 214
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Quel est le shield SD que tu utilises ?

Lionel
Logged

- Distributeur officiel Arduino - Conception de shields qui défrisent

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est le Shield  ethernet  officiel avec le support sd. 
« Last Edit: September 01, 2011, 04:04:49 am by OlivierDarn » Logged

Offline Offline
Faraday Member
**
Karma: 19
Posts: 4221
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
Toulouse / France
Offline Offline
Full Member
*****
Karma: 2
Posts: 214
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Re-

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

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

en dessous de ça
Code:
  // 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
Logged

- Distributeur officiel Arduino - Conception de shields qui défrisent

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

La Roche sur Yon - France
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Arduino Mega 2560 R2
Shield Ethernet + SD
Arduino 1.0

Pages: [1]   Go Up
Jump to: