Page 1 of 1

Help with a line following program

Posted: 22 Nov 2011, 14:44
by okami-ninja
Hi
I'm new to programming and lego mindstorms. I'm trying to write a program to make the robot move forward until it touches the line and then based on the angle it's touched it at position itself to follow the line. Then it stops until it here's a clap and then follows the line until there's another clap.

I've tried writing a program where the robot hits the line and turns left until it touches white again. Then if the turn time was less than the time taken to turn 90 degrees it stops otherwise it goes back on itsef until it touches the white. I tried running the program but the robot either just stops at the line or keeps going.

Does anyone have a better suggestion for the angle part or would be interested in looking at my code?
I'm thinking of geting the robot to turn left and store a light value and then do the same with the right. It would then compare the values and turn towards the greater one

Thanks a lot

okami

Re: Help with a line following program

Posted: 22 Nov 2011, 17:33
by mattallen37
Yes, please post your code.

Re: Help with a line following program

Posted: 23 Nov 2011, 14:03
by okami-ninja
I'm using bricx cc. Here's the code:

Code: Select all

#define Threshold 50      //define all thresholds and constants here
long maxTurn = 1300;
#define SOUND_THRESHOLD 75
#define MIC SENSOR_2

task main()
{
    long t0, time;
    t0 = CurrentTick();
    SetSensorLight(IN_3);
    SetSensorType(IN_3, SENSOR_TYPE_LIGHT_ACTIVE);//turns sensor on
    SetSensorSound(IN_2);

    OnFwd(OUT_BC,45);
    until (SENSOR_3<Threshold);  //goes forward till hits line
    /*
    *  the next part makes it turn left until it leaves the line
    *  then it works out how long it took to leave the line and if it took
    * longer than when it turns 90 degrees it goes back on itself as we want it
    * to turn right in that circumstance
    */
    OnFwd(OUT_B,45);
    OnRev(OUT_C,45);
    until (SENSOR_3>Threshold);
    time = CurrentTick()-t0;
    if(time>=maxTurn){
       OnFwd(OUT_C,45); Wait(time);
       OnFwd(OUT_C,45);
       until(SENSOR_3>Threshold);
       until(MIC > SOUND_THRESHOLD ); //hears clap and then follows line
       Wait(100);
       while(MIC < SOUND_THRESHOLD)
      {
         OnFwd(OUT_BC,25);
         if (SENSOR_3<Threshold){
            OnFwd(OUT_C,40);//these make it turn when touches line
            OnRev(OUT_B,80);
         }
         else if(SENSOR_3>Threshold){
              OnFwd(OUT_B,90);
              OnRev(OUT_C,40  );
         }
         Off(OUT_BC);
         Wait(300);
      }
    }
    else {  //if it turns less than 90 degrees it has turned the right way and so goes straight to tracking
       until(MIC > SOUND_THRESHOLD ); //hears clap and then follows line
       Wait(100);
       while(MIC < SOUND_THRESHOLD)
       {
         OnFwd(OUT_BC,25);
         if (SENSOR_3<Threshold){
            OnFwd(OUT_B,40);//these make it turn when touches line
            OnRev(OUT_C,80);
         }
         else if(SENSOR_3>Threshold){
              OnFwd(OUT_C,90);
              OnRev(OUT_B,40  );
         }
         Off(OUT_BC);
         Wait(300);
      }
    }
  Off(OUT_BC);    //turns the robot off
}
I'm going to write a different version that uses the second idea for finding the angle.

Thanks

Re: Help with a line following program

Posted: 23 Nov 2011, 14:38
by okami-ninja
I've just finished writing a different version that uses 2 variables to compare the light in different places. Here's the code for the new one

Code: Select all

#define Threshold 50        //defines variables for sound and light
#define SOUND_THRESHOLD 75
#define MIC SENSOR_2
 int normSpeed = 45;  //defines the different speeds used
 int fwdSpeed = 90;
 int revSpeed = 40;
 
 task main()
  {
     SetSensorLight(IN_3);               //set the two sensors and turn light on to measure reflected light
     SetSensorType(IN_3, SENSOR_TYPE_LIGHT_ACTIVE);
     SetSensorSound(IN_2);
     
     OnFwd(OUT_BC,normSpeed);
     until (SENSOR_3<Threshold);//it stops at the line
     
     /*The next part will find the angle
     *The robot turns slightly to the left and stores the light reading as a variable
     *It then does the same for the right
     *Then it compares the 2 values and turns towards the greater one and stops when touches white
     */
     OnFwd(OUT_B,normSpeed); Wait(100);
     int lightLeft=SENSOR_3;

     OnFwd(OUT_C,normSpeed); Wait(100);
     int lightRight=SENSOR_3;
     
     //the comparison
     if(lightLeft>lightRight)     //it's lighter on the left so it turns that way
      {
         OnFwd(OUT_B,fwdSpeed);
         OnRev(OUT_C,revSpeed);
         until (SENSOR_3>Threshold);//stops when it leaves the line
         
         until (MIC > SOUND_THRESHOLD); //hears clap and then follows line
         Wait(100);
         while(MIC < SOUND_THRESHOLD)   //tracks until the second clap
         {
              OnFwd(OUT_BC,25);
              if(SENSOR_3>Threshold)
               {
                   OnFwd(OUT_C,fwdSpeed);
                   OnRev(OUT_B,revSpeed);
               }
              else if(SENSOR_3>Threshold)
               {
                    OnFwd(OUT_B,fwdSpeed);
                    OnRev(OUT_C,revSpeed);
               }
         }
         Off(OUT_BC);   //stops at 2nd clap
      }
      
      else if(lightLeft<lightRight)  //this is for when it should turn right
       {
        OnFwd(OUT_C,fwdSpeed);
        OnRev(OUT_C,revSpeed);
        until (SENSOR_3>Threshold);
        
        until (MIC > SOUND_THRESHOLD); //hears clap and then follows line
        Wait(100);
        while(MIC < SOUND_THRESHOLD)   //tracks until the second clap
         {
              OnFwd(OUT_BC,25);
              if(SENSOR_3>Threshold)
               {
                    OnFwd(OUT_B,fwdSpeed);
                    OnRev(OUT_C,revSpeed);
               }
              else if(SENSOR_3<Threshold);
               {
                    OnFwd(OUT_C,fwdSpeed);
                    OnRev(OUT_B,revSpeed);
               }
         }
         Off(OUT_BC);
      }
  }

Re: Help with a line following program

Posted: 23 Nov 2011, 20:37
by mattallen37
Could you please use code tags as well so it keeps white-space?

Code: Select all

[code]
[/code]

Re: Help with a line following program

Posted: 24 Nov 2011, 14:10
by okami-ninja
Sorry, I didn't realise you could do that. Thanks