[Résolu] Lire fichier texte carte SD et stocker dans matrice

Bonjour, :slight_smile:

Nous avons un problème pour lire un fichier texte sur un carte SD. Je vous fait part du programme, nous n'arrivons pas à avoir ce que l'on veut dans le port série de Arduino. Nous avons tout les deux la version 1.5.2 mais le soucis de pose également avec la précédente version. Il est assez fréquent de trouver ceci dans le port série : ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Nous aurions vraiment besoin d'un coup de main :blush:

Je vous expliques un peu le problème. Sur un fichier txt présent sur une carte SD, nous avons 32 caractère de 0 et 1, nous souhaitons les récupérer, les stocker dans une matrice et les réutiliser par la suite. Si vous avez une autre approche ou une autre méthode pour faire cela, nous sommes à votre écoute ! :slight_smile:

Voici le code :

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

File myFile;

int bit = 0;
int ligne = 0;
int red = 0;
char rouge[] = {};
char R;
String Rfinal = "";
String Rfinal1 = "";
String Rfinal2 = "";

void setup() {
  Serial.begin(9600);
  Serial.println("");
  Serial.println("Carte SD detectee...");
  pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("Erreur de chargement.");
    return;
  }
  
  Serial.println("Chargement reussi.");
  myFile = SD.open("/0/R.txt");
  if (myFile) {
    while (myFile.available()) {
     Serial.write(myFile.read());
    }
    myFile.close();
    
    /////////////////////////
    if (bit < 16) {
  R = myFile.read();
  Rfinal1=Rfinal1+R;
  bit = bit + 1;
} else {
  if (red < 2) {
    Rfinal2 = Rfinal1;
    Rfinal1="";
    red = red+1;
  } else {
    Rfinal = Rfinal2+Rfinal1;
    bit = 0;
  }
}

  Serial.println("");
  Serial.print("Return : ");
  Serial.print(Rfinal);
///////////////////////
  } else {
    Serial.println("Erreur de lecture du fichier.");
  }
}

void loop() {
  
}

Merci à vous !

Freequant:
Il est assez fréquent de trouver ceci dans le port série : ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Est ce que sur l'ordi le baudrate est bien lui aussi réglé sur 9600 ?

Bonjour, :slight_smile:

Oui, c'est bien le cas :roll_eyes:

Le programme est il correcte ? J'ai vu un peu par tout parlé de la liaison SPI il ne me semble pourtant pas y faire référence dans le programme, est ce ça pourrait venir de là ?

Merci :slight_smile:

Edit : il faudrait arriver à récupérer les lignes, une par une, contenu dans le .txt,
puis les stocker séparément dans la matrice pour pouvoir sans servir par la suite.

Freequant:
Bonjour, :slight_smile:

Oui, c'est bien le cas :roll_eyes:

Le programme est il correcte ? J'ai vu un peu par tout parlé de la liaison SPI il ne me semble pourtant pas y faire référence dans le programme, est ce ça pourrait venir de là ?

Merci :slight_smile:

Edit : il faudrait arriver à récupérer les lignes, une par une, contenu dans le .txt,
puis les stocker séparément dans la matrice pour pouvoir sans servir par la suite.

le code est fonctionnel (utilisation du slot SD de la carte ethernet)
resultat :
contenu du fichier

artouste Artouste test sur dossier 0
01110101110001010110001110010101
end

resultat sur le serial

Carte SD detectee...
Chargement reussi.
artouste Artouste test sur dossier 0
01110101110001010110001110010101
end

Return :

Bonsoir,

Milles merci de porter attention à notre sujet ! :slight_smile:

C'est une excellente nouvelle ! Vous utiliser donc la prise ethernet et non le câble USB ? Nous nous servons nous de l'USB, le soucis devait donc venir de là non ?

Comment pouvons nous faire pour réutiliser le contenue de la carte ? Nous avions pour projet de le mettre dans une matrice et de récupérer les données par la suite. Es ce que ceci est faisable ou y a t'il plus simple ?

Pour être le plus précis possible les 0 et 1 seront assignés à des leds de 1 à 32 ou 0 à 31. Chaque leds comportent 3 couleurs RVB. Si nous lisons ceci :

011

Cela voudrait dire que seulement la LED rouge serait éteinte.

Exemple complet.

Arduino doit lire le contenue de 3 fichier sur la carte SD un R un V un B. Il doit lire ceci :

01000101111011110100100011001101
10111010000100001011011100110010
11111111111111111111111111111111

La première led aura comme couleur CYAN. Chaque colones correspond à la couleurs d'une LED sur le bâton.

Colonne 1 => LED 1
Colonne 2 => LED 2
Colonne 3 => LED 3
...

Si vous avez besoin de plus de détailles je suis là 8)

Merci de votre aide ! :slight_smile:

Non, il utilise le câble USB, mais il utilise le slot pour carte sd présent sur la carte ethernet pour insérer une sd et tester votre code. D'ailleurs, vous utilisez quoi vous pour mettre la carte sd? Et quel pin de la carte sd est relié avec quel pin de l'arduino? Peut être que le problème vient de là ! Votre montage est-il soudé ou bien relié par une breadboard? Ou bien est-ce un shield branché directement sur la carte arduino?

Bonjour,

Je pense avoir trouvé l'origine du problème. Nous n'utilisons pas de Carte SD mais une micro SD, autant pour moi je me suis trompé :* :blush:

Nous ne définissons donc aucun broche, rien. Du coup le problème viendrait de la ?

Comment procéderiez vous pour que cela fonctionne ? Si il y a du matériel à commander nous pouvons bien évidement le faire. Si vous avez un shéma pour y voir plus clair c'est avez plaisir ! :slight_smile:

Un grand merci !

Edit : nous utilisons donc un shield, mais nous ne fesont que l'emboiter par dessus la carte arduino.
Manque t'il un fil à relier par rapport à ceci : pinMode(10, OUTPUT); ?

Freequant:
Bonjour,

Je pense avoir trouvé l'origine du problème. Nous n'utilisons pas de Carte SD mais une micro SD, autant pour moi je me suis trompé :* :blush:

Nous ne définissons donc aucun broche, rien. Du coup le problème viendrait de la ?

Comment procéderiez vous pour que cela fonctionne ? Si il y a du matériel à commander nous pouvons bien évidement le faire. Si vous avez un shéma pour y voir plus clair c'est avez plaisir ! :slight_smile:

Un grand merci !

Edit : nous utilisons donc un shield, mais nous ne fesont que l'emboiter par dessus la carte arduino.
Manque t'il un fil à relier par rapport à ceci : pinMode(10, OUTPUT); ?

bonjour
J'utilise aussi une µSD sur le slot de la carte ethernet
mais toi tu utilise quoi exactement comme lecteur de carte, quel shield ?

mais toi tu utilise quoi exactement comme lecteur de carte, quel shield ?

Je ne comprend pas trop ta question, on utilise celui sur l'image au dessus?!
Peux tu reformuler ta question stp, Merci

EDIT : il y a plusieurs modèles ? Peut être que nous emboîtons pas les cartes de la bonnes manières ? Es ce qu'il serait possible d'avoir une photo de votre montage ? svp :slight_smile:

On va vous envoyer une photo du notre vous pourrez bien voir comme ça :slight_smile:

Merci encore !

Freequant:

mais toi tu utilise quoi exactement comme lecteur de carte, quel shield ?

Je ne comprend pas trop ta question, on utilise celui sur l'image au dessus?!
Peux tu reformuler ta question stp, Merci

alors si tu utilise le slot µsd de la carte ethernet officielle (c'est ce que j'ai fait)
le code est fonctionnel sans modif

ma config
UNO rev2
Shield ethernet (pas un R3, mais la version precendente)
IDE 1.0.4

dossier 0 et fichier R.txt de la µsd créé sur PC

Bonsoir,

Le soucis se pose plus loin. Comment stocker les informations lu sur la micro SD ? Nous avions prévu de les stocker dans une matrice mais après 20 essaies aucun ne fonctionne :frowning:

Es ce qu'il y aurait un autre moyen plus efficace ?

Merci encore :slight_smile:

Edit : Voici la config, dans l'ordre l'une sur l'autre :

  • ARDUINO UNO R3
  • SHIELD ETHERNET R3
  • Arduino ProtoShield v2

Voilà les photos de notre montage (cliquer pour agrandir) :wink:
Nous utilisons les pins 1 et 4 définit dans notre programme, ainsi qu'une masse GND.
Le port ethernet a été dessoudé, c'est donc normal qu'il n’apparaisse pas sur les photos

Bonjour,

Un petit post pour faire remonter le sujet, c'est pour le bac alors :blush:

Merci à vous :frowning:

Bonsoir,

Encore un petit rappel svp :blush:

-> le code actuel
-> petit résumé de ce que tu veut faire et de ce que tu as testé :wink:

Salut skywodd,
merci de d'intéresser à notre problème :).
Désolé mais nous n’avons pas de code actuel à te donner.
En fait nous avons essayés différentes choses :

  • lire un fichier sur la micro SD et le stocker directement dans une matrice
  • lire les lignes une par une et les afficher
  • découper une ligne en 2 puis rassembler les 2 parties d’une ligne
  • récupérer les caractères un par un d’une ligne, puis reconstituer la ligne

Je suis également allé voir sur ton site internet pour voir si n’y avait pas de solution.
J’ai trouvé le sujet Charger un fichier de configuration depuis une carte SD,
Nous avons regardé et essayé ton code.
Si je te résume exactement le problème, un fichier à lire ce compose par exemple
comme ceci :

10000000000000000000000000000000
01000000000000000000000000000000
00100000000000000000000000000000
00010000000000000000000000000000
00001000000000000000000000000000

C’est un fichier avec un nombre de ligne variable.
Chaque ligne est composée de 0 ou de 1 représentant l’état d’une LED.
Comme nous avons 32 LED, les lignes font toujours 32 caractères de long.
En fait notre problème est d’arriver à stocker chaque ligne séparément
dans une matrice pour pouvoir être utilisé par la suite.

Voilà merci, dis-moi si tu as besoin de plus de détails

Ton but c'est quoi (en gros la matrice sert à quoi) ?
Si la matrice doit être complétement chargée en mémoire il faudra faire de l'allocation dynamique (ou avoir un nombre max de lignes fixe).
Si une seule ligne est utilisé à chaque fois il suffit de lire les lignes au fur et à mesure.

Bon sinon voila l'algo pour charger une ligne :

// Lit une ligne depuis le fichier "f" et place le résultat dans la variables "v" (pointeur)
byte readLine(File& f, uint32_t* v) {
  char buffer[32]; // Buffer temporaire pour la ligne compléte
  uint32_t tmp = 0; // Valeur temporaire pour la valeur binaire
  if (f.readBytesUntil('\n', buffer, 32) != 32) // Lit 32 octet max, s'arréte au premier \n lu
    return 1; // Erreur
  for (byte i = 0; i < 32; ++i) // Pour chaque bit
    bitSet(tmp, i, ((buffer[i] == '0') ? 0 : 1)); // si bit == '0' -> 0, sinon -> 1
  *v = tmp; // Stocke la valeur finale
  return 0; // Pas d'erreur
}

// Exemple d'utilisation
// uint32_t v;
// File f;
// Ouverture du fichier ...
// if (readLine(f, &v)) {
// Gestion de l'erreur ...
// }

A toi de faire ce qui va autour :wink:

Salut,

Est ce que vous avez pensé que ce qui est stocké sur la carte, ou ce qui est lu depuis la carte, peut être en code ASCII ?
Ca ressemble beaucoup à un problème de conversion de données !

nicolas34:
Est ce que vous avez pensé que ce qui est stocké sur la carte, ou ce qui est lu depuis la carte, peut être en code ASCII ?

Le code que j'ai donné en exemple travaille uniquement avec des caractères ASCII '0' ou '1'.

le "texte" présent dans le fichier est encodé en ASCII mais les fonctions par défaut de lecture de l'arduino ne tienne pas forcément compte de cet encodage. Perso, j'essayerai cette piste, au moins pour être sur que le problème ne vient pas de là.

Désolé du retard,
mais finalement le problème est résolu.
J'ai réussi à lire le fichier sur la carte SD
ligne à ligne et à les stocker séparément
en utilisant la fonction readBytesUntil et seek.
Merci pour vos idées :slight_smile: