Aller au contenu


Photo
- - - - -

Problème de code pour suivre un objet

tracking camera stepper moteur accelstepper slider chariot simultannée

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

#1 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 28 juin 2020 - 08:14

Bonjour à tous! 
J'ai pour projet de créer un mini chariot de travelling pour pouvoir filmer de façon continue un objet. Côté mécanique tout fonctionne parfaitement, le chariot se déplace à l'aide d'une poulie et d'un moteur pas à pas nema 17 et un A4988 piloter par un arduino uno, et j'arrive à des bons résultats.

Désormais je souhaite que la caméra puisse pivoter sur elle-même afin qu'elle suive un objet tout en se déplacent linéairement.  Pour cela, j'ai ajouté un deuxième moteur pas à pas , le 28byj-48 avec son driver dédié afin de piloter la rotation. Sauf qu'en terme de code , je bute... J'utilise la librairie "accelstepper" afin de pouvoir activer les 2 moteurs simultanément , mais malgré mes heures de lectures de la doc, je n'arrive à aucun résultat. 

Voici pour le moment ma fonction qui est censée calculer l'angle nécessaire pour suivre un objet (avec arctangente connaissant les coordonnées de l'objet à suivre) . 

void runandtrack(){
    double step_rot;  variable qui converti l'angle en nombre de pas pour le 28byj48
    double diff_angle;  // la différence entre l'angle calculé à t-1 et celui à t
    double x = dist_x_obj; //x est la distance sur l'axe qui va évoluer au fur et à mesure
    //que le chariot avance. dist_x_obj est la distance initiale de l'objet à suivre sur x
   
    trans.setMaxSpeed(speed_x / 100 * 5000); //converti la vitesse choisie en % en pas/secondes
    trans.setAcceleration(100);
    trans.moveTo(10000); //bouger le chariot pour qu'il fasse 10000 pas
   
    while (digitalRead(limitSwitch) != 0) { 
       diff_angle = ((atan2 (dist_y_obj, x) - angle));
       step_rot = diff_angle * resolution_rot; 
       if (diff_angle >= ( (2 * PI) / stepsPerRevolution2 ))
       {
          angle = atan2 (dist_y_obj, x);
          for (int i = 0; i < step_rot; i ++){ //on fait bouger le 28byj de i pas correspond à l'angle souhaité
              rotat.moveTo(1);}
       }
       x = dist_x_obj - (trans.currentPosition() * resolution_x); //on actualise la distance x
     }
} 

Sauf que lorsque j'appelle la fonction, rien ne se produit. Je ne suis pas du tout sur de bien utiliser la librairie. Quelqu'un verrait le problème dans la fonction ? (le reste du code fonctionne très bien mais est très long , c'est pour cela que je poste uniquement la fonction) 

 

trans. est le moteur qui effectue la translation --> NEMA 17

rotat. est le moteur qui effectue la rotation --> 28byj

resolution.rot est la résolution en pas/rad du 28byj

resolution_x est la résolution en m/pas du NEMA 17

stepsPerRevolution2 est le nombre de pas pour faire une révolution pour le 28byj

angle est l'angle initial calculé lors de la saisie des coordonnées de l'objet 

 

Merci à vous !



#2 Ludovic Dille

Ludovic Dille

    Habitué

  • Membres
  • PipPip
  • 185 messages
  • Gender:Male
  • Location:Belgique

Posté 28 juin 2020 - 09:00

Hello


Tu as un soucis dans l'indentation de ton code ce qui le rend plus compliqué à lire. Je dirais que le soucis c'est que le calcul de ton x devrait se situer dans ta boucle et non à l'extérieur vu que tu veux pouvoir update ton calcul d'angle pour voir si tu dois réaliser des steps ou non.
 

Ludo



#3 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 28 juin 2020 - 09:40

Effectivement c'était mal indenté , j'ai normalement modifié. 

Le calcul de x se trouve dans la boucle while, il manquait une accolade. 



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 28 juin 2020 - 11:52

 "Sauf qu'en terme de code , je bute... J'utilise la librairie "accelstepper" afin de pouvoir activer les 2 moteurs simultanément , mais malgré mes heures de lectures de la doc, je n'arrive à aucun résultat.  "  => a 

 

"Sauf que lorsque j'appelle la fonction, rien ne se produit. Je ne suis pas du tout sur de bien utiliser la librairie. Quelqu'un verrait le problème dans la fonction ? (le reste du code fonctionne très bien mais est très long , c'est pour cela que je poste uniquement la fonction) " = > b

 

 

 

 

Je te propose de faire les exercices suivant : 

a) Décrit la fonction  telle  que tu penses qu'elle est censée fonctionner en " pur français " . ( Ne pas regarder ton code quand tu fais cet exercice !! =

exemple de description pour un va et vient sur une butée: 

 

Tant que le moteur n'arrive pas à la buté droite, je vais demander à mon moteur de tourner un degré vers la droite. 

Maintenant que mon moteur est arrivé à la buté droite , 

Tant que le moteur n'arrive pas à la buté gauche je vais demander à mon moteur de tourner un degré vers la gauche . 
Maintenant que le moteur est arrivé à la buté gauche ; 
Je désactive l'alimentation du moteur

 

Le but de cet exercice est ensuite de comparer ton texte avec le code de ta fonction, si tu as un problème de logique dans ton code, ce genre d'exercice doit pouvoir t'aider à le trouver. 

 

 

b ) Essayer des bouts de code très simple pour tester que la librairie fonctionne bien comme tu veux, / chercher à comprendre comment elle fonctionne

=> Tu dois savoir ce qu'est censé faire le code avant de le tester et comparer ce qui était attendu de ce qui est obtenu. 

Exemple : 

 

void fonctiontest1() {

  trans.setMaxSpeed(500); //converti la vitesse choisie en % en pas/secondes

  trans.setAcceleration(500);
  trans.moveTo(500); //bouger le chariot pour qu'il fasse 10000 pas  

}

 

Que fait cette fonction ? Est ce qu'elle fait  bouger le moteur? Pourquoi ?

 

Et si tu essaye cette fonction :

 

void fonctiontest2() {

  trans.setMaxSpeed(500); //converti la vitesse choisie en % en pas/secondes

  trans.setAcceleration(500);

  trans.runToNewPosition(500);

}

 

 

à quoi sert la fonction run() dans la librairie? 
 

 

Bref pour ce deuxième exercice le but est de bien comprendre comment utiliser l'outil. 
Si c'est pas déjà fait je te recommande de lire la doc dispo ici : http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#a176c5d2e4c2f21e9e92b12e39a6f0e67

 

 

Si tu arrives à dire précisément où tu bloques ou ce que tu ne comprends pas on pourra t'aider ;) 

à bientôt !


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  

 

 

 


#5 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 29 juin 2020 - 06:01

Merci pour ta réponse, 

Je ne peux utiliser la fonction runToNewPosition() dans mon cas car elle est bloquante, et justement j'aimerais pouvoir mouvoir les 2 moteurs en même temps. 

Donc j'en déduis que je dois utiliser plutôt moveTo() en appelant run() le plus souvent possible. Cela fonctionne. 
Pour mon utilisation j'aimerais bouger le moteur de la rotation que un pas par un pas lorsque je le décide (dans le if). 
J'ai essayé avec MoveTo(1) et ensuite rotat.run() mais le moteur ne réagit pas. 
J'aimerais utiliser la fonction step() de Accelstepper car elle semble adaptée mais elle est privée et je ne peux pas m'en servir. Comment je pourrais faire ? 
Merci !



#6 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 29 juin 2020 - 06:29

Merci pour ta réponse, 

Je ne peux utiliser la fonction runToNewPosition() dans mon cas car elle est bloquante, et justement j'aimerais pouvoir mouvoir les 2 moteurs en même temps. 

Donc j'en déduis que je dois utiliser plutôt moveTo() en appelant run() le plus souvent possible. Cela fonctionne. 
Pour mon utilisation j'aimerais bouger le moteur de la rotation que un pas par un pas lorsque je le décide (dans le if). 
J'ai essayé avec MoveTo(1) et ensuite rotat.run() mais le moteur ne réagit pas. 
J'aimerais utiliser la fonction step() de Accelstepper car elle semble adaptée mais elle est privée et je ne peux pas m'en servir. Comment je pourrais faire ? 
Merci !

 

 

 

quelle est la différence entre : 

 

void fonctiontest3() {

  trans.setMaxSpeed(500); 

  trans.setAcceleration(500);

  for(uint8_t i = 0; i < 100; i++) {

   trans.moveTo(1);

   trans.run();

  }

}

 

et 

 

void fonctiontest4() {

  trans.setMaxSpeed(500); 

  trans.setAcceleration(500);

  for(uint8_t i = 0; i < 100; i++) {

   trans.moveTo(i);

   trans.run();

  }

}

 

Normalement comprendre cette différence devrait te permettre de résoudre ton problème ;) 

Si tu veux quand même utiliser une fonction privée, il est toujours possible de modifier la librairie pour la rendre publique... Mais je pense que tu ne devrais pas en avoir besoin et que tu devrais pouvoir faire tout ce que tu veux avec les fonctions publiques. 


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  

 

 

 


#7 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 29 juin 2020 - 06:41

Je devrais plutôt faire cela ? : 

void loop() {


 
    double angle = PI /2;
    double step_rot;  
    double diff_angle;
    double x = 0.2;
    rotat.setSpeed(1000);
    trans.setMaxSpeed( (-50) * (5000/100));
    trans.setAcceleration(1000);
    trans.moveTo(-20000);
    while (digitalRead(limitSwitch) != 0) {
      trans.run();
      diff_angle = ((atan2 (0.2 , x) - angle));
      step_rot = diff_angle * 4096 / 1.7 / (2*PI); 
      if (diff_angle >= ( (2 * PI) / 4096 )) //si la différence entre angle(i) et angle(i-1) 
                                              //est >= à la résolution du 28byj, alors on bouge
                                              //le nombre de pas nécessaire
      {
        angle = atan2 (0.2, x);
        trans.run();
        trans.moveTo(step_rot);
        trans.run();
        
        }
      x = 0.2 - (trans.currentPosition() * 1.8 / 16 * 0.007 * PI / 180);
    }
}

La rotation ne bouge pas avec ce code, peut-être est-ce un problème dans mes calculs d'angles et je n'entre pas dans le "if"



#8 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 29 juin 2020 - 07:10

void loop() {
    double step_rot;
    rotat.setSpeed(1000);
    trans.setMaxSpeed( (-50) * (5000/100));
    trans.setAcceleration(1000);
    trans.moveTo(-20000);
    while (1) {
      step_rot = 1;
      if (1)        
        trans.moveTo(step_rot);

      trans.run();
    }
}

Si tu test le code ci dessus ( qui respecte toute l'architecture de ton précédent loop sans la partie avec tes calculs d'angle, est ce que le système bouge comme tu veux ? 

 

Peux tu (/ sais tu ?) faire du debuggage en utilisant le moniteur série pour afficher du texte ?  

 

Découpe ton code en plusieurs fonction et vérifie que chacune des sous fonctions fonctionne ben comme prévu.  Hésite pas à faire les exercices a et b  si jamais une fonction ne marche pas comme prévue ...  Utiliser la console du moniteur série pour afficher l'état des variables c'est souvent pratique pour faire ces vérifications.

Sinon pour faire du code si tu n'as pas lu je te recommande de lire ce petit article :https://www.robot-ma...programmer.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  

 

 

 


#9 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 29 juin 2020 - 07:38

Le code que tu m'as fournis ne bouge pas la rotation. Aucune LED sur le driver n'est allumée. J'arrive à la faire bouger cependant à l'aide de :

rotat.setMaxSpeed(1000);
rotat.setAcceleration(1000);
rotat.moveTo(-20000);
while(1){
   rotat.run();
}


Et lorsque que je change pour rotat.moveTo(1) , 2 Leds s'allument donc j'en déduis qu'un pas a été effectué.
Oui je sais débugger, je suis en train de procéder. Je pense que le problème proviens de mes calculs plutôt que de la librairie. 
Je reviens lorsque j'en sais plus 



#10 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 29 juin 2020 - 11:28

Le code que tu m'as fournis ne bouge pas la rotation. Aucune LED sur le driver n'est allumée. J'arrive à la faire bouger cependant à l'aide de :

rotat.setMaxSpeed(1000);
rotat.setAcceleration(1000);
rotat.moveTo(-20000);
while(1){
   rotat.run();
}


Et lorsque que je change pour rotat.moveTo(1) , 2 Leds s'allument donc j'en déduis qu'un pas a été effectué.
Oui je sais débugger, je suis en train de procéder. Je pense que le problème proviens de mes calculs plutôt que de la librairie. 
Je reviens lorsque j'en sais plus 

 

 

Mes hypothèses sur ce code fournit était que l'ensemble allait faire 1 pas et rien de plus... à cause du "step_rot" = 1 ... 
Mais que potentiellement un pas ça ne serait pas assez pour le voir bouger. 

J'ai pas vérifier les calculs ... ( Sans schémas je ne suis pas sûr de ce que tu calculs ) mais j'ai essayé de reproduire  ce que j'ai supposé que tu pouvais avoir comme problème ...  => Avoir un step_rot calculé trop faible et constant ... 

 

Mais d'après ton retour : 

 

 

Aucune LED sur le driver n'est allumée. 

Et lorsque que je change pour rotat.moveTo(1) , 2 Leds s'allument donc j'en déduis qu'un pas a été effectué.

 

j'en déduis que mon hypothèse n'était pas bonne ... Et que malgré ce que je pensais le moteur n'a même pas fait un pas ... 

Ce qui m'étonne un petit peu ... Et en regardant une deuxième fois le code un détail m'a sauté au yeux :

du coup ça veut dire que ça : 

 

void loop() {
    double step_rot;
    rotat.setSpeed(1000);
    trans.setMaxSpeed( (-50) * (5000/100));
    trans.setAcceleration(1000);
    trans.moveTo(-20000);
    while (1) {
      step_rot = 1000;
      if (1)        
        trans.moveTo(step_rot);

      trans.run();
    }
}

ça ne fait pas bouger le moteur 

 

 

mais ça : 

 

void loop() {
    double step_rot;
    trans.setSpeed(1000);
    trans.setMaxSpeed( (-50) * (5000/100));
    trans.setAcceleration(1000);
    trans.moveTo(-20000);
    while (1) {
      step_rot = 1000;
      if (1)        
        trans.moveTo(step_rot);

      trans.run();
    }
}

ça fait bien tourner le moteur ? =) 


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  

 

 

 


#11 Ludovic Dille

Ludovic Dille

    Habitué

  • Membres
  • PipPip
  • 185 messages
  • Gender:Male
  • Location:Belgique

Posté 30 juin 2020 - 07:36

@Mike je pense que tu as fais une petite faute dans le code. Je pense que tu voudrais mettre rotat. ... dans ta boucle while (sinon tu ne donnes aucune consigne à ta rotation).



#12 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 30 juin 2020 - 10:29

Oui effectivement @Mike, de plus j'ai l'impression que tu as posté 2 fois le même code. 
Après un débugage intensif, les calculs de distance et d'angle sont bons (il y avait effectivement quelques erreurs). 
Désormais je bute sur le fait de bouger la rotation uniquement d'un pas lorsqu'on rentre dans le if . Le problème c'est qu'il le fait qu'une seule fois , j'imagine qu'il se dit "je suis arrivé à ma position finale alors je ne bouge plus" , même si je lui redemande de bouger d'un pas après. 
Typiquement l'exemple que j'ai essayé prouve cela : 

    rotat.setSpeed(1000);
    while (digitalRead(limitSwitch) != 0) {
        rotat.moveTo(1);
        rotat.run();
        delay(1000);
    }
}

Ce que j'attend de lui c'est de tourner d'un pas toute les secondes. Sauf que seulement 2 leds sont allumés sur son driver , et elle ne change pas . Donc il reste sur sa position finale , c'est à dire 1 pas. 

Peut-être que pour effectuer seulement 1 pas il serait préférable d'utiliser une autre librairie?  Accelstepper ne semble pas gérer ça non ? 

 

EDIT : 

J'ai essayé avec une fonction que j'ai trouvé sur le net pour faire tourner 1 pas : 

void clockwise(){
 // 1
 digitalWrite(motorPin4, HIGH);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, LOW);
 delay(motorSpeed);
 // 2
 digitalWrite(motorPin4, HIGH);
 digitalWrite(motorPin3, HIGH);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, LOW);
 delay (motorSpeed);
 // 3
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, HIGH);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, LOW);
 delay(motorSpeed);
 // 4
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, HIGH);
 digitalWrite(motorPin2, HIGH);
 digitalWrite(motorPin1, LOW);
 delay(motorSpeed);
 // 5
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, HIGH);
 digitalWrite(motorPin1, LOW);
 delay(motorSpeed);
 // 6
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, HIGH);
 digitalWrite(motorPin1, HIGH);
 delay (motorSpeed);
 // 7
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, HIGH);
 delay(motorSpeed);
 // 8
 digitalWrite(motorPin4, HIGH);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, HIGH);
 delay(motorSpeed);
}

ça le fait bien tourner , et ça semble respecter l'angle. Gros problème qui fait que ce n'est pas acceptable pour mon cas : les mouvements ne deviennent pas simultanées. Comme si la fonction clockwise() était bloquante, du coup j'ai les 2 mouvements des moteurs qui sont saccadés , et le résultat n'est pas bon. Donc je pense qu'il faut que je me penche sur accelstepper pour pouvoir effectuer des mouvements simultanées, mais je ne trouve pas de fonction qui pourrait me faire avancer d'un pas ! 



#13 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 30 juin 2020 - 10:55

@Mike je pense que tu as fais une petite faute dans le code. Je pense que tu voudrais mettre rotat. ... dans ta boucle while (sinon tu ne donnes aucune consigne à ta rotation).

 

 

 

Oui effectivement @Mike, de plus j'ai l'impression que tu as posté 2 fois le même code. 
 

 

 

Non mais ! :P
Je ne suis pas infaillible mais là l'erreur ne vient pas de moi ! =) 
 

J'ai fournis deux code différents à une ligne près, un qui marche, un qui ne marche pas. 

En précisant lequel est censé marcher de celui qui n'est pas censé marcher. 
Une seule différence pour montrer que c'est cette différence qui fait que ça marche ou pas ... 

Comme dit le code que j'ai posté à l'origine dans le message numéro 8 https://www.robot-ma...et/#entry110381provient du loop " simplifié " du message numéro 7 de Tango ... 

J'ai mis en évidence l'erreur dans ce morceau de code fournit! 

Si maintenant les mathématiques sont bonnes et que la librairie est correctement utilisée (en corrigeant l'erreur que j'ai mis en évidence), Tango devrait réussir à faire la fonction qu'il veut en utilisant " moveTo " et "run" ...  

 

PS : Un petit conseil : reprend les fonctions test 3 et 4 fournies plus haut et regarde bien la différence entre les deux... Dans la fonction moveTo faut pas que tu mettes une constante, mais bien une variable que tu vas incrémenter de 1 à chaque fois que tu veux bouger d'un pas ... 

 


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  

 

 

 


#14 Tango

Tango

    Nouveau membre

  • Membres
  • 7 messages

Posté 30 juin 2020 - 12:31

Effectivement je n'avais pas vu la différence, ma faute. 
J'essaye ta méthode en incrémentant . 

 

Petit détail que je viens de lire sur la doc, le multistepper ne semble pas gérer les accélérations  : 

"Caution: only constant speed stepper motion is supported: acceleration and deceleration is not supported All the steppers managed by MultiStepper will step at a constant speed to their target " 

Pourtant elle semble fonctionner mais un peu de façon saccadé , ça doit être pour ça 

 

La méthode d'incrémentation semble être la bonne, je vois les LEDs du driver le la rotation évoluer de façon cohérente. Par contre le moteur lui ne tourne pas. Lorsque je pose ma main dessus je sens des pulsations (correspondant au rythme des leds) , mais comme si elles n'étaient pas assez puissantes pour bouger le moteur.  



#15 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 30 juin 2020 - 12:55

Tu n'es pas obliger d'utiliser " MultiStepper " pour piloter tes deux moteurs. 

 

Tu peux faire une fonction 
runSteppers() {

 moteur1.run();
 moteur2.run();
 //etc ...

}
 

et appeler cette fonction à chaque fois au lieu d'appeler le run que de 1 seul moteur. 


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 : tracking, camera, stepper, moteur, accelstepper, slider, chariot, simultannée

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

0 members, 0 guests, 0 anonymous users