Probleme avec des servomoteurs

Bonjour,

Je suis en train de finaliser un quadripode

IMG_5526.jpg

Le problème que je rencontre est que les servomoteurs n’ont pas toujours la même position avec les mêmes lignes de code.

Je pilote les servo avec un Arduino Nano et le servo driver d'Adafruit.
Le code ressemble a ça :

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

const byte servoPin (1);
const int servoPosition (345);

void setup() {

  pwm.begin();
  pwm.setPWMFreq(60);

  pwm.setPWM(servoPin, 0, servoPosition);
}

void loop() {
}

Pour le moment j’alimente la carte arduino avec l'usb de l'ordi et le servo driver avec un bloc d'alim de 5v-5a.
J'ai 10 servo, j'en commande 4 maximun en même temps.

Pour gérer le déplacement des pattes, je commande les servo en leur donnant un pulse (const byte).

Le problème est que de temps en temps, un des servo (pas toujours le même), se décale. La ou avec un pulse de 345 il touchait le sol maintenant il est au dessus de 1cm.

Je débranche tout, je bouge les pattes manuellement, et tout refonctionne.

Auriez vous une idée du problème ?

Merci

IMG_5526.jpg

greg06:
Pour gérer le déplacement des pattes, je commande les servo en leur donnant un pulse (const byte).

heu c'est un PWM sur 12 bits, donc si vous avez un byte (8 bits) vous n'avez pas toute la dynamique nécessaire.

 pwm.setPWM(servoPin, 0, servoPosition);

ça veut dire commencer à HIGH entre 0 et 345, puis passer à LOW jusqu'à 4095 (PWM 12-bit).

Généralement il faut calibrer son servo notamment pour trouver les 2 valeurs qui vont correspondre aux angles min et max de votre servo. (certains ne vont pas jusqu'à 0° ou 180°). Avec 345 vous êtes censé avoir quoi?

Salut merci pour ta réponse.

Pour moi, il y a deux façon de commander les servos avec le driver.

  • Avec les angles. On fait le calibrage pour connaître le pulse min et max et on fait un map
pulselength = map(degrees, 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(servonum, 0, pulselength);
  • Avec les pulses. On commande directement le servo avec les pulses
pwm.setPWM(servonum, 0, pulselength);

J utilise la deuxième car plus précise

Pour déterminer la position d une patte, j incrément les pulses petit à petit jusqu’à la position souhaitée. Arrivé a la bonne position, la valeur du pulse devient ma variable const int.

Il n’y a pas 2 méthodes, au final vous réglez le PWM. l’appel à la fonction avec une valeur que vous pilotez finement est effectivement plus précise, mais ça ne change pas le fait que tout dépend de comment vos servos fonctionnent.

—> quel PWM pour l’angle min atteignable ‘souvent pas 0°) et quel PWM pour le Max (souvent pas 180°).

Si vous êtes en dessous ou au dessus de ces valeurs vous allez forcer et patiner et ne pas vous retrouver au même endroit

L’autre problème classique est que le poids du robot est trop important pour vos moteurs

j ai calibré les moteur pour être bien sur d être dans le bon intervalle.
Les moteurs ne patinent pas.

J ai pensé aussi au faite qu ils soient en sur charge. J ai donc fais des essais en reprenant le poid du robot sur un support, donc aucune charge sur les servo.

Rien à faire, de temps en temps, deux des servos change de position et il n y a que en les débranchant qui ce remettent a la bonne référence.

Peut il y avoir des défauts dans les servo ?
J utilise pas le condensateur recommandé par adafruit pour le servo driver, ça pourrai venir de la ?

Merci

greg06:
j ai calibré les moteur pour être bien sur d être dans le bon intervalle.
Les moteurs ne patinent pas.

J ai pensé aussi au faite qu ils soient en sur charge. J ai donc fais des essais en reprenant le poid du robot sur un support, donc aucune charge sur les servo.

Rien à faire, de temps en temps, deux des servos change de position et il n y a que en les débranchant qui ce remettent a la bonne référence.

Peut il y avoir des défauts dans les servo ?
J utilise pas le condensateur recommandé par adafruit pour le servo driver, ça pourrai venir de la ?

Merci

Bonsoir
Attention avec les servos "cheap" , la pignonnerie mecanique est souvent essentiellement "plastique" et n'embarque pas de rattrapage de jeu, un bon servo avec recopie de position par potentiomètre vaut essentiellement d'abord par la qualité du couplage mecanique entre axe du potentiometre et pignon de couplage.

greg06:
Rien à faire, de temps en temps, deux des servos change de position et il n y a que en les débranchant qui ce remettent a la bonne référence.

et ça juste avec le code ci dessus - càd avec une référence fixe dans le setup() ?