AX12 gros robot

Fork of command_AX12_gros_robot by CRAC Team

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "AX12.h"
00003 #include "cmsis.h"
00004 #include "ident_crac.h"
00005 
00006 #define AX12_INITIALISATION 0
00007 #define AX12_PREPARATION_PRISE 1
00008 #define AX12_STOCKAGE_HAUT 2
00009 #define AX12_STOCKAGE_BAS 3
00010 #define AX12_DEPOSER 4
00011 #define AX12_PREPARATION_DEPOT_BAS 5
00012 #define AX12_PREPARATION_DEPOT_HAUT 6
00013 #define AX12_POUSSER_MODULE 7
00014 #define AX12_DEFAUT 20
00015 
00016 #define TIME 0.8
00017 #define TOLERANCE_AX12 50
00018 #define SIZE_FIFO 25        
00019         
00020                              /*  DECLARATION VARIABLES */
00021 CAN can1(p30,p29);
00022 CANMessage msgRxBuffer[SIZE_FIFO];
00023 unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
00024 unsigned char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
00025 
00026 extern "C" void mbed_reset();//Pour pouvoir reset la carte
00027 
00028 unsigned char action = 0, choix_bras = 0, etat_ax12 = 0, flag = 0;
00029 static float TAB_ANGLE1[4], TAB_ANGLE2[4];
00030 static char TAB_POSITION[4];
00031 short vitesse=700;
00032 float angle=0.0;
00033 float test_socle=0.0,test_bas=0.0,test_milieu=0.0,test_haut=0.0,test_ventouse=0.0, test_calcul=0.0, valeur_test=0.0;  
00034 AX12 *deux_myAX12, *trois_myAX12, *quatre_myAX12, *sept_myAX12, *huit_myAX12, *quinze_myAX12, *treize_myAX12, *quatorze_myAX12, *dixhuit_myAX12, *multiple_myAX12, *multiple2_myAX12; 
00035                                  
00036                                  
00037                     /*       PROTOTYPES DE FONCTIONS ET POINTEURS       */
00038                     
00039   
00040 /****************************************************************************************/
00041 /* FUNCTION NAME: CAN2_wrFilter                                                         */
00042 /* DESCRIPTION  : Fonction qui permet de ne garder que les ID qui nous interessent      */
00043 /****************************************************************************************/                    
00044 void CAN2_wrFilter (uint32_t id);                    
00045                                   
00046 /****************************************************************************************/
00047 /* FUNCTION NAME: canProcessRx                                                          */
00048 /* DESCRIPTION  : Fonction de traitement des messages CAN                               */
00049 /****************************************************************************************/
00050 void canProcessRx(void);
00051 
00052 /****************************************************************************************/
00053 /* FUNCTION NAME: canRx_ISR                                                             */
00054 /* DESCRIPTION  : Interruption en réception sur le CAN                                  */
00055 /****************************************************************************************/
00056 void canRx_ISR (void);
00057 
00058 /****************************************************************************************/
00059 /* FUNCTION NAME: SendRawId                                                             */
00060 /* DESCRIPTION  : Fonction qui permet d'envoi une trame vide à un ID                    */
00061 /****************************************************************************************/
00062 void SendRawId (unsigned short id);
00063 
00064 /****************************************************************************************/
00065 /* FUNCTION NAME: Fin_action                                                            */
00066 /* DESCRIPTION  : Fonction qui confirme la fin de mouvement des AX12                    */
00067 /****************************************************************************************/
00068 void Fin_action(void);
00069 
00070 /****************************************************************************************/
00071 /* FUNCTION NAME: Automate_ax12                                                         */
00072 /* DESCRIPTION  : Fonction qui gère les différentes actions des AX12                    */
00073 /****************************************************************************************/
00074 void AX12_automate(void);
00075 
00076 /****************************************************************************************/
00077 /* FUNCTION NAME: Initialisation_position                                               */
00078 /* DESCRIPTION  : Fonction qui place les bras en position verticale                     */
00079 /****************************************************************************************/
00080 void Initialisation_position(unsigned char choix);
00081 
00082 /****************************************************************************************/
00083 /* FUNCTION NAME: Preparation_prise                                                     */
00084 /* DESCRIPTION  : Fonction qui prepare le robot pour prendre les modules                */
00085 /****************************************************************************************/
00086 void Preparation_prise(unsigned char choix);
00087 
00088 /****************************************************************************************/
00089 /* FUNCTION NAME: Stockage_haut                                                         */
00090 /* DESCRIPTION  : Fonction qui prend et stocke les modules dans la position haute       */
00091 /****************************************************************************************/
00092 void Stockage_haut(unsigned char choix);
00093 
00094 /****************************************************************************************/
00095 /* FUNCTION NAME: Stockage_bas                                                          */
00096 /* DESCRIPTION  : Fonction qui prend et stocke un module dans la pince                  */
00097 /****************************************************************************************/
00098 void Stockage_bas(unsigned char choix);
00099 
00100 /****************************************************************************************/
00101 /* FUNCTION NAME: Deposer                                                               */
00102 /* DESCRIPTION  : Fonction qui permet de déposer un module                              */
00103 /****************************************************************************************/
00104 void Deposer(unsigned char choix);
00105 
00106 /****************************************************************************************/
00107 /* FUNCTION NAME: Preparation_depos_bas                                                 */
00108 /* DESCRIPTION  : Fonction qui prépare le depos d'un module en bas                      */
00109 /****************************************************************************************/
00110 void Preparation_depot_bas(unsigned char choix);
00111 
00112 /****************************************************************************************/
00113 /* FUNCTION NAME: Preparation_depos_haut                                                */
00114 /* DESCRIPTION  : Fonction qui prépare le depos d'un module en haut                     */
00115 /****************************************************************************************/
00116 void Preparation_depot_haut(unsigned char choix);
00117 
00118 /****************************************************************************************/
00119 /* FUNCTION NAME: Pousser_module                                                        */
00120 /* DESCRIPTION  : Fonction qui permet pousser le module situé à l'entrée de la bas      */
00121 /****************************************************************************************/
00122 void Pousser_module(unsigned char choix);
00123 
00124 /****************************************************************************************/
00125 /* FUNCTION NAME: Check_positionAX12                                                    */
00126 /* DESCRIPTION  : Fonction qui permet de verifier la position des AX12                  */
00127 /****************************************************************************************/
00128 void Check_positionAX12(char* TAB, unsigned char choix);
00129 
00130 Timer t;
00131 Ticker flipper;
00132 
00133 ///////////TABLEAU PINCE DROITE /////////////////////////// --> choix_bras == 1
00134 static char TAB1[25]=   {0x12,0xDA, 0x00, 0xFF, 0x00,               ///Position initiale          
00135                          0x04,0xF4, 0x01, 0xFF, 0x00,
00136                          0x07,0x00, 0x01, 0xFF, 0x00,
00137                          0x0F,0x00, 0x03, 0xFF, 0x00};                              
00138 
00139 static char TAB2[25]=   {0x12,0xFF, 0x02, 0xFF, 0x03,               ///Preparation prise              
00140                          0x04,0xE9, 0x00, 0xFF, 0x03,
00141                          0x07,0xF4, 0x01, 0xFF, 0x03,
00142                          0x0F,0xF4, 0x01, 0xFF, 0x03};
00143                          
00144 static char TAB3[25]=   {0x12,0xFF, 0x02, 0xFF, 0x03,               ///Stockage haut/bas (attraper module)            
00145                          0x04,0xE9, 0x00, 0xFF, 0x03,
00146                          0x07,0xD5, 0x00, 0xFF, 0x00,
00147                          0x0F,0x4D, 0x03, 0xFF, 0x00}; 
00148 
00149 static char TAB4[25]=   {0x12,0x35, 0x01, 0xFF, 0x03,               ///Stockage haut (bras en l'air)   
00150                          0x04,0x00, 0x02, 0xFF, 0x03,
00151                          0x07,0xD5, 0x00, 0xFF, 0x00,
00152                          0x0F,0x4D, 0x03, 0xFF, 0x00}; 
00153                          
00154 static char TAB5[25]=   {0x12,0x35, 0x01, 0xFF, 0x00,               ///Stockage haut (module sur tige)              
00155                          0x04,0x60, 0x01, 0xFF, 0x00,
00156                          0x07,0xD5, 0x00, 0xFF, 0x00,
00157                          0x0F,0x4D, 0x03, 0xFF, 0x00};  
00158                          
00159 static char TAB6[25]=   {0x12,0x35, 0x01, 0xFF, 0x03,               ///Stockage haut (pince ouverte)            
00160                          0x04,0x50, 0x01, 0xFF, 0x03,
00161                          0x07,0x0A, 0x01, 0xFF, 0x03,
00162                          0x0F,0xDD, 0x02, 0xFF, 0x03}; 
00163                          
00164 static char TAB7[25]=   {0x12,0xA6, 0x00, 0xFF, 0x03,               ///Stockage bas (bras en l'air)              
00165                          0x04,0x50, 0x03, 0xFF, 0x03,
00166                          0x07,0xD5, 0x00, 0xFF, 0x03,
00167                          0x0F,0x4D, 0x03, 0xFF, 0x03};  
00168                          
00169 static char TAB8[25]=   {0x12,0xF4, 0x01, 0xFF, 0x00,               ///Deposer (descendre bras)            
00170                          0x04,0x00, 0x03, 0xFF, 0x00,
00171                          0x07,0xD5, 0x00, 0xFF, 0x00,
00172                          0x0F,0x4D, 0x03, 0xFF, 0x00}; 
00173                          
00174 static char TAB9[25]=   {0x12,0xF4, 0x01, 0xFF, 0x03,               ///Deposer (pince ouverte)            
00175                          0x04,0x00, 0x03, 0xFF, 0x03,
00176                          0x07,0x0A, 0x01, 0xFF, 0x03,
00177                          0x0F,0xDD, 0x02, 0xFF, 0x03}; 
00178                          
00179 static char TAB10[25]=   {0x12,0x35, 0x01, 0xFF, 0x00,               ///deposer (preparation module haut)              
00180                          0x04,0x00, 0x02, 0xFF, 0x00,
00181                          0x07,0xD5, 0x00, 0xFF, 0x00,
00182                          0x0F,0x4D, 0x03, 0xFF, 0x00}; 
00183                          
00184 static char TAB11[25]=   {0x12,0xB0, 0x01, 0xFF, 0x00,               ///Pousser module (bras en bas)            
00185                          0x04,0x00, 0x03, 0xFF, 0x00,
00186                          0x07,0x0A, 0x01, 0xFF, 0x03,
00187                          0x0F,0xDD, 0x02, 0xFF, 0x03};                                                                         
00188                          
00189                          
00190 //////////////////TABLEAU PINCE GAUCHE /////////////////////////////    --> choix_bras == 2
00191 static char TAB21[25]=   {0x08,0xDA, 0x00, 0xFF, 0x00,               ///Position initiale          
00192                          0x03,0xF4, 0x01, 0xFF, 0x00,
00193                          0x0D,0x00, 0x01, 0xFF, 0x00,
00194                          0x0E,0x00, 0x03, 0xFF, 0x00};                              
00195 
00196 static char TAB22[25]=   {0x08,0xFF, 0x02, 0xFF, 0x03,               ///Preparation prise              
00197                          0x03,0xE9, 0x00, 0xFF, 0x03,
00198                          0x0D,0xF4, 0x01, 0xFF, 0x03,
00199                          0x0E,0xF4, 0x01, 0xFF, 0x03};
00200                          
00201 static char TAB23[25]=   {0x08,0xFF, 0x02, 0xFF, 0x03,               ///Stockage haut/bas (attraper module)            
00202                          0x03,0xE9, 0x00, 0xFF, 0x03,
00203                          0x0D,0xD5, 0x00, 0xFF, 0x00,
00204                          0x0E,0x4D, 0x03, 0xFF, 0x00};  
00205 
00206 static char TAB24[25]=   {0x08,0x35, 0x01, 0xFF, 0x03,               ///Stockage haut (bras en l'air)   
00207                          0x03,0x00, 0x02, 0xFF, 0x03,
00208                          0x0D,0xD5, 0x00, 0xFF, 0x00,
00209                          0x0E,0x4D, 0x03, 0xFF, 0x00};  
00210                          
00211 static char TAB25[25]=   {0x08,0x35, 0x01, 0xFF, 0x00,               ///Stockage haut (module sur tige)              
00212                          0x03,0x60, 0x01, 0xFF, 0x00,
00213                          0x0D,0xD5, 0x00, 0xFF, 0x00,
00214                          0x0E,0x4D, 0x03, 0xFF, 0x00};  
00215                          
00216 static char TAB26[25]=   {0x08,0x35, 0x01, 0xFF, 0x03,               ///Stockage haut (pince ouverte)            
00217                          0x03,0x50, 0x01, 0xFF, 0x03,
00218                          0x0D,0x0A, 0x01, 0xFF, 0x03,
00219                          0x0E,0xDD, 0x02, 0xFF, 0x03}; 
00220                          
00221 static char TAB27[25]=   {0x08,0xA6, 0x00, 0xFF, 0x03,               ///Stockage bas (bras en l'air)              
00222                          0x03,0x50, 0x03, 0xFF, 0x03,
00223                          0x0D,0xD5, 0x00, 0xFF, 0x03,
00224                          0x0E,0x4D, 0x03, 0xFF, 0x03}; 
00225                          
00226 static char TAB28[25]=   {0x08,0xF4, 0x01, 0xFF, 0x00,               ///Deposer(descendre bras)            
00227                          0x03,0x00, 0x03, 0xFF, 0x00,
00228                          0x0D,0xD5, 0x00, 0xFF, 0x00,
00229                          0x0E,0x4D, 0x03, 0xFF, 0x00}; 
00230                          
00231 static char TAB29[25]=   {0x08,0xF4, 0x01, 0xFF, 0x03,               ///Deposer(pince ouverte)            
00232                          0x03,0x00, 0x03, 0xFF, 0x03,
00233                          0x0D,0xF4, 0x01, 0xFF, 0x03,
00234                          0x0E,0xF4, 0x01, 0xFF, 0x03}; 
00235                          
00236 static char TAB30[25]=   {0x08,0x35, 0x01, 0xFF, 0x00,               ///deposer(preparation module haut)              
00237                          0x03,0x00, 0x02, 0xFF, 0x00,
00238                          0x0D,0xD5, 0x00, 0xFF, 0x00,
00239                           0x0E,0x4D, 0x03, 0xFF, 0x00};    
00240                          
00241 static char TAB31[25]=   {0x08,0xB0, 0x01, 0xFF, 0x00,               ///Pousser module (bras en bas)            
00242                          0x03,0x00, 0x03, 0xFF, 0x00,
00243                          0x0D,0xD5, 0x00, 0xFF, 0x00,
00244                          0x0E,0x4D, 0x03, 0xFF, 0x00};  
00245                                                       
00246                    
00247                             /*   ANGLE   */
00248                             
00249 /*         10° =    0x21, 0x00   |    110°= 0x6E, 0x01    |   210°= 0xBC, 0x02
00250            20° =    0x42, 0x00   |    120°= 0x90, 0x01    |   220°= 0xDD, 0x02
00251            30° =    0x64, 0x00   |    130°= 0xB1, 0x01
00252            40° =    0x85, 0x00   |    140°= 0xD2, 0x01
00253            50° =    0xA6, 0x00   |    150°= 0xF4, 0x01
00254            60° =    0xC8, 0x00   |    160°= 0x15, 0x02
00255            70° =    0xE9, 0x00   |    170°= 0x36, 0x02
00256            80° =    0x0A, 0x01   |    180°= 0x58, 0x02
00257            90° =    0x2C, 0x01   |    190°= 0x79, 0x02
00258            100°=    0x4D, 0x01   |    200°= 0x9A, 0x02                         */                   
00259 
00260                             /*  NUMERO AX12  */
00261                             
00262 /*         0 =    0x00   |    9  =    0x09  |  18 =   0x12
00263            1 =    0x01   |    10 =    0x0A 
00264            2 =    0x02   |    11 =    0x0B
00265            3 =    0x03   |    12 =    0x0C
00266            4 =    0x04   |    13 =    0x0D
00267            5 =    0x05   |    14 =    0x0E
00268            6 =    0x06   |    15 =    0x0F
00269            7 =    0x07   |    16 =    0x10
00270            8 =    0x08   |    17 =    0x11                      */
00271 
00272 
00273                   
00274                                         /* MAIN */                 
00275 
00276 int main() 
00277 {
00278     can1.frequency(1000000); // fréquence de travail 1Mbit/s
00279     can1.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
00280     CAN2_wrFilter(SERVO_AX12_ACTION);
00281     CAN2_wrFilter(SERVO_AX12_ACK);
00282     CAN2_wrFilter(SERVO_AX12_END);
00283     CAN2_wrFilter(CHECK_AX12);
00284     
00285     trois_myAX12 = new AX12(p9, p10, 3, 1000000);     //pince gauche
00286     treize_myAX12 = new AX12(p9, p10, 13, 1000000);       //pince gauche
00287     quatorze_myAX12 = new AX12(p9, p10, 14, 1000000);    //pince gauche
00288     huit_myAX12 = new AX12(p9, p10, 8, 1000000);   //pince gauche
00289     
00290     quatre_myAX12 = new AX12(p13, p14, 4, 1000000);     //pince droite
00291     sept_myAX12 = new AX12(p13, p14, 7, 1000000);       //pince droite
00292     quinze_myAX12 = new AX12(p13, p14, 15, 1000000);    //pince droite
00293     dixhuit_myAX12 = new AX12(p13, p14, 18, 1000000);   //pince droite
00294         
00295     multiple_myAX12 = new AX12(p13,p14,0xFE,1000000);   //pince droite 
00296     multiple2_myAX12 = new AX12(p9,p10,0xFE,1000000);   //pince gauche 
00297 
00298      while(true) {
00299         AX12_automate();
00300         canProcessRx();//Traitement des trames CAN en attente  
00301     }
00302 }    
00303 
00304                         /*              FONCTIONS                */
00305     
00306 /****************************************************************************************/
00307 /* FUNCTION NAME: canProcessRx                                                          */
00308 /* DESCRIPTION  : Fonction de traitement des messages CAN                               */
00309 /****************************************************************************************/
00310 void canProcessRx(void)
00311 {
00312     static signed char FIFO_occupation=0,FIFO_max_occupation=0;
00313     
00314     CANMessage msgTx=CANMessage();
00315     msgTx.format=CANStandard;
00316     msgTx.type=CANData;
00317     FIFO_occupation=FIFO_ecriture-FIFO_lecture;
00318     
00319     if(FIFO_occupation<0)
00320         FIFO_occupation=FIFO_occupation+SIZE_FIFO;
00321     
00322     if(FIFO_max_occupation<FIFO_occupation)
00323         FIFO_max_occupation=FIFO_occupation;
00324     
00325     if(FIFO_occupation!=0) {
00326         
00327         switch(msgRxBuffer[FIFO_lecture].id) {
00328             case CHECK_AX12:
00329                 SendRawId(ALIVE_AX12);
00330                 flag = 1;
00331                 break;
00332             
00333             case SERVO_AX12_ACTION : 
00334                 etat_ax12 = msgRxBuffer[FIFO_lecture].data[0];
00335                 choix_bras = msgRxBuffer[FIFO_lecture].data[1];
00336                 
00337                 //ACK de reception des actions a effectuer
00338                 msgTx.id = SERVO_AX12_ACK;
00339                 msgTx.len = 1;
00340                 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
00341                 can1.write(msgTx);
00342                 break;
00343         }
00344                     
00345         FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
00346     }
00347 }    
00348  
00349 /****************************************************************************************/
00350 /* FUNCTION NAME: canRx_ISR                                                             */
00351 /* DESCRIPTION  : Interruption en réception sur le CAN                                  */
00352 /****************************************************************************************/
00353 void canRx_ISR (void)
00354 {
00355     if (can1.read(msgRxBuffer[FIFO_ecriture])) {
00356         if(msgRxBuffer[FIFO_ecriture].id==RESET_STRAT) mbed_reset();
00357         else FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
00358     }
00359 } 
00360   
00361 /****************************************************************************************/
00362 /* FUNCTION NAME: SendRawId                                                             */
00363 /* DESCRIPTION  : Fonction qui permet d'envoi une trame vide à un ID                    */
00364 /****************************************************************************************/
00365 void SendRawId (unsigned short id)
00366 {
00367     CANMessage msgTx=CANMessage();
00368     msgTx.id=id;
00369     msgTx.len=0;
00370     can1.write(msgTx);
00371 }  
00372   void Init_AX12()                                           // Initialisation des différents paramétres
00373 {
00374     deux_myAX12-> Set_Goal_speed(vitesse);             // vitesse (0-1023)
00375     quatre_myAX12-> Set_Goal_speed(vitesse);    
00376     sept_myAX12-> Set_Goal_speed(vitesse);
00377     quatorze_myAX12-> Set_Goal_speed(vitesse);
00378     quinze_myAX12-> Set_Goal_speed(vitesse);
00379     dixhuit_myAX12-> Set_Goal_speed(vitesse);
00380     huit_myAX12-> Set_Goal_speed(vitesse);
00381     trois_myAX12-> Set_Goal_speed(vitesse);
00382     quatorze_myAX12-> Set_Goal_speed(vitesse);
00383     treize_myAX12-> Set_Goal_speed(vitesse);
00384     
00385     deux_myAX12-> Set_Mode(0);
00386     quatre_myAX12-> Set_Mode(0);
00387     sept_myAX12-> Set_Mode(0);
00388     quatorze_myAX12-> Set_Mode(0);
00389     quinze_myAX12-> Set_Mode(0);
00390     dixhuit_myAX12-> Set_Mode(0); 
00391     huit_myAX12-> Set_Mode(0); 
00392     trois_myAX12-> Set_Mode(0); 
00393     quatorze_myAX12-> Set_Mode(0); 
00394     treize_myAX12-> Set_Mode(0); 
00395 } 
00396   
00397 
00398 /****************************************************************************************/
00399 /* FUNCTION NAME: Initialisation_position                                               */
00400 /* DESCRIPTION  : Fonction qui place les bras en position verticale                     */
00401 /****************************************************************************************/
00402 void Initialisation_position(unsigned char choix){
00403     if (choix == 1){
00404         multiple_myAX12->multiple_goal_and_speed(4,TAB1);
00405         wait(TIME);  
00406     }
00407     
00408     else if (choix == 2){
00409         multiple2_myAX12->multiple_goal_and_speed(4,TAB21);
00410         wait(TIME);
00411     }
00412     
00413 }
00414 
00415 /****************************************************************************************/
00416 /* FUNCTION NAME: Preparation_prise                                                     */
00417 /* DESCRIPTION  : Fonction qui prepare le robot pour prendre les modules                */
00418 /****************************************************************************************/
00419 void Preparation_prise(unsigned char choix){    
00420     if (choix == 1){
00421         multiple_myAX12->multiple_goal_and_speed(4,TAB2);
00422         wait(TIME);
00423     }
00424     
00425     else if (choix == 2){
00426         multiple2_myAX12->multiple_goal_and_speed(4,TAB22);
00427         wait(TIME);
00428     }
00429 }
00430 
00431 /****************************************************************************************/
00432 /* FUNCTION NAME: Stockage_haut                                                         */
00433 /* DESCRIPTION  : Fonction qui prend et stocke les modules dans la position haute       */
00434 /****************************************************************************************/
00435 void Stockage_haut(unsigned char choix){
00436     if (choix == 1){
00437         multiple_myAX12->multiple_goal_and_speed(4,TAB3);
00438         wait(TIME);
00439         multiple_myAX12->multiple_goal_and_speed(4,TAB4);
00440         wait(TIME);
00441         multiple_myAX12->multiple_goal_and_speed(4,TAB5);
00442         wait(TIME);
00443         multiple_myAX12->multiple_goal_and_speed(4,TAB6);
00444         wait(TIME);
00445     }
00446     
00447     else if (choix == 2){
00448         multiple2_myAX12->multiple_goal_and_speed(4,TAB23);
00449         wait(TIME);
00450         multiple2_myAX12->multiple_goal_and_speed(4,TAB24);
00451         wait(TIME);
00452         multiple2_myAX12->multiple_goal_and_speed(4,TAB25);
00453         wait(TIME);
00454         multiple2_myAX12->multiple_goal_and_speed(4,TAB26);
00455         wait(TIME);
00456     }
00457 }
00458 
00459 /****************************************************************************************/
00460 /* FUNCTION NAME: Stockage_bas                                                          */
00461 /* DESCRIPTION  : Fonction qui prend et stocke un module dans la pince                  */
00462 /****************************************************************************************/
00463 void Stockage_bas(unsigned char choix){
00464     if (choix == 1){
00465         multiple_myAX12->multiple_goal_and_speed(4,TAB3);
00466         wait(TIME);
00467         multiple_myAX12->multiple_goal_and_speed(4,TAB7);
00468         wait(TIME);
00469     } 
00470     
00471     else if (choix == 2){
00472         multiple2_myAX12->multiple_goal_and_speed(4,TAB23);
00473         wait(TIME);
00474         multiple2_myAX12->multiple_goal_and_speed(4,TAB27);
00475         wait(TIME);
00476     }       
00477 }
00478 
00479 /****************************************************************************************/
00480 /* FUNCTION NAME: Deposer                                                               */
00481 /* DESCRIPTION  : Fonction qui permet de déposer le module                              */
00482 /****************************************************************************************/
00483 void Deposer(unsigned char choix){
00484     if (choix == 1){
00485         multiple_myAX12->multiple_goal_and_speed(4,TAB9);
00486         wait(TIME);
00487     }  
00488     
00489     else if (choix == 2){
00490         multiple2_myAX12->multiple_goal_and_speed(4,TAB29);
00491         wait(TIME);
00492     }        
00493 }
00494 
00495 /****************************************************************************************/
00496 /* FUNCTION NAME: Preparation_depot_bas                                                 */
00497 /* DESCRIPTION  : Fonction qui prépare le depos d'un module en bas                      */
00498 /****************************************************************************************/
00499 void Preparation_depot_bas(unsigned char choix){
00500     if (choix == 1){
00501         multiple_myAX12->multiple_goal_and_speed(4,TAB8);
00502         wait(TIME);
00503     }
00504     
00505     else if (choix == 2){
00506         multiple2_myAX12->multiple_goal_and_speed(4,TAB28);
00507         wait(TIME);
00508     }
00509 }
00510 
00511 /****************************************************************************************/
00512 /* FUNCTION NAME: Preparation_depot_haut                                                */
00513 /* DESCRIPTION  : Fonction qui prépare le depos d'un module en haut                     */
00514 /****************************************************************************************/
00515 void Preparation_depot_haut(unsigned char choix){
00516     if (choix == 1){
00517         multiple_myAX12->multiple_goal_and_speed(4,TAB6);
00518         wait(TIME);
00519         multiple_myAX12->multiple_goal_and_speed(4,TAB5);
00520         wait(TIME);
00521         multiple_myAX12->multiple_goal_and_speed(4,TAB10);
00522         wait(TIME); 
00523         multiple_myAX12->multiple_goal_and_speed(4,TAB8);
00524         wait(TIME);   
00525     }
00526     
00527     else if (choix == 2){
00528         multiple2_myAX12->multiple_goal_and_speed(4,TAB26);
00529         wait(TIME);
00530         multiple2_myAX12->multiple_goal_and_speed(4,TAB25);
00531         wait(TIME);
00532         multiple2_myAX12->multiple_goal_and_speed(4,TAB30);
00533         wait(TIME); 
00534         multiple2_myAX12->multiple_goal_and_speed(4,TAB28);
00535         wait(TIME);   
00536     }
00537 }
00538 
00539 /****************************************************************************************/
00540 /* FUNCTION NAME: Pousser_module                                                        */
00541 /* DESCRIPTION  : Fonction qui permet pousser le module situé à l'entrée de la bas      */
00542 /****************************************************************************************/
00543 void Pousser_module(unsigned char choix){
00544     if (choix == 1){
00545         multiple_myAX12->multiple_goal_and_speed(4,TAB11);
00546         wait(TIME);   
00547     }
00548     
00549     else if (choix == 2){
00550         multiple2_myAX12->multiple_goal_and_speed(4,TAB31);
00551         wait(TIME);   
00552     }
00553 }
00554 
00555 /****************************************************************************************/
00556 /* FUNCTION NAME: Fin_action                                                            */
00557 /* DESCRIPTION  : Fonction qui confirme la fin de mouvement des AX12                    */
00558 /****************************************************************************************/
00559 void Fin_action(void){
00560     CANMessage msgTx=CANMessage();
00561     msgTx.format=CANStandard;
00562     msgTx.type=CANData;
00563     
00564     msgTx.id = SERVO_AX12_END;
00565     msgTx.len = 1;  
00566     msgTx.data[0] = AX12_PREPARATION_PRISE;
00567     can1.write(msgTx);  
00568 }
00569 
00570 /****************************************************************************************/
00571 /* FUNCTION NAME: Automate_ax12                                                         */
00572 /* DESCRIPTION  : Fonction qui gère les différentes actions des AX12                    */
00573 /****************************************************************************************/
00574 void AX12_automate(void){
00575     switch(etat_ax12){
00576         case AX12_INITIALISATION :
00577             if (flag == 1){
00578                 Initialisation_position(1);
00579                 //Check_positionAX12(&TAB1[25], 1);
00580                 Initialisation_position(2);
00581                 //Check_positionAX12(&TAB21[25], 2);
00582                 flag = 2;
00583             }
00584             else if (choix_bras > 1){
00585                 Initialisation_position(choix_bras);
00586             }
00587             break;
00588                         
00589         case AX12_PREPARATION_PRISE :
00590             Preparation_prise(choix_bras);
00591             if (action == 0){
00592                 Fin_action();
00593                 action ++;
00594             }
00595             break;
00596                         
00597         case AX12_STOCKAGE_HAUT :
00598             Stockage_haut(choix_bras);
00599             etat_ax12 = AX12_DEFAUT;
00600             Fin_action();
00601             break;
00602                         
00603         case AX12_STOCKAGE_BAS :
00604             Stockage_bas(choix_bras);
00605             etat_ax12 = AX12_DEFAUT;
00606             Fin_action();
00607             break;
00608                         
00609         case AX12_DEPOSER :
00610             Deposer(choix_bras);
00611             etat_ax12 = AX12_DEFAUT;
00612             Fin_action();
00613             break;
00614                         
00615         case AX12_PREPARATION_DEPOT_BAS :
00616             Preparation_depot_bas(choix_bras);
00617             etat_ax12 = AX12_DEFAUT;
00618             Fin_action();
00619             break;
00620                         
00621         case AX12_PREPARATION_DEPOT_HAUT :
00622             Preparation_depot_haut(choix_bras);
00623             etat_ax12 = AX12_DEFAUT;
00624             Fin_action();
00625             break;
00626                         
00627         case AX12_POUSSER_MODULE :
00628             Pousser_module(choix_bras);
00629             etat_ax12 = AX12_DEFAUT;
00630             Fin_action();
00631             break;
00632         
00633         case AX12_DEFAUT :
00634         action = 0;
00635             break;
00636     }
00637 }
00638 
00639 /****************************************************************************************/
00640 /* FUNCTION NAME: CAN2_wrFilter                                                         */
00641 /* DESCRIPTION  : Fonction qui permet de ne garder que les ID qui nous interessent      */
00642 /****************************************************************************************/
00643 void CAN2_wrFilter (uint32_t id)  {
00644     static int CAN_std_cnt = 0;
00645     uint32_t buf0, buf1;
00646     int cnt1, cnt2, bound1;
00647  
00648     /* Acceptance Filter Memory full */
00649     if (((CAN_std_cnt + 1) >> 1) >= 512)
00650         return;                                       /* error: objects full */
00651  
00652     /* Setup Acceptance Filter Configuration
00653       Acceptance Filter Mode Register = Off  */
00654     LPC_CANAF->AFMR = 0x00000001;
00655  
00656     id |= 1 << 13;                        /* Add controller number(2) */
00657     id &= 0x0000F7FF;                            /* Mask out 16-bits of ID */
00658  
00659     if (CAN_std_cnt == 0)  {                     /* For entering first  ID */
00660         LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16);
00661     }  else if (CAN_std_cnt == 1)  {             /* For entering second ID */
00662         if ((LPC_CANAF_RAM->mask[0] >> 16) > id)
00663             LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16);
00664         else
00665             LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id;
00666     }  else  {
00667         /* Find where to insert new ID */
00668         cnt1 = 0;
00669         cnt2 = CAN_std_cnt;
00670         bound1 = (CAN_std_cnt - 1) >> 1;
00671         while (cnt1 <= bound1)  {                  /* Loop through standard existing IDs */
00672             if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id)  {
00673                 cnt2 = cnt1 * 2;
00674                 break;
00675             }
00676             if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id)  {
00677                 cnt2 = cnt1 * 2 + 1;
00678                 break;
00679             }
00680             cnt1++;                                  /* cnt1 = U32 where to insert new ID */
00681         }                                          /* cnt2 = U16 where to insert new ID */
00682  
00683         if (cnt1 > bound1)  {                      /* Adding ID as last entry */
00684             if ((CAN_std_cnt & 0x0001) == 0)         /* Even number of IDs exists */
00685                 LPC_CANAF_RAM->mask[cnt1]  = 0x0000FFFF | (id << 16);
00686             else                                     /* Odd  number of IDs exists */
00687                 LPC_CANAF_RAM->mask[cnt1]  = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id;
00688         }  else  {
00689             buf0 = LPC_CANAF_RAM->mask[cnt1];        /* Remember current entry */
00690             if ((cnt2 & 0x0001) == 0)                /* Insert new mask to even address */
00691                 buf1 = (id << 16) | (buf0 >> 16);
00692             else                                     /* Insert new mask to odd  address */
00693                 buf1 = (buf0 & 0xFFFF0000) | id;
00694  
00695             LPC_CANAF_RAM->mask[cnt1] = buf1;        /* Insert mask */
00696  
00697             bound1 = CAN_std_cnt >> 1;
00698             /* Move all remaining standard mask entries one place up */
00699             while (cnt1 < bound1)  {
00700                 cnt1++;
00701                 buf1  = LPC_CANAF_RAM->mask[cnt1];
00702                 LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16);
00703                 buf0  = buf1;
00704             }
00705  
00706             if ((CAN_std_cnt & 0x0001) == 0)         /* Even number of IDs exists */
00707                 LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | (0x0000FFFF);
00708         }
00709     }
00710     CAN_std_cnt++;
00711  
00712     /* Calculate std ID start address (buf0) and ext ID start address <- none (buf1) */
00713     buf0 = ((CAN_std_cnt + 1) >> 1) << 2;
00714     buf1 = buf0;
00715  
00716     /* Setup acceptance filter pointers */
00717     LPC_CANAF->SFF_sa     = 0;
00718     LPC_CANAF->SFF_GRP_sa = buf0;
00719     LPC_CANAF->EFF_sa     = buf0;
00720     LPC_CANAF->EFF_GRP_sa = buf1;
00721     LPC_CANAF->ENDofTable = buf1;
00722  
00723     LPC_CANAF->AFMR = 0x00000000;                  /* Use acceptance filter */
00724 } // CAN2_wrFilter
00725 
00726 /****************************************************************************************/
00727 /* FUNCTION NAME: Check_positionAX12                                                    */
00728 /* DESCRIPTION  : Fonction qui permet de verifier la position des AX12                  */
00729 /****************************************************************************************/
00730 void Check_positionAX12(char* TAB, unsigned char choix){
00731     int k=1, i=0;
00732     static float TAB_POS_TH[4];
00733     
00734     CANMessage msgTx=CANMessage();
00735     msgTx.id=SERVO_AX12_POSITION;
00736     msgTx.len=5;
00737     
00738     //PERMET DE VERIFIER LA POSITION D'UN AX12
00739     TAB_ANGLE1[0] = (unsigned short)(dixhuit_myAX12->Get_Position()/0.3);
00740     TAB_ANGLE1[1] = (unsigned short)(quatre_myAX12->Get_Position()/0.3);
00741     TAB_ANGLE1[2] = (unsigned short)(sept_myAX12->Get_Position()/0.3);
00742     TAB_ANGLE1[3] = (unsigned short)(quinze_myAX12->Get_Position()/0.3);
00743     TAB_ANGLE2[0] = (unsigned short)(huit_myAX12->Get_Position()/0.3);
00744     TAB_ANGLE2[1] = (unsigned short)(trois_myAX12->Get_Position()/0.3);
00745     TAB_ANGLE2[2] = (unsigned short)(treize_myAX12->Get_Position()/0.3);
00746     TAB_ANGLE2[3] = (unsigned short)(quatorze_myAX12->Get_Position()/0.3);
00747      
00748     for(i=0; i<4; i++){
00749         TAB_POS_TH[i] = (unsigned short) TAB[k] + ((unsigned short)TAB[k+1]<<8);    
00750         k=k+5;
00751     }
00752     
00753     for(i=0; i<4; i++){
00754         if (choix == 1){
00755             if ((TAB_ANGLE1[i] < TAB_POS_TH[i]+TOLERANCE_AX12) && (TAB_ANGLE1[i] > TAB_POS_TH[i]-TOLERANCE_AX12)){
00756                 TAB_POSITION[i] = 1;
00757                 }
00758             else if ((TAB_ANGLE1[i] < TAB_POS_TH[i]+TOLERANCE_AX12) && (TAB_ANGLE1[i] > TAB_POS_TH[i]-TOLERANCE_AX12)){
00759                 TAB_POSITION[i] = 0;
00760                 }
00761             }
00762         else if (choix == 2){
00763             if ((TAB_ANGLE2[i] < TAB_POS_TH[i]+TOLERANCE_AX12) && (TAB_ANGLE2[i] > TAB_POS_TH[i]-TOLERANCE_AX12)){
00764                 TAB_POSITION[i] = 1;
00765                 }
00766             else if ((TAB_ANGLE2[i] < TAB_POS_TH[i]+TOLERANCE_AX12) && (TAB_ANGLE2[i] > TAB_POS_TH[i]-TOLERANCE_AX12)){
00767                 TAB_POSITION[i] = 0;
00768                 }
00769             }
00770      }
00771     
00772     msgTx.data[0] = choix;
00773     for(i=1; i<5; i++){
00774         msgTx.data[i] = TAB_POSITION[i];
00775     }
00776     can1.write(msgTx);
00777 }            
00778