Aller au contenu


Tango

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

Messages que j'ai postés

Dans le sujet : Problème de code pour suivre un objet

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.  


Dans le sujet : Problème de code pour suivre un objet

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 ! 


Dans le sujet : Problème de code pour suivre un objet

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 


Dans le sujet : Problème de code pour suivre un objet

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"


Dans le sujet : Problème de code pour suivre un objet

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 !