Cde moteur PAP et tableau

Bonjour,
Un chariot doit se déplacer suivant des coordonnées contenues dans un tableau.
J'ai mis les coordonnées à atteindre par le moteur dans celui-ci.
La boucle est supposée extraire les données une par une au moteur qui tournera du nombre de pas indiqué à chaque étape.
Le programme se compile correctement et le moniteur serie affiche bien les coordonnées du tableau à chaque passage dans la boucle mais le moteur a juste le temps d'un petit sursaut puis plus rien.
Où est l'erreur ?
CI-JOINT LE CODE

//Le moniteur serie sort bien les coordonnées mais rien ne se passe au niveau du moteur
#include <AccelStepper.h>
AccelStepper monmoteur (1,9,8);//step broche 9, dir broche 8_
int boutonin=5;//bouton de demarrage du programme

int positions[8] = {200,400,600,800,-200,-400,-600,-800};//tableau de 8 positions 
int val;
void setup()
{
Serial.begin(9600);
pinMode (boutonin,INPUT_PULLUP);
monmoteur.setCurrentPosition(0);
monmoteur.setMaxSpeed(2000);//maxi 4000pas/seconde originee (1000)
monmoteur.setSpeed(1000);//regle la vitesse du moteur (origine 500)
monmoteur.setAcceleration(1000);//lemoteur accelere et decelere en douceur (origine 50)

}

void loop() {

int etatbouton = digitalRead(boutonin);//appui du bouton : depart du programme 
if ((etatbouton)==0)
for (int i=0; i<8; i++)
{val=positions[i];}
//val=positions[i]
valSuit();
Serial.print("positions i: ");
   Serial.print(positions[val]);
   Serial.println(".");

}
void valSuit()
{monmoteur.runToNewPosition (val);}

 


Votre alimentation n'est pas correctement connectée.

regardez les accolades... (surtout celle fermant le for } ...)

Bonsoir grandiosos

Dans les grandes lignes, ton programme est bon, mais attention, un if sans accolade:
if ((etatbouton)==0)
c'est un truc à surprise(s), il faut savoir que seul l'instruction suivante est prise en compte dans la condition. Je te laisse comprendre ce qui se passe dans ce cas- Il est préférable, systématiquement, de mettre les accolades.

Ton programme corrigé:

void loop() {

	int etatbouton = digitalRead(boutonin);//appui du bouton : depart du programme
	if ((etatbouton)==0)
	{
		for (int i=0; i<8; i++)
		{
			val=positions[i];
			Serial.print("positions i: ");
//!!			Serial.print(positions[val]);
			Serial.print(val);
			Serial.println(".");
			valSuit();
		}
	}
	//val=positions[i]

}

Cordialement
jpbbricole

pour être précis, car c'est souvent un point mal compris de la grammaire C++

Dans TOUS LES CAS seul le statement suivant est pris en compte

La syntaxe c'est if (condition) statement

si j'écris

if (condition) 
  for (int i = 0; i < 10; i++) 
    statement

l'instruction for() est un iteration statement donc toute la boucle for est liée au if.

Mais si j'avais écrit

if (condition)
   statement1
   statement2
   statement3

alors seul statement1 est lié au if, c'est plus lisible ainsi

if (condition) statement1
statement2
statement3

Dans ce cas, si on voulait tous les statements dans le if, on peut aussi créer ce qu'on appelle un compound statement. C'est à cela que servent les accolades {}.

if (condition) { // <== ouverture du compound statement 
   statement1
   statement2
   statement3
  ...
   statementN
} // <== fermeture du compound statement 

Donc oui, les accolades sont importantes quand on veut grouper plusieurs statement en un seul.

Dans le cas du code d'origine on avait donc

if ((etatbouton)==0)
  for (int i=0; i<8; i++) {
    val=positions[i];
  }

la boucle for était exécutée si la condition du if était vraie et elle ne faisait qu'affecter val en séquence à toutes les positions mais sans rien faire d'autre et finit donc sur la dernière position.

L'optimiseur sait se rendre compte de ce genre de chose et a sans doute remplacé le code sous cette forme

if (etatbouton == 0) val=positions[7];
//tableau1.ino
#include <AccelStepper.h>
AccelStepper monmoteur (1,9,8);//step broche 9, dir broche 8_
int boutonin=5;//bouton de demarrage du programme

int positions[8] = {200,400,600,800,-200,-400,-600,-800};//crée un tableau de 8 positions 
int val=0;
void setup()
{

pinMode (boutonin,INPUT_PULLUP);
monmoteur.setCurrentPosition(0);
monmoteur.setMaxSpeed(2000);//maxi 4000pas/seconde originee (1000)
monmoteur.setSpeed(1000);//regle la vitesse du moteur (origine 500)
monmoteur.setAcceleration(1000);//lemoteur accelere et decelere en douceur (origine 50)

}

void loop() {

int etatbouton = digitalRead(boutonin);//depart
if ((etatbouton)==0)
{
    for (int i=0; i<8; i++)
    {
         val=positions[i];
    }

valSuit();
 
}    
void valSuit() {(monmoteur.runToNewPosition (val);} 
}
}


J'ai maintenant une erreur de compilation : Compilation error: 'valSuit' was not declared in this scope

Compilation error: 'valSuit' was not declared in this scope

Ta fonction valSuit n'est pas à la bonne place. Voila à quoi doit ressembler ton programme:

//tableau1.ino
#include <AccelStepper.h>
AccelStepper monmoteur (1,9,8);//step broche 9, dir broche 8_
int boutonin=5;//bouton de demarrage du programme

int positions[8] = {200,400,600,800,-200,-400,-600,-800};//crée un tableau de 8 positions
int val=0;
void setup()
{
	Serial.begin(9600);
	pinMode (boutonin,INPUT_PULLUP);
	monmoteur.setCurrentPosition(0);
	monmoteur.setMaxSpeed(2000);//maxi 4000pas/seconde originee (1000)
	monmoteur.setSpeed(1000);//regle la vitesse du moteur (origine 500)
	monmoteur.setAcceleration(1000);//lemoteur accelere et decelere en douceur (origine 50)

}

void loop() 
{

	int etatbouton = digitalRead(boutonin);//appui du bouton : depart du programme
	if ((etatbouton)==0)
	{
		for (int i=0; i<8; i++)
		{
			val=positions[i];
			Serial.print("positions i: ");
			//!!			Serial.print(positions[val]);
			Serial.print(val);
			Serial.println(".");
			valSuit();
		}
	}
	//val=positions[i]
}

void valSuit()
{
	monmoteur.runToNewPosition (val);
}

A+
Cordialement
jpbbricole

Ton code n'étant pas indenté, c'est le genre d'erreur courante qui peut arriver.
De plus dans les bonnes pratiques il est mentionné qu'il faut indenté ton code avant de le poster :frowning:

Merci à tous de m'avoir aidé.
C'est vrai que l'indentation permet d'y voir plus clair mais quand on code de manière occasionnelle, malgré soi on n'a pas les bonnes pratiques.
En tout cas le programme marche parfaitement.

il ne vous reste plus qu'à nettoyer un peu

  • utiliser const byte comme type pour les N° de pin
  • les positions seraient sans doute mieux (plus de flexibilité) en utilisant long au lieu de ìnt`
  • la console série pourrait être à 115200 bauds, pas la peine d'aller lentement
  • sur arduino on utilise le camelCase pour les noms de variables et fonctions (boutonin ➜ boutonIn, monmoteur ➜ monMoteur, ...)

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