Code for final project
/*......................................................................
Final project - Recognizing commands
Mobile robot - Spring 1999
Alejandro J. Trejo
......................................................................*/
int leftMotor = 0; /*
Motor ports */
int rightMotor = 2;
int leftS = 2; /*
Photoresistor ports */
int rightS = 0;
int turnLeftS = 6;
int turnRightS = 4;
int topS = 1; /* Infrared
ports */
int bottomS = 5;
int leftB = 12; /* Bumper
ports */
int rightB = 8;
int centerB = 10;
int OK = 0; /* Constants
*/
int YES = 1;
int NO = 0;
int NONE = 0;
int HIT = 1;
int NOHIT = 0;
int left = -7;
int right = 7;
int flag; /* Flags */
int offRight = -1;
int offLeft = 1;
int leftTurn = -2;
int rightTurn = 2;
int seekRamp = 100;
int goRamp = 10;
int peak = 21;
int bumpedLeft = -3;
int bumpedRight = 3;
int bumpedCenter = 30;
float forward = 0.05; /*
Time allowed for displacements */
float reverse = 1.0;
float adjusting = 0.2;
float turn = 1.0;
float adjustRamp = 0.5;
float turnAround = 2.0;
int leftForward = -25; /*
Motor speeds */
int rightForward = -25;
int leftForwardFast = -40;
int rightForwardFast = -40;
int leftBackward = 50;
int rightBackward = 50;
int leftUphill = -80;
int rightUphill = -80;
int leftTracker; /* Sensor
readings */
int rightTracker;
int leftTurner;
int rightTurner;
int leftBumper;
int rightBumper;
int centerBumper;
int topScanner;
int bottomScanner;
int limit = 10; /* Limits
*/
int turnLimit = 60;
int maxBumps = 2;
int compensation = 2; /*
Compensations */
int turnCompensation = 9;
int turnCounter = 0; /*
Global variables */
int displacements = 0;
int leftBumps = 0;
int rightBumps = 0;
int lastTurn = NONE;
int peakStop = NO;
/*.....................................................
Forward motion
.....................................................*/
int MoveForward()
{
motor(leftMotor,leftForward); /* Starts moving here */
motor(rightMotor,rightForward);
printf("Forward: %d:%d %d:%d
%d\n",leftTracker,rightTracker, leftTurner, rightTurner,
displacements);
sleep(forward);
leftTracker =
analog(leftS); /* Gets sensor readings */
rightTracker = analog(rightS)+compensation;
leftTurner = analog(turnLeftS);
rightTurner = analog(turnRightS)+turnCompensation;
leftBumper = digital(leftB);
rightBumper = digital(rightB);
centerBumper = digital(centerB);
if ( (leftTurner>150)
&& (rightTurner>150) ) /* Robot is moving on ramp */
displacements++;
if (turnCounter>3) /*
Reports ramp was found */
return seekRamp;
else if (centerBumper ==
HIT) /* Reports robot bumped */
return bumpedCenter;
else if (leftBumper == HIT)
return bumpedLeft;
else if (rightBumper == HIT)
return bumpedRight;
else if (leftTurner >=
rightTurner+turnLimit) /* Reports a turn was found */
{
if (displacements>20) /* Check if getting off ramp. Otherwise,
robot won't get off ramp */
{RawForward(); RawForward(); RawForward(); RawForward(); }
else
return leftTurn;
}
else if (rightTurner >= leftTurner+turnLimit)
{
if (displacements>20) /* Check if getting off ramp... */
{RawForward(); RawForward(); RawForward(); RawForward(); }
else
return rightTurn;
}
else if (leftTracker >=
rightTracker+limit) /* Reports line was touched */
{
if ( (displacements>20) && ((leftTurner >=
rightTurner+turnLimit) || (rightTurner >=
leftTurner+turnLimit)) ) /* Check if getting off ramp... */
{RawForward(); RawForward(); RawForward(); RawForward(); }
else
return offRight;
}
else if (rightTracker >= leftTracker+limit)
{
if ( (displacements>20) && ((leftTurner >=
rightTurner+turnLimit) || (rightTurner >=
leftTurner+turnLimit)) ) /* Check if getting off ramp... */
{RawForward(); RawForward(); RawForward(); RawForward(); }
else
return offLeft;
}
return OK;
} /* End forward motion */
/*.....................................................
Raw forward motion
.....................................................*/
int RawForward()
{
motor(leftMotor,leftForward);
motor(rightMotor,rightForward);
printf("Getting off ramp...\n");
sleep(forward);
}
/*.....................................................
Adjustment to right
.....................................................*/
void AdjustRight()
{
motor(rightMotor,rightBackward);
motor(leftMotor,leftForwardFast);
printf("Adjusting...\n");
sleep(adjusting);
}
/*.....................................................
Adjustment to left
.....................................................*/
void AdjustLeft()
{
motor(leftMotor,leftBackward);
motor(rightMotor, rightForwardFast);
printf("Adjusting...\n");
sleep(adjusting);
}
/*.....................................................
Right turn
.....................................................*/
void TurnRight()
{
motor(rightMotor,rightBackward);
motor(leftMotor,leftForwardFast);
printf("Turning right...\n");
sleep(turn);
}
/*.....................................................
Left turn
.....................................................*/
void TurnLeft()
{
motor(rightMotor,rightForwardFast);
motor(leftMotor,leftBackward);
printf("Turning left...\n");
sleep(turn);
}
/*.....................................................
Reverse
.....................................................*/
void Reverse()
{
motor(leftMotor,-leftForward);
motor(rightMotor,-rightForward);
printf("Backing...\n");
sleep(reverse);
}
/*.....................................................
Turn around
.....................................................*/
void TurnAround(int direction)
{
Reverse();
Reverse();
if (direction == right)
{
motor(rightMotor,rightBackward);
motor(leftMotor,leftForwardFast);
printf("Turning around...\n");
sleep(turnAround);
}
if (direction == left)
{
motor(rightMotor,rightForwardFast);
motor(leftMotor,leftBackward);
printf("Turning around...\n");
sleep(turnAround);
}
} /* End Turn around */
/*.........................................................
Forward motion uphill on ramp
.........................................................*/
int ForwardRamp()
{
motor(leftMotor,leftUphill); /* Starts moving here */
motor(rightMotor,rightUphill);
printf("Climbing ramp %d %d\n",displacements,
peakStop);
sleep(forward);
displacements++;
leftBumper =
digital(leftB); /* Gets sensor readings */
rightBumper = digital(rightB);
centerBumper = digital(centerB);
if (leftBumper == HIT) /*
Reports bump */
return bumpedLeft;
else if (rightBumper == HIT)
return bumpedRight;
else if (displacements > 80) /* On center of ramp. End fast
speed */
return peak;
else
return OK;
} /* End forward ramp */
/*.....................................................
Climbing ramp
.....................................................*/
void ClimbRamp()
{
if ( (lastTurn == leftTurn) && (flag == seekRamp) )
{
motor(rightMotor,rightBackward); /* Robot corrects for ramp on
right */
motor(leftMotor,leftForwardFast);
printf("Finding ramp...\n");
sleep(adjustRamp);
}
if ( (lastTurn == rightTurn) && (flag == seekRamp) )
{
motor(rightMotor,rightForwardFast); /* Robot corrects for ramp on
left */
motor(leftMotor,leftBackward);
printf("Finding ramp...\n");
sleep(adjustRamp);
}
flag = OK;
lastTurn = NONE;
turnCounter = 0;
displacements=0;
while (1) /* Robot climbs
ramp */
{
while (flag == OK) flag=ForwardRamp(); /* Move a little and check
if bumped */
if (flag == bumpedLeft) /*
Correct trajectory if bumped */
{AdjustRight();flag = OK;}
if (flag == bumpedRight)
{AdjustLeft();flag = OK;}
if (flag == peak)
break;
}
displacements=0;
} /* End climb ramp */
/*.....................................................
Main
.....................................................*/
void main()
{
printf("Ready :)\n");
while (1)
{
while (!start_button());
beep();
while (!stop_button())
{
flag = OK;
while (flag == OK) flag=MoveForward(); /* Move a little and check
sensors */
if (flag == bumpedCenter)
/* Center bumper hit */
{
alloff();
topScanner = analog(topS); /* Read command */
bottomScanner = analog(bottomS);
printf("Infrared: %d %d\n", topScanner, bottomScanner);
sleep(1.0);
if ( (topScanner>100 && bottomScanner<100) ||
(topScanner<100 && bottomScanner>100) ) /* Bicolor
block */
{ TurnAround(right); flag = OK; }
if (topScanner>100 && bottomScanner>100) /* Black
block */
{ TurnAround(right); peakStop = YES; flag = OK; }
if (topScanner<100 && bottomScanner<100) /* White
block */
break;
}
if ( (leftTurner>150)
&& (rightTurner>150) ) /* If on ramp... */
{
if (flag == bumpedLeft) /* Left bumper hit - correct a little*/
{ AdjustRight(); AdjustRight(); flag=OK; }
if (flag == bumpedRight) /* Right bumper hit - correct a little*/
{ AdjustLeft(); AdjustLeft(); flag=OK; }
}
else /* If off ramp... */
{
displacements = 0;
if ( (flag == bumpedLeft) && (leftBumps<maxBumps) ) /*
Left bumper hit */
{ Reverse();leftBumps++;flag = OK; }
if (leftBumps == maxBumps) /* --enough bumping on the left! */
{ TurnAround(left);leftBumps=0;flag=OK; }
if ( (flag == bumpedRight) && (rightBumps<maxBumps) )
/* Right bumper hit */
{ Reverse();rightBumps++;flag = OK; }
if (rightBumps == maxBumps) /* --enough bumping on the right! */
{ TurnAround(right);rightBumps=0;flag=OK; }
if (flag == offRight) /* Line hit on left side */
{ AdjustLeft(); turnCounter=0; flag = OK; }
if (flag == offLeft) /* Line hit on right side */
{ AdjustRight(); turnCounter=0; flag = OK; }
if (flag == leftTurn) /* Turn found on left side */
{ TurnLeft(); turnCounter++; lastTurn = leftTurn; flag = OK; }
if (flag == rightTurn) /* Turn found on right side */
{ TurnRight(); turnCounter++; lastTurn = rightTurn; flag = OK; }
if (flag == seekRamp) /* Ramp was found */
{ ClimbRamp(); flag = OK; if (peakStop == YES) break; }
}
flag = OK;
}
flag = OK;
alloff();
beep();
printf("Done! :)\n");
}
}
Alejandro J. Trejo
University of Texas at El Paso
Last update: 09 Apr 1999.