Sparkfun Robot with Hall effect sensor and Bluetooth

Dependencies:   Motordriver mbed

Revision:
0:e36c23af3037
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Oct 18 18:06:15 2014 +0000
@@ -0,0 +1,213 @@
+#include "mbed.h"
+#include "motordriver.h"
+
+Serial pc(USBTX, USBRX);
+Serial device(p9, p10); //Connect JY-MCU bluetooth module to 9,10
+
+Motor  right(p21, p22, p23, 1); // pwm, fwd, rev, has brake feature
+Motor left(p26, p25, p24, 1);
+
+DigitalOut myled1(LED1);
+DigitalOut myled2(LED2);
+// LED's blink every pole change degugging like feature
+DigitalOut myled3(LED3);
+DigitalOut myled4(LED4);
+void align();
+
+// white wire is output, black is gound, Red is Vout or 3.3 volt
+DigitalIn Enc1(p19); //right motor
+DigitalIn Enc2(p20); //left motor
+float speed;
+//regulate speeds of motors
+float s1 = 0;
+float s2 = 0;
+// this increases speed of motors slightly
+int upspeed1 = 0;
+int upspeed2 = 0;
+// this is for correction that occurs for flag1 right motor speeding up
+// or flage 2 for left motor.
+int flag1 = 0;
+int flag2 = 0;
+
+int hexPos1 = 1;  //4 north and 4 south poles -number 1-8
+int hexPos2 = 1;  // calling them postions on wheel.
+// direction 1 = foward   &  dir = -1 is reverse
+float dir = 1;  //default set to forward
+int state = 0;
+
+
+int main()
+{
+    unsigned char Instr = 0;//What button was sent? 1 = forward, 2 = backward
+    unsigned char sentSpeed; //What is the slider set to?
+    device.baud(57600);
+    Enc1.mode(PullUp); // requires a pullup resistor so i just used embed's feature.
+    Enc2.mode(PullUp);
+    // this tells us the starting N/S poles of the motors
+
+    myled1 = (!Enc1);
+    myled2 = (!Enc2);
+    //intialize motors to start on same pole if not move motor two to correct
+    align();
+
+    while(1) {
+
+
+        if(device.readable()) {
+            Instr = device.getc();
+            pc.printf("Instruction: %i\n\r", Instr);
+            wait(.05);//Wait for the next bluetooth value to be recieved.
+            if(device.readable()) {
+                sentSpeed = device.getc();
+                switch (Instr) {
+                    case 0://Stop
+                        left.speed(0);
+                        right.speed(0);
+                        align();
+                        break;
+                    case 1://Forward
+                        pc.printf("Speed: %i\n\r", sentSpeed);
+                        speed = float(sentSpeed) / 100;
+                        left.speed(speed);
+                        right.speed(speed);
+                        s1 = speed;
+                        s2 = speed;
+                        dir = 1;
+                        break;
+                    case 2://Reverse
+                        pc.printf("Reverse speed: %i\n\r", sentSpeed);
+                        hexPos1 = 0;
+                        hexPos2 = 0;
+                        speed = -float(sentSpeed) / 100;
+                        left.speed(speed);
+                        right.speed(speed);
+                        s1 = speed;
+                        s2 = speed;
+                        dir = -1;
+                        break;
+                    case 3://Clockwise Turn
+                        speed = float(sentSpeed) / 100;
+                        left.speed(speed);
+                        right.speed(-speed);
+                        break;
+                    case 4://CCW Turn
+                        speed = float(sentSpeed) / 100;
+                        left.speed(-speed);
+                        right.speed(speed);
+                        break;
+                }//End Switch
+
+            }//End Speed Read
+        }//End Instruction Read
+
+
+        // forward and reverse Instructions from app are 2 and 1
+        if((Instr == 2) || (Instr == 1)) {
+            // Right motor faster then left
+            if(hexPos1 >= hexPos2) {
+                // this takes out negative values as being < 2
+                if(((hexPos1 - hexPos2) < 2) ) {
+
+                    if(flag2) {
+                        // now that left side is caught up reduce speed increased by half since
+                        // it was slower to bein with.
+                        left.speed(s2 -= (upspeed2*0.01*dir));
+                        flag2 = 0;
+                    }
+
+
+                }
+                if(((hexPos1 - hexPos2) > 2) ) {
+                    // requires corrective action
+                    flag2 = 1;
+                    if(dir*s2<1) {
+                        left.speed(s2 +=(dir*0.02));
+                        upspeed2 += 1;
+                    }
+
+                }
+            }
+
+
+            // Left motor faster then right
+            if(hexPos2 > hexPos1) {
+                // this takes out negative values as being < 2
+                if(((hexPos2 - hexPos1) < 2)) {
+
+                    if(flag1) {
+                        // now that left side is caught up reduce speed increased by half since
+                        // it was slower to bein with.
+                        right.speed(s1 -= (upspeed1*0.01*dir));
+                        flag1 = 0;
+                    }
+
+                }
+                if(((hexPos2 - hexPos1) > 2) ) {
+                    // requires corrective action
+                    flag1 = 1;
+                    if(dir*s1<1) {
+                        right.speed(s1 +=(0.02*dir));
+                        upspeed1 += 1;
+                    }
+
+                }
+            }
+            // keeps count low.
+            if(hexPos1 > 2000 || hexPos2 > 2000) {
+                hexPos1 = hexPos1-1000;
+                hexPos2 = hexPos2-1000;
+            }
+
+
+            // this is for keeping track of the poles and updating LED's so you can see
+            // if the motors are getting out of wack.
+            if(!Enc1) { // I'm assuming this is a postive pole
+                if(!myled1) { // it was a south pole last time and is now north
+                    hexPos1++;
+                    myled3 = !myled3;
+                    myled1 = 1;
+                }
+            } else {
+                if(myled1) { // it was a North pole last time and is now South
+                    hexPos1++;
+                    myled3 = !myled3;
+                    myled1 = 0;
+                }
+            }
+
+            if(!Enc2) { // I'm assuming this is a postive pole
+                if(!myled2) { // it was a south pole last time and is now north
+                    hexPos2++;
+                    myled4= !myled4;
+                    myled2 = 1;
+                }
+            } else {
+                if(myled2) { // it was a North pole last time and is now South
+                    hexPos2++;
+                    myled4 = !myled4;
+                    myled2 = 0;
+                }
+            }
+        }
+
+    }
+}
+
+
+//intialize motors to start on same pole if not move motor two to correct
+void align()
+{
+    if(Enc1 != Enc2) {
+        while(1) {
+            left.speed(.5);
+            if(Enc1 == Enc2) {
+                left.speed(0);
+                myled1 = (!Enc1);
+                myled2 = (!Enc2);
+                hexPos1 = 0;
+                hexPos2 = 0;
+                break;
+            }
+        }
+    }
+}
\ No newline at end of file