[Résolu] Lire et utiliser contenu carte SD

Les cartes Arduino, les platines

[Résolu] Lire et utiliser contenu carte SD

Message non lude fabrice54 » Lun 27 Aoû 2012 06:54

bonjour;

qui pourrai me dire comment relire un fichier qui se trouve sur une carte sd avec la librairie sdfat pour arduino;
merci pour vos suggestions
(ps)Si des personnes sont interressees par l’écriture sur carte sd par sdfat quelles me contacts.
fabrice54
 
Messages: 16
Inscription: Mar 10 Juil 2012 04:49

Re: SD CARTE

Message non lude Stéphane » Lun 27 Aoû 2012 13:52

Bonjour,

Qu'entendez-vous par "relire" ?
La librairie utilisée par Arduino (SD.h) est une surcouche de sdfat, et les exemples d'utilisation (lire/écrire/...) sont directement inclus dans l'IDE Arduino et permettent déja d'effectuer la grande majorité des applications pour carte SD.

Cependant si vous tenez spécifiquement à utiliser Sdfat sans le wrapper SD d'Arduino, que ce soit pour des raisons de fonctions "bricolables", de vitesse ou autre, vous trouverez toute la documentation/exemples nécessaire(s) dans l'archive téléchargeable sur leur site.

Bonne journée :)
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: SD CARTE

Message non lude fabrice54 » Mar 28 Aoû 2012 04:04

Stéphane a écrit:Bonjour,

Qu'entendez-vous par "relire" ?
La librairie utilisée par Arduino (SD.h) est une surcouche de sdfat, et les exemples d'utilisation (lire/écrire/...) sont directement inclus dans l'IDE Arduino et permettent déja d'effectuer la grande majorité des applications pour carte SD.

Cependant si vous tenez spécifiquement à utiliser Sdfat sans le wrapper SD d'Arduino, que ce soit pour des raisons de fonctions "bricolables", de vitesse ou autre, vous trouverez toute la documentation/exemples nécessaire(s) dans l'archive téléchargeable sur leur site.

Bonne journée :)

merci pour votre réponse mais ,j'ai trouve une solution la librairie sd a les exemples de programmes qui fonctionnent avec une connections différente sur la carte sd j'ai donc change la patte de connections qui est la 10 au lieu de la 4 et maintenant les deux librairies fonctionnent .

merci et bonne journée
F.thomas
fabrice54
 
Messages: 16
Inscription: Mar 10 Juil 2012 04:49

Re: SD CARTE

Message non lude fabrice54 » Mer 29 Aoû 2012 05:32

fabrice54 a écrit:
Stéphane a écrit:Bonjour,

Qu'entendez-vous par "relire" ?
La librairie utilisée par Arduino (SD.h) est une surcouche de sdfat, et les exemples d'utilisation (lire/écrire/...) sont directement inclus dans l'IDE Arduino et permettent déja d'effectuer la grande majorité des applications pour carte SD.

Cependant si vous tenez spécifiquement à utiliser Sdfat sans le wrapper SD d'Arduino, que ce soit pour des raisons de fonctions "bricolables", de vitesse ou autre, vous trouverez toute la documentation/exemples nécessaire(s) dans l'archive téléchargeable sur leur site.

Bonne journée :)

merci pour votre réponse mais ,j'ai trouve une solution la librairie sd a les exemples de programmes qui fonctionnent avec une connections différente sur la carte sd j'ai donc change la patte de connections qui est la 10 au lieu de la 4 et maintenant les deux librairies fonctionnent .

merci et bonne journée
F.thomas


encore un petit problème pour la sd carte, voila le logiciel de lecture pour la carte sd ,il fonctionne mais j’aimerais faire un test pour
savoir la valeur lu et de la commander un servo moteur pour lui donner le degrés voulu.Le problème et que je ne sais pas comment lire la donnée à tester ou se trouve t'elle ? dans data file ou ailleurs j'ai testez un paquets de combinaisons mais rien ne fonctionne si quelqu’un peu m'aider ce serais le bienvenue.

merci à tous
f.thomas
#include <SD.h>
const int chipSelect =10;
void setup()
{
Serial.begin(9600);
Serial.print("initialisation carte sd");
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("carte non presente");
return;
}
Serial.println("carte initialisee");
File dataFile = SD.open("data.txt");
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
}
else {
Serial.println("erreur ouverture data.txt");
}
}

void loop()
{
}
fabrice54
 
Messages: 16
Inscription: Mar 10 Juil 2012 04:49

Re: SD CARTE

Message non lude Stéphane » Mer 29 Aoû 2012 15:28

Bonjour,

Etant donné que vous m'avez envoyé le même post en message privé, je recopie ici la réponse envoyée :

Alors, d'abord, sachez que DataFile est un objet de type fichier (File). C'est à dire que dans notre cas :

File DataFile définit un objet de type fichier. pour ouvrir un fichier nommé toto.txt,
vous ferez donc

Code: Tout sélectionner
  File Datafile;
    Datafile = SD.open("toto.txt", FILE_READ);


puis pour le lire vous utiliserez l'objet Datafile :

Code: Tout sélectionner
    Datafile.read();


Ce que vous faites dans votre code, c'est que vous lisez tous les caractères du fichier "data.txt" supposé être sur votre carte SD, et vous envoyez le tout sur une liaison série sur votre ordinateur.

Code: Tout sélectionner
    while (dataFile.available()) {
    Serial.write(dataFile.read());
    }


Si vous voulez lire les caractères un par un, mettez les d'abord dans une variable, puis faites ensuite vos tests dessus.

Code: Tout sélectionner
   byte var;

    var = dataFile.read();

(Faites ensuite les tests voulus sur la valeur de "var")


Bonne journée

S.


Je rajouterai que par la structure votre programme, vous n'exécutez ceci qu'une seule fois. En effet, la fonction setup ne s'éxécute qu'une seule fois, à contrario de la fonction loop qui est une boucle infine.
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: SD CARTE

Message non lude fabrice54 » Ven 31 Aoû 2012 04:58

bonjour
voici le programme reduit à sa plus simple expression ,la comparaison ne se fais pas parce-que il affiche les chiffres en colonne en non sur la même ligne,et en plus il doit aussi lire les carriage return line find ,je pense que c'est pour cela qu'il ne peut pas faire de comparaison,
#include <SD.h>
const int chipSelect =10;
File DataFile;
byte var;
void setup()
{
Serial.begin(9600);
Serial.print("initialisation carte sd");
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("carte non presente");
return;
}
DataFile = SD.open("data.txt", FILE_READ);
while (DataFile.available()) {
var = DataFile.read();
Serial.println(var);
}
}
void loop()
{
}
fabrice54
 
Messages: 16
Inscription: Mar 10 Juil 2012 04:49

Re: SD CARTE

Message non lude Stéphane » Lun 3 Sep 2012 16:23

Bonjour,

Je vous ai écrit un programme pour vous aider à comprendre certaines choses.
Veuillez préférer poster des messages ici plutot qu'en message privé cela permettra à tout un chacun de profiter des conseils/réponses.

Code: Tout sélectionner

 
#include <SD.h>
// remplacer ici 10 par la pin reliée au ChipSelect de la carte SD
#define CS_PIN 10


File fichier;
byte valeur;

void setup()
{

  Serial.begin(9600);

   pinMode(CS_PIN, OUTPUT);
   pinMode(13,OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // ouverture fichier
  fichier = SD.open("data.txt");
 
  if (fichier) {
    //si ouverture ok
    Serial.print("opening : OK");
  } else {
    // si pb à l'ouverture
    Serial.println("error opening ");
  }
 
    while (fichier.available()) {
      valeur=fichier.read();
      if(valeur >='0' && valeur <='9')
      {
       valeur=fichier.read();
         
       
        switch (valeur){ // on peut également remplacer l'instruction switch par un if pour effetuer les tests sur la valeur de "valeur"
       
        case '0':
        // si la valeur lue est O, alors tout ce qu'il y a entre cette ligne et le "break;" suivant sera exécuté.
        //Ici, on envoie la valeur sur le port série, puis on allume la led de la pin 13
        Serial.write(valeur);
        digitalWrite(13,HIGH);
        break;
       
        case '1':
        //[...]
        break;
       
        case '3':
         //[...]
        break;
       
         //[...]
       
        default: // non optionnel, ainsi que le break apres chaque test/default
        break;
        }
        delay(100); // attendre 100ms avant de relire une autre valeur dans le fichier
      }
     
    }
   
    // fermer le fichier
    fichier.close();
   
}

void loop()
{
   
}



Voici un lien qui vous aidera par la suite à faire des tests sur des valeurs : ici.
Dans le lien que je vous ait envoyé pour vous expliquer l'usage des balises CODE ou autre sur un forum, il est écrit que le texte que l'on veut traiter doit être ENTRE les balises.
exemple (en insérant le caractère "_" dans les balises pour les rendre inopérentes :
[co_de]
Voici le code à toto...
[/co_de]

J'ai également supprimé votre post dans une autre section qui faisait doublon avec ce sujet.
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: SD CARTE

Message non lude Stéphane » Mar 4 Sep 2012 09:18

bonjour

j'ai testez votre programme ,mais vous allez voir qu'il y a un problème,quant vous écrivez Serial.print(valeur) apres while vous avez bien une valeur lue mais si vous le faite plus loin la valeur ne se lie pas et par le faite le programme ne peut pas comparer les éléments
while (fichier.available()) {
valeur=fichier.read();
//ici si vous mettez Serial.print(valeur) cela fonctionne
if(valeur >='0' && valeur <='9')
{
valeur=fichier.read();
//mais ici si vous mettez Serial.println(valeur); cela ne fonctionne plus

cordialement
F.Thomas


Effectivement il y a une erreur de copier/coller dans mon programme, qui est de refaire un " fichier.read(); " apres avoir lu et testé la valuer en cours.
Quand aux Serial.print dont vous me parlez, je ne comprend pas. Serial.print sert seulement à envoyer une valeur sur le port série. Cela n'a absolument rien à voir avec une quelconque comparaison.
Ici, dans mon programme de démonstration, dans l'ordre je fais ceci :
- Tant qu'il y a des valeurs à lire dans le fichier, executer ce qui suit :
- lire une valeur dans le fichier
- est-ce que cette valeur est comprise entre 0 et 9 (en caractère ASCII
- oui : lancer un test sur la valeur qui vient d'être lu, et pour chaque chiffre correspondant, faire les actions voulues, puis attendre 100ms
- non : ne rien faire, continuer la boucle


Je ne comprend donc pas votre interrogation sur la liaison série, car si j'ai bien compris ce que vous vouliez, vous souhaitez lire et comparer les valeurs contenues dans un fichier, et bouger un servo ou aurte en conséquence. L'envoi des données sur la liaison série est donc juste accessoire. Apres, si cela est important pour vous, mettez le apres le while, mais dans tous les cas ça ne change rien au test par valeur qui s'effectue.


P.S: arretez s'il vous plait les messages privés, comme demandé dans mon dernier post.
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: SD CARTE

Message non lude fabrice54 » Mer 5 Sep 2012 11:14

Bonjour

Cette fois le programme fonctionne ,merci beaucoup,j'utilisais les serial print comme debug pour voir si les variables changent d'etats
et effectivement cela n'avais rien à voir avec les comparaisons.
En fin de compte le problème résidais dans les bricoles (' '), mois je testais 1 ou 2 et non '1' ou '2' d'ailleurs je ne sais pas à quoi servent exactement ces petites choses la .
En tous cas merci encore pour tous vos conseils ,et je vais enfin pouvoir continuer le programme.

cordialement
F.Thomas.
fabrice54
 
Messages: 16
Inscription: Mar 10 Juil 2012 04:49

Re: SD CARTE

Message non lude Stéphane » Mer 5 Sep 2012 11:25

Bonjour,

un test/comparaison, teste une valeur (1, 2, 3, ...). Le chiffres dans votre fichier texte sont des CARACTERES ASCII, et non des valeurs directement. Chaque caractère ASCII à une valeur donnée dans la table ascii.
La lettre 'A' à une valeur de 65, le chiffre '1' une valeur de 49. SI vous comparez avec la valeur 1, 2 ou 3, c'est normal que rien ne se passe.

Pour éviter de marquer les valeurs correspondates, et pour que ce soit plus compréhensible, la comparaison se fait sur le caractère lui même (d'où les ' ', cf chapitres débutants d'apprentissage du langage C ou bien rubrique débutant du site arduino). Le programme traduit directement le caractère ascii ainsi indiqué en sa valeur.

Bonne journée.
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40


Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron