Aller au contenu


Photo
- - - - -

Contrôler des moteurs pas à pas avec PWM

Arduino

  • Veuillez vous connecter pour répondre
4 réponses à ce sujet

#1 RocketPickel

RocketPickel

    Nouveau membre

  • Membres
  • 6 messages
  • Gender:Male

Posté 29 novembre 2020 - 07:01

Bonsoir à tous , après avoir plus ou moins réussis à contrôler un moteur pas à pas avec le moniteur série , je me redirige vers le PWM pour moins de complexité avec vigibot et pour éviter d'utiliser le RX TX . Dans la configuration , une pi envoie un signal PWM qui est convertit par l'arduino en un signal lisible par le driver du moteur.   Je ne sais pas du tout par quoi commencer , je suis bloqué... J'ai mis deux programme un peu différent , c'est les deux manières que j'ai expérimenté pour contrôler un ou plusieurs moteur pap 

Merci d'avance 

 

Code Terminé

#include <AccelStepper.h>


AccelStepper stepper1(AccelStepper::FULL4WIRE, 0, 2, 1, 3);
AccelStepper stepper2(AccelStepper::FULL4WIRE, 4, 6, 5, 7);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 8, 10, 9, 11);
AccelStepper stepper4(AccelStepper::FULL4WIRE, A0, A2, A1, A3);


void setup() {
     
    // Paramétrage du premier moteur avec setMaxSpeed et setAcceleration
    stepper1.setMaxSpeed(1000);
    stepper1.setAcceleration(200);
     
    // Paramétrage du second moteur avec setMaxSpeed et setAcceleration
    stepper2.setMaxSpeed(1000);
    stepper2.setAcceleration(200);

    // Paramétrage de troisième moteur avec setMaxSpeed et setAcceleration
    stepper3.setMaxSpeed(1000);
    stepper3.setAcceleration(200);

    // Paramétrage de quatrième moteur avec setMaxSpeed et setAcceleration
    stepper4.setMaxSpeed(1000);
    stepper4.setAcceleration(200);
     
}
 
void loop() {
    //Début 
    stepper1.move(300);
    stepper2.move(-300);
    stepper3.move(-300);
    stepper4.move(300); 
     
    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
        
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }

    
    //Début
    stepper1.move(-600);
    stepper2.move(600);
    stepper3.move(600);
    stepper4.move(-600);

    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
      
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }


    //Début 
    stepper1.move(300);
    stepper2.move(-300);
    stepper3.move(-300);
    stepper4.move(300); 
     
    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
        
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }


    //Début 
    stepper1.move(0);
    stepper2.move(-0);
    stepper3.move(500);
    stepper4.move(-500); 
     
    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
        
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }


    //Début 
    stepper1.move(500);
    stepper2.move(-500);
    stepper3.move(-500);
    stepper4.move(500); 
     
    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
        
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }


    //Début 
    stepper1.move(-500);
    stepper2.move(500);
    stepper3.move(500);
    stepper4.move(-500); 
     
    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
        
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }


    //Début 
    stepper1.move(0);
    stepper2.move(0);
    stepper3.move(-500);
    stepper4.move(500); 
     
    while ( ( stepper1.distanceToGo() != 0 ) || ( stepper2.distanceToGo() != 0 ) || (stepper3.distanceToGo() != 0) || (stepper4.distanceToGo() != 0) ) {
        
        stepper1.run();
        stepper2.run();
        stepper3.run();
        stepper4.run();
        
    }

    
    delay(1000);
 
}

Test

#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 1, 3, 2, 4);

void setup() {
  Serial.begin(9600);
  stepper1.setMaxSpeed(1000);
  stepper1.setAcceleration(300);
  
   

 
}
void loop() 
{
  if(Serial.available() > 0)
  {
    char caractere = Serial.read();

    if(caractere == '1')
    {
      stepper1.move(100);
      
      stepper1.run();
    }
    if(caractere == '2')
    {
      stepper1.move(500);
      while ( stepper1.distanceToGo() != 0 )
      stepper1.run();
    }
    if(caractere == '3')
    {
      stepper1.move(1000);
      while ( stepper1.distanceToGo() != 0 )
      stepper1.run();
    }
    if(caractere == '4')
    {
      stepper1.move(1500);
      while ( stepper1.distanceToGo() != 0 )
      stepper1.run();
    }
  }  
}      
    

Fichier(s) joint(s)


Modifié par Microrupteurman, 29 novembre 2020 - 07:09 .


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 29 novembre 2020 - 07:10

Déjà, tu vas utiliser un pwm 0 100% ou un signal pour servomoteurs ? Les deux sont possibles c'est à toi de choisir, le code sera différent en fonction de ce choix. ( Vigibot te permet de faire les deux il faudra que tu configures en fonction de ton choix... )

 

Il y a un tuto sur le site qui montre une méthode " facile " pour lire des signaux pwm : https://www.robot-ma...de-arduino.html

à toi de l'essayer et de modifier selon ton besoin... 

Ensuite pour déposer du code sur le forum, c'est plus agréable si tu utilises la balise code  : 

// Utilisation de la balise code pour poster du code sur Robot Maker.

bool balise = true; 

pour plus de détails pour poster différents type de contenu dont du code sur le forum il y a cet article : https://www.robot-ma...obot-Maker.html


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 29 novembre 2020 - 07:23

#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 2, 3, 4, 5);

void setup() {
  Serial.begin(9600);
  stepper1.setMaxSpeed(1000);
  stepper1.setAcceleration(300);
}


void loop() 
{
  if(Serial.available() > 0)
  {
    char caractere = Serial.read();

    if(caractere == '1')
    {
      stepper1.moveTo(100);
    }
    else if(caractere == '2')
    {
      stepper1.moveTo(500);
    }
    else if(caractere == '3')
    {
      stepper1.moveTo(1000);
    }
    else if(caractere == '4')
    {
      stepper1.moveTo(1500);
    }
  }  
  stepper1.run();
}      

Et voici ton deuxième code modifié sans avoir à utiliser des while et qui propose une commande en position absolue de ton moteur pas à pas... à toi de modifier ce code en suivant le tutoriel que j'ai donné précédemment, pour faire bouger ton moteur non pas avec le moniteur série mais avec la lecture du pwm ...


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#4 RocketPickel

RocketPickel

    Nouveau membre

  • Membres
  • 6 messages
  • Gender:Male

Posté 29 novembre 2020 - 07:25

Je pense utiliser un signal pour servomoteurs ...

1 ère question :   Es que je peux remplacer les pins de 2 à 7 par les pins analog in ? 

 

Si j'ai bien compris maintenant , je dois modifier le code tuto rc pour le faire interagir avec les drivers mais la je ne sais pas , es que je dois crée une variable qui fait varier les pas du moteur à chaque fois que le signal varie ? 



#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 29 novembre 2020 - 07:39

oui tu peux lire un seul signal sur A0 par exemple si tu veux, à toi de modifier le code en conséquence. 

 

ensuite commence par faire un code qui marche comme le tuto, sans les moteurs  pas à pas, mais  qui fonctionne sur les pins que tu veux utiliser,  avec les valeurs qui vont bien pour ce que tu veux faire avec le moteur pas à pas et qui affiche tout sur le moniteur série. 

Tu auras alors 2 codes : 

1 ) qui fait bouger ton moteurs pas à pas comme tu veux avec ton moniteur série 
2) ) qui permet d'avoir les commandes que tu veux donner à ton moteur pas à pas avec ton signal PWM. 

Une fois ces deux codes nickels, tu pourras les mélanger pour faire le trucs que tu veux c'est à dire piloter ton moteur pas à pas juste avec le pwm sans passer par le moniteur série.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 






Aussi étiqueté avec au moins un de ces mots-clés : Arduino

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users