Driver Stepper Motor 5 phases Pentagon.

Le principe est d'obtenir 5 signaux en forme de sinusoïde à 3 états (+V, 0 -V) et avec des déphasages entre eux

C'est bon j'ai réussi! truc tout con j'avais mis des led pour visualiser mes signaux et du coup ça me bouffait 1.2V! donc pas assez pour bloqué les transistor N... --"

bref nouveaux problème maintenant, décidément..

mon moteur fait 500pas par tour! donc 0.72deg/step

je lui balance 200 step! et il fait plus d'un tour!

des idées ?

  • les leds branchées comme sur le schéma ne nuisent en aucun cas au bon fonctionnement du montage ! … il est donc encore assez loin du top.
  • ton schéma ne nous dit pas comment ton interface est branchée à l’arduino, il n’est donc pas possible de vérifier le câblage ni le programme. Peux-tu nous donner l’info ? Une photo ?
  • à part cela ton programme semble correct.
  • normalement 200 pas avec 1000ms par pas, ça doit faire + de 3mn de mouvement, qu’en est-il ? je vois pas dans le programme comment sont comptés les 200 pas ?

Merci de nous communiquer ces infos, car il y a encore bien du travail, je t’en parlerai.

Mais tu as bien avancé.

à+

Bonsoir,

Merci @Trimarco232

Ci joint mon schémas mis à jour avec le câblage de l’Arduino.

  • J’avais monté les LED comme le montre le schémas (bulle bleue), et du coup j’avais pas assez de tension pour la grille de mon transistor.

  • Bref j’ai enlevé les résistance de Pull up, pas très utile au final, j’ai mis des diode de protection a la place.

  • Pour de ce qui est câblage arduino / driver… fils direct vers la carte Uno.
    (Je vois pas trop pourquoi les gens mettent des résistances sur la grille d’un transistor MOS!
    source de courant commandé en tension en principe… )

  • Pour le code j’ai mis 5ms de délais entre chaque pas! Donc si je lui fait faire 2000 pas, j’ai bien 10s.

  • Si je lui demande de faire “200 pas” dans un sens puis dans l’autre il reviens bien sur ça position d’origine! mais il fait plus de 1 tours!! Alors qu’il devrait le faire en 500!

voici le code:

const int VOHGA = 13;
const int VOHGB = 3;
const int VOHGC = 4;
const int VOHGD = 5;
const int VOHGE = 12;
const int VOLA  = 7;
const int VOLB  = 8;
const int VOLC  = 9;
const int VOLD  = 6;
const int VOLE  = 11;

     int a =10;
     int sensorValue = 0;
     int sensorPin = A0;
     int i,k,j;
     int stepper;
     int fspeed = 5;
     
void setup() {
  
  int FullStep (int stepper);
  int HalfStep (int stepper);
  
  Serial.begin(9600);
  pinMode(VOHGA, OUTPUT);
  pinMode(VOHGB, OUTPUT); 
  pinMode(VOHGC, OUTPUT); 
  pinMode(VOHGD, OUTPUT); 
  pinMode(VOHGE, OUTPUT);   
  pinMode(VOLA, OUTPUT);
  pinMode(VOLB, OUTPUT); 
  pinMode(VOLC, OUTPUT); 
  pinMode(VOLD, OUTPUT); 
  pinMode(VOLE, OUTPUT);     
}

void loop(){
  
 
     for (j=0; j<200; j++){
       k=0;
       for (i=0; i<=9; i++)
       {
         FullStep(k);
         k++;
         delay(fspeed); 
        }
       }
     
     for(j=200; j>0; j--)
       {
       k=9;
       for (i=9; i>=0; i--)
       {
         FullStep(k);
         k--;
         delay(fspeed); 
       }
     } 
} 
int FullStep (int stepper){

  switch (stepper) {
       case 0:
       // Step 0 // 1000000110
       digitalWrite(VOHGA, HIGH);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, HIGH);
       digitalWrite(VOLD, HIGH);
       digitalWrite(VOLE, LOW);
       break;
       
       case 1:
       // Step 1 // 1100000010
       digitalWrite(VOHGA, HIGH);
       digitalWrite(VOHGB, HIGH);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, HIGH);
       digitalWrite(VOLE, LOW); 
       break;
       
       case 2: 
       //Step 2 // 0100000011
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, HIGH);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, HIGH);
       digitalWrite(VOLE, HIGH);
       break;
       
       case 3: 
       // Step 3 // 0110000001
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, HIGH);
       digitalWrite(VOHGC, HIGH);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, HIGH);  
       break;
       
       case 4: 
       // Step 4 // 0010010001
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, HIGH);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, HIGH);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, HIGH);    
       break;
       
       case 5: 
       // Step 5 // 0011010000
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, HIGH);
       digitalWrite(VOHGD, HIGH);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, HIGH);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, LOW);
       break;
       
       case 6: 
       // Step 6 // 0001011000
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, HIGH);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, HIGH);
       digitalWrite(VOLB, HIGH);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, LOW);
       break;
       
       case 7: 
       // Step 7 // 0001101000
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, HIGH);
       digitalWrite(VOHGE, HIGH);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, HIGH);
       digitalWrite(VOLC, LOW);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, LOW);    
       break;
       
       case 8: 
       // Step 8// 0000101100
       digitalWrite(VOHGA, LOW);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, HIGH);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, HIGH);
       digitalWrite(VOLC, HIGH);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, LOW);   
       break;
       
       case 9: 
       // Step 9// 1000100100
       digitalWrite(VOHGA, HIGH);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, HIGH);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, HIGH);
       digitalWrite(VOLD, LOW);
       digitalWrite(VOLE, LOW);    
       break;
       

     }

Pour être sur: un pas = une étapes dans mon switch case?
ou un pas = les 10 étapes dans le switch case ?

merci a+

Je crois que j'ai trouvé...

     for(j=200; j>0; j--)
       {
       k=9;
       for (i=9; i>=0; i--)
       {
         FullStep(k);
         k--;
         delay(fspeed); 
       }
     }

Tu lui demandes de faire 200 tours de phases, soit 200 x 10 = 2000 pas, donc 4 tours... (en fait, je pense qu'il n'en fait que 2, à vérifier)

avec ceci :

     for(j=200/10; j>0; j--)
       {
       k=9;
       for (i=9; i>=0; i--)
       {
         FullStep(k);
         k--;
         delay(fspeed); 
       }
     }

Tu ne feras que 200 pas. Mais si tu décides de faire un nombre de pas qui n'est pas un multiple de 10, il y aura des ratés... Il va falloir raisonner en nombre de tours de phase (boucle avec j) et en fraction de phase (boucle avec i)... c'est faisable!

pour la résistance de grille, mets-là, il y a des tas de bonnes raisons pour la mettre, ne serait-ce que le prix du moteur. Mais ça part dans des notions électroniques assez compliquées, donc cherche pas, si tout le monde la met, c'est peut-être pas pour rien.

Ce n’est pas ça le problème ^^

le 200 c’était pour le test de 10 secondes.

pour faire 200 pas je met:

 for(j=20; j>0; j--)
       {
       k=9;
       for (i=9; i>=0; i--)
       {
         FullStep(k);
         k--;
         delay(fspeed); 
       }
     }

Mais le problème c’est qu’il fait plus que un tours! (genre 1.2 tours)
Alors qu’il devrait faire un peu moins de 1/2 tours!

il y a incohérence entre le schéma et le programme
il y a :
const int VOLA = 7;
const int VOLB = 8;
const int VOLC = 9;
const int VOLD = 6;
const int VOLE = 11;
il faut (si ton schéma est juste…) :
const int VOLA = 11; // 7
const int VOLB = 6; // 8
const int VOLC = 9;
const int VOLD = 8; // 6
const int VOLE = 7; // 11

Merci, mais le problème ne viens pas de la non plus. Je suis sur breadboard avec une Uno, j'ai fait ce schéma Eagle rapidement pour que vous voyez mon branchement (désolé du coup pour l'inversion) . La relecture des mes connections fut mes premières actions.

Petit Up ! j'ai toujours pas trouvé de solution... Un petit coup de main me ferais super plaisir :)

merci a+

La première observation que je peux faire, c’est que la séquence d’excitation est différente de ton code, à celle de ton datasheet :

case 0:
       // Step 0 // 1000000110
       digitalWrite(VOHGA, HIGH);
       digitalWrite(VOHGB, LOW);
       digitalWrite(VOHGC, LOW);
       digitalWrite(VOHGD, LOW);
       digitalWrite(VOHGE, LOW);
       digitalWrite(VOLA, LOW);
       digitalWrite(VOLB, LOW);
       digitalWrite(VOLC, HIGH);
       digitalWrite(VOLD, HIGH);
       digitalWrite(VOLE, LOW);
       break;

et : dbbbd9d348de0b112e1fba33d5c446f327bf0a7f.png
Quand on observe le datasheet, seule une phase est “en l’air” et on a toujours une succession de + et de -.
Le code dit (et le site aussi j’ai bien vu mais ça correspond peut-être à un autre mode spécial qui saute des pas) :
Step 0 // 1000000110
C’est-à-dire :

A B C D E
1 0 0 0 0
0 0 1 1 0

Autrement dit :

A B C D E
+ 0 - - 0

Peut-être que le pas 1 ne correspond pas au pas 0 du site où tu as trouvé les séquences que tu as utilisées, mais on a déjà deux phases non excitées, et pas d’alternance +/-

Je ne connais pas les moteurs pentagone, mais j’ai déjà tenter de commander des bipolaires, unipolaires et des brushless avec des ponts en H, bah dès que tu passes sur des drivers industriels, c’est le jour et la nuit :grin: mais rien est impossible et ça ne fait pas de mal d’expérimenter ces moteurs !
Je te laisse le plaisir de retranscrire la séquence de ton datasheet si tu as foi en moi xD, fait très attention aux ponts court-circuités !