diff --git a/Readme.md b/Readme.md index c694fd1..010c9dd 100644 --- a/Readme.md +++ b/Readme.md @@ -7,3 +7,41 @@ En faisant varier la consigne de position de -512 à 5120, nous observons des bu Voici le graphique obtenu à partir du comportement du servomoteur. ![](/doc/ModeServo_normal.png) + + +Suppression des butées +----------------------- + +En faisant varier la consigne de position de -512 à 5120, nous observons l'absence de butées logicielles. + +Voici le graphique obtenu à partir du comportement du servomoteur. + +![](/doc/ModeServo_SansButée.png) + +Seulement, en poussant le servomoteur un peu plus loin, nous observons que le multitour est limité. Lorsqu'il doit faire son 8e tour (ou presque), le servomoteur part dans l'autre sens à toute vitesse. Un tour correspond à 4096 points de codeurs et la position est enregistrée sur 16 bits, donc avec une limite vers 32700 (en positif ou en négatif). + +Nous remarquons que la valeur de la position du servo est toujours comprise entre 0 et 4095. Pas moyen de savoir combien de tours le servomoteur a fait. + +Sur le graphique ci-dessous, nous voyons que le servomoteur (position en bleu) s'affole quand la consigne passe au dessus de 32000. + +![](doc/ModeServo_rebouclage.png) + +Note : Pour la butée logicielle haute, contrairement à ce qui est indiqué dans la documentation, des valeurs plus grandes que 4095 sont acceptées. + +Retour de position qui correspond à la consigne +----------------------------------------------- + +En passant le bit4 du registre 0x12 à 1, vous obtenez un retour de position du servomoteur qui n'est plus bloqué entre 0 et 4095. Mais attention, cette valeur n'est pas celle qui persistera à une coupure de courant. Si votre servo s'arrête à la position 6000, après une extinction, vous lire une position à 1904. + +C'est donc une solution intéressante tant que vous avez un moyen de refaire le zéro à la mise sous tension. + +Fonctionnement en mode Servo "Classique" - basse résolution +========================================================= + +Un paramètre permet de baisser artificiellement la résolution du codeur. Ceci permet, en interrogeant le servo de savoir où il se trouve sur une position de 0 à 4095, d'avoir une réponse sur 2 ou 3 tour, en fonction de la valeur de 0x1E : +- 2 : ce sera sur 2 tours +- 3 : ce sera sur 3 tours + +En théorie, ceci va de pair avec une perte en précision, qui est probablement négligeable. + +Je ne comprends pas trop l'intérêt de ce mode. La valeur de position n'est pas persistante après une extinction... \ No newline at end of file diff --git a/doc/ModeServo_SansButée.png b/doc/ModeServo_SansButée.png new file mode 100644 index 0000000..ec7de4a Binary files /dev/null and b/doc/ModeServo_SansButée.png differ diff --git a/doc/ModeServo_rebouclage.png b/doc/ModeServo_rebouclage.png new file mode 100644 index 0000000..079ffce Binary files /dev/null and b/doc/ModeServo_rebouclage.png differ diff --git a/src/main.cpp b/src/main.cpp index 6e3d994..23ecef5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,6 +25,7 @@ void setup() { Serial.begin(115200);//sts舵机波特率1000000 Serial1.begin(1000000);//sts舵机波特率1000000 sms_sts.pSerial = &Serial1; + delay(5000); } @@ -98,8 +99,15 @@ enum etat_t test_ping() enum etat_t configure_servomoteur(){ sms_sts.ServoMode(SERVO_ID); + 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, pour activer le multitour + sms_sts.writeByte(SERVO_ID, 0x0C, 0); // Buté max à 0, pour activer le multitour + sms_sts.writeByte(SERVO_ID, 0x1E, 3); - sms_sts.writeByte(SERVO_ID, 0x12, 3); // Registre de "Phase" + sms_sts.writeByte(SERVO_ID, 0x12, 0x7C); // Registre de "Phase", valeur par défaut 108 (0x6C) + + return TERMINE; } @@ -116,7 +124,7 @@ enum etat_t mouvement_servomoteur(){ // On avance ou recule de d'un pas position += pas_servo; // si position > 5000 ou position < 0 - if(position > 5000 || position < 0){ + if(position > 20100 || position < 0){ pas_servo = -pas_servo; } sms_sts.WritePosEx(SERVO_ID, position, 4800);