Problème carte SD et arduino mega (ATMega2560)

Bonjour,
J'essaye depuis plusieurs jours de faire fonctionner un lecteur de cartes SD (MicroSD card breakout board+ : ID 254 : $7.50 : Adafruit Industries, Unique & fun DIY electronics and kits et un autre sans marque) sur un arduino mega (ATMega2560).

Mon problème est que la communication ne fonctionne pas à tout les coup et ceux de façon aléatoire.
En effet j'ai pu utiliser la carte SD pour enregistrer des logs pendant une après-midi, ce matin ça ne fonctionnait pas, en début d'après-midi je m'y remets et ça remarche sans que j'ai changé quoi que ce soit.
En fin d'après midi je rebranche le tout pour recommencer à travailler et ça ne remarche plus.

Mon code est fonctionnel puisque je n'ai aucun problème sur un arduino uno, et même les exemples fournis ne fonctionnent pas (blocage a SD.begin) et message dans le moniteur série "initialization failed".

J'ai bien-sur adapté mes branchements pour correspondre avec la Mega, le pin CS est relié au 53 de la mega, et je le mets en sortie dans mon setup().

J'ai deux cartes SD une sanDisk de 23Go et une toshiba plus vieille de 8Go, le problème se produit avec les deux.
Une des carte est en FAT32 l'autre en FAT16.

J'ai utilisé la librairie SD de base mais aujourd'hui je suis passé sur la SDFat (GitHub - greiman/SdFat: Arduino FAT16/FAT32 exFAT Library)
J'avais déjà le problème avant et il ne s'est pas résolu avec cette libraire.

Voila,voila si quelqu'un à des hypothèses me permettant de résoudre mon problème je suis preneur.

Merci d'avance

Q.R

Postez le code et les branchements exacts

adaptateur>>arduinoMega

CS >> SS(53)
DO >> MISO(50)
DI >> MOSI(51)
CLK>> SCK(52)

Rappel adaptateur: MicroSD card breakout board+ : ID 254 : $7.50 : Adafruit Industries, Unique & fun DIY electronics and kits

Ce code (exemple arduino cardInfo modifié (chipSelect=53)) marche des fois et des fois non.
Dans mon code j’utilise SD.begin(chipSelect) ou juste SD.begin(). Je pourrais le poster demain mais je n’en voit pas l’intérêt puisque le problème se pose déjà sur l’exemple fournit dans l’IDE.

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

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 53;

void setup() {
  pinMode(chipSelect,OUTPUT);
  // 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
  }
  delay(500);

  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!


  //Bloque ICI, affiche initialization failed...
  //Même problème avec la méthode SD.begin() dans d'autres problèmes

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);


  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {

}

Marche très bien sur arduino Uno mais seulement de temps à autres sur un Mega

vous n'avez pas besoin d'un SPI.begin(); dans le setup() ?

essayez avec la SDFat library.

je dois dire que j’ai sensiblement le même problème sur ma régulation solaire : j’étais parti sur une UNO, jamais le moindre soucis avec la carte SD.
j’ai du passer sur la méga car manque de RAM et ça partait en sucette sur la uno → pareil que @Zud carte qui s’initialise pas à tous les coups. Ou qui s’initialise mais c’est l’ouverture de fichier qui foire.

du coup quand ça ne fonctionne pas j’ai rajouté une tempo avant de refaire un essai.

j’ai remarqué que couper l’alim de la carte et la remettre permet en général que ça reparte à l’essai suivant, sinon ça continue à déconner.
du coup je vais alimenter la carte via une pin en sortie de manière à pouvoir couper son alim quand ça foire et la remettre ensuite. pas très clean, mais faute de mieux…

Si vous lisez la doc de SDFat il dit

Most cards have good SPI read performance but cards vary widely in SPI write performance. Write performance is limited by how efficiently the card manages internal erase/remapping operations. The Arduino cannot optimize writes to reduce erase operations because of its limit RAM.

...

The hardware interface to the SD card should not use a resistor based level shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal rise times that are too slow for the edge detectors in many newer SD card controllers when resistor voltage dividers are used.
...
If you are using a resistor based level shifter and are having problems try setting the SPI bus frequency to 4 MHz. This can be done by using card.init(SPI_HALF_SPEED) to initialize the SD card.

avez vous essayé à 4 MHz

oui, c'est la première chose que j'ai essayé. aucune amélioration. Ce qui est curieux c'est que pourtant avec la UNO aucun soucis, même à 8MHz.
et de plus en ce qui me concerne mon support de sd utlise un convertisseur de niveau, pas juste des pont diviseurs.

de mémoire j'avais lu que parfois ça ne passait pas du premier coup et qu'il fallait essayer 2 ou 3 fois avant d'abandonner...

Effectivement, c'est à peu près ce qui se passe. J'ai en général entre 2 et 4 essais les fois où ça ne fonctionne pas du premier coup.
A condition de couper l'alim de la carte entre les essais, sinon quand c'est parti à foirer, ça perdure.

Reste que avec la uno ça a toujours fonctionné du premier coup. Avec exactement la même configuration et le même soft (à part les pins) c'est ça qui est un peu frustrant, là....

J'ai remarqué aussi qu'en coupant l'alim ça marche mais pas à tous les coup...
Pour ce qui est de la librairie SDfat mon code perso l'utilise, (si vous le souhaitez je pourrais le mettre demain soir), mais j'ai le même problème.

Je n'ai pour ma part pas testé à 4MHz.

@bricofoy pareil pour moi le code marche sans aucun soucis sur arduino UNO mais la mega...

Pour le SPI.begin(); puisqu'il n'était pas présent dans les exemples arduino je n'ai pas jugé utile de l'ajouter. Je testerai tout ça demain.

Merci de vos réponses!

EDIT: Testé à 4MHz et aussi avec un SPI.begin(); dans le setup, pas de changements pour moi.

Merci pour toutes réponses c'est vraiment trop cool.
Après plusieurs nuit de recherche je suis tomber sur un tuto (dsl je me souviens plus de qui et où tellement que j'en ai regarder) le mec avait mis une resistance de 330 ohm sur la broche Miso du lecteur SD [ ---- FILS QUI PAR DE L ARDUINO ---> RESISTANCE 330 OHM ----> connexion a la borne MISO du lecteur ]
j'ai essayer cela est plus de conflit avec le lecteur sd et le lecteur RFID brancher ensemble sur la meme broche SPI ( mon lecteur lui et brancher directement sans resistance ).

Pour l'instant tt fonctionne.

Je vous remercie encore pour l'aide que vous apportez.

PS :
j'ai une autre petite question SVP :
comment ou quel instruction fonctionne pour connaitre le nombre de caracteres d'un mot ou d'une phrase
du style : [ mot="BONJOUR" ; A=(nbre de lettre dans "mot") ; A=7
j'utiliserai cette fonction pour pouvoir centrer un mot (qui change en fonction de la lecture du badge RFID que j'utilise) sur l'ecran TFT.

Merci encore.

Eddy25350:
comment ou quel instruction fonctionne pour connaitre le nombre de caracteres d'un mot ou d'une phrase
du style : [ mot="BONJOUR" ; A=(nbre de lettre dans "mot") ; A=7

char phrase[] = "bonjour";
unsigned int longueur = strlen(phrase);

si vous utilisez la classe String (pas bonne idée...) pour stocker votre message, il y a la méthode length()

Désolé d'encore vous déranger avec mes problèmes ...
Mais je n'arrive pas à mettre en place les lignes de code que J-M-L m'a sympathiquement données .

Dans mon code ça donne ça :

String label = saisi("ENTREZ LE NOM DU NOUVEAU BAGDE");

tft.fillScreen(GRIS1);
tft.fillRect(25,25,430,50,GRISC);
tft.drawRect(25,25,430,50,GRIS1);
tft.setCursor(90,40);
tft.setTextSize(3);
tft.setTextColor(BLACK);
tft.println("CREATION DU BADGE");
tft.fillRect(40,100,400,50,BLACK);
tft.drawRect(40,100,400,50,WHITE);
tft.setTextColor(WHITE);
// tft.setCursor(90,115);

//-------------------- LIGNE RAJOUTER AU PROGRAMME DE BASE ------------------

char phrase = label; // [ label ] et le mot qui s'affiche sur l'ecran TFT après saisie
unsigned int longueur = strlen(phrase);
tft.setCursor(((480/2)-(longueur/2)),115);

// -----------------------------------------------------------------------------

tft.println(label);

// ---------------------------------- boucle de confirmation de creation du badge --------------------

while(1){
tft.setTextSize(3);

...

j'obtiens cela comme message d'erreur a la compilation :

Arduino : 1.8.12 (Windows 10), Carte : "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users*****\Documents\Arduino\RFID_ENRBADGEOK\RFID_ENRBADGEOK.ino: In function 'void ajouterBadge()':

RFID_ENRBADGEOK:693:10: error: initializer fails to determine size of 'phrase'

char phrase = label;

^~~~~~

RFID_ENRBADGEOK:693:21: error: array must be initialized with a brace-enclosed initializer

char phrase = label;

^~~~~

exit status 1
initializer fails to determine size of 'phrase'

Merci de me venir en aide.

Pourquoi passer par un char ?

String label = saisi("ENTREZ LE NOM DU NOUVEAU BAGDE");
size_t longueur = label.length();

https://www.arduino.cc/reference/tr/language/variables/data-types/stringobject/

Merci hbachetti.

Simple & efficace !

j’apprend, j’avance merci.