From 6d42195b458f070142534726cfbe25d123f611af Mon Sep 17 00:00:00 2001 From: Samuel Date: Sun, 10 Aug 2025 17:29:53 +0200 Subject: [PATCH] =?UTF-8?q?Filtrage=20des=20erreurs=20de=20lecture=20(posi?= =?UTF-8?q?tion=20=C3=A0=2032769)=20et=20ajout=20de=20la=20documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 9 ++ doc/ModeServo_normal.png | Bin 0 -> 33215 bytes src/main.cpp | 175 +++++++++++++++++++++------------------ 3 files changed, 105 insertions(+), 79 deletions(-) create mode 100644 doc/ModeServo_normal.png diff --git a/Readme.md b/Readme.md index e69de29..c694fd1 100644 --- a/Readme.md +++ b/Readme.md @@ -0,0 +1,9 @@ +Fonctionnement en mode Servo "Classique" +======================================== + +En faisant varier la consigne de position de -512 à 5120, nous observons des butées logicielles à 0 et à 4093. Notons aussi que la position renvoyée peut reboucler à 0 comme indiqué sur le graphique. Nous avons globalement le fonctionnement d'un servomoteur classique, sauf que nous avons le retour de position et que nous pouvons régler également la vitesse. + + +Voici le graphique obtenu à partir du comportement du servomoteur. + +![](/doc/ModeServo_normal.png) diff --git a/doc/ModeServo_normal.png b/doc/ModeServo_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7de4a3de93be0d770e93587f19b019541894c0 GIT binary patch literal 33215 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index dd6da9b..1285ee6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,85 +1,23 @@ #include #include "SCServo.h" +#define SERVO_ID 1 + SMS_STS sms_sts; -void test_ping(); -void lire_tous_les_registres(int servo_id); - - -char registre_description[70][100]={ - "Version majeure du firmware", - "Version mineure du firmware", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" +enum etat_t{ + EN_COURS, + TERMINE, + ECHEC }; +void gestion_servo(void); +enum etat_t test_ping(void); +enum etat_t configure_servomoteur(void); +enum etat_t mouvement_servomoteur(void); + +void lire_tous_les_registres(int servo_id); + // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. @@ -93,12 +31,51 @@ void setup() { // the loop routine runs over and over again forever: void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) - test_ping(); + gestion_servo(); digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW - test_ping(); + gestion_servo(); } -void test_ping() +void gestion_servo(){ + static enum { + PING_SERVO, + CONFIG_SERVO, + MOUVEMENT_SERVO + } etat_gestion_servo = PING_SERVO; + + enum etat_t etat_action; + + switch(etat_gestion_servo){ + case PING_SERVO: + if(test_ping() == TERMINE){ + etat_gestion_servo = CONFIG_SERVO; + } + break; + + case CONFIG_SERVO: + etat_action = configure_servomoteur(); + if(etat_action == TERMINE){ + etat_gestion_servo = MOUVEMENT_SERVO; + } + if(etat_action == ECHEC){ + etat_gestion_servo = PING_SERVO; + } + break; + + case MOUVEMENT_SERVO: + etat_action = mouvement_servomoteur(); + + if(etat_action == ECHEC){ + etat_gestion_servo = PING_SERVO; + } + break; + + + + } +} + +enum etat_t test_ping() { int ID = sms_sts.Ping(1); static int found = 0; @@ -108,6 +85,7 @@ void test_ping() if(found == 0){ found = 1; lire_tous_les_registres(ID); + return TERMINE; } delay(100); }else{ @@ -115,6 +93,45 @@ void test_ping() found = 0; delay(2000); } + return EN_COURS; +} + +enum etat_t configure_servomoteur(){ + sms_sts.ServoMode(SERVO_ID); + return TERMINE; +} + +enum etat_t mouvement_servomoteur(){ + static int position=0; + static int temps_pas_ms = 0; + static int temps_aff_ms = 0; + static int pas_servo = 512; + int position_lue; + char tampon[200]; + /// Toutes les 500 ms + if(millis() - temps_pas_ms > 500 ){ + temps_pas_ms = millis(); + // On avance ou recule de d'un pas + position += pas_servo; + // si position > 5000 ou position < 0 + if(position > 5000 || position < 0){ + pas_servo = -pas_servo; + } + sms_sts.WritePosEx(SERVO_ID, position, 4800); + } + + if(millis() - temps_aff_ms > 10 ){ + temps_aff_ms = millis(); + sprintf(tampon, ">pos_consigne:%d\n", position); + Serial.print(tampon); + position_lue = sms_sts.ReadPos(SERVO_ID); + if(position_lue != 32769){ + sprintf(tampon, ">pos_actuelle:%d\n", position_lue); + } + Serial.print(tampon); + } + + return EN_COURS; } int lire_registre(int servo_id, int registre_adresse){ @@ -124,7 +141,7 @@ int lire_registre(int servo_id, int registre_adresse){ void lire_tous_les_registres(int servo_id){ char message[200]=""; for (int i=0; i<0x46; i++){ - sprintf(message, "registre 0x%x: %d\t\t%s\n", i, lire_registre(servo_id, i), registre_description[i]); + sprintf(message, "registre 0x%x: %d\n", i, lire_registre(servo_id, i)); Serial.print(message); }