Comment enregistrer le parcours d'un robot sur carte Sd et le reproduire

Bonjour, en clair je voudrais que mon robot enregistre le parcours que je lui fait suivre en commande manuelle pour qu'il le reproduise en suite à partir des données enregistrées sur carte SD. Je saurais le faire sur l'eeprom de l'Arduino mais elle saturerait vite

J'ai cherché sur Google et je n'ai rien trouvé de clair ou je n'ai pas compris que j'avais trouvé.

Je sais enregistrer les données sur la carte SD (les impulsions envoyées aux 4 moteurs et directions) toutes les 5 millisecondes dans mon programme de contrôle des moteurs. Mais comment récupérer tout ça dans l'autre sens : SD -> Moteurs ? J'ai vaguement compris que je devrais utiliser les fonctions "position" "peek" et peut être "seek" de la librairie SD mais je n'ai trouvé aucun exemple simple de leur utilisation.

Si quelqu'un pouvait me mettre sur la voie ce serait sympa.

La voie ==> File.read()

Ok mais comment ne pas lire toutes les données d'un coup mais seulement les quatre premières au premier passage dans la boucle puis les quatre suivantes et ainsi des suite jusqu'à la fin du fichier mémorisé sur la SD ?

C'est toi qui choisit le moment où tu lis donc c'est toi qui donne le rythme.

Messieurs les érudits, merci beaucoup de vous pencher sur mon humble personne mais pourriez plutôt descendre à mon piètre niveau sans trop de condescendance car cela ne m'a pour le moment pas éclairé beaucoup.

Un des exemples de la librairie SD (Datalogger) créé un fichier sur la carte SD à partir de données mesurées sur 3 entrées analogiques et un autre exemple(Dumpfile) affiche ce même fichier en entier sur le moniteur série.

Je voudrais juste savoir comment lire certaines données de ce fichier et non pas sa totalité.
Je n'ai pas ces connaissances là en C++ et j'ai précisé ne pas avoir trouvé de réponse assez claire pour moi sur internet.

C'est pour cela que je demande l'aide sur ce forum, si ce n'est pas sa fonction veuillez m'excusez, si vous ne désirez pas m'aider, c'est votre droit.

Par ailleurs, as-tu été regarder ce que faisait la méthode read() ? Elle te permet de lire un fichier octet par octet, donc ensuite, c'est à toi de traiter chaque octet comme tu le souhaites. Soit il t'es utile et tu le traites, soit tu n'en as pas besoin et tu passes au suivant.

Nous avons fait l'effort de t'aiguiller par rapport à ce que nous avons compris de ton besoin et le peu de détails que tu nous as donné. Si tu ne comprends pas nos réponses, je pense qu'il faut que tu reprennes les bases de l'algorithmique et de la programmation avant d'essayé d'aller plus loin.

Ensuite, si tu allais lire la charte du forum (ce que tu n'as sans doute pas fait), tu verrais que pour obtenir une aide pertinente, il est nécessaire de fournir beaucoup plus d'informations que ce que tu nous a fourni. Nous ne sommes pas en classe avec toi et n'avons pas le cahier des charges de ton projet.

Si tu as déjà fait du code, poste le, ça pourra surement nous aider à t'aider.

Merci messieurs, j'ai donc continué mes recherches et ai effectivement trouvé des choses comme celle là :

byte var;

    var = dataFile.read();

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

Mais je ne trouve pas comment reprendre les tests de la variable var là où ils s'étaient arrêtés à la première ouverture du fichier.

Je ne suis pas en classe effectivement, je suis plutôt enseignant mais c'est juste que je n'ai pas pour habitude je jeter des bouquins à mes élèves pour qu'ils se dérouillent tous seuls , surtout aux moins doués.

bonjour,
je ferais déjà un premier test.
lire le nombre de lignes et le stocker dans une variables.
après, via un compteur d'incrémentation => 4 pour ton cas
on ouvre le fichier et un pointeur va lire ligne par ligne et stocker le numéro de la ligne de fin
on ouvre encore le fichier et on va se placer à ligne du pointeur stocké +1 pour lire une autre série de lignes.
etc..
ca donnerait quelque chose comme ca vite fait, surement des erreurs, mais le principe est là

int compteur = 0;
int nbligne = 4;
int pointeur = 0;
int pointeur1 = 0;

void loop(){
File f = SD.open("data.txt", FILE_READ);
if(f)
{
    while(f.available())
    {
       char c = f.read();
         if(c == '\n' && nbligne > compteur && pointeur < pointeur1)
         {
          compteur++;
            Serial.write('fin de ligne');
          pointeur = pointeur + compteur;
         }
         else
        {

          Serial.write(c);
        }
    } 
    f.close();
   pointeur1 = pointeur;
   compteur = 0;
  }
  else
  {
    Serial.println("Impossible ouvrir fichier");
  }
}

Merci beaucoup pour cette première pièce de l'édifice que je vais essayé de terminer moi même, comme un grand.

oups, j'ai oublié un truc dans le setup
on lit tout le fichier une première fois

File f = SD.open("data.txt", FILE_READ);
if(f)
{
    while(f.available())
    {
       char c = f.read();
         if(c == '\n' )
         {
           pointeur++;
          }
    } 
    f.close();

Bonsoir à l'aide précieuse reçue sur ce forum et à quelques heure de recherches et de tests voilà la solution de mon problème.

Pour lire les données d'une carte SD stockées dans cette configuration :

45,0,27,0
35,0,17,0
35,0,17,0
66,0,16,1
109,0,41,1
109,0,41,1
109,0,41,1
109,0,41,1
111,0,39,1
111,0,39,1

Mon code:

#include <SPI.h>
#include <SD.h>
const int chipSelect = SS;  //carte SD
File dataFile;
int compteur = 1;
int  DIRg, DIRd;   // directions des moteurs
String  speedRequired_L=""; //vitesse moteur gauche
String  speedRequired_R=""; //vitesse moteur droit


void setup(){
  Serial.begin(38400);
  pinMode(SS, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    while (1) ;
  }
  Serial.println("card initialized.");

  dataFile = SD.open("datalog.txt", FILE_READ);
  if (!dataFile) {
    Serial.println("error opening datalog.txt");
    while (1) ;
  }
}

void loop(){

  if(dataFile)
  {
    while(dataFile.available())
    {
      char c = dataFile.read();
      while(c != '\n')
      {
        if(c!='\,'){
          if( compteur==1){
            speedRequired_L += c;         
          }
          if( compteur==2 ){
            DIRg = c;           
          }  
          if(compteur==3 ){
            speedRequired_R += c;           
          }
          if( compteur==4 ){
            DIRd = c;
                        
          } 
          c = dataFile.read();           
        }
        else{
          compteur++;
          c = dataFile.read();
        }
      }
      // ici j'affiche la lecture des données mais n'importe quel autre traitement est possible
      /*  A utiliser pour des valeurs à virgules ou > abs 32768

       char buf1[speedRequired_L.length()];
       speedRequired_L.toCharArray(buf1,speedRequired_L.length()+1);
       float vall=atof(buf1);
       char buf2[speedRequired_R.length()];
       speedRequired_R.toCharArray(buf2,speedRequired_R.length()+1);
       float valr=atof(buf2);
       Serial.print(vall);
       Serial.print(",");
       Serial.print(DIRg-48);
       Serial.print(",");     
       Serial.print(valr);
       Serial.print(",");
       Serial.println(DIRd-48);
       compteur =1;
       */
       
      Serial.print(speedRequired_L.toInt());
      Serial.print(",");
      Serial.print(DIRg-48);
      Serial.print(",");     
      Serial.print(speedRequired_R.toInt());
      Serial.print(",");
      Serial.println(DIRd-48);
      speedRequired_L="";
      speedRequired_R="";
      compteur =1;
     
    } 
    dataFile.close();

  }
}

Merci encore pour votre aide.