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: mbed
Diff: main.cpp
- Revision:
- 18:6e8eae661cf3
- Parent:
- 17:54da4359134f
- Child:
- 20:823f05f5ffd5
diff -r 54da4359134f -r 6e8eae661cf3 main.cpp
--- a/main.cpp Fri Mar 20 16:59:28 2015 +0000
+++ b/main.cpp Mon Mar 23 01:01:52 2015 +0000
@@ -28,7 +28,22 @@
//LED to test
DigitalOut led(LED_RED);
+//integer value of sensors (has to be global)
+int val_r=0;
+int val_l=0;
+int old_val_r=0;
+int old_val_l=0;
+//Flags for decisions
+int l_turn_spot = 0;
+int r_turn_spot = 0;
+int l_180_spot = 0;
+int r_180_spot = 0;
+int forwards = 0;
+int backwards = 0;
+int spin = 0;
+//Junction Counter (hard coding deccsions on junctions)
+int junction_cnt = 0;
void set_direction( int direction, float duty_l, float duty_r)
{
@@ -81,15 +96,51 @@
}
}
-void motor_result(int val)
+void motor_result() //val_r and val_l are global
{
-
+ //This needed to be completely changed. We need sequential actions, a case statement is too basic (unforetuneately)
led= 0;
- switch(val) {
- case 0: //lost
+ switch(val_r) {
+ case 6: //Normal Mode
+ // blue.printf("0110\n");
+ if (!forwards){ //if you're not already going forwards
+ set_direction(0x11, 0.3,0.3);
+ forwards = 1;
+ }
+ break;
+ case 7: // 0111 Either misaligned or getting ready for a turn
+ r_turn_spot = 1;
+ //No need to change direction, if misaligned, it will soon go to a double line alignment protocol
+ //if the next state is 0000; then we were right and there is a right turn.
+ break;
+ case 0: //lost or turn
// blue.printf("0000\n");
- set_direction(0x00, 0,0);
+ if ((r_turn_spot & l_turn_spot) & !spin) { //if we're expecting a junction and we're not spinning
+ set_direction(0x10, 0.3,0.3); //spin right because there's only one junction
+ spin = 1;
+ //no stop conditions yet
+
+ } else if (r_turn_spot & !spin) { //if we're expecting a right turn
+ set_direction(0x10, 0.3,0.3); //spin right
+ spin = 1;
+ //no stop conditions yet
+
+ } else if(val_l == 6) { //0110 0000 could mean a right 180 turn
+ //keep going forward, no need to change dir
+ r_180_spot = 1; //raise 180 flag in prep for next time
+
+ } else if(r_180_spot) {
+ //code for 180???
+ blue.printf("I want to 180 Right, but i don't know how yet");
+ set_direction(0x00, 0,0);
+
+ } else { //probably lost
+ set_direction(0x00, 0,0);
+ }
break;
+
+
+ //***************************IF THERE IS A SINGLE BIT ONLY; WE ARE MISALIGNED*********************************
case 1:
// blue.printf("0001\n");
set_direction(0x11, 0.3,0.1);
@@ -102,10 +153,13 @@
// blue.printf("0100\n");
set_direction(0x11, 0.2,0.3);
break;
- case 6:
- // blue.printf("0110\n");
- set_direction(0x11, 0.3,0.3);
+ case 8:
+ //blue.printf("1000\n");
+ set_direction(0x11, 0.1,0.3);
break;
+ //******************************END OF SINGLE BIT ALIGNMENT********************************************
+
+ //*************IF TWO BITS ARE ON, AND NOT IN THE MIDDLE, WE'RE PROBABLY VERY MISALIGNED*******************
case 12:
// blue.printf("1100\n");
set_direction(0x11, 0.2,0.3);
@@ -114,24 +168,98 @@
// blue.printf("0011\n");
set_direction(0x11, 0.3,0.2);
break;
+ //********************************END OF DOUBLE BIT ALIGNMENT********************************************
+
+
+
+ default:
+ //blue.printf("%i\n", val);
+ set_direction(0x00, 0,0);
+ }
+//***************************************LEFT SHOULD BE PRETTY MUCH MIRRORED***********************************************************
+ switch(val_l) {
+ case 6: //Normal Mode
+ // blue.printf("0110\n");
+ set_direction(0x11, 0.3,0.3);
+ break;
+ case 7: // 0111 Either misaligned or getting ready for a turn
+ l_turn_spot = 1;
+ //No need to change direction, if misaligned, it will soon go to a double line alignment protocol
+ //if the next state is 0000; then we were right and there is a left turn.
+ break;
+ case 0: //lost or turn
+ // blue.printf("0000\n");
+ if (r_turn_spot & l_turn_spot) { //if we're expecting a junction
+ set_direction(0x10, 0.3,0.3); //spin right because there's only one junction
+ //no stop conditions yet
+
+ } else if (l_turn_spot) { //if we're expecting a left turn
+ set_direction(0x01, 0.3,0.3); //spin left
+ //no stop conditions yet
+
+ } else if(val_r == 6) { //0000 0110 could mean a left 180 turn
+ //keep going forward, no need to change dir
+ l_180_spot = 1; //raise 180 flag in prep for next time
+
+ } else if(l_180_spot) {
+ //code for 180???
+ blue.printf("I want to 180 left, but i don't know how yet");
+ set_direction(0x00, 0,0);
+
+ } else { //probably lost
+ set_direction(0x00, 0,0);
+ }
+ break;
+
+ //***************************IF THERE IS A SINGLE BIT ONLY; WE ARE MISALIGNED*********************************
+ case 1:
+ // blue.printf("0001\n");
+ set_direction(0x11, 0.1,0.3);
+ break;
+ case 2:
+ // blue.printf("0010\n");
+ set_direction(0x11, 0.2,0.3);
+ break;
+ case 4:
+ // blue.printf("0100\n");
+ set_direction(0x11, 0.3,0.2);
+ break;
case 8:
//blue.printf("1000\n");
- set_direction(0x11, 0.1,0.3);
+ set_direction(0x11, 0.3,0.1);
+ break;
+ //******************************END OF SINGLE BIT ALIGNMENT********************************************
+
+ //*************IF TWO BITS ARE ON, AND NOT IN THE MIDDLE, WE'RE PROBABLY VERY MISALIGNED*******************
+ case 12:
+ // blue.printf("1100\n");
+ set_direction(0x11, 0.3,0.2);
break;
+ case 3:
+ // blue.printf("0011\n");
+ set_direction(0x11, 0.2,0.3);
+ break;
+ //********************************END OF DOUBLE BIT ALIGNMENT********************************************
+
+
+
default:
//blue.printf("%i\n", val);
set_direction(0x00, 0,0);
}
-
}
-int sensor_read()
+void sensor_read()
{
- int val=0;
+
int x = 0;
- int sens[4] = {0};
- for (x = 0; x < 4; x++) {
+ int sens_r[4] = {0};
+ int sens_l[4] = {0};
+
+ for (x = 0; x < 8; x++) {
switch(x) {
+ //0 is the robot's rightest sensor and 7 is the robot's leftmost sensor
+ //Addresses are inputs to multiplexer, can ignore them mainly
case 0:
sensor = 0x3;
break;
@@ -158,19 +286,24 @@
break;
}
- sens[x] = input;
+ if(x<4)sens_r[x] = input;
+ else sens_l[x%4] = input;//array of sensor output values for left and right
//blue = !blue;
}
- for(x = 3; x >= 0; x--) {
- val = val << 1;
- val = val + sens[x];
+ for(x = 7; x >= 0; x--) {
+ if(x>3) {
+ val_l = val_l << 1;
+ val_l = val_l + sens_l[x%4];
+ } else {
+ val_r = val_r << 1;
+ val_r = val_r + sens_r[x];
+ }
}
//blue.printf("%i\n",val);
- return val;
}
int main()
{
@@ -183,22 +316,28 @@
motor_rb=0;
motor_lf=0;
motor_lb=0;
- int val =0;
- int old_val=0;
- while(1) {
- old_val = val;
- val = sensor_read();
- if(!(old_val == val)) {
- string binary = "";
+ //Now Global*****
+ //int val =0;
+ //int old_val=0;*********
+
+ while(1) { //PRINTS A STRING 0110 0110 FOR LEFT AND RIGHT RESPECTIVELY
+ old_val_r = val_r;
+ old_val_l = val_l;
+ sensor_read();
+ if((!(old_val_l == val_l)) | (!(old_val_r == val_r))) {
+ string binary_r = "";
+ string binary_l = "";
int mask = 1;
for(int i = 0; i < 4; i++) {
- if((mask&val) >= 1) binary = "1"+binary;
- else binary = "0"+binary;
+ if(!(mask&val_r)) binary_r = "1"+binary_r; //(mask&val) >= 1
+ else binary_r = "0"+binary_r;
+ if(!(mask&val_l)) binary_l = "1"+binary_l; //(mask&val) >= 1
+ else binary_l = "0"+binary_l;
mask = mask << 1;
}
- blue.printf("%s\n", binary);
+ blue.printf("%s\t%s\n", binary_l, binary_r);
wait(0.2);
- motor_result(val);
+ motor_result();
}
// if(!(old_val == val)) {