tableau à deux dimension

Bonjour

J'ai récupéré un robot-bras motorisé par cinq moteurs classiques des années 80 piloté par un vieil ordinosaure .Chaque moteur est couplé à un potentiomètre de précision qui permettent de déterminer la position du bras. J'ai branché l'ensemble sur un mega et des l298n. J'arrive à contrôler grossièrement l'ensemble ce qui est positif. Je souhaite maintenant "apprendre" à ce bras à passer par certaines positions et les reproduire à la chaîne.

J'ai donc décomposé mon (futur) programme en deux étapes:
-je positionne le bras la ou je le souhaite
-j'appuie sur un bouton et lis les valeurs analogiques de chaque potentiomètre que j'enregistre dans la ligne 1 de mon tableau.
je reproduis 10 fois cette opération et j'obtiens un tableau de 10 lignes et 5 colonnes décrivant les 10 positions
-après le dernier enregistrement, le robot reproduit les 10 opérations successivement et recommence le cycle.

Voici une ébauche du programme avec la partie qui me pose problème : le tableau.
Sachant que mes valeurs vont de 0 à 1024, que dois je choisir comme type de variable ?
La partie void longPressStop() provoque une erreur à la compilation . Je pense me planter dans cette partie, qu'est ce qui ne va pas?
en pj le programme que je souhaite envoyer au robot
Olivier

int ordrebase = 0; // la valeur du potentiomètre ou doit aller le moteur
int ordrejamb = 200;
int ordrebras = 500;
int ordrepivo = 800;
int ordrepinc = 1023;
int i = 0;

int Tab2D[10][5] ;// = {{0, 200, 500, 800, 1023}};

// La librairie de gestion des boutons
#include <OneButton.h>
const byte buttonPin = 13; // notre bouton est sur la pin 3
OneButton button(buttonPin, true); // true pour le mettre en INPUT_PULLUP

void clickSimple() {
  chargerNouvellePosition();
  i++;
}

void longPressStop() {
  
  Tab2D[i] = {1+i,2+i,3+i,4+i,5+i} //{analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3), analogRead(A4)};
  i++;
}

void chargerNouvellePosition()
{
  ordrebase = Tab2D [i - 10] [0] ;
  ordrejamb = Tab2D [i - 10] [1] ;
  ordrebras = Tab2D [i - 10] [2] ;
  ordrepivo = Tab2D [i - 10] [3] ;
  ordrepinc = Tab2D [i - 10] [4] ;

}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  button.attachLongPressStop(longPressStop);
  button.attachClick(clickSimple);
}

void loop() {
  // put your main code here, to run repeatedly:
  button.tick();

  if (i >= 10) {
    Serial.print("un:");
    Serial.print(ordrebase);
    Serial.print("   deux:");
    Serial.print(ordrejamb);
    Serial.print("   trois:");
    Serial.print(ordrebras);
    Serial.print("   quatre:");
    Serial.print(ordrepivo);
    Serial.print("   cinq:");
    Serial.println(ordrepinc);
  }
  if (i = 20) {
    i = 10;
  }
}

robot4.ino (4.8 KB)

Bonsoir

La partie void longPressStop() provoque une erreur à la compilation

Reproduire içi le message d'erreur

Sachant que mes valeurs vont de 0 à 1024, que dois je choisir comme type de variable ?

int c'est bon, mais le type uint16_t est le mieux adapté dans ce cas

Tab2D[i] = {1+i,2+i,3+i,4+i,5+i}

Tu ne peux pas assigner les valeurs d'un tableau de cette façon. C'est seulement lors de la déclaration qu'on peut faire ça.

Il faut assigner chaque valeur séparément, soit manuellement:

Tab2D[i][0] = 1+i;
Tab2D[i][1] = 2+i;
...

Ou dans ce cas précis tu peux aussi le faire avec un loop

for (size_t j = 0; j < 5; j++)
{
  Tab2D[i][j] = j+1 + i;
}

Mais évite d'utiliser une variable globale nommée 'i'...

Et dans ta fonction chargerNouvellePosition() tu fais i - 10 sans savoir si i est >= 10, donc il se peut que ton code essaie d'accéder à une zone mémoire qui est en dehors des limites du tableau

Repense ton programme avec un peu plus de logique.

olitask:

  if (i = 20) {

i = 10;
  }

la comparaison, c'est avec ==

if (i == 20)
    i = 10;

Alors merci à tous. j'ai pigé mon problème de tableau , et comme le dis Guix, mon code est tiré par les cheveux. Alors ce n'est plus un problème de tableau, mais je reste dans le fil
je l'ai modifié ainsi :

mais je ne passe jamais à initialisation = 0 et les enregistrements se font en boucle.
PS j'ai mis le code complet en PJ.
J'ai du encore faire une boulette tellement grosse que même le doigt dessus je ne la vois pas ( merci Biggil)

void loop() {
   Serial.println(initialisation);
   delay(3);        // delay in between reads for stability
  if (initialisation = 1 ) {
    button.tick(); // enregistre les analog read dans le tableau à la pression du boutton dans la bonne ligne puis ligne++
    if (ligne == 10) {
      initialisation = 0;  les enregistrements sont terminés, on passe à la partie moteur
      ligne = 0;
    }
  }
  else   {
    if ( (abs(sensorbase - ordrebase) < 15) && (abs(sensorjamb - ordrejamb) < 8) &&  (abs(sensorbras - ordrebras) < 10) && (abs(sensorpivo - ordrepivo) < 15) && (abs(sensorpinc - ordrepinc) < 30) ) {

      mettreAuRepos();
      delay(700);
      ligne++;
    }
    else {
      actionMoteur();
    }
    if (ligne == 10) {
      ligne = 0;
    }
  }
}

robot4.ino (5.11 KB)

C'est la même erreur que celle signalée dans le message juste au-dessus

  if (initialisation = 1 ) {

à remplacer par

  if (initialisation == 1 ) {

Je suis un boulet :kissing:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.