The program

Dependencies:   FileSystem_POPS Sound m3pi_test2 mbed

Fork of M3PI_SuiviLigne by Maxime Chevreau

Committer:
Maximousse
Date:
Thu May 03 12:08:03 2018 +0000
Revision:
4:22275847875d
Parent:
0:398afdd73d9e
test3;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bouaziz 0:398afdd73d9e 1 #include "mbed.h"
bouaziz 0:398afdd73d9e 2 #include "m3pi.h"
bouaziz 0:398afdd73d9e 3 #include "MSCFileSystem.h"
bouaziz 0:398afdd73d9e 4
bouaziz 0:398afdd73d9e 5 m3pi m3pi; // Initialise the m3pi
bouaziz 0:398afdd73d9e 6
bouaziz 0:398afdd73d9e 7 DigitalOut resetxbee(p26);
Maximousse 4:22275847875d 8 DigitalOut led3(LED3);
Maximousse 4:22275847875d 9 DigitalOut led1(LED1);
Maximousse 4:22275847875d 10 DigitalIn push(p21);
Maximousse 4:22275847875d 11
Maximousse 4:22275847875d 12 Serial pc(USBTX, USBRX); // For debugging and pc messages, uses commented out to prevent hangings
Maximousse 4:22275847875d 13 Serial bt(p28,p27);
Maximousse 4:22275847875d 14
bouaziz 0:398afdd73d9e 15 MSCFileSystem fs("fs");
bouaziz 0:398afdd73d9e 16
bouaziz 0:398afdd73d9e 17 BusOut myleds(LED1, LED2, LED3, LED4);
bouaziz 0:398afdd73d9e 18
Maximousse 4:22275847875d 19 const int THRESH = 200;
Maximousse 4:22275847875d 20
Maximousse 4:22275847875d 21 unsigned short sensors[5], mems[5], nbCapt, memsNb;
Maximousse 4:22275847875d 22 char tab[4];
Maximousse 4:22275847875d 23 float position, proportional, last_proportional, integral;
Maximousse 4:22275847875d 24
Maximousse 4:22275847875d 25 unsigned char dir;
Maximousse 4:22275847875d 26 float speed, duration, s1, s2;
Maximousse 4:22275847875d 27 char src='x';
Maximousse 4:22275847875d 28
Maximousse 4:22275847875d 29 Timer timer;
Maximousse 4:22275847875d 30
Maximousse 4:22275847875d 31
Maximousse 4:22275847875d 32
Maximousse 4:22275847875d 33
Maximousse 4:22275847875d 34
Maximousse 4:22275847875d 35
Maximousse 4:22275847875d 36
Maximousse 4:22275847875d 37
Maximousse 4:22275847875d 38
Maximousse 4:22275847875d 39 Serial& getCurrentSerial()
Maximousse 4:22275847875d 40 {
Maximousse 4:22275847875d 41 return (src == 'u' ? pc : bt);
Maximousse 4:22275847875d 42 }
Maximousse 4:22275847875d 43
Maximousse 4:22275847875d 44
Maximousse 4:22275847875d 45
Maximousse 4:22275847875d 46
Maximousse 4:22275847875d 47 void set_motors(float mr, float ml)
Maximousse 4:22275847875d 48 {
Maximousse 4:22275847875d 49 m3pi.left_motor(ml);
Maximousse 4:22275847875d 50 m3pi.right_motor(mr);
Maximousse 4:22275847875d 51 }
Maximousse 4:22275847875d 52
Maximousse 4:22275847875d 53 //------------------------------------------------------------------------------
Maximousse 4:22275847875d 54
Maximousse 4:22275847875d 55 void getCapt(bool mem = false)
Maximousse 4:22275847875d 56 {
Maximousse 4:22275847875d 57 int v = 0;
Maximousse 4:22275847875d 58 nbCapt = 0;
bouaziz 0:398afdd73d9e 59
Maximousse 4:22275847875d 60 m3pi.calibrated_sensors(sensors);
Maximousse 4:22275847875d 61
Maximousse 4:22275847875d 62 for(int i=0 ; i<5 ;i++)
Maximousse 4:22275847875d 63 {
Maximousse 4:22275847875d 64 sensors[i] = (sensors[i] > THRESH ? true : false);
Maximousse 4:22275847875d 65 if(sensors[i])
Maximousse 4:22275847875d 66 {
Maximousse 4:22275847875d 67 v += 0x1<<i;
Maximousse 4:22275847875d 68 nbCapt++;
Maximousse 4:22275847875d 69 }
Maximousse 4:22275847875d 70 if(mem)
Maximousse 4:22275847875d 71 {
Maximousse 4:22275847875d 72 mems[i] = sensors[i];
Maximousse 4:22275847875d 73 memsNb = nbCapt;
Maximousse 4:22275847875d 74 }
Maximousse 4:22275847875d 75 }
Maximousse 4:22275847875d 76 m3pi.leds(v);
Maximousse 4:22275847875d 77 }
Maximousse 4:22275847875d 78
Maximousse 4:22275847875d 79 //------------------------------------------------------------------------------
Maximousse 4:22275847875d 80
Maximousse 4:22275847875d 81 void suiviIntersect(float intervalTour = 0.0f)
Maximousse 4:22275847875d 82 {
Maximousse 4:22275847875d 83 bool done = false;
Maximousse 4:22275847875d 84 //forward = true;
Maximousse 4:22275847875d 85 unsigned int idx=0;
Maximousse 4:22275847875d 86 float vl, vr, omega, l_k=0, l_k1=0, sum=0, vmax=1.0f;
Maximousse 4:22275847875d 87
Maximousse 4:22275847875d 88 #if 1 // Low speed
Maximousse 4:22275847875d 89 const float Ki=0.007f, Kp=0.7f, Kd=1.5f, v=0.2;
Maximousse 4:22275847875d 90 #else
Maximousse 4:22275847875d 91 const float Ki=0.0007f, Kp=0.07f, Kd=1.5f, v=0.80f;
Maximousse 4:22275847875d 92 #endif
bouaziz 0:398afdd73d9e 93 m3pi.sensor_auto_calibrate();
Maximousse 4:22275847875d 94 wait(1.0);
bouaziz 0:398afdd73d9e 95
Maximousse 4:22275847875d 96 Timer t; t.start();
Maximousse 4:22275847875d 97 while(!done)
Maximousse 4:22275847875d 98 {
Maximousse 4:22275847875d 99 idx++;
Maximousse 4:22275847875d 100 getCapt();
Maximousse 4:22275847875d 101
Maximousse 4:22275847875d 102 // PID
Maximousse 4:22275847875d 103 l_k1 = l_k;
Maximousse 4:22275847875d 104 l_k = m3pi.line_position();
Maximousse 4:22275847875d 105 //v = sp;
Maximousse 4:22275847875d 106 omega = l_k*Kp; // Proportionnal
Maximousse 4:22275847875d 107 sum += l_k;
Maximousse 4:22275847875d 108 omega += sum*Ki; // Integral
Maximousse 4:22275847875d 109 omega += (l_k-l_k1)*Kd;
bouaziz 0:398afdd73d9e 110
bouaziz 0:398afdd73d9e 111
Maximousse 4:22275847875d 112 vl = v+omega < vmax ? (v+omega > -vmax ? v+omega : vmax) : vmax;
Maximousse 4:22275847875d 113 vr = v-omega < vmax ? (v-omega > -vmax ? v-omega : -vmax): vmax;
Maximousse 4:22275847875d 114
Maximousse 4:22275847875d 115 vr *= 1.2;
Maximousse 4:22275847875d 116 vl *= 1.2;
Maximousse 4:22275847875d 117 set_motors(vr,vl);
Maximousse 4:22275847875d 118
Maximousse 4:22275847875d 119 //---------------------INTERSECTION
Maximousse 4:22275847875d 120 if(sensors[0] || sensors[4]) {
Maximousse 4:22275847875d 121 char c = 'a';
Maximousse 4:22275847875d 122 //if ((c<='5') & (c>='1')) {
Maximousse 4:22275847875d 123 // leds[c - '1'] = !leds[c - '1'];
Maximousse 4:22275847875d 124 //}
Maximousse 4:22275847875d 125 bt.printf("Voici un %c \n", c);
Maximousse 4:22275847875d 126 }
Maximousse 4:22275847875d 127
Maximousse 4:22275847875d 128 /*
Maximousse 4:22275847875d 129 if(forward) set_motors(vr,vl);
Maximousse 4:22275847875d 130 else set_motors(-vl,-vr);
Maximousse 4:22275847875d 131 */
Maximousse 4:22275847875d 132
Maximousse 4:22275847875d 133 m3pi.cls();
Maximousse 4:22275847875d 134 //const char* C [1]= {'0' + idx};
Maximousse 4:22275847875d 135 //m3pi.printf(C);
bouaziz 0:398afdd73d9e 136 }
Maximousse 4:22275847875d 137
Maximousse 4:22275847875d 138 return;
bouaziz 0:398afdd73d9e 139 }
Maximousse 4:22275847875d 140
Maximousse 4:22275847875d 141
Maximousse 4:22275847875d 142
Maximousse 4:22275847875d 143
Maximousse 4:22275847875d 144
Maximousse 4:22275847875d 145
Maximousse 4:22275847875d 146
Maximousse 4:22275847875d 147
Maximousse 4:22275847875d 148
Maximousse 4:22275847875d 149
Maximousse 4:22275847875d 150 int main() {
Maximousse 4:22275847875d 151 bt.baud(115200);
Maximousse 4:22275847875d 152 m3pi.cls();
Maximousse 4:22275847875d 153 wait(0.5);
Maximousse 4:22275847875d 154
Maximousse 4:22275847875d 155 m3pi.sensor_auto_calibrate();
Maximousse 4:22275847875d 156
Maximousse 4:22275847875d 157 set_motors(0.f,0.f);
Maximousse 4:22275847875d 158 char c = 'a';
Maximousse 4:22275847875d 159 bt.printf("Hello World!\n");
Maximousse 4:22275847875d 160
Maximousse 4:22275847875d 161 while(1)
Maximousse 4:22275847875d 162 {
Maximousse 4:22275847875d 163 getCapt();
Maximousse 4:22275847875d 164 suiviIntersect();
Maximousse 4:22275847875d 165 }
Maximousse 4:22275847875d 166 }