Partage
  • Partager sur Facebook
  • Partager sur Twitter

arduino: programmation d'un moteur pas à pas.

Prise d'origine moteur pas à pas

21 août 2015 à 9:35:29

bonjour,

je vous écris car j'ai besoin de votre aide, j'aimerais faire un petit programme pour faire une prise d'origine à mon moteur pas à pas puis de le faire avancer d'un nombre de pas très précis mais voilà je bloque littéralement sur la deuxième partie du programme. je préfère vous donner le programme est ensuite je vous expliquerais le programme à la fin.

Programme:

#include accelstepper.h

AccelStepper stepper1(1, 9, 8);

 int pos = 10; // variable pour la prise d'origine.

int capteur ;

void setup()

{

stepper.setMaxSpeed(3000);

stepper.setAcceleration(1000);

pinMode(12, INPUT); // capteur de Prise d'origine

digitalWrite(12, HIGH); // pull up interne de l'arduino

}

void loop()

{

capteur = digitalRead(12);

while(capteur == LOW) // tant que le moteur n'est pas à sa position d'origine je fais cette action

{

delay(500);

pos = pos +1 ;

stepper.moveTo(pos);

stepper.run();

capteur = digitalRead(12);

}

stepper.stop();

capteur = digitalRead(12);

if (capteur == HIGH) // faire avancer le moteur pas à pas d'un nombre de pas très précis.

{

    delay(500);

    stepper.moveTo(-500);

    stepper.run();

 }

delay(3000);

}


voilà mon problème est le suivant :

Pour la prise d'origine c'est ok le moteur tourne dans le bon sens jusqu'à la détection par le capteur. mais ensuite le moteur au lieu de repartir dans la direction pour faire le nombre de pas souhaité, il continu à aller dans la direction de prise d'origine pendant un demi tour et ensuite il fait le nombre de pas que je veux dans l'autre direction.

Je tiens juste à préciser que je pense au niveau câblage il n'y a pas de problème car le moteur tourne sans problème.

je vous remercie d'avance pour votre aide et je vous avoue que ça fait deux jours que je chercher une solution...

dans l'attente de votre réponse,

cordialement,

-
Edité par passionautomatisme 21 août 2015 à 9:40:44

  • Partager sur Facebook
  • Partager sur Twitter
21 août 2015 à 10:45:35

Dans la lib AccelStepper, il est clairement dit que :

  • La fonction moveTo est instantanée : elle permet de configurer la position et rien d'autre (elle ne fait pas tourner le moteur)
  • La fonction run rafraichit la position du moteur, il faut donc l'appeler le plus souvent possible

Dans ton code, il y a un delay de 500 entre chaque appel de run, c'est très mauvais...

Ce delay est aussi très mauvais car tu ne vas lire le capteur que 2 fois par secondes donc la commande stop peut arrive bien plus tard (maxi 500ms après que le capteur ai touché le capteur).

Tu as aussi un autre problème en utilisant moveTo qui fait avancer jusqu'à une point précis et non avancé d'une distance précise.

Il faudrait plutôt que tu utilise move ;)

Au final, j'aurais plus vu un code de ce genre :

void loop() {

	stepper.move(100000uL);                  // Demande au moteur d'aller super loin vers l'avant (on l'arrêtera quand il aura touché le capteur)

	do {
		stepper.run();                        // Update du moteur
		capteur = digitalRead(12);            // Lecture du capteur
	} while (capteur == LOW);                 // Temps que le capteur n'est pas actif, on continue la boucle (pour faire tourner le moteur)

	stepper.stop();                           // Demande au moteur de s'arrêter
	stepper.move(-500);                       // Demande au moteur d'aller 500 pas en arrière

	do {
		stepper.run();                         // Update du moteur
	} while ( stepper.distanceToGo() != 0 );   // Temps que le moteur n'a pas atteind la pos, on continue la boucle (pour faire tourner le moteur)
	
	delay(3000);
	
}



-
Edité par lorrio 21 août 2015 à 10:46:55

  • Partager sur Facebook
  • Partager sur Twitter
21 août 2015 à 11:38:27

je te remercie beaucoup Lorrio,

je vais essayer cela cette après midi et je te tiens au courant,

  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2016 à 4:26:25

Je veut savoir comment commander 3 moteur pas à pas au meme temps sur arduino.

merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2016 à 11:54:43

Ne serait-ce pas un peu agressif comme message ça ?

En commençant par "bonjour" et en remplaçant je "je veux" par "je voudrais", ce serait tellement mieux...

Enfin bon, nous aussi on peut faire ce genre de réponse agressive :

Y'a une lib pour ça, débrouilles toi et lis la doc.

  • Partager sur Facebook
  • Partager sur Twitter
29 août 2021 à 13:22:09

bonjour 

je suis un projet qui nécessite 4 moteurs pas a pas 28byj-48.

j'aimerai avoir un programme qui puisse les mettre en mouvement et surtout

avoir des pauses a chaque mouvements.

la carte arduino est une mega 2560

merci de me répondre

wendy 

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2021 à 9:05:14

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL