exemple pour le TP SETI ROBOT M3PI
Dependencies: mbed FileSystem_POPS m3pi
main3.cpp
- Committer:
- bouaziz
- Date:
- 2018-01-10
- Revision:
- 4:dcad3508bdfb
- Parent:
- 0:398afdd73d9e
- Child:
- 5:0f4a460521be
File content as of revision 4:dcad3508bdfb:
#include "mbed.h" #include "m3pi.h" #include "MSCFileSystem.h" m3pi m3pi; // Initialise the m3pi Serial xbee(p28,p27); DigitalOut resetxbee(p26); Serial pc(USBTX, USBRX); // For debugging and pc messages, uses commented out to prevent hanging //MSCFileSystem fs("fs"); Timer tm1; Ticker tic1; BusOut myleds(LED1, LED2, LED3, LED4); // all variables are float #define D_TERM 0.0 #define I_TERMO 0.1 #define I_TERM 0.1 #define P_TERM 0.9 #define MAX 0.3 #define MIN -0.2 float current_pos_of_line,derivative,proportional,power,integral,right,left,previous_pos_of_line; float speed =0.3; unsigned short tabsensor[5]; #define seuil(x) (x>400 ? 1 : 0) unsigned char statcapt; char PIDf(char commande){ unsigned char i; m3pi.calibrated_sensors(tabsensor); statcapt=0; for(i=0;i<5;i++){ statcapt = (statcapt <<1) | seuil(tabsensor[i]); } if(commande == 1) { if((statcapt==0 )||(statcapt==0x1F )) { m3pi.left_motor(0.0); m3pi.right_motor(0.0); 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 derivative derivative = current_pos_of_line - previous_pos_of_line; // Compute the integral integral = (integral+ I_TERMO*proportional)/(1+I_TERMO); // Remember the last position. previous_pos_of_line = current_pos_of_line; // Compute the power power = (proportional * (P_TERM) ) + (integral*(I_TERM)) + (derivative*(D_TERM)) ; // Compute new speeds right = speed-(power*MAX); left = speed+(power*MAX); // limit checks on motor control //MIN <right < MAX // MIN <left < MAX right = (right>MAX ? MAX :(right<MIN ? MIN : right)); // send command to motors m3pi.left_motor(left); m3pi.right_motor(right); } } return 1; } volatile char flag10ms; void inter1(){ flag10ms=1; } int v; unsigned char delai600ms; char chain[10]; int main() { resetxbee =0; wait(0.01); resetxbee =1; // FILE *p= fopen("/fs/tt.txt","a+"); m3pi.sensor_auto_calibrate(); wait(1.); tic1.attach(&inter1,0.01); // fprintf(p,"ecrire dans la cle USB\r\n"); // fclose(p); while(1) { if(flag10ms==1){ flag10ms=0; tm1.reset(); tm1.start(); PIDf(1); tm1.stop(); v=tm1.read_us(); delai600ms++; } if(delai600ms>=60){ sprintf(chain,"%5u",v); m3pi.locate(0,0); m3pi.print(chain,strlen(chain)); delai600ms=0; } //pc.printf("%u %u %u %u %u\r\n",seuil(tabsensor[0]),seuil(tabsensor[1]), // seuil(tabsensor[2]),seuil(tabsensor[3]),seuil(tabsensor[4])); } }