Final version of Polulu M2 SETI
Dependencies: FileSystem_POPS m3PI_TP_POPS_II2015v0 m3pi mbed
Fork of m3PI_TP_POPS_II2015v0 by
main3.cpp
- Committer:
- diogohideki
- Date:
- 2018-02-22
- Revision:
- 4:cdd8e61cd8c7
- Parent:
- 0:398afdd73d9e
- Child:
- 5:bc86a4fb4784
File content as of revision 4:cdd8e61cd8c7:
#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 t; Ticker tick1; 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>400 ? 1 : 0) float current_pos_of_line, previous_pos_of_line, derivate, proportional, power, integral, left, right, speed=0.3; char chain[10]; int v; unsigned short tabsensor[5]; volatile unsigned char sensors; volatile char flag10ms; char command=1; void inter1() { flag10ms=1; } void current_state() { unsigned char i; sensors=0; for(i=0; i<5; i++) { sensors = (sensors << 1) | seuil(tabsensor[i]); } } void step() { m3pi.forward(0.4*speed); wait(0.2); // m3pi.stop(); } /* * Results * 1 -> PID * 2 -> Turn back * 3 -> Turn left * 4 -> Turn right */ char PIDf(char commande) { if(commande==1) { char result; m3pi.calibrated_sensors(tabsensor); current_state(); switch(sensors) { case 0x00: // Deadend m3pi.stop(); // Back result = 2; break; case 0x1C: case 0x18: case 0x1E: // Forward/Left or Left Only // m3pi.stop(); step(); m3pi.calibrated_sensors(tabsensor); current_state(); if ((sensors == 0x00) || (sensors == 0x10)) { // Turn Left result = 3; } else { // Forward result = 1; } break; case 0x07: case 0x03: case 0x0F: // Forward/Right or Right Only -> RF // m3pi.stop(); step(); result = 4; break; case 0x1F: // 'T' or Intersection or End -> LR or RFL // m3pi.stop(); step(); m3pi.calibrated_sensors(tabsensor); current_state(); if (sensors == 0x1F) { // End result = 0; } else { // Turn Right result = 4; } /* if ((sensors == 0x00) || (sensors == 0x01) || (sensors == 0x10) || (sensors == 0x11)) { // Turn Right result = 4; } else if (sensors == 0x1F) { // End result = 0; } else { // Turn Right result = 4; } */ break; case 0x04: case 0x0C: case 0x06: case 0x0E: case 0x02: case 0x08: //PID // 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); result = 1; break; default: // Faire rien m3pi.stop(); result = 0; break; } return result; } } /* * Results * 1 -> PID * 2 -> Turn back * 3 -> Turn left * 4 -> Turn right */ char turn(char command) { if(command > 1 && command < 5) { char result; m3pi.calibrated_sensors(tabsensor); current_state(); switch(command) { case 2: // Turn Back if(sensors != 0x01) { m3pi.right(speed); result = 2; } else { m3pi.right(0.4*speed); wait(0.12); m3pi.stop(); result = 1; } break; case 3: // Turn Left if(sensors != 0x10) { m3pi.left(speed); result = 3; } else { m3pi.left(0.4*speed); wait(0.1); m3pi.stop(); result = 1; } break; case 4: // Turn Right if(sensors != 0x01) { m3pi.right(speed); result = 4; } else { m3pi.right(0.4*speed); wait(0.1); m3pi.stop(); result = 1; } break; } return result; } } int main() { resetxbee=0; wait(0.01); resetxbee =1; // FILE *p= fopen("/fs/tt.txt","a+"); m3pi.sensor_auto_calibrate(); wait(1.); tick1.attach(&inter1,0.01); // fprintf(p,"ecrire dans la cle USB\r\n"); // fclose(p); while(1) { if(flag10ms==1) { switch(command) { case 0: // Faire Rien m3pi.stop(); break; case 1: // PID command = PIDf(command); break; case 2: case 3: case 4: // 2 -> Back // 3 -> Left // 4 -> Right command = turn(command); break; } } } }