Hi Guys
I have a nasty bug I can't get rid of.
Scenario: A Maze solving Robot (Parallax BoeBot) with 4 Infrared Sender / Receiver.
IR-Modules are called:
leftir (for left-infrared)/ midleftir (...Middle-left-Infrared)/ midrightir / rightir
Maze is black lines on white paper.
The Phase is the mapping Phase where it roams the maze with the "Left hand on the wall rule"
Navigation IS working, except for one special case:
If the two Middle-IR-Modules AND the RIGHT one go high, it turns left. There is NO section in the code where I told it to do so.
And it happens only on the way BACK. (But the bot does not know that yet, as I'm not yet saving the data.)
In fact, there is a section where i explicitly told it NOT to turn left but go straight:
if(rightir == 1 && midrightir == 1 && midleftir == 1 && leftir == 0){
forward();
delay (25);
}
But still, it sometimes goes left! And it goes the exact amount of left it would on a regular turn.
Btw. the above section is not needed, I just tried to fix it that way.
Summary:
Left-IR-Sensor = 0 / Midleft-IR-Sensor = 1 / Midright-IR-Sensor = 1 / Right-IR-Sensor = 1
---> Bot still goes left sometimes, around 90 Degrees (Not the small steps when it would correct it's path on the line, more like 1/4 of a circle). I believe it "thinks" it hit a left turn.
It's really puzzling me, I'd be very grateful if someone has some advice for me.
The whole Code:
#include <Servo.h> // Include servo library
//Servos
Servo servoleft;
Servo servoright;
//IR Variables
int leftir;
int midleftir;
int midrightir;
int rightir;
void setup()
{
servoleft.attach(13);
servoright.attach(12);
//IR_Readers
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
//Serial Communication
Serial.begin(9600);
}
void loop()
{
//Read IR Values
leftir = digitalRead(5);
delay(1);
midleftir = digitalRead(4);
delay(1);
midrightir = digitalRead(3);
delay(1);
rightir = digitalRead(2);
delay(1);
//Line Follower Part (I have a wide Line, so only if BOTH Middle Sensors are High, it goes forward)
if (midrightir == 1 && midleftir == 1){
forward();
delay (25);
}
if (midrightir == 1 && midleftir == 0){
turnright();
delay (25);
}
if (midleftir == 1 && midrightir == 0){
turnleft();
delay (25);
}
// turn left at left turn
if (leftir == 1 && rightir == 0 && midleftir == 1 && midrightir == 1){
forward();
delay(330);
turnleft();
delay (520);
stopbot();
delay (2000);
}
/* // Turn right at right turn ########### MAY ONLY BE USED _AFTER_ SOLVING MAZE!!!! Left-Hand-On-Wall-Rule!! ###########
if ((rightir == 1 && leftir == 0) && (midleftir == 1 && midrightir == 1)){
forward();
delay(330);
turnright();
delay (520);
stopbot();
delay (2000);
}
*/
// turn left at intersection
if (leftir == 1 && rightir == 1 && midleftir == 1 && midrightir == 1){
forward();
delay(330);
turnleft();
delay (520);
stopbot();
delay (2000);
}
//Turn at the end of a line
if (rightir == 0 && midrightir == 0 && midleftir == 0 && leftir == 0){
stopbot();
delay(15);
turnleft();
delay (80);
}
//SHOULD NOT turn left when hitting a path to the right - But still does.
if(rightir == 1 && midrightir == 1 && midleftir == 1 && leftir == 0){
forward();
delay (25);
}
}
void forward(){
servoleft.writeMicroseconds(1800);
servoright.writeMicroseconds(1200);
}
void backward(){
servoleft.writeMicroseconds(1200);
servoright.writeMicroseconds(1800);
}
void turnright(){
servoleft.writeMicroseconds(1800);
servoright.writeMicroseconds(1800);
}
void turnleft(){
servoleft.writeMicroseconds(1200);
servoright.writeMicroseconds(1200);
}
void stopbot(){
servoleft.writeMicroseconds(1500);
servoright.writeMicroseconds(1500);
}
void stopservo(){
servoleft.detach();
servoright.detach();
}