Simple Line Follower

Hey guys I recently found all my documentation for an old line follower we had to do for a first year course at my university. We did these in teams of 4. I built all the hardware and did a majority of the electrical. One other group member did the coding and one more did a CAD rendition of the prototype I built. The goal was basically to complete the track as fast as possible. Obstacles included size requirements, paths to chose from, breaks in the path, a block that needed to be pushed into a trench and not falling off the table. Our team was the 4th fastest out of about 20 Arduino teams and 20 LEGO NX teams.

We were given all the electrical parts/suggested diagrams. As far as I can tell parts where sourced from robotshop, digikey and solarbotics. I got hold of Lexan plastic and spent two days after lectures in the shop just eyeballing and cutting. The arduino shield was done in a similar sloppy fashion with no prior layout planned (I have no pictures of the shield so please don't ask me).

 

 



Just kinda winging it with Lexan and 2 part epoxy....

Bottom View

Side View



Rear Isometric View

Front Isometric CAD


Same view with wheels and shield removed.



Here is an explanation of the program that I made as part of our write-up. Move() is just drive forward and Touchfun() is just a function that monitors if the front bumper has been pushed.

Here is the code as it ran in the competition I had to clean it up because many last minute changes were made it it just before competition. It can be downloaded above as a .txt file. 

//define pins

#define light1 5
#define light2 4
#define touch 8
#define PWM12 5
#define PWM11 6
#define PWM21 9
#define PWM22 10

 

const int blackl= 550;
const int blackr= 500;

 
 //initiate touch counter
 int counttouch = 0;
 int lastbutstate = 0;

void setup()

{
    //Set up pin output/ input

    pinMode(18, INPUT);
    pinMode(19, INPUT);
    pinMode(touch, INPUT);
    pinMode(PWM12, OUTPUT);
    pinMode(PWM11, OUTPUT);
    pinMode(PWM22, OUTPUT);
    pinMode(PWM21, OUTPUT);

    //one side of the motor driver output to low

    digitalWrite(PWM11, LOW);
    digitalWrite(PWM21, LOW);

    //set up connection speed

    Serial.begin(9600);

}

 
void move()

{

  //set speeds of whiles
  int full = 240;
  int slow = 0;

  //light sensors variables and constants

 
  long lightsenl;
  long lightsenr;


  //read light sensors

  lightsenl = analogRead(light2);
  lightsenr = analogRead(light1);
  Serial.println(lightsenl);

  //if the right light sensor read black
  //if the left light sensor reads black

   if(blackr<lightsenr)

   {
     //turn right wheel back wards and left wheel forward

     analogWrite(PWM21,LOW);
     analogWrite(PWM22,full);
     analogWrite(PWM12,LOW);
     analogWrite(PWM11,slow);

   }

   else if (blackl<lightsenl)

   {

     //turn right wheel back wards and left wheel forward

        analogWrite(PWM22,LOW);
        analogWrite(PWM21,slow);
        analogWrite(PWM11,LOW);
        analogWrite(PWM12,full);

   }

    

   //if neither of the light sensors read black

    else

     {

       //both motors to full

       analogWrite(PWM21,LOW);
       analogWrite(PWM11,LOW);
       analogWrite(PWM12,full);
       analogWrite(PWM22,full-45);
     
     }

}

 

void touchfun()

{

  //constants and variables for

  int reading;
  const int delayt = 3500;
  long time;

  //read the touch sensors

  reading = digitalRead(touch);

  //if the time past is greater than the delay time

  if(millis()-time >= delayt)

  {

     // the button is pushed

     if (reading != 0)

     {

         //record the time

          time = millis();

         //add one to the touch counter

         counttouch += 1;

        //if the button is pushed the first time

       if (counttouch ==1)

       {

          //while the touch sensor is pushed

           while( reading != 0)

           {

               //read the touch sensor and move

                reading = digitalRead(touch);
                move();

            }
         }

         //when the touch counter is pushed the second time

         while(counttouch==2)

             {

              //set up timer till shut off

               if (millis()-time >=delayt )

                  {

                  //shut off motor

                  analogWrite(PWM21,0);
                  analogWrite(PWM11,0);
                  analogWrite(PWM12,0);
                  analogWrite(PWM22,0);

                  }
              }
          }
     }
}

**Small update made, I added the code for this project for others to download

/* All my work is distributed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License or any subsiquent version of that license. Details here "http://creativecommons.org/licenses/by-nc-sa/3.0/". You don't need to give me any credit but any derivative works must remain free and open source to the community. All code, media, diagrams and details are provided on an "as is" basis with no expressed or implied waranties for suitability to any purpose - don't blame me if something breaks. */

 

Follows a line and navigates a course.

  • Actuators / output devices: Solarbotic Motors
  • Control method: autonomous
  • CPU: Arduino
  • Power source: 4 AA batteries
  • Programming language: Arduino C
  • Sensors / input devices: IR sensors and SPDT switch
  • Target environment: Test path, black line

This is a companion discussion topic for the original entry at https://community.robotshop.com/robots/show/simple-line-follower