conflit ethenet et sd card

bonjour,
j'essaie de configurer mon ethernet shield en serveur. pour que la page heberger par l'arduino soit avenante je voudrais afficher une image stocker sur la carte sd.
Mais voila, dès que j'initialise la communication avec le shield ethenet je perd la communication avec la carte sd :

void setup() {
  pinMode(A0,INPUT);
 pinMode(A1,INPUT);
  pinMode(A2,INPUT);  

   pinMode(5,OUTPUT);
  
  Serial.begin (9600); //initialisation de communication série

if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
     


  
  Ethernet.begin (mac); //initialisatio de la communication Ethernet
  server.begin(); 
if (Ethernet.begin( mac) == 0)
{ Serial.println(" FAILED!");
}
else {
  Serial.println(" OK!");
Serial.print(" IP Address: ");


Serial.println( Ethernet.localIP()); 
Serial.print(" Default Gateway: ");
Serial.println( Ethernet.gatewayIP());
Serial.print(" Subnet Mask: ");
Serial.println( Ethernet.subnetMask());
Serial.print(" DNS Server: "); 
Serial.println( Ethernet.dnsServerIP());

}


if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
     

}

qui me renvoie :

communication ok
les paramètres ip, mac
communication impossible

si quelqu'un à une idée je suis preneur

meme en essayant de forcer le spi en mettant le ss de l'ethernet (10) à high, puis celui de la sd (4) à low
ça ne fonctionne pas

void setup() {
  pinMode(A0,INPUT);
 pinMode(A1,INPUT);
  pinMode(A2,INPUT);  

   pinMode(5,OUTPUT);
  
 pinMode (4, OUTPUT); // SDCard cs
  digitalWrite (4, HIGH);
  pinMode (10, OUTPUT); // Ethernet cs
  digitalWrite (10, HIGH);
  
  Serial.begin (9600); //initialisation de communication série

if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
     


  
  Ethernet.begin (mac); //initialisatio de la communication Ethernet
  server.begin(); 
if (Ethernet.begin( mac) == 0)
{ Serial.println(" FAILED!");
}
else {
  Serial.println(" OK!");
Serial.print(" IP Address: ");


Serial.println( Ethernet.localIP()); 
Serial.print(" Default Gateway: ");
Serial.println( Ethernet.gatewayIP());
Serial.print(" Subnet Mask: ");
Serial.println( Ethernet.subnetMask());
Serial.print(" DNS Server: "); 
Serial.println( Ethernet.dnsServerIP());

}
 digitalWrite (10, HIGH);
 delay(10);
 
 digitalWrite (4, LOW);
 delay(10);
if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
      digitalWrite (4, HIGH);

}

Prenez l'habitude de poster tout le code...

Les librairies gèrent cela pour vous normalement - c'est un arduino-ethernet-shield-2 ??

Commencez par le Ethernet.begin() et configurez la SD ensuite - essayez avec ça dans le setup
(tapé dans le forum directement, donc possible qu'il y ait des erreurs de frappe - cf les commentaires par changer la mac address et le nom de votre image)

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h> // vaut mieux utiliser SDFat.h, mais si vous  ne l'avez pas, commencez par ça

// MAC address (si nécessaire regardez l'auto-collant de votre Ethernet shield sous la carte)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

cons byte sdcardCSPin = 4;

const char * nomImage = "/monImage.jpg"; // <-- A CHANGER POUR LE BON NOM

EthernetServer server(80);


void setup()
{
  pinMode (SS, OUTPUT);
  pinMode (sdcardCSPin, OUTPUT); // SDCard cs

  Serial.begin(115200);      // console à 115200

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

  if (!SD.begin(sdcardCSPin)) {
    Serial.println(F("ERREUR - SD"));
    while(1); // on meurt ici
  }

  Serial.println(F("SD card OK"));
  // check for index.htm file
  if (!SD.exists(nomImage)) {
    Serial.println(F("ERREUR - PAS DE FICHIER IMAGE"));
    while(1); // on meurt ici
  }
  Serial.println(F("OK SD et FICHIER."));
}

void loop()
{}

Merci pour ton aide, mais cela ne fonctionnepas
cependant :

#include <SPI.h> //bibliothèqe pour SPI

#include <SD.h>


void setup() {
  Serial.begin(9600);
 pinMode (4, OUTPUT);
if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme
    }

    else {
    Serial.println("Communication ok !");}
     
}

void loop() {

  if(SD.exists("ruche.jpg")) {
  Serial.println(F("ruche OK"));
} else {
  Serial.println(F("ruche introuvable"));
}

}

Quand je le téléverse dans l'arduino alors j'obtiens "ruche introuvable"

mais

si je débranche et rebranche l'arduino sur un nouveau port usb e que je téléverse le programme alors j'aobtiens ruche ok
?????

quel shield? quels branchements? quel formatage de carte? etc

SHIELD ETHERNET SHIELD R3
CARTE ARDUINO UNO

par contre ton programme fonctionne si j'enleve la librairie ethernet et que je force la patte 10 à low

#include <SPI.h>

#include <SD.h> // vaut mieux utiliser SDFat.h, mais si vous  ne l'avez pas, commencez par ça

// MAC address (si nécessaire regardez l'auto-collant de votre Ethernet shield sous la carte)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xF3, 0x9B};

const byte sdcardCSPin = 4;

const char * nomImage = "/ruche.jpg"; // <-- A CHANGER POUR LE BON NOM




void setup()
{
  pinMode (10, LOW);
  pinMode (sdcardCSPin, OUTPUT); // SDCard cs

  Serial.begin(9600);      // console à 115200




  if (!SD.begin(sdcardCSPin)) {
    Serial.println(F("ERREUR - SD"));
    while(1); // on meurt ici
  }

  Serial.println(F("SD card OK"));
  // check for index.htm file
  if (!SD.exists(nomImage)) {
    Serial.println(F("ERREUR - PAS DE FICHIER IMAGE"));
    while(1); // on meurt ici
  }
  Serial.println(F("OK SD et FICHIER."));
}

void loop()
{}

mais pas si vous démarrez la partie TCP-IP?

exactement, je pense donc que les deux librairies sont en conflit car elle partagent le protocole spi
j'ai téléchargé sdfat, mais j'ai du mal à trouver la doc afin de réaliser un test avec cette librairie

le SPI est fait pour être partagé et si vous mettez bien la pin SS et 4 en OUTPUT il n'y a pas de raison pour que ça ne fonctionne pas (sauf clone de mauvaise facture)

j'admets que c'est troublant, mais même avec output 4 cela ne fonctionne pas

il faut 10 aussi en OUTPUT (mais la librairie ethernet le fait)

si je met 10 en output alors j'obtiens directement le message communication impossible :o

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
#include <SD.h>


byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xF3, 0x9B}; // tableau pour l'adresse MAC de votre carte
EthernetServer server(80);


int dit;
int temperature;
int masse;
int effectif;

  

void setup() {
  pinMode(A0,INPUT);
 pinMode(A1,INPUT);
  pinMode(A2,INPUT);  

   pinMode(5,OUTPUT);
   

pinMode (10,OUTPUT);
pinMode(4,OUTPUT);

  
  Serial.begin (9600); //initialisation de communication série

if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
     


  
  Ethernet.begin (mac); //initialisatio de la communication Ethernet
  server.begin(); 
if (Ethernet.begin( mac) == 0)
{ Serial.println(" FAILED!");
}
else {
  Serial.println(" OK!");
Serial.print(" IP Address: ");


Serial.println( Ethernet.localIP()); 
Serial.print(" Default Gateway: ");
Serial.println( Ethernet.gatewayIP());
Serial.print(" Subnet Mask: ");
Serial.println( Ethernet.subnetMask());
Serial.print(" DNS Server: "); 
Serial.println( Ethernet.dnsServerIP());

} 


if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
   

}

Vous êtes bien sur un UNO, avec le shield enfiché directement sur le UNO?

est-ce que les exemples fournis pour Ethernet fonctionnent?

que dit exactement MON code posté plus haut? (changez la mac address pour la votre si elle est écrit en dessous du shield)

il s'agit bien d'un uno
internet fonctionne car mon code (ci-dessous ) permet d'accéder à la page (image jointe)

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
#include <SD.h>


byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xF3, 0x9B}; // tableau pour l'adresse MAC de votre carte
EthernetServer server(80);


int dit;
int temperature;
int masse;
int effectif;

  

void setup() {
  pinMode(A0,INPUT);
 pinMode(A1,INPUT);
  pinMode(A2,INPUT);  

   pinMode(5,OUTPUT);
   
pinMode(4,OUTPUT);



  
  Serial.begin (9600); //initialisation de communication série

if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
     


  
  Ethernet.begin (mac); //initialisatio de la communication Ethernet
  server.begin(); 
if (Ethernet.begin( mac) == 0)
{ Serial.println(" FAILED!");
}
else {
  Serial.println(" OK!");
Serial.print(" IP Address: ");


Serial.println( Ethernet.localIP()); 
Serial.print(" Default Gateway: ");
Serial.println( Ethernet.gatewayIP());
Serial.print(" Subnet Mask: ");
Serial.println( Ethernet.subnetMask());
Serial.print(" DNS Server: "); 
Serial.println( Ethernet.dnsServerIP());

} 


if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme

    }

    else {

    Serial.println("Communication ok !");}
   

}



void loop() {
  

temperature = analogRead (A0);
masse = analogRead (A1);
effectif = analogRead (A2);
 
  
EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client



                  

                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {

true;
        
     


                  
                    // send a standard http response header
                    client.println(F("HTTP/1.1 200 OK"));
                    client.println(F("Content-Type: text/html"));
                    client.println(F("Connection: close"));
                    client.println();
                    // send web page
                    client.println(F("<!DOCTYPE html>"));
                    client.println(F("<html>"));
                    client.println("<head>");
                    client.println("<META HTTP-EQUIV=""Refresh"" CONTENT=""5"">");
                    client.println("<title>Arduino Web Page</title>");
                    client.println("</META>");
                    client.println("</head>");
                    client.println("<body>");
client.println(F(" <div style=""text-align: center; font-weight: bold; color: rgb(255, 102, 0);""><big><big><span style=""font-family: Javanese Text;"">Ma ruche connecte</span>
</big></big></div>"));
client.println(F("<span style=""font-family: Courier New,Courier,monospace;""></span>"));
client.println(F("<table style=""text-align: left; width: 1251px; height: 119px;"" border=""1""cellpadding=""2"" cellspacing=""2"">"));          
client.println(F("<tbody>"));
client.println(F("<tr>"));
client.print(F("<td style=""width: 18%;""><span style=""font-weight: bold; font-family: Marlett;""> temperature:  "));
client.print(temperature);
client.println(F("</span></td>"));

client.println(F("<td style=""width: 40%;"" colspan=""1"" rowspan=""3""><img src='ruche.jpg'></td>"));


client.println(F(" <td colspan=""1"" rowspan=""3"" align=""undefined"" valign=""undefined"">video</td>"));
client.println("</tr>");
client.println("<tr>");
client.print(F("<td align=""undefined"" valign=""undefined""><span style=""font-weight: bold; font-family: Marlett;"">Masse:  "));
client.print(masse);
client.println(F("</span></td>"));
  client.println(F(" </tr>"));
    client.println(F(" <tr>"));
      client.print(F("<td align=""undefined"" valign=""undefined""><span style=""font-weight: bold; font-family: Marlett;"">Effectif:  "));
client.print(effectif);
client.println(F("</span></td>"));
      
      client.println(F(" </tr>"));
     client.println(F(" </tbody>"));
    client.println(F("</table>"));
    client.println(F("
"));
      
   
   
  
   
 



                

                    
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)

  
}

ton code me renvoie le message d'erreur erreur sd

1.png

et la carte SD? comment est-elle formatée? quelle capacité?

carte formatée fat 32 16 gb

le fichier ruche est reconnu avec le programme ci-dessous

#include <SPI.h> //bibliothèqe pour SPI

#include <SD.h>


void setup() {
  Serial.begin(9600);
 pinMode (4, OUTPUT);
if (!SD.begin(4)){//teste la communication avec la carte(pin 4)

        Serial.println("Communication impossible");

        return; //stoppe le programme
    }

    else {
    Serial.println("Communication ok !");}
     
}

void loop() {

  if(SD.exists("ruche.jpg")) {
  Serial.println(F("ruche OK"));
} else {
  Serial.println(F("ruche introuvable"));
}

}

vous pouvez mettre un lien sur votre shield?

c'est un truc qui a plus de 6 ans on dirait... (si j'en crois les liens)

Vous êtes dans la dernière version de l'IDE?

arduino1.8.5