[Non réglé] Problème écriture carte SD

Bonjour à tous !

Je viens de commencer dans l’arduino qui est une carte formidable !

Mais je me heurt à un petit problème.

Dans mon projet je voudrais stocker des variables dans une carte SD afin de pouvoir modifier et sauvegarder celle-ci entre deux utilisations.

Donc je pensais utiliser une SD avec un fichier contenant celles-ci (Initialisation = Récupération sur la carte et modification (très rares) => écriture sur la carte) afin d’éviter de rebrancher le PC et de modifier le code.

Donc voici mon problème : j’utilise un module SD en SPI avec une Carte Mega 2560.

Et quand je teste le code exemple de la bibliothèque SD je n’arrive qu’à lire et pas à écrire. Si j’essaye d’écrire dans le fichier ça bug et cela bloque même la lecture qui suit.

Voici mon code :

/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // nothing happens after setup
}

J’ai tester avec un arduino UNO que j’ai dans mes tiroirs et avec lui pas de problème !

Sur la carte MEGA je suis obligé de commenter la ligne :
myFile.println(“testing 1, 2, 3.”);
sinon ça plante la lecture et cela aussi fonctionne si je supprime FILE_WRITE de l’ouverture qui je pense bloque l’écriture.

Je ne comprend pas ce qui se passe. Quelques fois ça crée un fichier corrompu de plusieurs Go :o !

Sur la carte j’ai beaucoup de modules de branchés (Ecran LCD, RTC, Télécommande IR, Récepteur Modélisme, BMP180, …) et dans le doute j’ai implémenté le code exemple dans mon code où tout les modules fonctionne mais cela ne change rien.

Merci d’avance si quelqu’un à une idée.

Bonne journée.

Tu as transposé les numéros de broches pour la MEGA (voir le second paragraphe)?

Bonjour, oui quand je branche le module sur la Mega je les branches sur celles affectées au SPI (50, 51, 52 et j'affecte CS à la pin 53 ce qui donne SD.begin(53). au début j'avais un mauvais branchement ce qui me donnait une erreur d'initialisation de la SD mais maintenant la lecture pas de problème mais l'écriture échoue !

bonjour,
teste avec juste le module SD et rien d'autre.
si un truc bloque, on le prend sans rien pour voir si ca vient ou pas de ce module.

Bonsoir, je viens de tester avec le module seul et cela ne change rien. Lecture pas de problème mais si j'écris avec myFile.println(... cela n'affiche pas d'erreur sur l'écriture sauf que le fichier n'est pas modifié et plante la lecture après. J'ai essayer avec une autre carte SD mais même résultat !

J'avoue que je suis perplexe ... ma carte Mega n'est pas une "officiel" mais je ne pense pas que cela vienne de là. Sinon je pense commander un autre module SD (en microSD) pour pas resté bloqué là dessus.

Merci d'avance et bonne soirée.

La carte ne serait pas protégée en écriture quand même?

+1 mais ca ne ferait pas planter je pense

as tu testé le code exemple SD fait pour uno, donc a modifier les pins pour mega

/*
  SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
 
#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// nothing happens after setup
}

Le verrouillage de la carte c'est ce que j'ai vérifié en premier :slight_smile:
Ensuite le code et la carte fonctionne parfaitement sur le UNO.
Et le code que j'ai oublier en premier est exactement le même que tu as mis mais avec la pin réaffecter correctement pour la Méga.

C'est quoi votre Shield SD? Il a un Level shifter à 3.3v?

Si l'alim est OK essayez ceci:

N'utilisez pas la pin 10 pour autre chose et dans le setup() faites

pinMode(10, OUTPUT); // même sur le mega
digitalWrite(10,HIGH);

Juste pour voir