M3pi logo character recognition principle

Dependencies:   mbed m3pi

Revision:
0:33bfb6a726ba
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jul 08 12:12:56 2011 +0000
@@ -0,0 +1,189 @@
+#include "mbed.h"
+#include "m3pi.h"
+#include "MSCFileSystem.h"
+
+DigitalOut ledone(LED1);
+DigitalOut ledtwo(LED2);
+DigitalOut ledthree(LED3);
+DigitalOut ledfour(LED4);
+MSCFileSystem msc("msc");   // allows read/write to a removable USB device through the m3pi's USB interface
+Serial pc(USBTX, USBRX);
+m3pi m3pi;
+
+float speed_max;            //the maximum speed allowed. used in fwd/bck under recognition
+float speed_mod;            //the modifiable speed varible used for cornering. may be used to adjust cornering values in future versions
+float speed_user;
+
+char Buffer[512];   //will house all of the data in the Commands.txt file. has space for 510 commands + one speed variable at begining (M5)
+
+FILE *CMD = fopen("/msc/Commands.txt", "r");    //where all the commands should be stored
+
+//this will be run in the event that something goes wrong like a character cant be recognised or a file is missing
+void ERR() {
+    while (1) {
+        ledtwo = 0;
+        ledthree = 0;
+        ledone = 1;
+        ledfour = 1;
+        wait(0.2);
+        ledfour = 0;
+        ledone = 0;
+        ledtwo = 1;
+        ledthree = 1;
+        wait(0.2);
+    }
+}
+
+//run on completion of the scrip
+void FIN() {
+    while (1) {
+        ledone = 1;
+        ledtwo = 1;
+        ledthree = 1;
+        ledfour = 1;
+        wait(0.5);
+        ledone = 0;
+        ledtwo = 0;
+        ledthree = 0;
+        ledfour = 0;
+        wait(0.5);
+    }
+}
+//this will check that all the files are present and accounted for.
+void opening() {
+    m3pi.cls();
+    m3pi.locate(0,0);
+    m3pi.printf("  LOGO");
+    m3pi.locate(0,1);
+    m3pi.printf("  RACE");
+    FILE *CMD = fopen("/msc/Commands.txt", "r");
+    //if it isnt is there, we have an ERROR, Run ERR();
+    if (CMD == NULL) {
+        m3pi.cls();
+        m3pi.printf("CMD ERR");
+        fclose(CMD);
+        while (1) {
+            ERR();
+        }
+        fclose(CMD);
+    }
+}
+
+//getting everything from the text document
+void grabbing() {
+    fopen("/msc/Commands.txt", "r");
+    while (!feof(CMD)) {
+        ledone = 1;
+        //put everything in Buffer as a string it would be easier to have it in seperate containers but for simplicity to understand for nivices like my, i have done it like this.
+        fscanf (CMD, "%s", Buffer);
+    }
+    fclose(CMD);
+    ledone = 0;
+    //add on to the end of Buffer a *  so that the end can be recognised
+    sprintf(Buffer + strlen(Buffer), "*");
+}
+
+//sets the speed
+void variables () {
+    if (Buffer[0] == 'M') {
+        //as everything is in a string, numbers /begin at 48 (0, 1 etc) so anything after 48 should be a number
+        if (Buffer[1] >= 49) {
+            speed_max = ((Buffer[1] - 48) / 10);
+        } else {
+            // if it isnt a number, it can be used, say ERR
+            m3pi.cls();
+            m3pi.printf("BAD");
+            m3pi.locate(0,1);
+            m3pi.printf("SPEED");
+            ERR();
+        }
+        speed_user = speed_max;
+    } else {
+        //if nothing is there, there has been no speed defined!
+        m3pi.cls();
+        m3pi.printf("NO SPEED");
+        m3pi.locate(0,1);
+        m3pi.printf("DEFINED");
+    }
+}
+
+
+void recognition() {
+    //this shall be used to incriment what character we are looking at
+    int N=2;
+    //repeat until the end of the document
+    while (!feof(CMD)) {
+        if (Buffer[N] == 'F' || Buffer[N] == 'f') {
+            N++;
+            //Because it's a  string, the conversion will turn the number 1 into 49, as it is the 49th character that can be recognised.
+            while (Buffer[N] >= 48) {
+                m3pi.cls();
+                m3pi.printf("FWD %c", Buffer[N]);   // F represents forward and
+                m3pi.forward(speed_max);            // a number after it represents how long
+                wait(Buffer[N] - 48);               //to go forwards for. this senario
+                m3pi.stop();                        //only includes the posibilty of
+                N++;                                // a one digit number.
+            }
+        } else if (Buffer[N] == 'B' || Buffer[N] == 'b') {
+            N++;
+            while (Buffer[N] >= 48) {
+                m3pi.cls();
+                m3pi.printf("BACK %c", Buffer[N]);
+                m3pi.backward(speed_max);
+                wait(Buffer[N] - 48);
+                N++;
+            }
+        } else if (Buffer[N] == 'R' || Buffer[N] == 'r') {
+            N++;
+            while (Buffer[N] >= 48) {
+                int A=Buffer[N] - 48;
+                m3pi.cls();
+                m3pi.printf("RGHT %d", A);
+                m3pi.left( - speed_max);
+                m3pi.right(speed_max);
+                wait(((speed_mod * 0.28)/9)*A); //a number after R or L represents
+                m3pi.stop();                    //how much to turn. the algorithm
+                N++;                            //above converts that to wait times for motors
+            }
+        } else if (Buffer[N] == 'L' || Buffer[N] == 'l') {
+            N++;
+            while (Buffer[N] >= 48) {
+                int A=Buffer[N] - 48;
+                m3pi.cls();
+                m3pi.printf("LFT %d", A);
+                m3pi.right( - speed_max);
+                m3pi.left(speed_max);
+                wait(((speed_mod * 0.28)/9)*A);
+                m3pi.stop();
+                N++;
+            }
+        } else if (Buffer[N] == 'S' || Buffer[N] == 's') {
+            m3pi.cls();
+            m3pi.printf("STOP");
+            m3pi.stop();
+            FIN();
+            N++;
+            //if there is a * then we have reached the end of what is in Buffer
+        } else if (Buffer[N] == '*') {
+            m3pi.stop();
+            m3pi.cls();
+            m3pi.printf("FIN!");
+            FIN();
+            //if there is a character that is not listed above, it is probebly an error
+        } else {
+            m3pi.stop();
+            m3pi.cls();
+            m3pi.printf("  ERR  ");
+            ERR();
+        }
+    }
+}
+
+int main() {
+    opening();
+    grabbing();
+    variables();
+    speed_mod = speed_max;
+    wait(2.0);
+    recognition();
+}
\ No newline at end of file