Entrainement au tir à l'arc

Enregistrement des données provenant du XBEE dans un tableau à deux dimension sur carte SD avec arduino

a marqué ce sujet comme résolu.

Bonjour, Mon projet est d'enregistré des scores de tir à l'arc sur une carte SD avec arduino.

Je reçois donc une trame comprenant 8 bits d'identification,8 bits pour déterminer la cible et 16 bits pour les scores. Je dois récupérer ces informations puis remplir le tableau que j'enregistre sur la carte sd.

Le tableau sera composé de 6 ou 10 colonnes pour le nombre de volée et d'un certain nombre de cible que j'incrémente pour les lignes.

J'ai déjà réalisé un simple programme d'enregistrement sur carte sd mais je n'arrive pas à créé un tableau à 2 dimensions.. Il y a deux types de compétitions: a=6 volées soit 6 colonnes et b=10 volées soit 10 colonnes.

Je ne suis pas très expérimenté en tableau sur arduino si pouviez m'indiqué comment faire..

ps: désolé si ce n'est pas très clair

+0 -0

Je ne peut pas faire ça à cause de l’identification des cible. Image utilisateur

C'est le tableau que je veut réaliser sauf qu'on doit allé jusqu'à 6 flèches maximum et qu'il y à 10 volées max (donc un peu plus grand ..). Je met les volées dans la première colonne car je reçois les score par volée donc je remplie directement la partie du tableau dés que je reçois la volée correspondante.

oui mais comme dans le tableau ci-dessus, il y à 5 lignes par volée et comme il y a 5 cibles il faudrait alors 50 lignes .. et pour les colonnes on doit avoir au maximum 6 flèches plus la colonne cible et la colonne volée donc ça ferait 8 colonnes. Ça serait possible de faire:

1
char score[50][8]; // 50 lignes, 8 colonnes
+0 -0

Oui c'est possible.

Tu pourrais meme pousser le vice en faisant :

1
2
3
4
5
6
char score[5][10][6]; // 5 volees, 10 cibles par volees, 6 fleches par cible
...
// Exemple :
// Ma troisième flèche de la cible 9 pour la cinquieme volée a fait 9 points.
score[4][8][2] = 9;
// Rappel, les indices commencent a 0 ;)
+2 -0

Oui, un tableau à trois dimensions, c'est ce que je pensais faire au début mais je trouvais que c'était trop compliqué. Je trouve toujours que c'est trop compliqué mais je vais m'aider de ce que tu ma donné pour continuer ;) Je te tiens au courant pour la suite du projet et si j'ai d'autre questions.

+0 -0

Bon on va pas se mentir, c'est clairement pas la solution la plus propre… Perso si je le faisais je partirais sur un embriquement de structure :
(code non testé)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
typedef struct fleche {
    char score; // une fleche fait un score
} Fleche;

typedef struct cible {
    Fleche fleches[5]; // une cible possede 5 fleches
} Cible;

typedef struct volee {
    Cible cibles[10]; // une volee possede 10 cibles
} Volee;

// ----------- 

Volee mesvolees[10]; // un tableau de 10 volees
//...
// exemple : Assignement d'une valeur
// La troisieme fleche de la deuxieme cible de la huitieme volee
mesvolees[7].cibles[1].fleches[2] = 8;
// rappel, les indices demarrent a 0
+0 -0

Je vais peut être (même surement) passé pour un novice(ce que je suis) mais quand je met la fonction que tu ma proposé dans un void loop j'obtient ça:

test_struct.ino: In function 'void loop()':

test_struct.ino:25:35: error: no match for 'operator=' (operand types are 'Fleche {aka loop()::fleche}' and 'int')

test_struct.ino:25:35: note: candidate is:

test_struct.ino:7:18: note: loop()::fleche& loop()::fleche::operator=(const loop()::fleche&)

test_struct.ino:7:18: note: no known conversion for argument 1 from 'int' to 'const loop()::fleche&'

Erreur lors de la compilation.

Alors oui il y à surement des variables à déclarer et peut être une bibliothèque à utiliser mais j'ai quelque difficulté à réaliser ce programme.. :(

Je reviens en force.. J'ai essayé de faire un programme pour réussir à enregistrer sur une carte SD ce qui se trouve dans un tableau dans un autre tableau à trois dimension. Je suis légèrement dépasser(ironie quand tu nous tiens).

(il y à 5 cible, 6 flèches et 10 volées) On m'envoie un simple tableau appeler: Score1[60] = le 1 de Score signifie que c'est la cible 1, le 60 signifie qu'il y à 60 score différents qui vont être enregistrer dans le tableau 3D. Exemple: Score2[11]=10 //signifie que la cible 2, volée 2, flèches 1 vaut 10

dans mon programme j'ai éssayer d'incrementer chaque variable pour pouvoir remplir le tableau mais je n'arrive pas à taper ce que j'ai dans ma tête. en sachant que c=cible, v=volée, f=fléche.

 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
sscore[c][v][f]= Score1[s];

for(s=0 ; s < 60 ; s++)
{
    for (f=0 ; f < 6  ; f++)
    {
      monFichier.print(sscore);
      if(f=5)
      {
          for(int v=1 ; v < 6 ; v++)
          {
              f=0;
          }
      return;
      }

if(s=60)
{
        for(int c=1 ; c < 60 ; c++)
        {
            s=0;
            v=0;
        }  
    }
    return;
}
  }
    }

Je n'est pas encore prit en compte Score1/Score2/Score3… Vue que n'arrive même pas à faire Score1.. Je vais mettre mon programme entier sir vous pouvez m'apporter des conseils pour enfin le terminer..

 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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <SD.h>    //Utiliser la librairie SD
#include <SoftwareSerial.h>
int c;//cible
int v;//vole
int f;//fleche
int s;
char sscore[5][10][6];// 5cibles, 6volees, 6fleche
char Score1[60]; 

Sd2Card card;     //Variables utilisées par le programme
SdVolume volume; // pour verifier la taille de la partition
SdFile root;
File monFichier;    //Fichier à créer et effacer
const int chipSelect = 4;      //Configuré en sortie




void setup()
{

  Serial.begin(9600);   //Affichage série
  pinMode(10, OUTPUT);     // pin 53 si carte Mega

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("* le cablage est il correct ?");
    return; } else {
    Serial.println("Montage correct et carte presente"); 
    }
  if (!volume.init(card)) {
    Serial.println("Ne trouve pas de partition FAT16 / FAT32 .\nAssurez vous d avoir formate la carte");
    return;
  }
}




void loop() {

sscore[c][v][f]= Score1[s];

monFichier = SD.open("score.txt", FILE_WRITE); // ouvre le fichier en mode ecriture

if (monFichier) 
  {

      monFichier.print(sscore);
      Serial.print(sscore);


for(s=0 ; s < 60 ; s++)
{
    for (f=0 ; f < 6  ; f++)
    {
      monFichier.print(sscore);
      if(f=5)
      {
          for(int v=1 ; v < 6 ; v++)
          {
              f=0;
          }
      return;
      }

if(s=60)
{
        for(int c=1 ; c < 60 ; c++)
        {
            s=0;
            v=0;
        }  

    return;
}
  }
    }
      }
 monFichier.close();
else
{
 Serial.println("Erreur lors de l'ouverture de score.txt");
}

}
+0 -0

à ta place, j'aurais fait un peu comme eskimon propose, avec des struct. et à ma place avec ton projet, un style un peu plus POO. dans les deux cas, ça permet de faire un tableau à une seule dimension. et ça permet aussi d'avoir un modèle simple pour ta donnée avant de la stocker dans un tableau, pour faire des opérations et des fonctions dessus.

et j'ai l'impression que c'est ce que tu cherche à faire avec ton premier bout de code.

donc je te propose de revoir ce qu'eskimon te propose: les structures. ça t'évitera de faire des erreurs de syntaxe, et tout ça…

mais avant de te jeter dedans, il faut que tu nous donne un peu le comportement de ton concours. je vais te donner un exemple pour t'aider à voir ce qui est important pour nous: vu qu'il y a plusieurs cibles, je suppose qu'on part sur un concours type "tir nature", sur un circuit, mais avec des cibles "normales" (rondes avec des cercles concentriques pour les points), et tu tire une volée à chaque fois que tu passe devant une cible.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte