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.
Dependencies: FileSystem_POPS m3PI_TP_POPS_II2015v0 m3pi mbed
Fork of m3PI_TP_POPS_II2015v0 by
Revision 4:cdd8e61cd8c7, committed 2018-02-22
- Comitter:
- diogohideki
- Date:
- Thu Feb 22 08:21:12 2018 +0000
- Parent:
- 3:b4b0c5219d2a
- Child:
- 5:bc86a4fb4784
- Commit message:
- initial state - last class
Changed in this revision
| m3PI_TP_SETI.lib | Show annotated file Show diff for this revision Revisions of this file |
| main3.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m3PI_TP_SETI.lib Thu Feb 22 08:21:12 2018 +0000 @@ -0,0 +1,1 @@ +http://os.mbed.com/users/bouaziz/code/m3PI_TP_POPS_II2015v0/#b4b0c5219d2a
--- a/main3.cpp Mon Nov 23 23:24:35 2015 +0000
+++ b/main3.cpp Thu Feb 22 08:21:12 2018 +0000
@@ -1,4 +1,3 @@
-
#include "mbed.h"
#include "m3pi.h"
#include "MSCFileSystem.h"
@@ -8,24 +7,245 @@
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");
+//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;
+ resetxbee=0;
wait(0.01);
resetxbee =1;
- FILE *p= fopen("/fs/tt.txt","a+");
+ // 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);
-
+ // 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;
+ }
+ }
}
-}
+}
\ No newline at end of file
