Sources
This commit is contained in:
		
							
								
								
									
										272
									
								
								source_robot_master.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								source_robot_master.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | ||||
| // Bus pour le Dxl | ||||
| #define DXL_BUS_SERIAL1 1  //Dynamixel on Serial1(USART1)  <-OpenCM9.04 | ||||
| #define DXL_BUS_SERIAL2 2  //Dynamixel on Serial2(USART2)  <-LN101,BT210 | ||||
| #define DXL_BUS_SERIAL3 3  //Dynamixel on Serial3(USART3)  <-OpenCM 485EXP | ||||
|  | ||||
| // Nos quatre pattes, avec leur deux servomoteurs | ||||
|  | ||||
| // Arrière gauche | ||||
| #define PATTE_1_SERVO1 7 // Proche corps | ||||
| #define PATTE_1_SERVO2 9 // Proche sol | ||||
|  | ||||
| // Arrière droit | ||||
| #define PATTE_2_SERVO1 8 | ||||
| #define PATTE_2_SERVO2 12 | ||||
|  | ||||
| // Avant gauche | ||||
| #define PATTE_3_SERVO1 16 | ||||
| #define PATTE_3_SERVO2 11 | ||||
|  | ||||
| // Avant droit | ||||
| #define PATTE_4_SERVO1 14 | ||||
| #define PATTE_4_SERVO2 18 | ||||
|  | ||||
| // Positions initiales | ||||
| #define POS_INITIALE_SERVO1_TYPE1 380 | ||||
| #define POS_INITIALE_SERVO1_TYPE2 POS_INITIALE_SERVO1_TYPE1 + 256 | ||||
|  | ||||
| #define POS_INITIALE_SERVO2_TYPE1 280 | ||||
|  | ||||
| // Positions avancement | ||||
| #define ROTATION_SERVO1 150 | ||||
| #define ROTATION_SERVO2 120 | ||||
|  | ||||
| // Vitesses servo | ||||
| #define SPEED_SLOW 100 | ||||
| #define SPEED_RAPID 200 | ||||
|  | ||||
| // On initialise notre bus dynamixel | ||||
| Dynamixel Dxl(DXL_BUS_SERIAL1); | ||||
|  | ||||
| // Variables d'état de notre robot | ||||
| int state_avg, state_avd, state_arg, state_ard; | ||||
|  | ||||
| void setup()  | ||||
| { | ||||
|   // Dynamixel 2.0 Baudrate -> 0: 9600, 1: 57600, 2: 115200, 3: 1Mbps  | ||||
|   Dxl.begin(3); | ||||
|    | ||||
|   // On passe nos 8 servo en mode position | ||||
|   Dxl.jointMode(PATTE_1_SERVO1); | ||||
|   Dxl.jointMode(PATTE_1_SERVO2); | ||||
|    | ||||
|   Dxl.jointMode(PATTE_2_SERVO1); | ||||
|   Dxl.jointMode(PATTE_2_SERVO2); | ||||
|    | ||||
|   Dxl.jointMode(PATTE_3_SERVO1); | ||||
|   Dxl.jointMode(PATTE_3_SERVO2); | ||||
|    | ||||
|   Dxl.jointMode(PATTE_4_SERVO1); | ||||
|   Dxl.jointMode(PATTE_4_SERVO2); | ||||
|    | ||||
|   // On passe dans le premier état (-1 = lancement des moteurs; puis 0 = initialisation) | ||||
|   state_avg = -1; | ||||
|   state_avd = -1;  | ||||
|   state_arg = -1; | ||||
|   state_ard = -1; | ||||
|    | ||||
|   // On initialise notre communication série | ||||
|   SerialUSB.println("Hi"); | ||||
| } | ||||
|  | ||||
| void loop()  | ||||
| { | ||||
|   // Gestion des différents états   | ||||
|    | ||||
|   // Patte avant droite (patte maitre) | ||||
|   SerialUSB.print("Patte avant droite - état "); SerialUSB.println(state_avd); | ||||
|   patteManager(&state_avd, &state_arg, PATTE_4_SERVO1, PATTE_4_SERVO2, 1, 0, 1); | ||||
|    | ||||
|   // Patte arrière gauche | ||||
|   SerialUSB.print("Patte arrière gauche - état "); SerialUSB.println(state_arg); | ||||
|   patteManager(&state_arg, &state_avg, PATTE_1_SERVO1, PATTE_1_SERVO2, 0, 1, 0); | ||||
|    | ||||
|   // Patte avant gauche | ||||
|   SerialUSB.print("Patte avant gauche - état "); SerialUSB.println(state_avg); | ||||
|   patteManager(&state_avg, &state_ard, PATTE_3_SERVO1, PATTE_3_SERVO2, 0, 1, 1); | ||||
|    | ||||
|   // Patte arrière droite | ||||
|   SerialUSB.print("Patte arrière droite - état "); SerialUSB.println(state_ard); | ||||
|   patteManager(&state_ard, &state_avd, PATTE_2_SERVO1, PATTE_2_SERVO2, 0, 0, 0); | ||||
|    | ||||
|   SerialUSB.println("###################"); | ||||
| } | ||||
|  | ||||
| /******************************** | ||||
| *     FONCTIONS D'ANIMATION     * | ||||
| *********************************/ | ||||
|  | ||||
| // Mouvement d'une patte | ||||
| int patteManager(int *state, int *next_state, int patte_servo1, int patte_servo2, int is_master, int is_on_left, int is_on_front) | ||||
| { | ||||
|   // En fonction des paramètres, on défini les bonnes valeurs à partir des constantes (avg = ard et inversement) | ||||
|   int position_intiale_servo1 = (is_on_front == is_on_left ? POS_INITIALE_SERVO1_TYPE1 : POS_INITIALE_SERVO1_TYPE2); | ||||
|   int position_intiale_servo2 = (is_on_front == is_on_left ? POS_INITIALE_SERVO2_TYPE1 : POS_INITIALE_SERVO2_TYPE1); | ||||
|    | ||||
|   int rotation_move_servo1 = (is_on_left ? position_intiale_servo1 + ROTATION_SERVO1 : position_intiale_servo1 - ROTATION_SERVO1); | ||||
|   int rotation_move_servo2 = position_intiale_servo2 + ROTATION_SERVO2; | ||||
|    | ||||
|   // Switch d'état | ||||
|   switch (*state) | ||||
|   { | ||||
|     // Les différents états de notre patte | ||||
|        | ||||
|     case -1: // Etat spécial pour l'initialisation des positions au démarrage | ||||
|       Dxl.setPosition(patte_servo1, position_intiale_servo1, SPEED_RAPID); | ||||
|       Dxl.setPosition(patte_servo2, position_intiale_servo2, SPEED_RAPID); | ||||
|        | ||||
|       *state = 0; // Pret à démarrer !  | ||||
|        | ||||
|       SerialUSB.println("Pret a démarrer"); | ||||
|        | ||||
|       break; | ||||
|      | ||||
|     case 0: // Initialisation, en attente - si la patte est maitre et que le robot est pret à bouger, elle passe dans l'état 1 | ||||
|       /*if(is_master && isReadyToBegin()) | ||||
|       { | ||||
|         *state = 1; | ||||
|         SerialUSB.println("Patte maitre, initialisation - Système pret"); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         SerialUSB.println("En attente du maitre"); | ||||
|       }*/ | ||||
|        | ||||
|       if(isReadyToBegin()) | ||||
|       { | ||||
|         *state = 1; | ||||
|       } | ||||
|  | ||||
|       break; | ||||
|      | ||||
|     case 1: // La patte est posée à plat | ||||
|       SerialUSB.print("Etat 1, patte à plat..."); | ||||
|        | ||||
|       // On bouge la patte | ||||
|       Dxl.setPosition(patte_servo1, position_intiale_servo1, SPEED_SLOW); | ||||
|       Dxl.setPosition(patte_servo2, position_intiale_servo2, SPEED_RAPID); | ||||
|        | ||||
|       // On change d'état | ||||
|       *state = 2; | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 2: // Etat transitoire : on attend que la patte se pose | ||||
|       // La position est-elle la bonne ? | ||||
|       if( | ||||
|         (comparefive(Dxl.getPosition(patte_servo1), position_intiale_servo1)) && | ||||
|         (comparefive(Dxl.getPosition(patte_servo2), position_intiale_servo2)) | ||||
|       ) | ||||
|       { | ||||
|         *state = 3; | ||||
|         SerialUSB.println("OK"); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo1)); | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo2)); | ||||
|       } | ||||
|          | ||||
|       break; | ||||
|      | ||||
|     case 3: // La patte se lève et s'avance rapidement | ||||
|       SerialUSB.print("Etat 3, patte se lève et avance..."); | ||||
|        | ||||
|       // On bouge la patte   | ||||
|       Dxl.setPosition(patte_servo1, rotation_move_servo1, SPEED_RAPID); | ||||
|       Dxl.setPosition(patte_servo2, rotation_move_servo2, SPEED_RAPID); | ||||
|        | ||||
|       // On change d'état | ||||
|       *state = 4; | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 4: // Etat transitoire : on attend que la patte se soit avancée | ||||
|       // La position est-elle la bonne ? | ||||
|       if( | ||||
|         (comparefive(Dxl.getPosition(patte_servo1), rotation_move_servo1)) && | ||||
|         (comparefive(Dxl.getPosition(patte_servo2), rotation_move_servo2)) | ||||
|       ) | ||||
|       { | ||||
|         SerialUSB.println("OK"); | ||||
|          | ||||
|         // On change d'état | ||||
|         *state = 5; | ||||
|       } | ||||
|       else | ||||
|       {         | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo1)); | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo2)); | ||||
|       } | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 5: // Etat où la patte se repose sur le sol | ||||
|       // On anime le servomoteur | ||||
|       Dxl.setPosition(patte_servo2, position_intiale_servo2, SPEED_RAPID);     | ||||
|        | ||||
|       // On change d'état | ||||
|       *state = 6; | ||||
|        | ||||
|       SerialUSB.print("La patte se repose sur le sol... "); | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 6: // Etat transitoire où l'on attend que la patte se repose | ||||
|       // La position est-elle la bonne ? | ||||
|       if(comparefive(Dxl.getPosition(patte_servo2), position_intiale_servo2)) | ||||
|       { | ||||
|         *state = 7; | ||||
|          | ||||
|         // La patte reposée déclenche le mouvement de la suivante | ||||
|         *next_state = 1; | ||||
|  | ||||
|         SerialUSB.println("OK"); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo2)); | ||||
|       } | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 7: // Le corps pivote | ||||
|       // Mouvement du servomoteur | ||||
|       Dxl.setPosition(patte_servo1, position_intiale_servo1, SPEED_SLOW); | ||||
|        | ||||
|       // Changement d'état | ||||
|       *state = 0; | ||||
|        | ||||
|       SerialUSB.println("Pivot délenché, retour au début");   | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     default: | ||||
|       SerialUSB.println("Etat non supporté"); | ||||
|       break; | ||||
|        | ||||
|   } | ||||
| } | ||||
|  | ||||
| /***************** | ||||
| *     OUTILS     * | ||||
| ******************/ | ||||
|  | ||||
| // Vérifier si deux nombres correspondent, à 5 près | ||||
| int comparefive(int number1, int number2) | ||||
| { | ||||
|   return (abs(number1 - number2) <= 5); | ||||
| } | ||||
|  | ||||
| // Vérifier que le système est dans un état d'interblocage pour démarrer : le maitre attend tous les esclaves, et les esclaves sont en attente du maitre | ||||
| int isReadyToBegin() | ||||
| { | ||||
|   int statesInitCounter = 0; | ||||
|    | ||||
|   if(state_avg == 0) statesInitCounter++; | ||||
|   if(state_avd == 0) statesInitCounter++; | ||||
|   if(state_arg == 0) statesInitCounter++; | ||||
|   if(state_ard == 0) statesInitCounter++; | ||||
|    | ||||
|   return (statesInitCounter == 4); | ||||
| } | ||||
							
								
								
									
										354
									
								
								source_robot_masterless.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										354
									
								
								source_robot_masterless.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,354 @@ | ||||
| // Bus pour le Dxl | ||||
| #define DXL_BUS_SERIAL1 1  //Dynamixel on Serial1(USART1)  <-OpenCM9.04 | ||||
| #define DXL_BUS_SERIAL2 2  //Dynamixel on Serial2(USART2)  <-LN101,BT210 | ||||
| #define DXL_BUS_SERIAL3 3  //Dynamixel on Serial3(USART3)  <-OpenCM 485EXP | ||||
|  | ||||
| // Nos quatre pattes, avec leur deux servomoteurs | ||||
|  | ||||
| // Arrière gauche | ||||
| #define PATTE_1_SERVO1 7 // Proche corps | ||||
| #define PATTE_1_SERVO2 9 // Proche sol | ||||
|  | ||||
| // Arrière droit | ||||
| #define PATTE_2_SERVO1 8 | ||||
| #define PATTE_2_SERVO2 12 | ||||
|  | ||||
| // Avant gauche | ||||
| #define PATTE_3_SERVO1 16 | ||||
| #define PATTE_3_SERVO2 11 | ||||
|  | ||||
| // Avant droit | ||||
| #define PATTE_4_SERVO1 14 | ||||
| #define PATTE_4_SERVO2 18 | ||||
|  | ||||
| // Positions initiales | ||||
| #define POS_INITIALE_SERVO1_TYPE1 380 | ||||
| #define POS_INITIALE_SERVO1_TYPE2 POS_INITIALE_SERVO1_TYPE1 + 256 | ||||
|  | ||||
| #define POS_INITIALE_SERVO2_TYPE1 280 | ||||
|  | ||||
| // Positions avancement | ||||
| #define ROTATION_SERVO1 150 | ||||
| #define ROTATION_SERVO2 120 | ||||
|  | ||||
| // Vitesses servo | ||||
| #define SPEED_SLOW 150 | ||||
| #define SPEED_RAPID 300 | ||||
|  | ||||
| // Les 4 directions + le repos | ||||
| #define DIRECTION_NONE 1 | ||||
| #define DIRECTION_FRONT 2 | ||||
| #define DIRECTION_BACK 3 | ||||
| #define DIRECTION_LEFT 4 | ||||
| #define DIRECTION_RIGHT 5 | ||||
|  | ||||
| // On initialise notre bus dynamixel | ||||
| Dynamixel Dxl(DXL_BUS_SERIAL1); | ||||
|  | ||||
| // Variables d'état de notre robot | ||||
| int state_avg, state_avd, state_arg, state_ard; | ||||
| int direction, wanted_direction = NULL; | ||||
|  | ||||
| void setup()  | ||||
| { | ||||
|   // Dynamixel 2.0 Baudrate -> 0: 9600, 1: 57600, 2: 115200, 3: 1Mbps  | ||||
|   Dxl.begin(3); | ||||
|    | ||||
|   // On passe nos 8 servo en mode position | ||||
|   Dxl.jointMode(PATTE_1_SERVO1); | ||||
|   Dxl.jointMode(PATTE_1_SERVO2); | ||||
|    | ||||
|   Dxl.jointMode(PATTE_2_SERVO1); | ||||
|   Dxl.jointMode(PATTE_2_SERVO2); | ||||
|    | ||||
|   Dxl.jointMode(PATTE_3_SERVO1); | ||||
|   Dxl.jointMode(PATTE_3_SERVO2); | ||||
|    | ||||
|   Dxl.jointMode(PATTE_4_SERVO1); | ||||
|   Dxl.jointMode(PATTE_4_SERVO2); | ||||
|    | ||||
|   // On passe dans le premier état (-1 = lancement des moteurs; puis 0 = initialisation) | ||||
|   state_avg = -1; | ||||
|   state_avd = -1;  | ||||
|   state_arg = -1; | ||||
|   state_ard = -1; | ||||
|  | ||||
|   // Direction par défaut | ||||
|   direction = DIRECTION_NONE; | ||||
|    | ||||
|   // On lie une interruption sur le port série USB | ||||
|   // Pour les commandes du robot | ||||
|   SerialUSB.attachInterrupt(USBInterrupt); | ||||
| } | ||||
|  | ||||
| void loop()  | ||||
| { | ||||
|   // Gestion des différents états   | ||||
|    | ||||
|   // Patte avant droite | ||||
|   SerialUSB.print("Patte avant droite - état "); SerialUSB.println(state_avd); | ||||
|   pawManager(&state_avd, &state_arg, PATTE_4_SERVO1, PATTE_4_SERVO2, 0, 1); | ||||
|    | ||||
|   // Patte arrière gauche | ||||
|   SerialUSB.print("Patte arrière gauche - état "); SerialUSB.println(state_arg); | ||||
|   pawManager(&state_arg, &state_avg, PATTE_1_SERVO1, PATTE_1_SERVO2, 1, 0); | ||||
|    | ||||
|   // Patte avant gauche | ||||
|   SerialUSB.print("Patte avant gauche - état "); SerialUSB.println(state_avg); | ||||
|   pawManager(&state_avg, &state_ard, PATTE_3_SERVO1, PATTE_3_SERVO2, 1, 1); | ||||
|    | ||||
|   // Patte arrière droite | ||||
|   SerialUSB.print("Patte arrière droite - état "); SerialUSB.println(state_ard); | ||||
|   pawManager(&state_ard, &state_avd, PATTE_2_SERVO1, PATTE_2_SERVO2, 0, 0); | ||||
|    | ||||
|   SerialUSB.println("###################"); | ||||
| } | ||||
|  | ||||
| /******************************** | ||||
| *     FONCTIONS D'ANIMATION     * | ||||
| *********************************/ | ||||
|  | ||||
| // Mouvement d'une patte | ||||
| int pawManager(int *state, int *next_paw_state, int patte_servo1, int patte_servo2, int is_on_left, int is_on_front) | ||||
| { | ||||
|   // En fonction des paramètres, on défini les bonnes valeurs à partir des constantes (avg = ard et inversement) | ||||
|   int position_intiale_servo1 = (is_on_front == is_on_left ? POS_INITIALE_SERVO1_TYPE1 : POS_INITIALE_SERVO1_TYPE2); | ||||
|   int position_intiale_servo2 = POS_INITIALE_SERVO2_TYPE1; | ||||
|    | ||||
|   int rotation_move_servo1 = position_intiale_servo1; | ||||
|   int rotation_move_servo2 = position_intiale_servo2 + ROTATION_SERVO2; | ||||
|  | ||||
|   // Le sens de déplacement influence les ordres donnés aux servomoteurs | ||||
|   switch (direction) | ||||
|   { | ||||
|       case DIRECTION_FRONT: | ||||
|         rotation_move_servo1 += (is_on_left ? ROTATION_SERVO1 : -1*ROTATION_SERVO1); | ||||
|         break; | ||||
|  | ||||
|       case DIRECTION_BACK: | ||||
|         rotation_move_servo1 += (is_on_left ? -1*ROTATION_SERVO1 : ROTATION_SERVO1); | ||||
|         break; | ||||
|  | ||||
|       case DIRECTION_LEFT: | ||||
|         rotation_move_servo1 -= ROTATION_SERVO1; | ||||
|         break; | ||||
|  | ||||
|       case DIRECTION_RIGHT: | ||||
|         rotation_move_servo1 += ROTATION_SERVO1; | ||||
|         break; | ||||
|   } | ||||
|    | ||||
|   // Switch d'état | ||||
|   switch (*state) | ||||
|   { | ||||
|     // Les différents états de notre patte | ||||
|        | ||||
|     case -1: // Etat spécial pour l'initialisation des positions au démarrage | ||||
|       Dxl.setPosition(patte_servo1, position_intiale_servo1, SPEED_RAPID); | ||||
|       Dxl.setPosition(patte_servo2, position_intiale_servo2, SPEED_RAPID); | ||||
|        | ||||
|       *state = 0; // Pret à démarrer !  | ||||
|        | ||||
|       SerialUSB.println("Pret a démarrer"); | ||||
|        | ||||
|       break; | ||||
|      | ||||
|     case 0: // Initialisation, en attente - si le robot est pret à bouger, elle passe dans l'état 1 | ||||
|       if(isReadyToBegin()) | ||||
|       { | ||||
|         // Si la direction doit être changée, elle doit l'être à ce moment | ||||
|         if(direction != wanted_direction && wanted_direction != NULL) | ||||
|         { | ||||
|             direction = wanted_direction; | ||||
|             wanted_direction = NULL; | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         *state = 1; | ||||
|         SerialUSB.println("Système pret"); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         SerialUSB.println("En attente des autres pattes"); | ||||
|       } | ||||
|  | ||||
|       break; | ||||
|      | ||||
|     case 1: // La patte est posée à plat | ||||
|       SerialUSB.print("Etat 1, patte à plat..."); | ||||
|        | ||||
|       // On bouge la patte | ||||
|       Dxl.setPosition(patte_servo1, position_intiale_servo1, SPEED_SLOW); | ||||
|       Dxl.setPosition(patte_servo2, position_intiale_servo2, SPEED_RAPID); | ||||
|        | ||||
|       // On change d'état | ||||
|       *state = 2; | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 2: // Etat transitoire : on attend que la patte se pose | ||||
|       // La position est-elle la bonne ? | ||||
|       if( | ||||
|         (compareFive(Dxl.getPosition(patte_servo1), position_intiale_servo1)) && | ||||
|         (compareFive(Dxl.getPosition(patte_servo2), position_intiale_servo2)) | ||||
|       ) | ||||
|       { | ||||
|         // L'état suivant dépend de si le robot doit avancer | ||||
|         if(direction == DIRECTION_NONE) | ||||
|         { | ||||
|           *state = 0; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           *state = 3; | ||||
|         } | ||||
|  | ||||
|         SerialUSB.println("OK"); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo1)); | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo2)); | ||||
|       } | ||||
|          | ||||
|       break; | ||||
|      | ||||
|     case 3: // La patte se lève et s'avance rapidement | ||||
|       SerialUSB.print("Etat 3, patte se lève et avance..."); | ||||
|        | ||||
|       // On bouge la patte   | ||||
|       Dxl.setPosition(patte_servo1, rotation_move_servo1, SPEED_RAPID); | ||||
|       Dxl.setPosition(patte_servo2, rotation_move_servo2, SPEED_RAPID); | ||||
|        | ||||
|       // On change d'état | ||||
|       *state = 4; | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 4: // Etat transitoire : on attend que la patte se soit avancée | ||||
|       // La position est-elle la bonne ? | ||||
|       if( | ||||
|         (compareFive(Dxl.getPosition(patte_servo1), rotation_move_servo1)) && | ||||
|         (compareFive(Dxl.getPosition(patte_servo2), rotation_move_servo2)) | ||||
|       ) | ||||
|       { | ||||
|         SerialUSB.println("OK"); | ||||
|          | ||||
|         // On change d'état | ||||
|         *state = 5; | ||||
|       } | ||||
|       else | ||||
|       {         | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo1)); | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo2)); | ||||
|       } | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 5: // Etat où la patte se repose sur le sol | ||||
|       // On anime le servomoteur | ||||
|       Dxl.setPosition(patte_servo2, position_intiale_servo2, SPEED_RAPID);     | ||||
|        | ||||
|       // On change d'état | ||||
|       *state = 6; | ||||
|        | ||||
|       SerialUSB.print("La patte se repose sur le sol... "); | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 6: // Etat transitoire où l'on attend que la patte se repose | ||||
|       // La position est-elle la bonne ? | ||||
|       if(compareFive(Dxl.getPosition(patte_servo2), position_intiale_servo2)) | ||||
|       { | ||||
|         *state = 7; | ||||
|          | ||||
|         // La patte reposée déclenche le mouvement de la suivante | ||||
|         // Sauf si un changement de direction est décidé : on bloque le mouvement | ||||
|         if(wanted_direction == NULL) | ||||
|         { | ||||
|           *next_paw_state = 1; | ||||
|         } | ||||
|  | ||||
|         SerialUSB.println("OK"); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         SerialUSB.println(Dxl.getPosition(patte_servo2)); | ||||
|       } | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     case 7: // Le corps pivote | ||||
|       // Mouvement du servomoteur | ||||
|       Dxl.setPosition(patte_servo1, position_intiale_servo1, SPEED_SLOW); | ||||
|        | ||||
|       // Changement d'état | ||||
|       *state = 0; | ||||
|        | ||||
|       SerialUSB.println("Pivot délenché, retour au début");   | ||||
|        | ||||
|       break; | ||||
|        | ||||
|     default: | ||||
|       SerialUSB.println("Etat non supporté"); | ||||
|       break; | ||||
|        | ||||
|   } | ||||
| } | ||||
|  | ||||
| // La direction est reçue par le port série USB | ||||
| // Cette fonction gère l'interruption | ||||
| void USBInterrupt(byte* buffer, byte nCount)   | ||||
| { | ||||
|     // Ici, la valeur reçue est un nombre [0;5] | ||||
|     // Donc tenant sur 1 seul octet | ||||
|     // Pas besoin de parcourir au delà de l'index 0 du buffer | ||||
|     SerialUSB.print("Reçu (ascii ; int) : "); | ||||
|     SerialUSB.print(buffer[0]); | ||||
|     SerialUSB.print(" ; ");    | ||||
|  | ||||
|     // On stocke la valeur dans une variable temporaire, en convertissant le char en int | ||||
|     // Sous condition que la valeur reçue soit un nombre ASCII | ||||
|     if(buffer[0] > 47 && buffer[0] < 58) | ||||
|     { | ||||
|         int tmp_direction = buffer[0] - '0'; | ||||
|         SerialUSB.print(tmp_direction); | ||||
|  | ||||
|         // La valeur est-elle cohérente ? | ||||
|         switch(tmp_direction) | ||||
|         { | ||||
|             case DIRECTION_NONE: | ||||
|             case DIRECTION_FRONT: | ||||
|             case DIRECTION_BACK: | ||||
|             case DIRECTION_LEFT: | ||||
|             case DIRECTION_RIGHT: | ||||
|               wanted_direction = tmp_direction; | ||||
|               break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SerialUSB.println(); | ||||
| } | ||||
|  | ||||
| /***************** | ||||
| *     OUTILS     * | ||||
| ******************/ | ||||
|  | ||||
| // Vérifier si deux nombres correspondent, à 5 près | ||||
| int compareFive(int number1, int number2) | ||||
| { | ||||
|   return (abs(number1 - number2) <= 5); | ||||
| } | ||||
|  | ||||
| // Vérifier que toutes les pattes sont en attente de démarrage | ||||
| int isReadyToBegin() | ||||
| { | ||||
|   int statesInitCounter = 0; | ||||
|    | ||||
|   if(state_avg == 0) statesInitCounter++; | ||||
|   if(state_avd == 0) statesInitCounter++; | ||||
|   if(state_arg == 0) statesInitCounter++; | ||||
|   if(state_ard == 0) statesInitCounter++; | ||||
|    | ||||
|   return (statesInitCounter == 4); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user