moteur pas à pas bipolaire

Dans une imprimante j'ai récupéré des moteur PAP, 48 steps, 24volts bipolaire (4 fils). J'ai essayer d'utiliser la librairie Stepper.h avec l'exemple sur Arduino-Playground, mais ça ne fonctionnait pas correctement. J'ai trouvé un site sur le quels sont décrites les séquences de fonctionnement d'un PAP :

http://www.positron-libre.com/electronique/moteurpasapas/rappel-cours-moteur-pas-pas.htm

En m'inspirant du mode "demi-pas", j'ai fait ce petit code :

int A_Pin = 13;    // H-bridge patte 1 
int B_Pin = 9;     // H-bridge patte 2 
int C_Pin = 12;    // H-bridge patte 9 
int D_Pin = 10;    // H-bridge patte 15 

 void Step_0();
 void Step_1();
 void Step_2();
 void Step_3();
 void Step_4();
 void Step_5();
 void Step_6();
 void Step_7();
 void Step_8();

 void Step_0(){

    digitalRead(A_Pin);  
    digitalRead(B_Pin);  
    digitalRead(C_Pin);  
    digitalRead(D_Pin);  

  }

void Step_1(){
    digitalWrite(A_Pin, HIGH);   
    digitalWrite(B_Pin, LOW);  
    digitalRead(C_Pin);   
    digitalRead(D_Pin);  
  }
void  Step_2(){
    digitalWrite(A_Pin, HIGH);  
    digitalWrite(B_Pin, LOW);  
    digitalWrite(C_Pin, HIGH);   
    digitalWrite(D_Pin, LOW);  
  }
void  Step_3(){
    digitalRead(A_Pin);   
    digitalRead(B_Pin); 
    digitalWrite(C_Pin, HIGH);   
    digitalWrite(D_Pin, LOW);
    }
void  Step_4(){
    digitalWrite(A_Pin, LOW);  
    digitalWrite(B_Pin, HIGH);  
    digitalWrite(C_Pin, HIGH);  
    digitalWrite(D_Pin, LOW); 
    }
void  Step_5(){
    digitalWrite(A_Pin, LOW);  
    digitalWrite(B_Pin, HIGH);  
    digitalRead(C_Pin);   
    digitalRead(D_Pin);  
    }
void  Step_6(){    
    digitalWrite(A_Pin, LOW);   
    digitalWrite(B_Pin, HIGH);  
    digitalWrite(C_Pin, LOW);   
    digitalWrite(D_Pin, HIGH);  
    }
void  Step_7(){  
    digitalRead(A_Pin);  
    digitalRead(B_Pin);  
    digitalWrite(C_Pin, LOW);   
    digitalWrite(D_Pin, HIGH); 
    }
void  Step_8(){
    digitalWrite(A_Pin, HIGH);   
    digitalWrite(B_Pin, LOW);  
    digitalWrite(C_Pin, LOW);   
    digitalWrite(D_Pin, HIGH); 
    }


void setup() {
  pinMode(A_Pin, OUTPUT);                                                                     
  pinMode(B_Pin, OUTPUT); 
  pinMode(C_Pin, OUTPUT);                                                                     
  pinMode(D_Pin, OUTPUT);
  }

void loop() {
  
               Step_1();
              
  delay(2);
  
               Step_2();
               
  delay(2);
  
               Step_3();
               
  delay(2);
  
               Step_4();
              
  delay(2);

               Step_5();
              
  delay(2);

               Step_6();
             
  delay(2);

               Step_7();
               
  delay(2);
  
               Step_8();
               
  delay(2);
  
}

Ce que je trouve bizarre c'est que tout les 5 tours environ le moteur me fait un "accrochage". De plus j'aimerais trouver le moyen de le faire tourner sans vibrations, pour cela j'avais pensé à un truc du style :

....
  
               Step_1();
               Step_0();
               Step_1();
               Step_1();
  delay(2);
  
               Step_2();
               Step_0();
               Step_2();
               Step_2();
  delay(2);


...

Le Step_0 me permet de mettre les pins à zéro afin de faire une sorte de "hachage" du signal, style PWM, mais c'est pas trop concluant.

Si quelqu'un à une piste à me fournir... :-?

Salut Qu'appel tu par vibration ? tu veux dire sans à coup ?

Oui, le fait d'utiliser le mode "demi pas" fait un à coup à chaque pas, suivant la vitesse de rotation cela devient une vibration. Pour pallier à ce problème il faudrait passer en mode "micro pas", les polarité sont toujours alternée de la même manière, mais le courant augmente et diminue progressivement. Cela devrait être possible à faire en PWM, mais je ne sais pas comment.

J'ai oublié de préciser que j'utilise un motor-shield v.1.1a

C'est ce moteur que j'utilise pour mes essais (4 fils):

http://www.eminebea.com/content/html/en/motor_list/pm_motor/pm42m048.shtml

La datasheet :

http://www.eminebea.com/content/html/en/motor_list/pm_motor/pdf/pm42m048.pdf

En fait tu veux alimenter progressivement la bobine si je comprend bien, donc au lieu de mettre 0V ou 5V sur la sortie il faudrait un PWM qui augmente jusqu’à 5V, reste un petit moment à 5V puis redescend.

for(i=0;i<=255;i++)
{
  analogWrite(pin, i); 
}

delay(dureePas);

for(i=255;i>=0;i--)
{
  analogWrite(pin, i); 
}

Après tu peux intégrer ça dans une fonction “alimenteBobine” mais du coup tu n’utilise plus la lib. Après faut voir comment marche la motor-shield, si c’est juste des buffers ou si c’est un driver de moteur.

L'idéal en fait serai d'avoir une sinusoïde, donc si c'est pas assez "lisse" tu peux mettre circuit RC mais je pense que c'est pas la peine.

... Après tu peux intégrer ça dans une fonction "alimenteBobine" mais du coup tu n'utilise plus la lib. Après faut voir comment marche la motor-shield, si c'est juste des buffers ou si c'est un driver de moteur.

En fait je n'utilise pas de lib (ça ne fonctionnait pas ::) ).

J'essaye le bout de code que tu me proposes ;)

EDIT:

Arfff j'avais pas vu que c'était "analogWrite" , le motor shield à les sorties moteur branchées sur les pins digitaux....

Je mettrais pas ma main à couper, mais il me semble que le motor-shield ne prend que du digital en entrée... :-/

:o

en cherchant un peu plus d'info sur internet je m'aperçois qu'il y a ça (ce que j'ai, en version v1.1a pour 2 moteurs) :

http://www.nkcelectronics.com/freeduino-arduino-motor-control-shield-kit.html

Et ça qui a l'air franchement mieux :

http://ladyada.net/make/mshield/index.html

Les noms prêtent bien à confusion, la première ne semble pas être faite pour des moteur PaP, bien que le mien tourne dessus ( ::) mal d'accord, mais quand même...).

Je vais voir si je peux me bidouiller un truc comme le premier avec mon bread-board.

J'ai remplacé delay() par delayMicroseconds() que j'ai fixé à 1200, le moteur tourne sans avoir de "bug". Pour démarrer je mets à 2000 pendant 10 boucles puis je passe à 1200.

Et il y a des vibrations ?

Les vibrations sont toujours là, je travaille encore avec des impulsions.

En fait certain pin digitaux permettent de faire du PWM, dont le digital 10 et digital 9.

En partant du fait que le bobinage d'un pôle est alimenté avec du + d'un coté et du - de l'autre ( :o incroyable non...??) le fait de changer le - en + serait similaire à une déconnection... donc en alternant ++ et +- on devrait pouvoir faire varier le magnétisme de la bobine.

Par contre, lorsque c'est la pin PWM qui est en + il faut la faire varier dans l'autre sens.

De toute façon d'un côté tu met la bobine à la masse et de l'autre l'alim. Il suffit donc de faire varier la tension.

En fait ce que je voulais dire c’est que comme je ne peux pas débrancher la bobine, le fait de mettre les deux sorties de cette même bobine sur le + ferait la même chose que de la débrancher.

J’ai fait un test avec ça :

...
void  Step_4(){
  H=0;
 for(L=255;L>=0;L=L-freq)
{
    digitalWrite(A_Pin, LOW);  
    analogWrite(B_Pin, H);  
    digitalWrite(C_Pin, HIGH);  
    analogWrite(D_Pin, L);
  H=H+freq;
}  
    }
void  Step_5(){
  H=0;
 for(L=255;L>=0;L=L-freq)
{
    digitalWrite(A_Pin, LOW);  
    analogWrite(B_Pin, H);  
    digitalRead(C_Pin);   
    digitalRead(D_Pin);
  H=H+freq;
} 
...

C’est censé incrémenter les “H” jusqu’à 255 et décrémenter les “L” jusqu’à 0, ainsi il me semble que les bobines travaillent simultanément.

Mais après plusieurs essais, il semble que les boucles d’incrément/décrément prennent trop de temps, j’agis la dessus avec la variable “freq”.
Pour l’instant les résultat ne sont pas très concluant :-/

Je ne pense pas que ce soit de cette façon que l’on fait une modulation PWM, car ça à l’air trop lent alors si quelqu’un sait comment utiliser les PWM sur cette carte(sur la page référence du site c’est très vague) :wink:

La solution est peut-être d'utiliser un L297 :

http://www.positron-libre.com/electronique/moteurpasapas/circuit-commande-l297.htm

La datasheet :

https://www.distrelec.com/distrelec/datasheets.nsf/WebAttachments/7C8F59AD8B3B6E93C12570EA007410FE/$File/647106.pdf

Oui le L297 est un driver pour commander des moteurs pas à pas. Suivant ton moteur il faut peut être rajouté un L298 (pour la puissance) par contre ces circuits coûtes assez chère si mes souvenirs sont bon, donc acheter un moteur avec plus de pas serait plus rentable. Tu veux que ton moteur tourne à quel vitesse ? et dans quel but ?

J'ai vu qu'un L297 tournait autour de 4 ?uros, c'est encore acceptable...

Pour l'instant j'essaye surtout de me familiariser avec ces sbsfasdfjksaiuuu de moteur PAP. ;D

J'ai revérifié mes séquences demi-pas avec un autre site :

http://www.fresnel.fr/perso/kuhlmey/nik/stepper.html

et je trouvais un truc bizarre dans mon premier code, j'ai refait ça et la rotation est plus "onctueuse", en plus je peux varier la vitesse sur une petite plage.

Je vais réessayer la "pseudo" PWM de tout à l'heure.

Pour le moment j'essaye de faire démarrer le moteur à un régime et de l'accélérer, mais en faisant une boucle de cette façon je bloque sur un step et le moteur ne tourne pas :

int del= 816;

void loop() {

               Step_1();
               
  delayMicroseconds(del);

               Step_2();
               
  delayMicroseconds(del);
  
               Step_3();
              
  delayMicroseconds(del);
  
               Step_4();
               
  delayMicroseconds(del);

               Step_5();
               
  delayMicroseconds(del);

               Step_6();
              
  delayMicroseconds(del);

               Step_7();
               
  delayMicroseconds(del);
  
               Step_8();
               
  delayMicroseconds(del);
  i++;
if (i>=10)
{
 if (del>=594)
 {
   del--;
 }
}
}

On dirait que ça me rallonge le "delay" entre la phase 8 à 1. :-?

J'ai fait un essai en mettant un petit potentiomètre sur analog 5 :

...

int analogPin = 5;

int freq = 1;
int del = 200;
int L;
int H;

...


void  Step_3(){  H=0;
 for(L=255;L>=0;L=L-freq)
{
    digitalWrite(A_Pin,LOW);   
    digitalWrite(B_Pin,H); 
    digitalWrite(C_Pin, L);   
    digitalWrite(D_Pin, LOW); H=H+freq;
} 

...

void loop() {
  freq = analogRead(analogPin)/4;

               Step_1();
               
  delayMicroseconds(del);

...

Le potentiomètre de 10k[ch937] permet de faire varier la vitesse du PWM. :) J'arrive à me caler à n'importe quelle "régime" de rotation et de pouvoir régler une rotation plus onctueuse en agissant sur le potar. Par contre il me semble que les boucles de PWM ne sont pas assez rapides pour que cela soit intéressant, j'arrive à une rotation plus élevée sans cet essais de mode micro-pas. :-?

J’arrive à faire tourner ce moteur à des vitesses différentes, mais je me pose un question, comment faire pour n’avancer que de 1 (ou plusieurs) pas dans un direction et m’arrêter ? :-?