Controle d'un moteur pas a pas Vitesse et direction Avec un seul et même potar.

Bonjour,

Je vous contacte pour avoir un peu d'aide j'ai pour projet de devoir faire tourner un moteur pas a pas à 4 fils dans les deux sens et avec une vitesse de rotation donnée par le potar.

Voici le code :

#include <Stepper.h>

const int NombrePas=200;
const int RVar=A2;

const int pwmPhaseA=3;
const int dirPhaseA=12;
const int freinPhaseA=9;
const int intensitePhaseA=A0;

const int pwmPhaseB=11;
const int dirPhaseB=13;
const int freinPhaseB=8;
const int intensitePhaseB=A1;

int mesure=0;

int vitesse=0;
int vitesse0=0;
int vitesseMax=100;

Stepper stepper(NombrePas, 3, 12, 11, 13);


void setup() {

pinMode (pwmPhaseA, OUTPUT);
pinMode (dirPhaseA, OUTPUT);
pinMode (freinPhaseA, OUTPUT);

pinMode (pwmPhaseB, OUTPUT);
pinMode (dirPhaseB, OUTPUT);
pinMode (freinPhaseB, OUTPUT);

digitalWrite (pwmPhaseA, HIGH);
digitalWrite (dirPhaseA, LOW);
digitalWrite (freinPhaseA, LOW);

digitalWrite (pwmPhaseB, HIGH);
digitalWrite (dirPhaseB, LOW);
digitalWrite (freinPhaseB, LOW);

stepper.setSpeed(70);

}


void loop() {
	mesure=analogRead(RVar);
	vitesse=map(mesure,0,1023,-vitesseMax,vitesseMax);

	if ( (vitesse!=vitesse0) && (abs(vitesse)>=1)) {
		stepper.setSpeed(abs(vitesse));
		vitesse0=vitesse;
	}

	if (vitesse>=1) stepper.step(1);
	if (vitesse<=1) stepper.step(-1);

}

Voici quelques photos de mon montage :

Photo avec le branchement du moteur sur une arduino motor shield :

En plus grand :
[u]http://www.zimagez.com/zimage/168eedcdf6b3d4e31278a216586724ed4.php#[/u]

Photo avec le potar brancher à la bord :

[u]http://www.zimagez.com/zimage/21b9114d03da0dbe6f514bb7ab6d7c009.php[/u]

Je ne comprend pas pourquoi cela ne marche pas ........

Pouvez vous m'aidez ?

bonjour je viens de modifier le code! :

#include <Stepper.h>

const int NombrePas=200;
const int RVar=2;

const int pwmPhaseA=3;
const int dirPhaseA=12; 
const int freinPhaseA=9; 
const int intensitePhaseA=A0;

const int pwmPhaseB=11;
const int dirPhaseB=13;
const int freinPhaseB=8;
const int intensitePhaseB=A1;

int mesure=0;

int indicePas=0;
int indicePas0=0;
int ecartPas=0;

int vitesse=0;
int vitesse0=0;
int vitesseMax=100;

Stepper stepper(NombrePas, dirPhaseA, dirPhaseB);

void setup() {

pinMode (pwmPhaseA, OUTPUT);
pinMode (dirPhaseA, OUTPUT);
pinMode (freinPhaseA, OUTPUT);

pinMode (pwmPhaseB, OUTPUT);
pinMode (dirPhaseB, OUTPUT);
pinMode (freinPhaseB, OUTPUT);

digitalWrite (pwmPhaseA, HIGH);
digitalWrite (dirPhaseA, LOW);
digitalWrite (freinPhaseA, LOW);

digitalWrite (pwmPhaseB, HIGH);
digitalWrite (dirPhaseB, LOW);
digitalWrite (freinPhaseB, LOW);

stepper.setSpeed(70);

}

void loop() {
  
        mesure=analogRead(RVar);
        indicePas=map(mesure,0,1023,0,NombrePas-1);
                
        ecartPas=indicePas-indicePas0;
                
        if (ecartPas>0) { stepper.step(ecartPas);
        indicePas0=indicePas;}
        
        if (ecartPas<0) { stepper.step(ecartPas);
        indicePas0=indicePas;}
	
        mesure=indicePas;
         
        vitesse=map(mesure,0,1023,-vitesseMax,vitesseMax);
        
	if ( (vitesse!=vitesse0) && (abs(vitesse)>=1)) {
		stepper.setSpeed(abs(vitesse));
		vitesse0=vitesse;
	}

       	
}

Tous marche parfaitement mais la vitesse du moteur pas a pas n'epouse pas parfaitement la vitesse d'execution de mon mouvement.

Avez vous des idées pour améliorer la vitesse de rotation suivant les écarts de mouvements entre chaque pas ?

Bonjour,

Sans chercher à comprendre plus en profondeur le code trois choses me hérisse le poil :

  • les noms de variables const en minuscule, une constante par convention est nommée en majuscule pour pouvoir être facilement différenciée d'une variable "normale"
    (au passage ça te permettrait de voir que tu as des const qui manque ;))
  • les variables globales inutiles, dans ton code une floppé de variables devrait être locales, ce serait plus lisible (et les autres static pour vraiment bien faire)
  • les accolades, les espaces et les retours à la ligne ça ne coute pas bien cher et ça rend le code bien plus lisible :wink:

Sinon ce morceau :

if (ecartPas > 0) { 
  stepper.step(ecartPas);
  indicePas0 = indicePas;
}
        
if (ecartPas < 0) { 
  stepper.step(ecartPas);
  indicePas0 = indicePas;
}

Revient à faire ceci en réalité :

if (ecartPas != 0) { 
  stepper.step(ecartPas);
  indicePas0 = indicePas;
}

Pour le reste du code je t'avouerai que je ne vois pas bien ce que tu veut faire exactement et ce que tu appelles "épouser parfaitement la vitesse d'exécution de mon mouvement".

skywodd:
Pour le reste du code je t'avouerai que je ne vois pas bien ce que tu veut faire exactement et ce que tu appelles "épouser parfaitement la vitesse d'exécution de mon mouvement".

Ouf je pensais que c'était mon week-end chargé qui me jouait des tours xD