Le mode pas à pas (Mode 3)
Avis personnel : je n'aime pas les moteurs pas à pas. Cherchez pas, c'est comme ça...
Les servomoteurs Feetech offrent un mode "pas à pas". Ce mode se construit par dessus le mode 0 (enfin c'est comme ça que je le conçois). Les correcteurs en vitesse et en position sont utilisés.
Le mode pas à pas s'active ainsi :sms_sts.writeByte(SERVO_ID, SMS_STS_MODE, 3);Pour commander un mouvement, vous utilisez la même fonction qu'en mode 0 (mode servo) sauf que la consigne de position à une signification légèrement différente. En effet, plus qu'un mode pas à pas, il faut le voir un mode de déplacement relatif à la position actuelle.
Pour demande un déplacement d'un nombre de pas égal à pas_servo, à la vitesse vitesse, vous utiliserez cette fonction :sms_sts.WritePosEx(SERVO_ID, pas_servo, vitesse);La première surprise que vous risquez de rencontrer, c'est que les butées logicielles sont actives dans ce mode. Je n'ai pas essayé de voir ce qui se passait si leur valeur dépassait 4096. Bref, pour les désactiver, mettez la butée min et la butée max à 0 :
sms_sts.writeByte(SERVO_ID, 0x09, 0); // Butée min à 0 sms_sts.writeByte(SERVO_ID, 0x0A, 0); // Butée min à 0 sms_sts.writeByte(SERVO_ID, 0x0B, 0); // Buté max à 0, désactivation de la butée sms_sts.writeByte(SERVO_ID, 0x0C, 0); // Buté max à 0, désactivation de la butéeLa lecture de la position actuelle pourrait vous surprendre, en effet, le registre ne contient plus la position actuelle mais le nombre de pas codeur à parcourir pour finir le mouvement. Vous lire donc 0 tant que vous ne demandez pas de mouvement. Vous observerez un sut à la demande du mouvement qui réduit au fur et à mesure que le servomoteur se rapproche de sa position.
Voici un exemple avec une demande de déplacement de 2000 pas toutes les 2 secondes
Contrairement au mode servo, en mode pas à pas, comme la position revient systématiquement à zéro, vous n'avez pas de phénomène de rebouclage (enfin pas ici).
La limite se situe au niveau de la consigne qui doit tenir sur 16 bits (bit de signe inclus). Donc la commande maximale que vous pouvez envoyer pour un mouvement est de 32767 pas (soit 8 tours). Évidement, si vous demandez plus, vous observerez le phénomène de rebouclage.
Le mode basse résolution vous permet de faire passer cette limite à 21 tours, mais les cas où ceci est utile ne doivent pas être nombreux...
La commande que vous envoyée sera ajoutée à celle en cours. Donc si vous envoyez de nouvelles consignes avant que le mouvement soit terminé, vous risquez un dépassement, mais c'est vraiment un effet de bord qui ne devrait pas arriver sur une utilisation correcte du servomoteur :
Bonjour à tous merci pour ce tuto super complet ! ![]()
De mon côté, j’ai fait un petit exemple simple avec un Feetech STS3032, un TT-Linker et une Arduino UNO.
L’objectif est de montrer une utilisation basique du mode 3, avec un déplacement relatif de 2 tours dans un sens, puis 2 tours dans l’autre, en boucle.
J’ai aussi ajouté l’attente de fin de mouvement avec ReadMove(), car comme indiqué plus haut, les commandes peuvent s’additionner si on envoie une nouvelle consigne avant la fin du déplacement.
/*
* Exemple : Feetech STS3032 en mode pas à pas (Mode 3) avec Arduino UNO
* ------------------------------------------------------------------
* Le servo fait 2 tours dans un sens, puis 2 tours dans l'autre, en boucle.
*
* Matériel :
* - Servo Feetech STS3032 (ID = 1, baudrate usine = 1 000 000)
* - TT-Linker Feetech entre la carte et le servo (liaison half-duplex)
* - Arduino UNO : un seul UART matériel (pins 0/1), partagé avec l'USB.
* -> Le servo utilise Serial (pin 1 = TX, pin 0 = RX).
* -> IMPORTANT : débrancher les fils TX/RX du TT-Linker pendant le
* téléversement du sketch, puis les rebrancher.
*
* Bibliothèque : FeetechServo (fork Robot Maker de SCServo)
* https://github.com/Robot-Maker-SAS/FeetechServo
*
* Principe du mode 3 (d'après le tutoriel Robot Maker, de Keuronde) :
* - C'est un mode de déplacement RELATIF : WritePosEx() commande un
* nombre de pas à parcourir depuis la position courante (signe = sens).
* - 1 tour = 4096 pas. Une commande accepte au max ±32767 pas (~8 tours),
* donc 2 tours (8192 pas) passent en une seule commande.
* - Les commandes s'additionnent : il faut attendre la fin du mouvement
* (registre "moving" 0x42, lu par ReadMove) avant d'en envoyer une autre.
*/
#include <SMS_STS.h>
SMS_STS st;
const byte SERVO_ID = 1;
const int PAS_PAR_TOUR = 4096;
const int NB_TOURS = 2;
const int DEPLACEMENT = NB_TOURS * PAS_PAR_TOUR; // 8192 pas
const int VITESSE = 2000; // pas/s (~29 tr/min)
const byte ACCELERATION = 50; // x100 pas/s²
void setup() {
// Liaison vers le TT-Linker : impérativement 1 000 000 bauds
Serial.begin(1000000);
st.pSerial = &Serial;
// Le registre de mode (0x21) et les butees d'angle (0x09-0x0C) sont en
// EEPROM : il faut deverrouiller avant d'ecrire, puis reverrouiller.
st.unLockEprom(SERVO_ID);
st.WriteMode(SERVO_ID, 3); // Mode 3 = pas a pas
st.WriteMinMaxAngleLimit(SERVO_ID, 0, 0); // butees a 0 = multi-tours
st.LockEprom(SERVO_ID);
st.EnableTorque(SERVO_ID, 1);
}
// Bloque tant que le servo n'a pas fini son deplacement
void attendreFinMouvement() {
delay(50); // laisse le temps au drapeau "moving" de passer a 1
while (st.ReadMove(SERVO_ID) == 1) {
delay(20);
}
}
void loop() {
st.WritePosEx(SERVO_ID, DEPLACEMENT, VITESSE, ACCELERATION);
attendreFinMouvement();
st.WritePosEx(SERVO_ID, -DEPLACEMENT, VITESSE, ACCELERATION);
attendreFinMouvement();
}
Petit point important avec l’Arduino UNO : comme l’UART matériel est partagé avec l’USB, il faut bien penser à débrancher les fils TX/RX du TT-Linker pendant le téléversement du programme, puis les rebrancher ensuite.
Avec cet exemple, le servo effectue donc un mouvement relatif de 8192 pas, soit 2 × 4096, donc 2 tours complets, puis revient dans l’autre sens.

Mon contenu
Homme


