Projet véhicules autonomes
Dependencies: FileSystem_POPS TextLCD m3pi mbed
Fork of m3PI_TP_POPS_II2015v0 by
main3.cpp
- Committer:
- Dalaldeh
- Date:
- 2018-03-12
- Revision:
- 4:a4ac92030374
- Parent:
- 0:398afdd73d9e
File content as of revision 4:a4ac92030374:
//Alaa et Dalal #include "mbed.h" #include "m3pi.h" #include "MSCFileSystem.h" #include "TextLCD.h" m3pi m3pi; // Initialise the m3pi TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x4); // rs, e, d4-d7 Serial xbee(p28,p27); DigitalOut resetxbee(p26); Serial pc(USBTX, USBRX); // For debugging and pc Timer t; Ticker tick1; int count=0; unsigned char vecteur; bool cmd; int valeur; int k=1; float co; void test(); BusOut myleds(LED1, LED2, LED3, LED4); #define D_TERM 0.0 #define I_TERM 0.1 #define I_TERMO 0.1 #define P_TERM 0.9 #define MAX 0.3 #define MIN -0.2 #define seuil(x) (x>600 ? 1 : 0) float current_pos_of_line, previous_pos_of_line, derivate, proportional, power, integral, left, right, speed=0.2; char chain[15]; int v; char delai600ms; int etat; char etat1; float correction = 0.2; char aff[10],aff1[10]; unsigned short tabsensor[5]; //right= (right>MAX ? MAX :(right<MIN ? MIN : right)); //left= (left>MAX ? MAX :(left<MIN ? MIN : left)); unsigned char statecapt; bool mu; int countt,countt1; char save[255]=" ";//"LRBRLRBW"; char save1[15]="00000000000000"; int j=0; //PID char PIDf(char commande) { if(commande==1) { if(statecapt==0x1F) { m3pi.left_motor(0); m3pi.right_motor(0); m3pi.forward(speed); myleds=0xF; return 0; } else { // Get the position of the line current_pos_of_line = m3pi.line_position(); proportional = current_pos_of_line; // Compute the derivate derivate = current_pos_of_line - previous_pos_of_line; // Compute the integral integral = (integral+I_TERMO*proportional)/(1+I_TERMO); // Remember the last postion previous_pos_of_line = current_pos_of_line; // Compute the power power = (proportional*(P_TERM)) + (integral*(I_TERM)) + (derivate*(D_TERM)); // Compute new speeds right = speed-(power*MAX); left = speed+(power*MAX); // Limits checks on motor control right= (right>MAX ? MAX :(right<MIN ? MIN : right)); left= (left>MAX ? MAX :(left<MIN ? MIN : left)); // Send command to motors m3pi.left_motor(left); m3pi.right_motor(right); } } return 1; } //Fonction superviseur //////////////////////////////////////*******************************optimisation de chaine***************//////////////////////////////////// void optim(char save[], int countt) { int i; int k; for(i=0;i<countt;i++) { if ((save[i]=='R')&(save[i+1]=='B')&(save[i+2]=='R')) { save[i]='W'; for (k=1; k<(countt-i);k++) { save[i+k]=save[i+k+2]; } i++; } if ((save[i]=='W')&(save[i+1]=='B')&(save[i+2]=='R')) { save[i]='L'; for (k=1; k<(countt-i);k++) { save[i+k]=save[i+k+2]; } i++; } if ((save[i]=='W')&(save[i+1]=='B')&(save[i+2]=='W')) { save[i]='B'; for (k=1; k<(countt-i);k++) { save[i+k]=save[i+k+2]; } i++; } if ((save[i]=='L')&(save[i+1]=='B')&(save[i+2]=='R')) { save[i]='B'; for (k=1; k<(countt-i);k++) { save[i+k]=save[i+k+2]; } i++; } if ((save[i]=='R')&(save[i+1]=='B')&(save[i+2]=='L')) { save[i]='B'; for (k=1; k<(countt-i);k++) { save[i+k]=save[i+k+2]; } i++; } if ((save[i]=='R')&(save[i+1]=='B')&(save[i+2]=='W')) { save[i]='L'; for (k=1; k<(countt-i);k++) { save[i+k]=save[i+k+2]; } i++; } else { for (k=0; k<(countt-1);k++) { save[k]=save[k]; } } }} /////////////////////////////////////*****************************************************optimisation**************************///////////////////////// void test1 () { int i; m3pi.calibrated_sensors(tabsensor); for(i=0; i<5; i++) { statecapt = (statecapt << 1) | seuil(tabsensor[i]); } vecteur = (tabsensor[0]>600)*1+ (tabsensor[1]>600)*2+(tabsensor[2]>600)*4+ (tabsensor[3]>600)*8+(tabsensor[4]>600)*16; if(k==1) { if ((tabsensor[0]<400)&(tabsensor[4]<400)) { if ((tabsensor[1]>400)|(tabsensor[2]>400)|(tabsensor[3]>400)) { etat1 ='P'; } else if ((tabsensor[1]<100)&(tabsensor[2]<100)&(tabsensor[3]<100)){ etat1=save[countt1];countt1++;} } else if (((tabsensor[1]>600)|(tabsensor[2]>600)|(tabsensor[3]>600))& ((tabsensor[0]<100)&(tabsensor[4]>600)) ) { etat1=save[countt1];countt1++; } else if (((tabsensor[1]>600)|(tabsensor[2]>600)|(tabsensor[3]>600))& ((tabsensor[0]>600)&(tabsensor[4]<100)) ) { etat1=save[countt1];countt1++; } else if (((tabsensor[1]>600)|(tabsensor[2]>600)|(tabsensor[3]>600))& ((tabsensor[0]>600)&(tabsensor[4]>600)))//intersection + croix { etat1=save[countt1] ;countt1++; } } switch (etat1) { case 'B': m3pi.left_motor(speed); m3pi.right_motor(-speed); strcpy( aff,"back "); wait(0.74); PIDf(1); wait(0.1); break; case 'E': m3pi.stop(); m3pi.cls(); m3pi.locate(0,1); m3pi.printf(save);; wait(1000); break; case 'R' : strcpy( aff,"Right "); m3pi.left_motor(0); m3pi.right_motor(0); wait(0.01); m3pi.left_motor(1.2*(1.5/2)*speed); m3pi.right_motor(1.2*(1.5/2)*speed); wait(0.16); save[countt-1]='R'; m3pi.left_motor((1.5/2)*speed); m3pi.right_motor(-(1.5/2)*speed); wait(0.5); m3pi.left_motor((1.5/2)*speed); m3pi.right_motor((1.5/2)*speed); wait(0.1); PIDf(1); wait(0.001); m3pi.calibrated_sensors(tabsensor); break; case 'L' : m3pi.left_motor(0); m3pi.right_motor(0); wait(0.01); m3pi.right_motor(1.2*(1.5/2)*speed); m3pi.left_motor(1.2*(1.5/2)*speed); wait(0.16); save[countt-1]='R'; m3pi.right_motor((1.5/2)*speed); m3pi.left_motor(-(1.5/2)*speed); wait(0.42); m3pi.left_motor((1.5/2)*speed); m3pi.right_motor((1.5/2)*speed); wait(0.1); PIDf(1); wait(0.001); m3pi.calibrated_sensors(tabsensor); break; case 'W': m3pi.left_motor(0); m3pi.right_motor(0); wait(0.01); m3pi.left_motor(2*(1.5/2)*0.8*speed); m3pi.right_motor(2*(1.5/2)*0.8*speed); wait(0.14); strcpy( aff,"t_forward "); PIDf(1); m3pi.left_motor(0); m3pi.right_motor(0); strcpy( aff,"w"); m3pi.locate(0,1); m3pi.printf(aff); m3pi.stop(); wait(0.01); PIDf(1); wait(0.1); break; case 'P': PIDf(1); sprintf(aff,"%d",countt); m3pi.locate(0,1); m3pi.printf(aff); wait(0.001); break; }} ///////////////////////////////////////////////////////***************Superviseur principal**************///////////////////////////// void test () { int i; m3pi.calibrated_sensors(tabsensor); for(i=0; i<5; i++) { statecapt = (statecapt << 1) | seuil(tabsensor[i]); } vecteur = (tabsensor[0]>600)*1+ (tabsensor[1]>600)*2+(tabsensor[2]>600)*4+ (tabsensor[3]>600)*8+(tabsensor[4]>600)*16; if(k==1) { if ((tabsensor[0]<400)&(tabsensor[4]<400)) { if ((tabsensor[1]>400)|(tabsensor[2]>400)|(tabsensor[3]>400)) etat =2; else if ((tabsensor[1]<100)&(tabsensor[2]<100)&(tabsensor[3]<100)){ etat =0;countt++;} } else if (((tabsensor[1]>600)|(tabsensor[2]>600)|(tabsensor[3]>600))& ((tabsensor[0]<400)&(tabsensor[4]>600)) ) { etat=1;countt++; } else if (((tabsensor[1]>600)|(tabsensor[2]>600)|(tabsensor[3]>600))& ((tabsensor[0]>800)&(tabsensor[4]<100)) ) { etat=4;countt++; } else if (((tabsensor[1]>600)|(tabsensor[2]>600)|(tabsensor[3]>600))& ((tabsensor[0]>600)&(tabsensor[4]>600)))//intersection + croix { etat=3 ;countt++; } } switch (etat) { case 0: m3pi.left_motor(1.2*(1.5/2)*speed); m3pi.right_motor(1.2*(1.5/2)*speed); wait(0.1); m3pi.left_motor(speed); m3pi.right_motor(-speed); strcpy( aff,"back "); wait(0.74); PIDf(1); wait(0.1); save[countt-1]='B'; break; case 1 : strcpy( aff,"Right "); m3pi.left_motor(0); m3pi.right_motor(0); wait(0.01); m3pi.left_motor(1.2*(1.5/2)*speed); m3pi.right_motor(1.2*(1.5/2)*speed); wait(0.16); save[countt-1]='R'; m3pi.left_motor((1.5/2)*speed); m3pi.right_motor(-(1.5/2)*speed); wait(0.42); m3pi.left_motor((1.5/2)*speed); m3pi.right_motor((1.5/2)*speed); wait(0.1); PIDf(1); wait(0.001); m3pi.calibrated_sensors(tabsensor); break; case 2: PIDf(1); sprintf(aff,"%d",countt);//strcpy( aff,"bye nombre"); m3pi.locate(0,1); m3pi.printf(aff); m3pi.calibrated_sensors(tabsensor); break; case 3: m3pi.left_motor(0); m3pi.right_motor(0); wait(0.01); m3pi.left_motor(1.2*(1.5/2)*speed); m3pi.right_motor(1.2*(1.5/2)*speed); wait(0.16); strcpy( aff,"t_forward "); m3pi.calibrated_sensors(tabsensor); wait(0.02); if ((tabsensor[0]>600)&(tabsensor[4]>200)&(tabsensor[2]>600)&(tabsensor[3]>600)&(tabsensor[1]>600))//the end { save[countt-1]='E'; m3pi.left_motor(2*0); m3pi.right_motor(2*0); cmd=false; m3pi.leds(255); wait(2); strcpy( aff,"Optim "); m3pi.leds(255); m3pi.locate(0,1); m3pi.printf(aff); wait(0.5); m3pi.leds(255); wait(0.5); m3pi.leds(127); wait(0.5); m3pi.leds(63); wait(0.5); strcpy( aff,"2 "); m3pi.locate(0,1); m3pi.printf(aff); m3pi.leds(31); wait(0.5); m3pi.leds(15); wait(0.5); m3pi.leds(7); strcpy( aff,"1 "); m3pi.locate(0,1); m3pi.printf(aff); m3pi.leds(3); wait(0.5); m3pi.leds(1); wait(0.5); strcpy( aff,"0 "); m3pi.locate(0,1); m3pi.printf(aff); wait(1); m3pi.leds(0); strcpy( aff,"GOOOOOOOOOO"); m3pi.locate(0,1); m3pi.printf(aff); wait(1); } else { save[countt-1]='R'; m3pi.left_motor((1.5/2)*speed); m3pi.right_motor(-(1.5/2)*speed); wait(0.53); m3pi.left_motor((1.5/2)*speed); m3pi.right_motor((1.5/2)*speed); wait(0.1); PIDf(1); wait(0.001); strcpy( aff,"turned "); } break; case 4: m3pi.left_motor(0); m3pi.right_motor(0); wait(0.01); m3pi.left_motor(2*(1.5/2)*0.8*speed); m3pi.right_motor(2*(1.5/2)*0.8*speed); wait(0.14); strcpy( aff,"t_forward "); PIDf(1); m3pi.left_motor(0); m3pi.right_motor(0); m3pi.calibrated_sensors(tabsensor); save[countt-1]='W'; if (((tabsensor[0]<400)&(tabsensor[4]<400))&(tabsensor[2]>900))//forward { PIDf(1); wait(0.001); } if ((tabsensor[1]<100)&(tabsensor[2]<100)&(tabsensor[3]<100))//turn left { save[countt-1]='L'; m3pi.left_motor(-(1.5/2)*speed); m3pi.right_motor((1.5/2)*speed); wait(0.48); m3pi.left_motor((1.5/2)*speed); m3pi.right_motor((1.5/2)*speed); wait(0.21); } break; }} ////////////////////////*********************************************///////////////////////////////////////////////// volatile char flag10ms; void inter1() { flag10ms=1; } int main() { k=1; countt=0; countt1=0; cmd=1; resetxbee =0; wait(0.01); resetxbee =1; statecapt=0; m3pi.sensor_auto_calibrate(); wait(1.); tick1.attach(&inter1,0.01); mu=1; while(1) { if (1) { if(flag10ms==1) { flag10ms=0; t.reset(); t.start(); m3pi.calibrated_sensors(tabsensor); if(cmd) { test(); } else { optim(save,countt);optim(save,countt);optim(save,countt);optim(save,countt); test1(); } t.stop(); v=t.read_us(); delai600ms++; } } } for (k=0 ;k<countt; k++ ) { if(k<8) { aff[k]=save[k]; } else { aff1[k]=save1[k]; } } m3pi.locate(0,1); m3pi.printf(aff); }