Bonjour
Je travail actuellement avec une carte Adafruit Trinket 5V, à base d’ATiny85 et un servomoteur SG90. Je pilote le Servo avec la bibliothèque d’Adafruit SoftServo. Notons que je force la carte à travailler à 8MHz, et que la valeurs des temporisations sont bonne (delay(1000)
dure bien une seconde).
Cependant, bien que le SG90 soit censé avoir une course de 180°, je n’arrive pas à dépasser les 90°
D’après ce que je comprend de la doc du servo(Attention, PDF), il est sensé être à 0° pour un signal de 1ms sur un temps de cycle de 20ms, et à 180° pour 2ms. C’est exactement ce que me semble faire SoftServo, qui met la sortie à 1 entre 1 et 2ms en fonction de l’angle souhaité dans la fonction write
1 2 3 4 5 6 | void Adafruit_SoftServo::write(uint8_t a) { angle = a; if (! isAttached) return; micros = map(a, 0, 180, 1000, 2000); } |
Si je comprend bien encore, le temps de cycle est fixé dans le code (pas dans la bibliothèque) par le déclenchement d’une interruption toute les 20ms dans cette fonction
1 2 3 4 5 6 7 8 9 10 11 12 | // We'll take advantage of the built in millis() timer that goes off // to keep track of time, and refresh the servo every 20 milliseconds volatile uint8_t counter = 0; SIGNAL(TIMER0_COMPA_vect) { // this gets called every 2 milliseconds counter += 2; // every 20 milliseconds, refresh the servos! if (counter >= 20) { counter = 0; myServo1.refresh(); } } |
J’ai beau modifier l’incrémentation de la variable counter
, ou la valeur qu’elle doit atteindre, cela ne change rien. Donc, je dois mal comprendre.
Qui saurait m’expliquer où je me goure ?
P.S.: j’ai trouvé une manière de contourner le problème en modifiant le mappage de l’angle vers le temps d’impulsion par essais/erreurs avec les valeurs suivantes : micros = map(a, 0, 180, 680, 2680);
, mais je ne trouve aucune logique dans valeurs et ça ne me satisfait donc pas totalement.