Viewing 5 reply threads
  • Author
    Posts
    • #6853
      JP
      Participant

      Bonjour,
      me lançant dans le projet InMoov, je commence donc par le commencement, en l’occurrence par le Finger Starter Kit.
      Je m’arrache les cheveux avec un premier test (ça commence bien 🙂 ) : pièces imprimées, le tout monté, je fais le premier test en envoyant le code indiqué sur la page Finger Starter ici dans l’Arduino Uno.

      #include <Servo.h>

      Servo servoindex;

      void setup() {
      servoindex.attach(3);
      }

      void loop() {
      //alltomiddle();
      //delay(4000);
      alltorest();
      delay(4000);
      alltomax();
      delay(2000);

      }
      // Mouvement pour amener le servo à sa position “milieu” : alltomiddlel
      void alltomiddle() {
      servoindex.write(90);
      }
      // Mouvement pour amener le servo à sa position “repos” : alltorest
      void alltorest() {
      servoindex.write(0);
      }
      // Mouvement pour amener le servo à sa position “maxi” : alltomax
      void alltomax() {
      servoindex.write(100);

      }

      Le servo est alimenté séparément. Je branche la carte.
      Mais voilà, le servo (un MG996R) tourne bien, mais semble “forcer” dans sa position 100° (je l’entends “ronronner”). Si j’ai bien compris le code, il devrait partir de sa position 0° pour aller à 100°, c’est bien ça ?
      On dirait déjà qu’il ne part pas de 0° mais d’environ 90° pour ensuite dépasser les 180°. Bref, je n’y comprends rien (problème d’impulsions ?), et encore moins comment y remédier. J’ai essayé avec un autre servo identique, même problème.
      J’ai essayé le servo avec une radiocommande, pas de soucis, le servo tourne de 0 à 180° sans forcer.

      Et parce que j’avais peur de n’être pas très clair dans mes explications, j’ai fait une petite vidéo :

      Je fais sans doute une erreur quelque part, mais où ? La réponse est peut-être évidente, mais pour un débutant comme moi, c’est plutôt dur dur. Bref, ça commence mal 🙂

      Merci par avance pour votre aide.

      • This topic was modified 5 years, 10 months ago by JP.
      • This topic was modified 5 years, 10 months ago by JP.
    • #6858
      Gael Langevin
      Keymaster

      A priori la poulie ne doit pas être montée correctement par rapport au degrés du servo.
      -Démonte la poulie du servo.
      -Lance le code afin que le servo se positionne sur 0 degré. (Débranche le servo dès qu’il est en position 0 afin de l’empécher de repartir sur une autre position.)
      -Étends le doigt/finger afin qu’il soit à plat sur la table, et remonte la poulie en place.
      -Reconnecte le servo et lance le code.
      -Normalement à ce moment, cela devrait être bon…

      Si le tendon n’est pas monté correctement sur la poulie, c’est là que tu pourras t’en rendre compte et adapter ton montage en fonction.

    • #6860
      JP
      Participant

      Merci pour ta réponse, Gaël.
      Je ne sais pas pourquoi mais le lien vers la vidéo n’est pas passé dans mon premier post.
      Je retente :

      Comme tu peux le voir sur la vidéo (si le lien passe), je n’ai pas monté la poulie mais juste un bras basique sur le servo afin de voir les mouvements et ne pas tout casser 🙂

      En bougeant le bras à la main, le point zéro est à peu près avec le bras vers le bas, et le 180° avec le bras vers le haut.

      Quand je branche l’arduino avec le code du premier post, le bras va dans un premier temps vers le point 90°, puis se déplace vers le haut en bourdonnant, comme s’il voulait dépasser son point maxi.

      Edit : le lien ne semble pas marcher quand je le mets dans un tag link. Voilà le lien sans le tag : https://youtu.be/FZU06Wjdiww

      • This reply was modified 5 years, 10 months ago by JP.
    • #6874
      Gael Langevin
      Keymaster

      Okay je vois.
      Certain de ces servo, qui ne sont pas de très bonne qualité, arrive en force contre leur butée interne. En fait le potentiomètre interne ne doit pas être parfaitement centré.
      Ce genre de servo fini par bruler si tu ne fait pas ce que l’on appelle un “mapping” dans Myrobotlab. C’est à dire qu’il faut redéfinir sa plage de mouvement.
      En attendant, il suffit de changer sur le code Arduino quelques degrés pour pallier à ce problème.
      Essaye ce code:
      ` #include

      Servo servoindex;

      void setup() {
      servoindex.attach(3);
      }

      void loop() {
      alltomiddle();
      delay(4000);
      alltorest();
      delay(4000);
      alltomax();
      delay(2000);

      }
      // Mouvement pour amener le servo à sa position “milieu” : alltomiddlel
      void alltomiddle() {
      servoindex.write(90);
      }
      // Mouvement pour amener le servo à sa position “repos” : alltorest
      void alltorest() {
      servoindex.write(5);
      }
      // Mouvement pour amener le servo à sa position “maxi” : alltomax
      void alltomax() {
      servoindex.write(175);

      }

      Je me demande quand même de quel servo il s’agit…
      Si c’est un MG946r, ils ont un mouvement maxi de 0-120 au lieu de 0-180, si je me souviens bien.

    • #6881
      JP
      Participant

      Merci Gaël pour ton aide,

      comme je l’avais mis dans le premier post, ce sont des MG996R. Ils ont bien 180° d’amplitude. Mais je crois que je me suis fait un peu avoir car sur le site où je les ai achetés (b…d) ils sont présentés comme des TowerPro. Ils sont identiques, même l’étiquette de couleur identique, en effet, mais la marque est différente. Je n’avais même pas fait attention en les recevant 🙁
      Cela peut entraîner peut-être une qualité moindre.

      Pour le mapping avec Myrobotlab, je n’en suis pas encore là, n’ayant pour le moment pas ouvert ce logiciel. J’essaye d’aller progressivement, et c’est déjà pas mal pour mon petit cerveau 🙂

      J’avais bien essayé ce que tu proposes, mais je n’arrivais pas à avoir une amplitude maxi, comme si les “références” 0 et 180 étaient décalées. Je crois que l’on n’a pas besoin de toute l’amplitude pour InMoov, mais je voulais comprendre 🙂
      Après pas mal de recherches (et de prise de tête), j’ai enfin trouvé une solution, qui, je ne sais pas, est vraiment adaptée ou pas, mais semble marcher.
      On dirait que cela vient d’un problème d’impulsion qui pour ces servos ne correspond pas à 1ms pour 0° et 2ms pour 180°.
      En mettant donc par exemple

      ServoTest1.attach(pinServo, 720, 1340);

      on modifie cela. En tâtonnant je suis arrivé à avoir l’amplitude maxi sans que le servo ne “ronronne”.
      Par contre je n’ai pas trouvé beaucoup d’info sur cela, c’est bizarre car j’ai essayé avec différents servos, et de mettre seulement l’angle (par exemple ServoTest1.write(0);) sans régler les impulsions, les servos entrent en butée la plupart du temps. Je ne suis tout de même pas le seul dans ce cas ? 🙂

      Ce que je ne comprends pas , par contre, c’est que si je les essaye avec une radiocommande et un récepteur pour modélisme, ça fonctionne très bien, sans aller en butée, et avec l’amplitude maxi.

      Sur la vidéo, on peut voir que c’est calé à peu près à 180° pour les MG996R.

      Les valeurs sont différentes pour chaque servo :

      ServoTest1.attach(pinServo, 720, 1340);
      ServoTest2.attach(pinServo2, 810, 1360);
      ServoTest3.attach(pinServo3, 600, 1280);
      ServoTest4.attach(pinServo4, 600, 1220); /

      Dans la deuxième partie de la vidéo, on peut remarquer que lorsque les 2 gros servos sont branchés il y a des perturbations, surtout sur les petits qui ont des sortes de retours en fin de course.
      Si je débranche un des gros servos, ça disparait.

      • This reply was modified 5 years, 10 months ago by JP.
    • #6911
      JP
      Participant

      Il a bougé 🙂

      Pour infos le code (des fois que je n’ai pas trop fait d’erreurs dans le code et que ça puisse servir à d’autres débutants comme moi) :
      Première partie de la vidéo :

      #include <Servo.h>
      Servo ServoTest1;
      int pinServo=3;
      void setup() {
      ServoTest1.attach(pinServo, 880, 1360); “pinServo”
      }
      void loop() {
      ServoTest1.write(100);
      delay(2000);
      ServoTest1.write(180);
      delay(2000);
      }

      Deuxième partie (mouvement plus lent) :

      #include <Servo.h>
      Servo ServoTest1;
      int pinServo=3;
      int pos = 1400;
      void setup() {
      ServoTest1.attach(pinServo);
      }
      void loop()
      {
      for(pos = 1400; pos < 2250; pos += 5)
      {
      ServoTest1.writeMicroseconds(pos);
      delay(15);
      }
      for(pos = 2250; pos>=1400; pos-=10)
      {
      ServoTest1.writeMicroseconds(pos);
      delay(15);
      }
      }

      • This reply was modified 5 years, 10 months ago by JP.
Viewing 5 reply threads
  • You must be logged in to reply to this topic.