code de la carte à tout faire / carte strat
Dependencies: mbed
main.cpp
00001 #include "global.h" 00002 00003 /****************************************************************************************/ 00004 /* FUNCTION NAME: automate_process */ 00005 /* DESCRIPTION : Automate de gestion de la stratégie du robot */ 00006 /****************************************************************************************/ 00007 void automate_process(void); 00008 00009 /****************************************************************************************/ 00010 /* FUNCTION NAME: canProcessRx */ 00011 /* DESCRIPTION : Fonction de traitement des messages CAN */ 00012 /****************************************************************************************/ 00013 void canProcessRx(void); 00014 00015 /*********************************************************************************************************/ 00016 /* FUNCTION NAME: SendRawId */ 00017 /* DESCRIPTION : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */ 00018 /*********************************************************************************************************/ 00019 void SendRawId (unsigned short id); 00020 00021 DigitalOut led(LED1); 00022 Serial pc(SERIAL_TX, SERIAL_RX); 00023 /*DigitalIn IO1(PB_7); 00024 DigitalIn IO2(PB_6); 00025 DigitalIn IO3(PF_1); 00026 DigitalIn IO4(PA_8); 00027 00028 DigitalIn A_in1(PB_7); 00029 DigitalIn A_in2(PA_6); 00030 DigitalIn A_in3(PA_4); 00031 DigitalIn A_in4(PA_1); 00032 DigitalIn A_in5(PA_0); 00033 00034 DigitalOut AX12(PA_9); 00035 */ 00036 00037 AnalogIn cptGauche(PA_1); 00038 AnalogIn cptDroit(PA_0); 00039 DigitalIn pressionGauche(PA_8); 00040 DigitalIn pressionDroit(PB_7); 00041 00042 00043 00044 00045 CAN can1(PA_11,PA_12); // Rx&Tx pour le CAN 00046 CANMessage msgRxBuffer[SIZE_FIFO]; // buffer en réception pour le CAN 00047 unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN 00048 00049 signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN 00050 00051 extern "C" void mbed_reset();//Pour pouvoir reset la carte 00052 00053 E_GameEtat carte_etat = ETAT_ATTENTE; 00054 E_Couleur couleurSelect = BLEU; 00055 00056 AX12 *myAX12; 00057 00058 00059 00060 00061 void canRx_ISR (void) 00062 { 00063 if (can1.read(msgRxBuffer[FIFO_ecriture])) { 00064 /*if(msgRxBuffer[FIFO_ecriture].id==RESET_ACTIONNEURS) mbed_reset(); 00065 else FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;*/ 00066 FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO; 00067 } 00068 } 00069 int main() { 00070 char truc = 0; 00071 00072 can1.frequency(1000000); // fréquence de travail 1Mbit/s 00073 can1.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN 00074 00075 CANMessage msgTx=CANMessage(); 00076 00077 myAX12-> Set_Goal_speed(vitesse); 00078 myAX12-> Set_Mode(0); 00079 00080 pc.printf("Hello World\n"); 00081 while(1) { 00082 00083 led = ((led == 1)?0:1); 00084 00085 automate_process(); 00086 canProcessRx(); 00087 //SendRawId(cpt); 00088 wait(0.5); 00089 } 00090 } 00091 00092 00093 00094 00095 int action; 00096 char localAX12 = AX12_POSIOTION_BASSE; 00097 /****************************************************************************************/ 00098 /* FUNCTION NAME: automate_process */ 00099 /* DESCRIPTION : Automate de gestion de la stratégie du robot */ 00100 /****************************************************************************************/ 00101 void automate_process(void){ 00102 SendRawId(carte_etat); 00103 switch(carte_etat){ 00104 case ETAT_ATTENTE: 00105 break; 00106 00107 case ETAT_TRAITEMENT_ACTION_AX12: 00108 switch(action){ 00109 #define ACTION_TOURNER_MODULE_GAUCHE 0x10 00110 #define ACTION_TOURNER_MODULE_DROIT 0x11 00111 case ACTION_TOURNER_MODULE_GAUCHE: 00112 carte_etat = ETAT_BAISSER_MAIN_GAUCHE; 00113 break; 00114 case ACTION_TOURNER_MODULE_DROIT: 00115 carte_etat = ETAT_BAISSER_MAIN_DROITE; 00116 break; 00117 default: 00118 carte_etat = ETAT_ATTENTE; 00119 } 00120 break; 00121 00122 case ETAT_BAISSER_MAIN_GAUCHE: 00123 if(pressionGauche.read() == ENFONCER){ 00124 carte_etat = ETAT_CHECK_COULEUR; 00125 } else{ 00126 // 00127 localAX12 = AX12BaisserMainGauche(localAX12); 00128 } 00129 break; 00130 00131 case ETAT_BAISSER_MAIN_DROITE: 00132 if(pressionDroit.read() == ENFONCER){ 00133 carte_etat = ETAT_CHECK_COULEUR; 00134 }else{ 00135 // 00136 localAX12 = AX12BaisserMainDroite(localAX12); 00137 } 00138 break; 00139 00140 case ETAT_CHECK_COULEUR: 00141 //if (((unsigned short)cptGauche.read()&(unsigned short)cptDroit.read()) == 0){ 00142 if ((unsigned short)cptDroit.read() == 0){ 00143 carte_etat = ETAT_ATTENTE; 00144 }else{ 00145 // on active les moteurs 00146 localAX12 = AX12BaisserMainGauche(localAX12); 00147 } 00148 break; 00149 00150 case ETAT_TURBINE: 00151 carte_etat = ETAT_ATTENTE; 00152 turbineWritePWM(50); 00153 break; 00154 00155 case ETAT_POMPES: 00156 carte_etat = ETAT_ATTENTE; 00157 pompeWritePWM(50); 00158 break; 00159 00160 00161 00162 default: 00163 pc.printf("etat non identifie"); 00164 } 00165 } 00166 00167 00168 /*********************************************************************************************************/ 00169 /* FUNCTION NAME: SendRawId */ 00170 /* DESCRIPTION : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */ 00171 /*********************************************************************************************************/ 00172 void SendRawId (unsigned short id) 00173 { 00174 CANMessage msgTx=CANMessage(); 00175 msgTx.id=id; 00176 msgTx.len=0; 00177 can1.write(msgTx); 00178 wait_us(200); 00179 } 00180 00181 00182 /****************************************************************************************/ 00183 /* FUNCTION NAME: canProcessRx */ 00184 /* DESCRIPTION : Fonction de traitement des messages CAN */ 00185 /****************************************************************************************/ 00186 void canProcessRx(void){ 00187 static signed char FIFO_occupation=0,FIFO_max_occupation=0; 00188 CANMessage msgTx=CANMessage(); 00189 FIFO_occupation=FIFO_ecriture-FIFO_lecture; 00190 if(FIFO_occupation<0) 00191 FIFO_occupation=FIFO_occupation+SIZE_FIFO; 00192 if(FIFO_max_occupation<FIFO_occupation) 00193 FIFO_max_occupation=FIFO_occupation; 00194 if(FIFO_occupation!=0) { 00195 00196 switch(msgRxBuffer[FIFO_lecture].id) { 00197 case CHECK_ACTIONNEURS: 00198 SendRawId(ALIVE_ACTIONNEURS); 00199 break; 00200 00201 case SERVO_AX12_ACTION : 00202 carte_etat = ETAT_TRAITEMENT_ACTION_AX12; 00203 00204 action = msgRxBuffer[FIFO_lecture].data[0]; 00205 couleurSelect = (E_Couleur)msgRxBuffer[FIFO_lecture].data[1]; 00206 //ACK de reception des actions a effectuer 00207 msgTx.id = ACKNOWLEDGE_AX12; 00208 msgTx.len = 1; 00209 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0]; 00210 can1.write(msgTx); 00211 break; 00212 00213 case POMPE_PWM: 00214 carte_etat = ETAT_POMPES; 00215 00216 msgTx.id = ACKNOWLEDGE_POMPES; 00217 msgTx.len = 1; 00218 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0]; 00219 can1.write(msgTx); 00220 break; 00221 00222 #define TURBINE_PWM 0xa1 00223 #define ACKNOWLEDGE_TURBINE 0x107 00224 case TURBINE_PWM: 00225 carte_etat = ETAT_TURBINE; 00226 00227 msgTx.id = ACKNOWLEDGE_TURBINE; 00228 msgTx.len = 1; 00229 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0]; 00230 can1.write(msgTx); 00231 break; 00232 00233 } 00234 FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO; 00235 } 00236 } 00237
Generated on Wed Jul 13 2022 02:11:14 by 1.7.2