[débutant] Shield Ethernet V2 : SD.open impossible

Bonsoir,

Je suis en plein apprentissage sur Arduino.

Pour l'instant, tout se passait bien, mais je bute depuis ce matin sur l'écriture de fichier sur une carte SD.
J'ai enfiché le shiel Ethernet sur l'Arduino et lancé les instructions suivantes :

#include <SPI.h>
#include <SD.h>
File monFichier;
void setup() {
Serial.begin(9600); //débute la communication avec le moniteur série
afficher("*************\nInitialisation...");
if (!SD.begin(4)){//teste la communication avec la carte(pin 4)
afficher("Communication impossible");
return; //stoppe le programme
};
afficher("Communication ok !");
afficher("Ouverture du fichier");

if (!(monFichier = SD.open("alea.ard",FILE_WRITE)))
{
afficher("Erreur de fichier");
return; //stoppe le programme
}

afficher("Fichier ouvert");
monFichier.close();
afficher("Fichier clos");
}
void loop() {
delay(1000);
afficher("A");
}
//code de la fonction1
void afficher(String A){
Serial.println(A);
delay(1000);
}

Et j'ai le message "Erreur de fichier".

Ma carte SD est formatée en FAT (le FAT 32 ne marche pas => "Communication impossible".
J'ai :

  • acheté une autre carte SD,
  • acheté une autre shield ethernet,
  • changé de port USB,
  • rallumé l'ordi,
  • testé sur un autre ordi,
  • réinstallé Arduino,
  • changé la bibliothèque SD

... rien n'y fait.
La carte SD fonctionne : sur mon PC (windows 10), la carte monte et je peux ouvrir des fichiers.

Je sais que les tests font partie de l'apprentissage, mais je suis à bout d'imagination.

Est-ce dû à la version de la carte (Ethernet Shield 2) ?

Merci beaucoup pour votre aide

En supposant que tout est bien branché et la carte SD correctement formattée et compatible.

Vous avez probablement un conflit pour l'interface SPI qui est utilisée par la carte SD et le module ethernet. Le chip select de la carte SD est bien 4 (que vous passez en paramètre SD.begin(4)) mais la pin 10 pilote ethernet --> meme si vous-même n'utilisez pas la partie ethernet il faut déclarer la pin 10 en sortie et la mettre à HIGH au tout début du setup pour désactiver le module.

Essayez avec ce code

void setup()
{
  pinMode(10, OUTPUT); // SS pin comme output (obligatoire!)
  digitalWrite(10, HIGH); // Mais ne pas parler à la puce W5100
....
}

C'est documenté sur la page du Shield, même si c'est parfois pénible faut toujours lire les spécifications...

Note that because the W5500 and SD card share the SPI bus, only one at a time can be active. 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 W5500, set digital pin 10 as a high output.

Sinon n'utilisez pas la classe String, mettez des char * ou const char*

Merci pour votre réponse, mais

void setup()
{
  pinMode(10, OUTPUT); // SS pin comme output (obligatoire!)
  digitalWrite(10, HIGH); // Mais ne pas parler à la puce W5100
}

Ne change rien.

J'avais lu la doc du Shield. Mais un script basique comme celui-ci :
https://www.arduino.cc/en/Tutorial/ReadWrite renvoie la même erreur :

Initializing SD card...initialization done.
error opening test.txt
error opening test.txt

La seule piste, c'est que je ne peux utiliser de carte formatée en FAT32 car dans ce cas, l'erreur est :
Initializing SD card...initialization failed! Or, les cartes SD de petite capacité commencent à se faire rare.

Je joins la configuration du port, au cas où...

Leur tuto est incorrect car ils ne désactivent pas la partie ethernet comme documenté et dépendent des valeurs par défaut - souvent ça crée ensuite des erreurs (surtout si vous utilisez la pin10 pour autre chose en entrée)

Elle fait quelle taille votre carte SD?

La librairie supporte FAT16 et FAT32 - mon avis Il vaut mieux formatter en FAT32 - Avez vous essayé l'exemple SDFat qui fait le formattage ?

Attention bien sûr ça détruit tout ce qui est sur la carte!

Oops - je vois que vous utilisez la librairies SD standard - passez sur la librairie SDFat

Merci J-M-L.
Ca m'a l'air d'être une bonne piste.
Je regarde cela tout de suite.

Comme il dit dans sa doc:

A new class, "File", has been added to provide compatibility with the Arduino SD.h library. To use SdFat with programs written for SD.h replace#include <SD.h>
with these two lines:

#include "SdFat.h"
SdFat SD;

C'était bien la biliothèque SDFat qui manquait.

Merci merci merci

Super!

il y a plusieurs librairies pour gérer les cartes SD. il y en a une incluse par défaut, un peu dépassée je trouve par SDFat.

Donc ce n'est pas qu'il vous manquait SDFat, mais en faisant

#include "SdFat.h"
SdFat SD;

vous changez en fait le code qui gère la connexion à la carte SD pour une nouvelle librairie, que je trouve bcp plus complète et performante.

Effectivement, la doc de SDfat est bien plus complète de la bibliothèque par défaut. Pour l'instant je me contente des fonctions de base read/write pour mes tests.

Je m'attaque à la partie Ethernet et ça n'a pas l'air de se passer mieux : j'ai un Ethernet.localIP() qui me retourne toujours 0.0.0.0

Je tente de me débrouiller seul (j'ai chargé la bibliothèque EthernetV2), mais si je galère trop, je reviendrai demander de l'aide.

Encore merci M-L-J

Si vous utilisez la librairie Ethernet (celle incluse de base est OK) enlevez le code qui met la pin 10 en sortie et à HIGH. laissez les librairies s'en charger (cf la doc qui dit

Note that because the W5500 and SD card share the SPI bus, only one at a time can be active. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries

)

Mais pour commencer à jouer avec Ethernet, mettez la pin4 en sortie et à HIGH en début de setup() pour être sûr qu'il n'y a pas de conflit et la désactiver. faites fonctionner votre shield sur Ethernet. Ensuite vous gérerez les 2 ensemble.

Je m'en suis sorti !

Il fallait que je charge la bibliothèque Ethernet2.

Je passe à l'étape suivante : le pilotage de l'Arduino.