Wednesday, February 13, 2013

Competition Day, LUCKY!

A picture of the first stages of the square bot.



A picture of the middle stages of the square bot.

A picture of the square bot near the final stages, looking for the flame.

A picture of the final build of the square bot. Our team name for the competition is, "Kitty Kat".

Here is the link to the video of "Kitty Kat" in action:
http://www.youtube.com/watch?v=paTmTizYf1I&feature=player_embedded

Our team was able to put of the flame, however, it was due to luck and not the code. Kitty Kat did carry out code correctly. More testing would have avoided the robot from crashing into the candle.

Here is the code for "Kitty Kat":

#pragma config(Sensor, in1,    flameSensor,    sensorAnalog)
#pragma config(Sensor, in2,    leftEncoder,    sensorRotation)
#pragma config(Sensor, in3,    rightEncoder,   sensorRotation)
#pragma config(Sensor, in4,    sonarSensor,    sensorSONAR, int1)
#pragma config(Sensor, in5,    lineSensor,     sensorReflection)
#pragma config(Sensor, in6,    startButton,     sensorReflection)
#pragma config(Sensor, in10,   fan,          sensorDigitalOut)
#pragma config(Motor,  port2,           rightMotor,    tmotorServoContinuousRotation, openLoop, reversed)
#pragma config(Motor,  port3,           leftMotor,     tmotorServoContinuousRotation, openLoop)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
void stoprobot()
{
    motor[leftMotor]=0;
    motor[rightMotor]=0;
    SensorValue[rightEncoder]=0;
    SensorValue[leftEncoder]=0;
}
void goforward(int counts)
{
    SensorValue [leftEncoder] = 0;
    SensorValue [rightEncoder] = 0;
    int normalspeed;
    int    slowspeed;
    normalspeed = 60;
    slowspeed =45 ;
    //while (SensorValue [rightEncoder]<counts && SensorValue [leftEncoder]<counts)
    while(SensorValue[leftEncoder] < counts)
    {
        if(SensorValue[leftEncoder]>SensorValue[rightEncoder])
        {
            motor[rightMotor]=normalspeed;
            motor[leftMotor]=slowspeed;
        }
        if(SensorValue[rightEncoder]>SensorValue[leftEncoder])
        {
            motor[rightMotor]=slowspeed;
            motor[leftMotor]=normalspeed;
        }
        if(SensorValue[rightEncoder] == SensorValue[leftEncoder])
        {
            motor[rightMotor]=normalspeed;
            motor[leftMotor]=normalspeed;
        }
    }
}
void gotowall(int distance)
{
    while (SensorValue [sonarSensor] >= distance || SensorValue [sonarSensor] < 2)
    {
        goforward(1);
    }
}
void fanOn ()
{
    SensorValue[fan]=1;
    wait10Msec(100);
    SensorValue[fan]=0;
}
void killFlame (int flameValue)
{
    fanOn();
    wait10Msec(100);
    while (SensorValue[flameSensor]> flameValue)
    {
        goforward(5);
        fanOn();
        stoprobot();
        wait10Msec(500);
    }
}
void searchRight(int fire, int searchTime)
{
    int counter=0;
    SensorValue [flameSensor] = 0;
    SensorValue [leftEncoder] = 0;
    while(SensorValue[flameSensor]<fire && counter<searchTime)
    {
        counter=counter+1;
        wait1Msec(1);
        motor[rightMotor] = -50;
        motor[leftMotor] = 50;
    }
    killFlame(600);
}
void fw2 ()
{
    while (SensorValue[flameSensor]> 100 && SensorValue[flameSensor] <900)
    {
        goforward(5);
        stoprobot();
    }
    int fire;
    int searchTime;

    searchRight(fire+300,searchTime);
}
void goleft(int langle)
{
    SensorValue [leftEncoder] = 0;
    SensorValue [rightEncoder] = 0;
    while (SensorValue [rightEncoder]<langle)
    {
        motor[rightMotor] = 60;
        motor[leftMotor] = -60;
    }
}
void goright(int rangle)
{
    SensorValue [leftEncoder] = 0;
    SensorValue [rightEncoder] = 0;
    while (SensorValue [leftEncoder]<rangle)
    {
        motor[rightMotor] = -60;
        motor[leftMotor] = 60;
    }
}
void rfindTape(int rblack)
{
    while (SensorValue [lineSensor] <= rblack)
    {
        goforward(10);
    }
}
void findTape(int black)
{
    while (SensorValue [lineSensor] >= black)
    {
        goforward(10);
    }
}
void back(int bb)
{
    SensorValue[rightEncoder]=0;
    SensorValue[leftEncoder]=0;
    motor[rightMotor]= 0;
    motor[leftMotor]=0;
    motor[rightMotor]=-60;
    motor[leftMotor]=-60;
    wait1Msec(1000);
    motor[rightMotor]=0;
    motor[leftMotor]=0;
}
void sr1()
{
    goright(90);
    back(50);
    gotowall(10);
    goright(90);
    back(50);
    gotowall(15);
    searchRight(600,2900);
    stoprobot();
    wait10Msec(100);
    goright(90);
    stoprobot();
    back(200);
    stoprobot();
    goright(95);
    back(200);
    gotowall(10);
    goleft(90);
    back(150);
    gotowall(10);
    stoprobot();
    goleft(90);
    stoprobot();
    back(60);
    stoprobot();
}
void sr2()
{
    goforward(200);
    //    gotowall(35);
    stoprobot();
    goright(90);
    stoprobot();
    back(60);
    stoprobot();
    gotowall(35);
    stoprobot();
    searchRight(400,3400);
    stoprobot();
    wait10Msec(100);
    goright(75);
    stoprobot();
    back(100);
    stoprobot();
    goright(90);
    stoprobot();
    back(250);
    gotowall(10);
    stoprobot();
}
void sr3()
{
    goright(90);
    //stoprobot();
    //back(210);
    //stoprobot();
    goforward(100);
    stoprobot();
    goright(90);
    stoprobot();
    gotowall(40);
    goleft(90);
    stoprobot();
    back(50);
    gotowall(10);
    searchRight(600,3400);
    stoprobot();
    goright(90);
    back(60);
    goright(90);
    back(60);
    gotowall(10);
    stoprobot();
}
void sr4()
{
    goright(90);
    goforward(90);
    goright(90);
    gotowall(40);
    goleft(90);
    gotowall(10);
    goright(90);
    back(60);
    gotowall(20);
    searchRight(600,3000);
    gotowall(10);
    searchRight(600,3000);
    stoprobot();
}
void SearchRoom1()
{
    wait1Msec(2000);
    back(80);
    stoprobot();
    gotowall(10);
    sr1();
}
void t2 ()
{
    //    gotowall(10);
    //    stoprobot();
    goforward(80);
    //    searchRight(400,2900);
    stoprobot();
}
task main()
{
    wait1Msec(1500);
    SearchRoom1();
    stoprobot();
    sr2();
    stoprobot();
    sr3();
    stoprobot();
    sr4();
    stoprobot();
}

The task main code basically tells "Kitty Kat" what navigation path the take. "Kitty Kat" will go straight to room 1, call functions that search for the flame and turn the fan on if a value of greater than 500 is present. If there is no flame, it would then proceed to sr2,(room2) and do the same. It would keep doing this in till it has found a flame or explored all 4 rooms.

Testing and reconfigure values was a must. Depending on battery life, and surface texture "Kitty Kat" would behave differently. In order to minimize errors, few function were made and many were called a lot. This made debugging easier. One governing rule that was absolutely necessary was "Kitty Kat" ability to go straight for long distances and turn 90 degrees perfectly. Having this insured that the robot would not crash on throw itself off course.

Overall this project was extremely fun and taught me a lot about programming, planning, and testing a unit. I think the next time I enter a robot competition I will be very confident in being able to win. I would not relay on luck but on hard work.

No comments:

Post a Comment