Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 00003 Timer chrono1; 00004 Timer chrono2; 00005 Timer chrono3; 00006 Timer chrono4; 00007 Timer chrono5; 00008 Timer chrono6; 00009 Timer chrono7; 00010 Timer chrono8; 00011 00012 InterruptIn ch1(p23); 00013 InterruptIn ch2(p24); 00014 InterruptIn ch3(p25); 00015 InterruptIn ch4(p26); 00016 InterruptIn ch5(p29); 00017 InterruptIn ch6(p30); 00018 InterruptIn Ultra1(p5); 00019 InterruptIn Ultra2(p7); 00020 00021 //SRF05 srf1(p6, p5);//p6:trigger, p5:echo 00022 //SRF05 srf2(p8, p7);//p8:trigger, p7:echo 00023 00024 Serial PC(USBTX, USBRX); 00025 Serial moteurs(p9, p10); 00026 Serial GPS(p13, p14); 00027 00028 DigitalOut del(LED1); 00029 DigitalOut puls1(p6); 00030 DigitalOut puls2(p8); 00031 00032 char etat_US=0; 00033 double tps_ch1=0,tps_ch2=0,tps_ch3=0,tps_ch4=0,tps_ch5=0,tps_ch6=0,dist_US1=0,dist_US2=0; 00034 00035 00036 void initial_PWMIn(void); 00037 void initial_Ultrasons(void); 00038 int calcul_vitesse(void); 00039 int calcul_direction(void); 00040 void ecriture_moteurs(int vitesse, int gouvernail); 00041 void impulsion1(void); 00042 void impulsion2(void); 00043 int lecture_GPS(double *ptr_heure,double *ptr_lat,double *ptr_longi,double *ptr_vitesse,double *ptr_route); 00044 double transfo_format(double a); 00045 00046 void ch1_start() { 00047 chrono1.start(); 00048 } 00049 00050 void ch1_stop() 00051 { 00052 chrono1.stop(); 00053 tps_ch1 = chrono1.read_us(); 00054 chrono1.reset(); 00055 } 00056 00057 void ch2_start() { 00058 chrono2.start(); 00059 } 00060 00061 void ch2_stop() 00062 { 00063 chrono2.stop(); 00064 tps_ch2 = chrono2.read_us(); 00065 chrono2.reset(); 00066 } 00067 00068 void ch3_start() { 00069 chrono3.start(); 00070 } 00071 00072 void ch3_stop() 00073 { 00074 chrono3.stop(); 00075 tps_ch3 = chrono3.read_us(); 00076 chrono3.reset(); 00077 } 00078 00079 void ch4_start() { 00080 chrono4.start(); 00081 } 00082 00083 void ch4_stop() 00084 { 00085 chrono4.stop(); 00086 tps_ch4 = chrono4.read_us(); 00087 chrono4.reset(); 00088 } 00089 00090 void ch5_start() { 00091 chrono5.start(); 00092 } 00093 00094 void ch5_stop() 00095 { 00096 chrono5.stop(); 00097 tps_ch5 = chrono5.read_us(); 00098 chrono5.reset(); 00099 } 00100 00101 void ch6_start() { 00102 chrono6.start(); 00103 } 00104 00105 void ch6_stop() 00106 { 00107 chrono6.stop(); 00108 tps_ch6 = chrono6.read_us(); 00109 chrono6.reset(); 00110 } 00111 00112 void Ultra1_start() 00113 { 00114 if(etat_US==0) 00115 { 00116 chrono7.reset(); 00117 chrono7.start(); 00118 } 00119 } 00120 00121 void Ultra1_stop()//Arrêt du chronomètre du capteur 1 et impulsion capteur 2 00122 { 00123 if(etat_US==0) 00124 { 00125 chrono7.stop(); 00126 dist_US1=chrono7.read_us()/58.0;//donne la distance en cm 00127 etat_US = 1; 00128 } 00129 } 00130 00131 void Ultra2_start()//Lancement du chronomètre du capteur 2 00132 { 00133 if(etat_US==1) 00134 { 00135 chrono8.reset(); 00136 chrono8.start(); 00137 } 00138 } 00139 00140 void Ultra2_stop()//Arrêt du chronomètre du capteur 2 et lancement d'une impulsion sur le capteur 1 00141 { 00142 if(etat_US==1) 00143 { 00144 chrono8.stop(); 00145 dist_US1=chrono8.read_us()/58.0;//donne la distance en cm 00146 etat_US = 0; 00147 impulsion1(); 00148 } 00149 } 00150 00151 00152 int main() { 00153 00154 double heure,latitude = 0,longitude = 0,vitesse_GPS,route,distance_restante; 00155 double lat_destination = 48.787068,longi_destination = 2.327229; 00156 double *ptr_h=&heure,*ptr_lat=&latitude,*ptr_long=&longitude,*ptr_v=&vitesse_GPS,*ptr_rte=&route; 00157 double route_th,diff_routes=0,gouvernail=0; 00158 int validite,vitesse,direction; 00159 00160 GPS.baud(9600); 00161 PC.baud(460800); 00162 initial_PWMIn(); 00163 initial_Ultrasons(); 00164 impulsion1(); 00165 00166 00167 while(true) { 00168 00169 validite = lecture_GPS(ptr_h,ptr_lat,ptr_long,ptr_v,ptr_rte);//Lecture du GPS. validite permet de savoir si le reception est bonne 00170 00171 if(validite == 1)//La réception est valide 00172 { 00173 latitude = transfo_format(latitude);//On change le format des coordonnées GPS 00174 longitude = transfo_format(longitude); 00175 PC.printf("LAT : %f, LONGI : %f\n\rLAT_DEST : %f LONGI_DEST : %f\r\n",latitude,longitude,lat_destination,longi_destination); 00176 00177 //Calcul de la route a suivre : 00178 route_th = 57.2956455309649*atan2(longi_destination-longitude,lat_destination-latitude); 00179 if(route_th<0) route_th += 360;//On s'assure que la route est comprise entre 0 et 360° 00180 00181 //Calcul de la distance à parcourir en mètres 00182 distance_restante = sqrt(pow(111111.1*(lat_destination-latitude),2)+pow(75000*(longi_destination-longitude),2)); 00183 00184 PC.printf("Route : %lf\n\rRoute theorique : %lf\r\nDistance restance : %lf\r\n",route,route_th,distance_restante); 00185 00186 00187 //Calcul, avec la route à suivre et la route suivie, des indications à donner 00188 //On utilise ici une variable "gouvernail", allant de -100 à 100 00189 //-100 correcpond à "à gauche toute" et 100 à "à droite toute" 00190 00191 if(distance_restante<10.0) 00192 { 00193 PC.printf("VOUS ETES ARRIVES\r\n"); 00194 } 00195 else 00196 { 00197 if((route<=route_th+5.0)&&(route>=route_th-5)) 00198 { 00199 PC.printf("TOUT DROIT\r\n"); 00200 gouvernail = 0; 00201 } 00202 else 00203 { 00204 //On calcule la différence d'angle entre la route actuellement suivie 00205 diff_routes = abs(route_th-route); 00206 if(diff_routes > 180.0) diff_routes = 360.0 - diff_routes; 00207 00208 //On vérifie la direction à suivre, s'il faut aller à droite ou à gauche. 00209 if((route_th>=route)&&(route_th<=(route+180))) 00210 { 00211 PC.printf("Direction : droite\r\n"); 00212 //On calcule la valeur à donner au gouvernail avec un correcteur proportionnel 00213 //si la différence est sup à 45°, on sature à 100, sinon on a une action 00214 //proportionnelle 00215 if(diff_routes>45.0) gouvernail = 100.0; 00216 else gouvernail = 2.22*diff_routes; 00217 PC.printf("Instruction donnee au gouvernail : %lf\r\n",gouvernail); 00218 } 00219 else 00220 { 00221 PC.printf("Direction : gauche\r\n"); 00222 //On fait de même pour tourner à gauche que pour tourner à droite, mais on a des 00223 //coefficients négatifs 00224 if(diff_routes>45.0) gouvernail = -100.0; 00225 else gouvernail = -2.22*diff_routes; 00226 PC.printf("Instruction donnee au gouvernail : %lf\r\n",gouvernail); 00227 } 00228 } 00229 } 00230 } 00231 else//Il y a une erreur de reception 00232 { 00233 PC.printf("erreur de reception"); 00234 } 00235 00236 //Programme mode manuel 00237 if(tps_ch6 > 1200) del = 1; //Allume la led si ch6 en position haute 00238 if(tps_ch6 < 1200) del = 0; //Allume la led si ch6 en position basse 00239 00240 00241 vitesse = calcul_vitesse(); 00242 direction = calcul_direction(); 00243 00244 ecriture_moteurs(vitesse,direction); 00245 00246 /*PC.printf("Tps haut entree 1:%.lfus\n\r",tps_ch1); 00247 PC.printf("Tps haut entree 2:%.lfus\n\r",tps_ch2); 00248 PC.printf("Tps haut entree 3:%.lfus\n\r",tps_ch3); 00249 PC.printf("Tps haut entree 4:%.lfus\n\r",tps_ch4); 00250 PC.printf("Tps haut entree 5:%.lfus\n\r",tps_ch5); 00251 PC.printf("Tps haut entree 6:%.lfus\n\r",tps_ch6);*/ 00252 PC.printf("Distance 1:%.lfcm\n\r",dist_US1); 00253 PC.printf("Distance 2:%.lfcm\n\r",dist_US2); 00254 PC.printf("Vitesse :%d\n\r",vitesse); 00255 PC.printf("Direction : %d\n\r",direction); 00256 PC.printf("\n\r"); 00257 wait(0.2); 00258 } 00259 } 00260 00261 void initial_PWMIn(void) 00262 { 00263 ch1.rise(&ch1_start); 00264 ch1.fall(&ch1_stop); 00265 00266 ch2.rise(&ch2_start); 00267 ch2.fall(&ch2_stop); 00268 00269 ch3.rise(&ch3_start); 00270 ch3.fall(&ch3_stop); 00271 00272 ch4.rise(&ch4_start); 00273 ch4.fall(&ch4_stop); 00274 00275 ch5.rise(&ch5_start); 00276 ch5.fall(&ch5_stop); 00277 00278 ch6.rise(&ch6_start); 00279 ch6.fall(&ch6_stop); 00280 00281 chrono1.reset(); 00282 chrono2.reset(); 00283 chrono3.reset(); 00284 chrono4.reset(); 00285 chrono5.reset(); 00286 chrono6.reset(); 00287 } 00288 00289 void initial_Ultrasons(void) 00290 { 00291 Ultra1.rise(&Ultra1_start); 00292 Ultra1.fall(&Ultra1_stop); 00293 00294 Ultra2.rise(&Ultra2_start); 00295 Ultra2.fall(&Ultra2_stop); 00296 } 00297 00298 void impulsion1(void) 00299 { 00300 puls1 = 1; 00301 wait (0.000002); 00302 puls1 = 0; 00303 } 00304 00305 void impulsion2(void) 00306 { 00307 puls2 = 1; 00308 wait (0.000002); 00309 puls2 = 0; 00310 } 00311 00312 int calcul_vitesse(void) 00313 { 00314 int val_ch2,val_ch3,vitesse; 00315 00316 val_ch2 = (tps_ch2-1500)/5; //calcul d'une valeur entre -100 et 100 selon la position du joustick 00317 val_ch3 = (tps_ch3-1500)/5; 00318 00319 //On compare les valeurs absolues des valeurs:c'est le joystick le plus éloigné 00320 //de la position centrale qui domine 00321 if(abs(val_ch2)>abs(val_ch3)) vitesse = val_ch2; 00322 else vitesse = val_ch3; 00323 00324 //vitesse nulle si les infos ne sont pas cohérentes 00325 if((tps_ch2<950)||(tps_ch2>2050)||(tps_ch3<950)||(tps_ch3>2050)) vitesse = 0; 00326 00327 if(abs(vitesse)<5) vitesse = 0;//Moteur immobile si jostick pas actionné 00328 if(vitesse>100) vitesse = 100; //saturation 00329 if(vitesse<-100) vitesse = -100; //saturation 00330 00331 return vitesse; 00332 } 00333 00334 int calcul_direction(void) 00335 { 00336 int val_ch4,direction; 00337 00338 //calcul d'une valeur entre -100 et 100 selon la position du joustick 00339 val_ch4 = (tps_ch4-1500)/5; 00340 00341 //On compare les valeurs absolues des valeurs:c'est le joystick le plus éloigné 00342 //de la position centrale qui domine 00343 direction = val_ch4; 00344 00345 //vitesse nulle si les infos ne sont pas cohérentes 00346 if((tps_ch4<950)||(tps_ch4>2050)) direction = 0; 00347 00348 if(abs(direction)<5) direction = 0;//Moteur immobile si jostick pas actionné 00349 if(direction>100) direction = 100; //saturation 00350 if(direction<-100) direction = -100; //saturation 00351 00352 return direction; 00353 } 00354 00355 void ecriture_moteurs(int vitesse, int gouvernail) 00356 { 00357 moteurs.printf("$%d|%d*",vitesse,gouvernail); 00358 } 00359 00360 //transforme les coordonnees au format dd.mmssss au lieu de ddmm.mmmm 00361 double transfo_format(double a) 00362 { 00363 double e; 00364 int c,b,d; 00365 d = a/100; 00366 c = a*10000; 00367 b = c%1000000; 00368 e = d+b/(60.0*10000.0); 00369 return e; 00370 } 00371 00372 //Fonction permettant de récupérer les données envoyées par la liaison série 00373 int lecture_GPS(double *ptr_heure,double *ptr_lat,double *ptr_longi,double *ptr_vitesse,double *ptr_route) 00374 { 00375 char i=2; 00376 char buffer[120]; 00377 int test_reception = 0; 00378 char a, etat=0; 00379 double h,lat,lng,v,dir; 00380 00381 while(test_reception == 0) 00382 { 00383 if (GPS.readable()) { // attention PC.readable reste à 1 tant qu'il n'y a pas eu de getc qui vide le buffer 00384 a=GPS.getc(); 00385 00386 switch(etat) 00387 { 00388 case 0 : 00389 if(a == '$') etat = 1; //On détecte le début de la trame 00390 break; 00391 case 1 : 00392 if(a != '$') //On s'assure que l'on reçoit bien un autre carcatère que celui de début de trame 00393 { 00394 etat = 2; 00395 buffer[0] = '$';//On stocke le caractère de début de trame dans la chaine (mais c'est juste pour faire joli en fait) 00396 buffer[1] = a;//On stocke le premier caractère utile de la trame 00397 } 00398 break; 00399 00400 case 2 : 00401 buffer[i] = a;//On stocke l'octet reçu dans la trame 00402 i++; 00403 if(a == 'C')//Si un caractère entré est un 'C', alors la trame nous intéresse : on poursuit 00404 { 00405 etat = 3; 00406 } 00407 else if(i>=7)//S'il n'y a pas de 'C' au 7ème caractère utile, la trame ne nous intéresse pas : on arrête l'acquisition 00408 { 00409 etat = 5; 00410 } 00411 break; 00412 00413 case 3 : 00414 00415 if(a=='$')//Si on revoit le caractère de début de trame, on s'arrête 00416 { 00417 etat = 4; 00418 } 00419 else 00420 { 00421 buffer[i]=a;//Sinon on stocke le caractère entré dans la chaîne de caractères 00422 i++; 00423 } 00424 break; 00425 00426 case 4 : 00427 00428 if((buffer[17]=='A')||(buffer[18]=='A')) 00429 { 00430 sscanf(buffer,"$GPRMC,%lf,A,%lf,N,%lf,E,%lf,%lf",&h,&lat,&lng,&v,&dir); 00431 *ptr_heure = h; 00432 *ptr_lat = lat; 00433 *ptr_longi = lng; 00434 *ptr_vitesse = v; 00435 *ptr_route = dir; 00436 test_reception = 1; 00437 } 00438 else 00439 { 00440 test_reception = 2; 00441 } 00442 PC.printf("%s",buffer);//On affiche la chaîne 00443 etat = 5; 00444 break; 00445 00446 case 5 : 00447 etat = 0;//On réinitialise l'acquisition 00448 for(i=0;i<120;i++)//On réinitialise la chaîne de caractères 00449 { 00450 buffer[i] = 0; 00451 } 00452 i=2; 00453 break; 00454 00455 default : 00456 etat = 0; 00457 break; 00458 } 00459 } 00460 00461 } 00462 return test_reception; 00463 } 00464
Generated on Fri Aug 5 2022 09:49:35 by
1.7.2