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 0000000..ec7de4a Binary files /dev/null and b/doc/ModeServo_normal.png differ 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); }