IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème ESP32 et carte SD


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut Problème ESP32 et carte SD
    Bonjour,
    j'utilise un module ESP32 DEV Kit V1. j'ai un lecteur de carte micro SD en SPI. j'utilise la bibliothèque SD(esp32).
    Je ne parviens pas à faire fonctionner l'exemple SD_test (spécifique à l'ESP32) . J'obtiens systématiquement le message "Card Mount Failed" malgré de très nombreux essais.
    Le problème ne vient pas de mon lecteur de carte car j'ai fait le test avec une Arduino nano et l'exemple Cardinfo et tout fonctionne parfaitement.
    j'ai les yeux qui pleurent à force de chercher sur le net
    Quelqu'un pourrait-il m'aider svp.

  2. #2
    Responsable Arduino et Systèmes Embarqués

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    12 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 12 219
    Points : 54 257
    Points
    54 257
    Billets dans le blog
    25
    Par défaut
    Bonjour,

    Comment est câblé le module SD ?
    Schéma ou photo du montage ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    tout d'abord merci de l'intérêt que tu portes à mon problème.
    Alors j'ai essayé une photo mais on ne voit rien
    donc
    côté carte SD : GND, VCC, MISO, MOSI, SCK, CS
    côté ESP 32 : GND, +3,3, 19, 23, 18, 5

    Une précision: j'ai exploré le code de la librairie SD. L'erreur se produit dans la méthode "sdcard_mount" de sd_diskio.cpp lors de l'appel à f_mount qui renvoie 3 (FR_NOT_READY).

  4. #4
    Responsable Arduino et Systèmes Embarqués

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    12 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 12 219
    Points : 54 257
    Points
    54 257
    Billets dans le blog
    25
    Par défaut
    Le câblage a l'air bon. Ton module SD est peut-être prévu pour une alimentation 5V, quelle est la référence de ton lecteur SD ?

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 342
    Points : 4 474
    Points
    4 474
    Par défaut
    juste pour être sûr des N° de pins, vous pouvez faire tourner ce code avec le terminal série ouvert à 115200 bauds?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void setup() {
      Serial.begin(115200);
      Serial.print("MOSI: ");  Serial.println(MOSI);
      Serial.print("MISO: ");  Serial.println(MISO);
      Serial.print("SCK: ");  Serial.println(SCK);
      Serial.print("CS: ");  Serial.println(SS);  
    }
     
    void loop() {}
    voyez vous bien le bus VSPI (23,19,18,5) ?

    une bonne alim 5V pour la carte SD serait effectivement sans doute un plus

  6. #6
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci à vous deux,

    j'ai essayé une alim 5V indépendante: même punition.
    j'ai aussi installé la dernière version 2.0.6 (j'étais en 2.0.5): même punition
    j'ai essayé en modifiant les numéros de pins: même punition

    Je soupçonne une inadaptation entre ma carte et le noyau...
    Comme je l'ai dit j'ai un ESP32 DEV KIT V1... mais pas un DOIT. C'est une carte achetée sur AliExpress, une CH9102X.

    En attendant une solution et pour pouvoir continuer mes développements, je passe par une carte Arduino NANO avec laquelle je parvient à initialiser ma SD.
    Mais... car il y a un mais! lorsque j'essaie d'écrire dans un fichier nouvellement créé, j'ai, encore, une erreur.
    Cette fois c'est dans la méthode File::File(SdFile f, const char *n) de la librairie SD (fichier File.cpp). Le malloc renvoie 0!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    File::File(SdFile f, const char *n) {
    	// oh man you are kidding me, new() doesn't exist? Ok we do it by hand!
    	unsigned long epm = sizeof(SdFile);
    	Serial.print(epm);
    	unsigned long epm2 = malloc(epm);
    	Serial.print(",");
    	Serial.println(epm2);
    	_file = (SdFile*) malloc(epm);
    	if (_file) {
    		memcpy(_file, &f, sizeof(SdFile));
     
    		strncpy(_name, n, 12);
    		_name[12] = 0;
     
    		/* for debugging file open/close leaks
    		 nfilecount++;
    		 Serial.print("Created \"");
    		 Serial.print(n);
    		 Serial.print("\": ");
    		 Serial.println(nfilecount, DEC);
    		 */
    	}
    }
    à noter les Serial.print sont de moi pour "voir" ce qui se passe . le premier affiche 129 et le deuxième 0.
    Dois-je faire un nouveau post pour tenter d'en connaitre les raisons ou pouvez-vous simplement compléter celui-ci?
    En tout cas merci encore.

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 342
    Points : 4 474
    Points
    4 474
    Par défaut
    Citation Envoyé par DidierGuy Voir le message
    Bo
    Mais... car il y a un mais! lorsque j'essaie d'écrire dans un fichier nouvellement créé, j'ai, encore, une erreur.
    Cette fois c'est dans la méthode File::File(SdFile f, const char *n) de la librairie SD (fichier File.cpp). Le malloc renvoie 0!
    cette écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    File::File(SdFile f, const char *n) {
    	// oh man you are kidding me, new() doesn't exist? Ok we do it by hand!
    	unsigned long epm = sizeof(SdFile);
    	Serial.print(epm);
    	unsigned long epm2 = malloc(epm);
    comprend de nombreuses erreurs sans doute

    - pour le commentaire, new existe mais son usage n'est généralement pas recommandé en C++ tout dépend de ce que vous essayez de faire

    - sizeof retourne la taille en octet de la variable ou type sous jacent. Donc sizeof(SdFile) n'est pas la longueur du fichier mais du descripteur de fichier (une variable de type SdFile)

    - malloc() retourne un pointeur pas un unsigned long

    - passer un SdFile par copie n'est sans doute pas ce que vous voulez, on passerait cela plutôt par référence

    - sinon pour l'idée de malloc(), quelle est la taille du fichier? une Nano n'a que très peu de mémoire et la bibliothèque SD en mange plus d'un quart pour son buffer...

    ==> Que cherchez vous vraiment à faire avec la fonction File? (drôle de nom) dupliquer un fichier existant?

  8. #8
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    il y a erreur sur les lignes. je n'ai fait qu'ajouter les Serial.print en créant au passage la variable epm (comme Et Puis Merde).
    voici le code d'origine de la librairie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    File::File(SdFile f, const char *n) {
    	// oh man you are kidding me, new() doesn't exist? Ok we do it by hand!
    	_file = (SdFile*) malloc(sizeof(SdFile));
    	if (_file) {
    		memcpy(_file, &f, sizeof(SdFile));
     
    		strncpy(_name, n, 12);
    		_name[12] = 0;
     
    		/* for debugging file open/close leaks
    		 nfilecount++;
    		 Serial.print("Created \"");
    		 Serial.print(n);
    		 Serial.print("\": ");
    		 Serial.println(nfilecount, DEC);
    		 */
    	}
    }
    Les commentaires présents sont aussi ceux d'origine.
    En me penchant (sans tomber) dans le code j'ai trouvé des choses "étranges".
    - 1) ce malloc ne me parait pas nécessaire.
    - 2) il me parait très arbitraire de stocker le nom de fichier sur 12 caractères.

    Pour le nom de fichier je me suis dit que j'avais déjà assez de problème comme ça sans en chercher d'autres
    Pour le malloc je l'ai supprimé et remplacé par une affectation directe.

    voici le code que je suis en train de tester actuellement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File::File(SdFile f, const char *n) {
    	_file=&f;
    }
    Largement simplifié.
    testé avec un seul fichier ouvert en même temps.
    Ce qui se passe désormais:
    • l'ouverture/création de fichier fonctionne
    • la lecture fonctionne
    • l'écriture fonctionne.. presque!

    pourquoi ce presque? et bien parce qu'elle ne fonctionne que si j'ajoute une instruction "print" parasite dans ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
      File SDClass::open(const char *filepath, uint8_t mode) {
    
    /*
           Open the supplied file path for reading or writing.
    
           The file content can be accessed via the `file` property of
           the `SDClass` object--this property is currently
           a standard `SdFile` object from `sdfatlib`.
    
           Defaults to read only.
    
           If `write` is true, default action (when `append` is true) is to
           append data to the end of the file.
    
           If `append` is false then the file will be truncated first.
    
           If the file does not exist and it is opened for writing the file
           will be created.
    
           An attempt to open a file for reading that does not exist is an
           error.
    
    */
    
        int pathidx;
    
        // do the interactive search
        SdFile parentdir = getParentDir(filepath, &pathidx);
        // no more subdirs!
    
        filepath += pathidx;
    
        if (! filepath[0]) {
          // it was the directory itself!
          return File(parentdir, "/");
        }
    
        // Open the file itself
        SdFile file;
        // failed to open a subdir!
        if (!parentdir.isOpen()) {
          return File();
        }
    
        if (! file.open(parentdir, filepath, mode)) {
          return File();
        }
        // close the parent
        parentdir.close();
    
        if ((mode & (O_APPEND | O_WRITE)) == (O_APPEND | O_WRITE)) {
          file.seekSet(file.fileSize());
         }
        file.print("A");
     return File(file, filepath);
    à noter Toutes les lignes de codes et commentaires sont d'origine sauf la ligne en gras souligné.
    Avec ce print je peux ensuite faire toutes les écritures que je veux. sans lui impossible!
    voici le code que j'ai écrit et qui appelle ces méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    bool ecritFichier(File fic, String message) {
    	if (!fic) {
    		Serial.println("- Fichier non ouvert.");
    		return false;
    	}
    	if (!fic.print(message)) {
    		Serial.println("- Erreur d'écriture du fichier.");
    		return false;
    	}
    	return true;
    }
    bool ecritFichier(String fichier, String message) {
    	Serial.println("je vais ouvrir le fichier " + fichier);
    	File fic = SD.open(fichier, FILE_WRITE);  // appel à la fonction d'ouverture citée plus haut et dans laquelle j'ai ajouté un print parasite
    	if (!fic) return false;
    	fic.print("234"); // ajouté pour tests:  ok si print dans SD.open sinon ko
    	Serial.println("je vais écrire dans le fichier " + fichier);
    	bool b = ecritFichier(fic, message); // ok si print dans SD.open sinon ko
    	Serial.println("je vais fermer le fichier " + fichier);
    	fermeFichier(fic);
    	return b;
    }
    En résumé, si j'appelle bool b=ecritFichier("/toto","un message") j'obtiens
    • "A234un message" dans le fichier /toto s'il y a l'appel parasite à print dans SD.open
    • un fichier /toto vide. sans cet appel.



    Est-ce moi qui devient parano ou bien est-il légitime de suspecter un bug dans une librairie?
    Tant que j'y suis j'ai plusieurs questions:
    1. Que pensez-vous de ma solution pour éviter le malloc?
    2. Avez-vous une idée du pourquoi ce print parasite permet d'écrire ensuite sans problèmes dans le fichier.


    Merci pour tout le temps que vous avez déjà passé et pour celui que vous voudrez bien y consacrer encore.

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 342
    Points : 4 474
    Points
    4 474
    Par défaut
    C’est quelle bibliothèque ?

  10. #10
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    La librarie SD de Arduino version 1.2.4

    Bien sûr je continue mes tests. j'ai pu mettre en évidence que le file.seek() ne fonctionne pas. on est toujours placé en fin de fichier et un seek ne change rien.

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 342
    Points : 4 474
    Points
    4 474
    Par défaut
    Citation Envoyé par DidierGuy Voir le message
    La librarie SD de Arduino version 1.2.4
    Ah je n’utilise que SdFat

    - 1) ce malloc ne me parait pas nécessaire.
    - 2) il me parait très arbitraire de stocker le nom de fichier sur 12 caractères.
    En fait c’est le constructeur donc il faut bien allouer un nouvel objet. La bibliothèque SD d’origine (2010…) ne supportait que les nom dit 8.3 soit 12 caractères.

  12. #12
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Pan sur les doigts
    Comme je continuais à chercher, j'ai encore ajouter des prints. Et j'obtenais un comportement différent!!!
    Alors mon vieil instinct de programmeur (ou mon instinct de vieux programmeur c'est au choix) c'est réveillé et je suis revenu à la première erreur à savoir le malloc qui rendait NULL.
    J'ai considéré qu'il avait raison et donc que je devais manquer de mémoire (enfin ma carte pas moi )
    J'ai supprimé un tas de Print... et ça marche!

    Par contre je me demande quand même ou passe toute cette mémoire, mais bon c'est une autre histoire.
    Je pensais qu'il y avait moyen de formater de diverses manières la mémoire au moment du téléversement... mais soit ce n'est pas possible avec une NANO soit je ne trouve pas comment faire.

    Encore une question :
    Tu dis utiliser la librairie SdFat. Il y a t'il une raison particulière. Est-elle meilleure que SD?
    Peux-tu m'en dire un peu plus là dessus STP.

    Sinon je considère ce problème avec ma NANO comme réglé.
    Par contre je laisse le sujet ouvert car je ne peux toujours pas monter ma carte SD avec mon ESP32.

    Je vous remercie encore pour votre aide.

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 342
    Points : 4 474
    Points
    4 474
    Par défaut
    Comme déjà mentionné la bibliothèque SD est hyper gourmande avec au moins un buffer de 512 octets.
    Si vous avez beaucoup de print sans la macro F() alors vous mangez aussi de la RAM. Il faut toujours mettre
    Plutôt que
    Comme ça le texte est en mémoire flash seulement

    Sinon la bibliothèque SD c’est juste une très vieille version de SdFat qu’arduino n’a pas vraiment fait évoluer alors que son développeur a amélioré de nombreux points. Autant prendre la version récente…

    Sur ESP32 cependant faut voir car on peut utiliser du plus natif : la SDD_MMC library. Regardez des tutos, par exemple https://randomnerdtutorials.com/esp3...-card-arduino/

  14. #14
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Super je te remercie de l'astuce du F dans le print!!!
    Je vais également sans doute passer à SdFat pour ma Nano, et je vais aller voir le tuto que tu cites pour mon ESP.
    Je ne m'étais pas intéressé à une librarie MMC parce que j'avais une carte en SPI et je pensais que ce n'était pas compatible.

    Avant de clore cette discussion je vais faire des essais et je mettrai les résultats.
    Encore merci et bonne soirée.

  15. #15
    Candidat au Club
    Homme Profil pro
    Amateur éclairé
    Inscrit en
    janvier 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur éclairé

    Informations forums :
    Inscription : janvier 2020
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Bon j'ai fait des tests et encore des tests... et marre!
    J'ai adopté la librairie SdFat. Avec la NANO c'est OK.
    Mais toujours pas possible de monter la carte SD sur mon ESP32.
    La NANO n'ayant vraiment pas assez de mémoire, je veux passer à ESP8266.

    Mais là encore des problèmes. Je ferme cette discussion car je laisse tomber l'ESP32... pour le moment.
    Mais je vais en ouvrir un nouveau pour mon problème ESP8266/Sloeber...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [UBUNTU] Problème avec ma carte ATi
    Par paristote dans le forum Ubuntu
    Réponses: 4
    Dernier message: 20/07/2006, 11h14
  2. Problème entre deux cartes réseaux
    Par Azharis dans le forum Administration
    Réponses: 6
    Dernier message: 12/07/2006, 16h33
  3. problème dans la carte graphique
    Par ikrame dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 21/04/2006, 01h29
  4. Probléme avec la carte graphique(GForce4)
    Par menzlitsh dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/03/2006, 01h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo