Lecture de valeurs sur une carte SD

Bonjour à tout le monde,

Je crée un nouveau topic pour vous demandez votre aide. Mon projet consiste à mémoriser un parcourt d'un bras robotisé avec des joysticks et de restituer le parcourt grâce à une carte SD. Pour la mémorisation cela marche parfaitement, je crée un fichier, j'enregistre les valeurs dessus des joysticks, niquel, tout ça marche bien. Mon soucis concerne la restitution du parcours. Je voudrais utiliser les valeurs des joysticks enregistrées sur le fichier de la SD, et les envoyer sur le servo-moteur mais je n'ai aucune idée de comment je peux faire ça. En espérant que vous pouvez m'aider, merci beaucoup.

Bonjour

en l’état actuel des choses tu arrive à commander un servo moteur par les joystick? ou tu arrives juste à faire la mémorisation?

si tu arrives a commander les servomoteur tu peux remplacer les ordre reçu par les servo (ces ordres viennent des joystick) par les ordres lu sur la carte SD

J’ai un programme qui contrôle le servo moteur par les joysticks et un autre programme qui enregistre les valeurs des joysticks, et ce que je n’arrive pas, c’est de prendre les valeurs enregistrées par les joysticks pour qu’elles soit envoyées au servo moteur

Comment je peux remplacer les ordres par les ordres lu sur la carte SD ?

Merci de ta réponse

bonjour, butineur lire fichier sd arduino ;)

tu répond toi même à ta question tu lis les donnée sur la carte et tu envoi les ordres au servo moteur... a la place des ordres envoyés par les joystick tu les envoi depuis la lecture de la carte SD...

Mais ce que je me demande, c’est comment je fais pour envoyer les ordres de la carte SD au servo
Merci

Salut sur ta SD tu va lire des donnée en générale au format text que tu doit convertir dans la bonne unité!

si tu as par exemple inscri sur ta SD 10.1;22.0; etc ...

alors tu va devoir faire un buffer de reception des carractéres , utilisé la fonction read(); qui te renvoi le caracter lu , placer ce carractére dans le bufer , lire le suivant j'usquau séparateur qui est ici le" ;".

ensuite avec les bonnes fonctions tu lit le buffer et transforme la chaine de carractére en donnée par exemple avec atoi(); pour les int atof(); pour les float

une foi tes données transformées tu envoi l'ordre au servo.

un tres bon tuto:https://skyduino.wordpress.com/2012/06/19/arduino-charger-un-fichier-de-configuration-depuis-une-carte-sd/

Bonjour à tous, tout d’abord merci Heloderma-kris pour ta réponse, mais je ne pense pas qu’il fasse quelque chose d’aussi “gros” je vous met ci-dessous mon programme et mon soucis plus clairement :

"// — Inclusion des librairies —
#include <SPI.h>
#include <SD.h>
#include <TinkerKit.h>
#include <Servo.h>

float voltage;
const int SDCard=(50,51,52,53); // broche utilisée pour sélectionner la SD card
TKJoystick joystick(I0, I1);
int test; // Variable utilisée pour tester valeur renvoyée par fonctions SD Card

int x = 0; // Variable pour la valeur x du Joystick
int y = 0; // Variable pour la valeur y du Joystick
int xAxisValue = 0;
int yAxisValue = 0;

Servo myservo;

File file; // objet file
File root; // objet root pour le répertoire racine

void setup() { // debut de la fonction setup()

Serial.begin(115200); // initialise connexion série à 115200 bauds
myservo.attach(9);
pinMode(53, OUTPUT); // met la broche 10 (SS) en sortie (nécessaire avec module ethernet)
digitalWrite(53, HIGH); // mais désactive le circuit intégré W5100 du module ethernet!

//----- initialisation de la carte SD -----
Serial.println(“Initialisation de la SD card…”);

pinMode(53, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

test=SD.begin(SDCard); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

if (test!=true) { // si initialisation n’est pas réussie
Serial.println(“Echec initialisation!”); // message port Série
}
else { // si nitialisation réussie
Serial.println(“Initialisation reussie !”); // message port Série

//----- affiche le contenu du répertoire

root = SD.open("/"); // ouvre la SD Card à la racine

Serial.println(“Repertoire racine ouvert !”);

} // fin si initialisation réussie
} // fin de la fonction setup()

void loop(){ // debut de la fonction loop()

int valeurA3 = analogRead(A3);
voltage=map(valeurA3,0,1024,0,255);

//---- efface fichier au préalable —
test=SD.remove(“data.txt”); // efface fichier et mémorise résultat opération
if (test)Serial.println(“Fichier efface”); // affiche message si fichier bien effacé

//---- crée fichier en écriture —
file = SD.open(“data.txt”, FILE_WRITE); // ouvre le fichier en écriture
// NB : le fichier est créé si il n’existe pas !

//---- test si fichier dispo en écriture
if (!file){ // si fichier pas dispo

Serial.println (“Erreur ouverture fichier !”);

} // fin if

else { // si le fichier existe et est ouvert
Serial.println (“Fichier pret pour ecriture !”);

// premiere ligne du fichier CSV - entete avec liste des champs
file.println(“NumeroMesure ; X ; Y ; X2 ; Y2 ; Millis”);

Serial.println (“Enregistrement en cours :”);

for (int i=0; i<1000; i++) { // n mesures CAN

x = joystick.readX();
y = joystick.readY();

// valeur premier champ
file.print(i), file.print(’;’);

// valeur deuxieme champ
file.print(x), file.print(’;’);

// valeur troisieme champ
file.print(y), file.print(’;’);

// valeur quatrième champ
file.print(millis());

// le dernier champ doit se terminer par un saut de ligne +++
file.println();

delay(10); // entre chaque mesure
if ((i+1)%50) Serial.print("."); else Serial.println(".");// affiche ligne de 50 points
} // fin boucle for

file.close(); // ferme le fichier

} // fin else

//Manque de la partie nécessaire pour l’utilisation des valeurs du fichier texte afin d’envoyer les valeurs au servo

//Fin du manque de la partie

if ( x < 300)
{
myservo.write(360);
}
if ( x > 700 )
{
myservo.write(0);
}
if( x < 700 && x > 300)
{
myservo.write(90);
}
}"

Comme vous le voyez, j’initialise la carte SD, j’enregistre les valeurs de l’axe X et Y du joystick sur un fichier texte sur la carte SD, et là c’est qu’une partie est manquante ( que j’ai montré par 2 commentaires ) : Je ne sais pas quelle commande j’ai besoin pour faire en sorte que les valeurs qui sont dans la partie servo soit les valeurs X et Y du fichier ( qui sont celle du joystick ).

Merci de vos futurs réponses !

C'est cadeau : ICI

Bilbapou: mais je ne pense pas qu'il fasse quelque chose d'aussi "gros"

et moi je pense que tu n'aura pas le choix car les donné sont stoké sous forme de chaine de carractére donc par exemple si tu as X=12 y =20: une fois ecrit sur la SD ce ne sera plus des int mais des caracterres les un à la suite des autres il faudrat donc les lire, determiné quel longueur il font et les convertir!

donc pour :

12;20;

la fonction read() sera executé 6 fois elle s'arretera 2 foi sur les ";" et il faudrat au moins un buffer ( tableau de char) type

mon_buffer[3];

ou seront placer dabord un 1 pui un 2 , on s'arrete sur le ";" on convertie le tableau en int avec

 atoi();

ce qui te donnera 12 en valeur int. Et Ainsi de suite pour les autres valeurs, il te resterat à écrire un algorhytme qui sait à quelle moment tu es sur un X ou Y.

"Ecrire un algorhytme qui sait à quelle moment tu es sur un X ou Y" Comment ça un algorhytme ?

par exemple lorsque tu ecrit 12;20 tu test une variable de teste , il faut ecrire un petit bout de programe de lecture conversion comme ça par exemple:

bool TestX=false;// teste switche x-y
char c;// variable du carractere lu par READ();
char buffer [3]; //Buffer de reception
byte curs1=0;// curseur de position dans le buffer
// tu remplit le buffer jusqu'a ce que tu trouve un ";"


for (long j = 0L; j < fichier.fileSize(); j++) // boucle de parcour du fichier
{

  char c = fichier.read(); // lecture du carracter suivant
  if (c != ';') // comparairon au séparateur de variable
  {
    buffer[curs1] = c; // mise en buffer du caractere
    curs1++;// déplacement du curseur de buffer
  }
  else { // si un ; a ete trouve
    if ( TestX == false) { // si on est sur un X
      X = atoi(buffer);
      TestX = true; //on passe la variable de test a vrai
      curs1 = 0; // on reinitialise le curseur
    } else { // si on a deja eu un X
      Y = atoi(buffer);
      TestX = false;
      curs1 = 0;
    }
  }
}

D’accord, merci beaucoup pour tes réponses, je vais essayer en utilisant ce que tu m’as demandé.

Bonjour, je reviens aujourd'hui pour une question : Je voudrais utiliser la fonction atoi sur arduino, et pour ça il me faut la bibliothèque Stdlib.h, mais impossible de la trouver. Est ce que vous auriez un lien où je peux la télécharger ?

normalement pas besoin elle est implémenter de base dans arduino. ça marche sans inclure stdlib. :wink:

Bonjour à tous, j’ai avancé dans le programme mais je n’arrive toujours pas à avoir ce que je veux :

// --- Inclusion des librairies ---
#include <SD.h>
#include <SPI.h>
#include <TinkerKit.h>
#include <Servo.h>
int c;
float voltage;
const int SDCard=4; // broche utilisée pour sélectionner la SD card 
TKJoystick joystick(I0, I1); 
int test; // Variable utilisée pour tester valeur renvoyée par fonctions SD Card

int x = 0;      // Variable pour la valeur x du Joystick
int y = 0;      // Variable pour la valeur y du Joystick
int xAxisValue = 0;
int yAxisValue = 0;

Servo myservo;

File file; // objet file 
File root; // objet root pour le répertoire racine
int compteur = 1;

void setup()   { // debut de la fonction setup()

Serial.begin(115200); // initialise connexion série à 115200 bauds 
myservo.attach(9);
pinMode(10, OUTPUT); // met la broche 10 (SS) en sortie (nécessaire avec module ethernet)
digitalWrite(10, HIGH); // mais désactive le  circuit intégré W5100 du module ethernet!

  //----- initialisation de la carte SD ----- 
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(SDCard); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

  //----- affiche le contenu du répertoire 

  root = SD.open("/"); // ouvre la SD Card à la racine

  Serial.println("Repertoire racine ouvert !");

  } // fin si initialisation réussie
} // fin de la fonction setup()

void loop(){ // debut de la fonction loop()

int valeurA3 = analogRead(A3);			
voltage=map(valeurA3,0,1024,0,255);

  //---- efface fichier au préalable ---
  test=SD.remove("data.txt"); // efface fichier et mémorise résultat opération  
  if (test)Serial.println("Fichier efface"); // affiche message si fichier bien effacé

  //---- crée fichier en écriture --- 
  file = SD.open("data.txt", FILE_WRITE); // ouvre le fichier en écriture
  // NB : le fichier est créé si il n'existe pas !

  //---- test si fichier dispo en écriture 
  if (!file){ // si fichier pas dispo

    Serial.println ("Erreur ouverture fichier !");

  } // fin if

  else { // si le fichier existe et est ouvert
    Serial.println ("Fichier pret pour ecriture !");

    // premiere ligne du fichier CSV - entete avec liste des champs
    file.println("NumeroMesure  ;  X  ;  Y  ;  X2  ;  Y2  ;  Millis");

    Serial.println ("Enregistrement en cours :");

    for (int i=0; i<1000; i++) { // n mesures CAN 

      x = joystick.getXAxis();  
      y = joystick.getYAxis();

      // valeur premier champ
      file.print(i), file.print(';'); 

      // valeur deuxieme champ
      file.print(x), file.print(';'); 

      // valeur troisieme champ
      file.print(y), file.print(';'); 

      // valeur quatrième champ
      file.print(millis());

      // le dernier champ doit se terminer par un saut de ligne +++
      file.println();

      delay(10); // entre chaque mesure
      if ((i+1)%50) Serial.print("."); else  Serial.println(".");// affiche ligne de 50 points

    } // fin boucle for
  } // fin else


bool Testx=false;
char c;
char buffer[3];
byte curs1=0;

  Serial.println ("Lecture des valeurs");
for (long j = 0L; j < file.size(); j ++)
{ char c = file.read();
if ( c != ';')
{
  buffer [curs1] = c;
  curs1++;
}
else {
  if ( Testx = false) {
    x = atoi(buffer);
    Testx = true;
    curs1 = 0;
  } else {
   y = atoi(buffer);
  Testx = false;

  }
}
}

Serial.println ("Envoie des valeurs au servo");

if ( x < 300)
{ 
  myservo.write(360);
}
if ( x > 700 )
{
  myservo.write(0);
}
if  ( x < 700 && x > 300 ) 
{
  myservo.write(90);
}
file.close();
while(1);
}

J’ai ceci, mais mon programme s’arrête au commentaire : “Lecture des valeurs” et après ça plus rien. Je n’ai pas très bien compris le système de atoi et buffer et je ne sais pas où est mon erreur, si quelqu’un est disponible, merci beaucoup. Bonne journée.

tu as simplement fait un copier coller du code que je t’ai mis en exemple as tu compris a quoi il servait?

le buffer de base j’ai mis 3 pour exemple mais quel taille fait une mesure .

un buffer 3 ne pourra contenir que 3 deux carracter et le carracter final , tu ne peut pas avoir plus de 2 chiffre par nombre 0 à 99 . si tu doit ecrire 10000 il faudra 6 case donc :
char buffer[6];

ensuite intercale un Serial.print(c); comme ça :

Serial.println ("Lecture des valeurs");
for (long j = 0L; j < file.size(); j ++)
{ char c = file.read();
Serial.print(c);// pour voir ce qui est lu sur la SD
if ( c != ';')
{
  buffer [curs1] = c;
  curs1++;
}
else {
  if ( Testx = false) {
    x = atoi(buffer);
Serial.print("X=");//on affiche la valeur converti de x
Serial.println(x);
    Testx = true;
    curs1 = 0;
  } else {
   y = atoi(buffer);
Serial.print("Y=");
Serial.println(y);
  Testx = false;

  }
}
}

la fonction atoi() ser a convertir un tableau de char par exemple {1,2,3,4,\0}
en la valeur entiere 1234.
voir atoi - C++ Reference

J'ai remplacé comme tu m'as dis mon buffer à 5 vu que c'est 1023 ma valeur maximum et quand je lance le programme j'ai ça :

"Initialisation de la SD card... Initialisation reussie ! Repertoire racine ouvert ! Fichier efface Fichier pret pour ecriture ! Enregistrement en cours : .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. Lecture des valeurs ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"

Je n'arrive pas à savoir d'où vient ce problème de ÿ...

autant pour moi j’ai fai une erreur dans le code textX j’ai mi un seul ‘=’ au lieu de deux
tu est sur de ce qu’il y a d’ecri sur ta carte , tu as verifier les donnée?
je vien de rajouter quelques logg sur le serial que tu aurai put mettre , il faut apprendre a ce servire du serial c’est un outil pratique pour débugué :grin:

Serial.println ("Lecture des valeurs");
for (long j = 0L; j < file.size(); j ++)
{
  char c = file.read();
  Serial.print(c);// pour voir ce qui est lu sur la SD
  if ( c != ';')
  {
    Serial.println();
    Serial.println(" character de fin trouve");
    buffer [curs1] = c;
    curs1++;
  }
  else {
    if ( Testx == false) {
      Serial.println();
      Serial.println(" conversion de X ");
      x = atoi(buffer);
      Serial.print("X=");//on affiche la valeur converti de x
      Serial.println(x);
      Testx = true;
      curs1 = 0;
    } else {
      Serial.println();
      Serial.println(" conversion de y");
      y = atoi(buffer);
      Serial.print("Y=");
      Serial.println(y);
      Testx = false;
    }
  }
}// fin  de boucle for
Serial.println ("fin de Lecture des valeurs");

Bonjour, j'ai corrigé ce qui était faux et ça a changé dans le moniteur désormais il m'affiche ça :

"Initialisation de la SD card... Initialisation reussie ! Repertoire racine ouvert ! Fichier efface Fichier pret pour ecriture ! Enregistrement en cours : .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. Lecture des valeurs ÿ character de fin trouve ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ conversion de X ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿconversion de X ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿonversion de X ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnversion de X ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿversion de X ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿe X ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ X ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX= ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ= ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ conversion de y ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿconversion de y ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿonversion de y ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnversion de y ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿversion de y ÿ " Et il me fait ça à l'infini, je n'arrive pas à savoir pourquoi

Mon fichier dans le carte est sous cette forme :

"1017;1023; 1017;1023; 1017;1023; 848;1023; 465;1023; 25;1023; 21;1023; 21;1023; 21;1023; 21;1023; 21;1023; 21;1023;"

D'un côté c'est X, de l'autre Y