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) ?
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*
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.
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!
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:
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.
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.