Je sors du tableau sans trouver pourquoi

Bonjour a tous les grands programmeur,

Voilà ce qui se passe : j'utilise un tableau pour faire tourner un moteur pas à pas en 1/2 pas. En grande vitesse, on ne remarque rien, mais en vitesse très lente (1 pas par seconde) je me suis aperçu d’irrégularité dans le cycle... bizarre, vérification des broches, des connections, idem.

Voila le tableau en question :

int mot[4] = {2,3,4,5}; // les quatre broches utilisées

boolean P[8][4] = {
{1,0,0,0}, //0
{1,0,1,0}, //1
{0,0,1,0}, //2
{0,1,1,0}, //3
{0,1,0,0}, //4
{0,1,0,1}, //5
{0,0,0,1}, //6
{1,0,0,1} //7

};

je lui fait lire de la façon suivante (la, c'est en arriere !) ;

void Arriere()
{
for(j = 0 ; j < 4; j++) {
digitalWrite(mot[j+2],P[cpt][j]);
}
cpt --;
if (cpt < 0) cpt = 7;
} // fin fonction

(c'est en avant, cette fois , pour tester)

Si je lui fait afficher les valeurs passées :

void Avant()
{

for(j = 0 ; j < 4; j++)
{
digitalWrite(mot[j+2],P[cpt][j]);
Serial.print(" j");
Serial.print(j);
Serial.print(" : ");
Serial.print(P[cpt][j]);
} // fin du for j on configure les quatres broches
Serial.print(" cpt :");
Serial.println(cpt);
cpt ++;
if(cpt > 7) cpt = 0; // selon cpt (de 0 a 7
} // fin fonction

il m'affiche ceci:
voir fichier joint (je n'arrive à coller directement la copie d'écran dans le message).
Bref, on voit que la première valeur correspondante a la première ligne du tableau est a "5", alors que mon tableau est sensé être " boolean"

La question est donc : "pourquoi je sors ce ce sacré tableau ?" Merci si quelqu'un trouve :slight_smile:

sortie affichage tableau.png

snippets-r-us ! :slight_smile:

ne postez pas des bouts de codes sans tout nous dire...

ou est déclaré et initialisé cpt par exemple?
si ça se trouve vous avez un débordement de variable ailleurs qui met le souk

       for(j = 0 ; j < 4; j++) {
                                  digitalWrite(mot[j+2],P[cpt][j]);

Quand j = 3, j+2 = 5. Vous sortez donc des indices possibles de "mot" qui sont 0, 1, 2, 3.

Cordialement.

Pierre

Lorsque tu entres dans Avant, cpt n'est pas initialisé à 0.
La recopie d'écran ne correspond pas au code que tu as posté on ne voit pas " j" ":"

Je fais tourner j de 0 a 3 afin d'affecter aux broches 2,3,4 et 5 la valeur correspondante a une ligne du tableaux. quand J est a 3, j'affecte a la broche J+2, CAD la broche 5 la valeur 0 ou 1.

adventum:
Je fais tourner j de 0 a 3 afin d'affecter aux broches 2,3,4 et 5 la valeur correspondante a une ligne du tableaux. quand J est a 3, j'affecte a la broche J+2, CAD la broche 5 la valeur 0 ou 1.

non pas avec mot[j+2] - il faut mot[j]+2 ou alors juste j+2 sans mot[] suivant à quelle pin vous voulez parler

Vous confondez l'indice du tableau avec la valeur qui lui est affectée :

mot[0] = 2;
mot[1] = 3;
mot[2] = 4;
mot[3] = 5;

Cordialement.

Pierre

Merci beaucoup a tous. je fais les modifs pour voir !

Ci joins programme entier , mais vraiment pas fini, aie, aie

Affichage.ino (1.36 KB)

Lecture_clavier.ino (1.72 KB)

Moteur.ino (3.02 KB)

Moteur_PAP_sans_biblio_avec_pointeurs_18_09_2017.ino (4.79 KB)

et vous avez une question?

C'etait pour répondre a la personne qui voulait l'ensemble du programme...

J'ai fait une nouvelle copie d'écran , j'ai maintenant 4 et 5 dans certaines cases qui sont censées etre en binaire !

J'ai repris ce qui concerne seulement le moteur et là, tout va bien
JML suggérait plus haut que quelque chose pouvait faire déborder le code, mais a part le traitement des touches qui utilise un pointeur et que j'ai bêtement recopié sans vraiment comprendre, je ne vois pas ???

[code]
// prog moteur PAP Sans librairie

const int nb_pas_mot = 48; // Nombre de pas du servomoteur 
int mot[4] = {2,3,4,5};
boolean P[8][4] =  {
                   {1,0,0,0}, //0
                    {1,0,1,0}, //1
                    {0,0,1,0}, //2
                    {0,1,1,0}, //3
                    {0,1,0,0}, //4     
                    {0,1,0,1}, //5
                    {0,0,0,1}, //6
                    {1,0,0,1}  //7
                   }; 
int i =0;
int j =0;
int k = 0;
int cpt = 0;
/**********************************/
void setup() 
  {
  Serial.begin(115200); 
  for(i= 2; i<6; i++)
      {
       mot[i]=i;pinMode(mot[i],OUTPUT); //on déclare les broches 2 3 4 et 5 
      }
   delay(2000);
   }
  
void loop()
    { 
     while(k < 1000)
        {    
          for(j = 0 ; j < 4; j++) //tps = micros();
               {
                digitalWrite(mot[j+2],P[cpt][j]);
                Serial.print("   j");
                Serial.print(j);
                Serial.print(" : ");
                Serial.print(P[cpt][j]);
               } // fin du for j on configure les quatres broches
          Serial.print("      cpt :"); 
          Serial.print(cpt);
          Serial.print("   k :");
          Serial.println(k);
          delay(10);   
          cpt ++; 
          if(cpt > 7) cpt = 0; 
          k++;           
        } //fin du while()
    } //fin du loop

[/code]

  for (i = 2; i < 6; i++)
  {
    mot[i] = i;
    for (j = 0 ; j < 4; j++) { //tps = micros();
      digitalWrite(mot[j + 2]

--> vous dépassez encore vos indices (et pour le premier cas c'est pas la peine puisque vous avez déjà initialisé le tableau)

pourquoi ne pas faire deux boucles for imbriquées ?

Le programme simplifié que je viens d'envoyer fonctionne trés bien, peut être avez vous essayé ?

au début, j'avais fait deux boucles for imbriquées i, j , mais je souhaite pouvoir avancer ou reculer de 1 ou n pas, avec une boucle 1 de 0 a 7, on fait 8 pas ! La piste de quelque chose qui ferait déborder ????

adventum:
Le programme simplifié que je viens d'envoyer fonctionne trés bien, peut être avez vous essayé ?

non parce qu'il est buggy :slight_smile: comme dit plus haut vous accédez à des éléments d'un tableau qui n'existent pas.

le voilà un peu plus propre

// prog moteur PAP Sans librairie

const byte nb_pas_mot = 48; // Nombre de pas du servomoteur
const byte mot[] = {2, 3, 4, 5};

const byte P[][4] =  {
  {1, 0, 0, 0}, //0
  {1, 0, 1, 0}, //1
  {0, 0, 1, 0}, //2
  {0, 1, 1, 0}, //3
  {0, 1, 0, 0}, //4
  {0, 1, 0, 1}, //5
  {0, 0, 0, 1}, //6
  {1, 0, 0, 1}  //7
};

/**********************************/
void setup()
{
  Serial.begin(115200);
  for (byte i = 0; i < 4; i++)
    pinMode(mot[i], OUTPUT); //on déclare les broches 2 3 4 et 5
}

void loop()
{
  static unsigned int k = 0; // initialisé une fois et mémorisé en local dans la fonction loop()
  
  while (k < 10) {
    for (byte cpt = 0; cpt < 7; cpt++) {
      for (byte j = 0 ; j < 4; j++) { 
        digitalWrite(mot[j], P[cpt][j]);
      } // fin du for j on configure les quatres broches
    }
    k++;
  } //fin du while()
  
} //fin du loop

Votre setup() doit être cela :

void setup()
  {
  Serial.begin(115200);
  for(i= 0; i<4; i++)
      {
      pinMode(mot[i],OUTPUT); //on déclare les broches 2 3 4 et 5
      }
   delay(2000);
   }

Ah ben J_M_L a été plus rapide que moi

Cordialement.

Pierre

Merci beaucoup les gars, c'est bien mieux comme ça J_M_L , plus propre, comme tu dit .... j'ai beaucoup a apprendre, je "bute" parfois des heures sur des trucs idiot... et puis un AT328 est quand même plutôt difficile maîtriser quand on ne travaille pas dans l'informatique ! encore merci !

pas de soucis - vous avez la bonne approche, vous n'abandonnez pas et vous cherchez. continuez!

Çà y est, mon moteur pas à pas ne fait plus de "faux pas"...il tourne parfaitement régulièrement, même a très petite vitesse. je m'étais lancé dans cette histoire car la librairie "stepper" refuse de tourner a moins d'un tour/minute et la fonction "step" me faisait des trucs bizarre. C'est pour faire tourner un Appareil photo tres lentement pour des "timelapse".

Voila, voila, je vais continuer et encore merci !

très bien!

mais vous avez mal lu la librairie... certes le RPM ne peut pas se mettre en dessous de 1 mais c'est pour régler la vitesse si vous demandez plein de pas d'un coup - mais c'est vous qui contrôlez les pas.. donc qui gérez le temps... si vous faites unstep(1);votre moteur fait 1 pas et si ensuite vous attendez une minute pour faire le prochain pas, le moteur mettra 48 minutes pour faire ses 48 pas

(sinon prenez la AccelStepper library for Arduino elle est plus performante)