Aller au contenu


Tango

Inscrit(e) (le) 28 juin 2020
Déconnecté Dernière activité juil. 01 2020 03:52
-----

#110373 Problème de code pour suivre un objet

Posté par Tango - 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 !