Robotics Competition | Odd & Even Count | Line Following Robot

robo

In this blog we have discussed about our 2nd stage autonomous robotics competition held at BIT Patna. So, before that please read our previous blog about 1st stage competition.

Please support us on YouTube also. Like Share and Subscribe to our channel : https://youtube.com/c/RatnasRoboLab

Odd & Even Count

The task given was to make the bot choose a path depending on the no of strips. If there is even no of side strips, the bot will choose path1 and if there is odd no of strips the bot will choose path2.

Path Choosing

Let me give you a demo. Now, let us assume that this is a line following robot and as you can see, here the no of strips are 3 the sensors at the extreme end will give a reading as odd, therefore the bot will choose path1. 

And now if the no of strips would be 2,4,6,.. etc, the extreme sensors will give the reading as even and hence the bot will choose path2.

There is also a sensor at the middle to detect obstacles. If any, the bot will stop for 3 secs(all autonomously).


Programming Part

Void Setup()

Here only Pin 3 (Proximity Sensor) is added for obstacle detection. For know about other pins read our previous blog.

void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT); //BUZZER

  pinMode(A0, INPUT);//EXTRM LEFT
  pinMode(A1, INPUT);//LEFT
  pinMode(A2, INPUT);//RIGHT
  pinMode(A3, INPUT);//EXTRM RIGHT

  pinMode(5, OUTPUT);  //left wheel positive
  pinMode(6, OUTPUT);  //left wheel negative
  pinMode(10, OUTPUT); //right wheel positive
  pinMode(11, OUTPUT); //right wheel negative

  pinMode(3, INPUT); //PRXIMITY

  pinMode(8, INPUT); // LEFT STRIPE CUNT
  pinMode(9, INPUT);  // RIGHT STRIPE CUNT

}

Functions()

We have already discussed most of the functions in the previous blog, this blog represents the continuous of the competition that held at BIT Patna.

Count variable is used for linefollowing. At first count variable set as 0, but when it reached to near strips it’s value changed to 1.

if(count==0)
{
  if((digitalRead(9)==LOW))
  {
  rtturn1();
  }
   if((digitalRead(8)==LOW))
  {
  ltturn1();
  }

   if((digitalRead(A0)==LOW))
   {
      slow();
      while(!(digitalRead(A0)==HIGH));
      n++;
              digitalWrite(2,HIGH);
              delay(10);
              digitalWrite(2,LOW);

   }
}

When counting strips if bot counts ODD number of strips according sensors, c used as a variable set as 1 and if bot counts EVEN number of strips, c set as 2.

if(count==1)
{
      if((digitalRead(A3)==LOW))
      {
            slow();
            while(!(digitalRead(A3)==HIGH));
            stop();
           delay(100);

      if(c==0)
       c=1;
        else if(c==1)
         c=2;

              digitalWrite(2,HIGH);
              delay(10);
              digitalWrite(2,LOW);

              if(p==c)
              {
                                Serial.print("    P====   ");
                                Serial.println(p);
                                Serial.print("    C====   ");
                                Serial.println(c);

               rtturn2();
               Serial.print("    turn====   ");
               count=2;
                Serial.println("    COUNT====   ");

               Serial.print(count);

               }
       }
}

Here we use c as a variable, if c=1 then it means bot counts ODD number of strips and bot choose Path1. 

if((count==2) && (c==1) && (a==0))
{
  if((digitalRead(9)==LOW))
  {
  rtturn3();
  }
   if((digitalRead(8)==LOW))
  {
  ltturn3();
  }
    if((digitalRead(A3)==LOW))
     {
     rtturn1();
     a=1;
              digitalWrite(2,HIGH);
              delay(60);
              digitalWrite(2,LOW);
     }
}

Here we use c as a variable, if c=2 then it means bot counts EVEN number of strips and bot choose Path2. 

if((count==2) && (c==2) && (a==0))
{
   if((digitalRead(9)==LOW))
  {
  rtturn3();
  }
   if((digitalRead(8)==LOW))
  {
  ltturn1();
  }

  if((digitalRead(A3)==LOW))
  {
  rtturn1();
  a=1;
              digitalWrite(2,HIGH);
              delay(60);
              digitalWrite(2,LOW);
  }
}

Whole Program

int z=0,n=0,c=0,count=0,a=0,p,b=0;
void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT); //BUZZER

  pinMode(A0, INPUT);//EXTRM LEFT
  pinMode(A1, INPUT);//LEFT
  pinMode(A2, INPUT);//RIGHT
  pinMode(A3, INPUT);//EXTRM RIGHT

  pinMode(5, OUTPUT);  //left wheel positive
  pinMode(6, OUTPUT);  //left wheel negative
  pinMode(10, OUTPUT); //right wheel positive
  pinMode(11, OUTPUT); //right wheel negative

  pinMode(3, INPUT); //PRXIMITY

  pinMode(8, INPUT); // LEFT STRIPE CUNT
  pinMode(9, INPUT);  // RIGHT STRIPE CUNT

}
void straight()
{
  analogWrite(5,250);
    analogWrite(6,0);
  analogWrite(10,250);
  analogWrite(11,0);
}

void rightadjust()
{
  analogWrite(5,250);
    analogWrite(6,0);

  analogWrite(10,150);
  analogWrite(11,0);
}

void leftadjust()
{
  analogWrite(5,150);
    analogWrite(6,0);

  analogWrite(10,250);
  analogWrite(11,0);
}

void rightturn()
{
  analogWrite(5,180);
    analogWrite(6,0);
  analogWrite(10,0);
  analogWrite(11,10);
}

void leftturn()
{
  analogWrite(5,0);
    analogWrite(6,10);

  analogWrite(10,180);
  analogWrite(11,0);
}
void stop()
{
  analogWrite(5,0);
    analogWrite(6,0);

  analogWrite(10,0);
  analogWrite(11,0);
}
void slow()
{
  analogWrite(5,70);
    analogWrite(6,0);

  analogWrite(10,70);
  analogWrite(11,0);
}

void rtturn1()
{
  rightturn();
  while(!((digitalRead(A3)==HIGH) && (digitalRead(9)==HIGH)));
}

void rtturn2()
{
  rightturn();

      while(!(digitalRead(A3)==LOW));
   while(!((digitalRead(A3)==HIGH) && (digitalRead(9)==HIGH)));

}

void rtturn3()
{
  rightturn();
  while(!((digitalRead(A3)==HIGH) && (digitalRead(9)==HIGH)))
  {
      if((digitalRead(A3)==LOW))
         break;
  }
}


void ltturn1()
{
  leftturn();
  while(!((digitalRead(A0)==HIGH) && (digitalRead(8)==HIGH)));

}


void ltturn3()
{
  leftturn();
  while(!((digitalRead(A0)==HIGH) && (digitalRead(8)==HIGH)))
  {

      if((digitalRead(A3)==LOW))
         break;
  }
}


void loop()
{
if((a==0) || (a==1))
{
 if((digitalRead(A1)==LOW) && (digitalRead(A2)==LOW))//straight
  {
    straight();
  }

  if((digitalRead(A1)==HIGH) && (digitalRead(A2)==LOW) )//adjust straight 4 right
  {
    rightadjust();
  }

  if((digitalRead(A1)==LOW) && (digitalRead(A2)==HIGH))//adjust straight 4 left
  {
    leftadjust();
  }
}


  if(count==0)
{
  if((digitalRead(9)==LOW))
  {
  rtturn1();
  }
   if((digitalRead(8)==LOW))
  {
  ltturn1();
  }

   if((digitalRead(A0)==LOW))
   {
      slow();
      while(!(digitalRead(A0)==HIGH));
      n++;
              digitalWrite(2,HIGH);
              delay(10);
              digitalWrite(2,LOW);

   }
}


 if(count==1)
{
      if((digitalRead(A3)==LOW))
      {
            slow();
            while(!(digitalRead(A3)==HIGH));
            stop();
           delay(100);

      if(c==0)
       c=1;
        else if(c==1)
         c=2;

              digitalWrite(2,HIGH);
              delay(10);
              digitalWrite(2,LOW);

              if(p==c)
              {
                                Serial.print("    P====   ");
                                Serial.println(p);
                                Serial.print("    C====   ");
                                Serial.println(c);

               rtturn2();
               Serial.print("    turn====   ");
               count=2;
                Serial.println("    COUNT====   ");

               Serial.print(count);

               }
       }
}


  if((count==2) && (c==1) && (a==0))
{
  if((digitalRead(9)==LOW))
  {
  rtturn3();
  }
   if((digitalRead(8)==LOW))
  {
  ltturn3();
  }
    if((digitalRead(A3)==LOW))
     {
     rtturn1();
     a=1;
              digitalWrite(2,HIGH);
              delay(60);
              digitalWrite(2,LOW);
     }

}


  if((count==2) && (c==2) && (a==0))
{
   if((digitalRead(9)==LOW))
  {
  rtturn3();
  }
   if((digitalRead(8)==LOW))
  {
  ltturn1();
  }

  if((digitalRead(A3)==LOW))
  {
  rtturn1();
  a=1;
              digitalWrite(2,HIGH);
              delay(60);
              digitalWrite(2,LOW);
  }
}


 if((digitalRead(3)==HIGH) && (count==0))
 {
   if(((n%2)==0))
   {
            p=2;
               digitalWrite(2,HIGH);
               delay(100);
               digitalWrite(2,LOW);
    }

   else
   {
     p=1;
   }

         count=1;
           digitalWrite(2,HIGH);
             delay(10);
              digitalWrite(2,LOW);
                 stop();
      while(!((digitalRead(3)==LOW)));
      delay(300);
  }

}

Product Links

Let’s see what are the parts we have used in building this line follower robot car using in the competition :

Components/Parts Required:

1. UNO R3 board, USB Cable : https://amzn.to/3dghi8u

2. L293d motor driver shield : https://amzn.to/3xXAi3z

3. Dual L293D motor driver shield : https://amzn.to/3A0Cklp

4. Plyboard chasis with motors and wheels : https://amzn.to/3jhiUTf

5. Only motor with wheels : https://amzn.to/3hdySeD

6. Infrared Sensor x 6 : https://amzn.to/3hcb8Hx

7. 4 cell AA Battery holder : https://amzn.to/3h4FRGC

8. 6 cell AA Battery holder : https://amzn.to/3dhIfsG

9. Duracell Ultra Alkaline AA Battery, 8 Pieces : https://amzn.to/3zVwT78

10. Jumper wires : https://amzn.to/3jvEX99

11. Black Tape : https://amzn.to/2T1bNDX

12. L-Clamp x2 : https://amzn.to/3hpM1l1

13. Screws and nuts set : https://amzn.to/3xYsHle


Further Readings

If you liked this article, then please subscribe to our YouTube Channel. You can also find us on Instagram, Facebook and Twitter.

READ – CONNECT – BOOST – CREATE

Leave a Comment

Your email address will not be published. Required fields are marked *

Newsletter

Stay connected with us