Ren Buggy
/
3-LightSeekingRobot
A program that allows the RenBuggy to detect the direction of a light source and drive towards it.
Diff: main.cpp
- Revision:
- 0:575ce3f4b7ec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 11 10:39:05 2016 +0000 @@ -0,0 +1,117 @@ +/**************************************************************** +* LightSeekingRobot * +* Author: Elijah Orr * +* * +* This program uses the values of two analog inputs (LDRs) to * +* steer the RenBuggy via a servo motor. * +*****************************************************************/ + +/* The library ServoDrive is used in this program to control the +servo and drive motors. Libraries are a useful tool for creating +code that can be reused in multiple programs. */ +#include "mbed.h" +#include "ServoDrive.h" + +AnalogIn LDR1(p15); +AnalogIn LDR2(p16); + +/**************************************************************** +* Function: main() * +* * +* Steers a servo controlled wheel of the Renbuggy according to * +* the relative light levels of two LDRs * +* * +* Inputs: none * +* * +* Returns: none * +****************************************************************/ +int main() +{ + /* variables that will be used in the main are declared */ + float angle; + float LDR1value; + float LDR2value; + int i; + + /* these variables are initialised values to be used to + control certain behaviors of the buggy. tolerance sets + how much the light levels must differ for it to turn, + centreValue is the value in degrees that corresponds to + the wheel pointing directly forward, and difAdjust is + used make the values of the two LDR inputs more similar */ + float tolerance = 0.03; + int centreValue = 45; + float difAdjust = 0.03; + + /* call the function to set up the PWM signal for the servo */ + configurePWM(20000, 1500); + + /* the angle of the servo is initially set to centre it */ + angle = centreValue; + + /* start the buggy moving */ + go(); + + /* opening a for loop without any conditions starts an infinite + loop, so that the contained code runs forever */ + for(;;) + { + /* the class member function read() in AnalogIn.h reads the + voltage of the of the LDR pins into variables as a floating + point value between 0.0 and 1.0 */ + LDR1value = LDR1.read(); + LDR2value = LDR2.read(); + + /* LDR2value has difAdjust added to it to make both LDR values + similar enough to compare effectively. The value 0.03 stored in + difAdjust was chosen by printing the LDR values to console via + USB and observing the difference between values (USBSerial.h was + used for this) */ + LDR2value = LDR2value + difAdjust; + + /* the behavior of the RenBuggy is defined by a series of if + statements. If the conditions in the parentheses are true, + then the code in the if statement will run, if not the program + moves on. */ + + /* && is known as the logical AND operator. If both operands are + non zero (i.e. true), then the condition will be true. If one LDR + value is significantly larger than the other, then angle will + increment (angle++ means that the value of angle will increase + by one) */ + if((LDR1value - LDR2value > tolerance) && (angle < 90)){ + angle++; + } + + /* if statements can be followed by an optional else if statement, + which will execute when the above if statement is false, and the + else if condition is true. */ + else if((LDR2value - LDR1value > tolerance) && (angle > 0)){ + angle--; /* angle-- means that angle will decrease by one */ + } + + /* If the difference between values is within tolerance, point the + wheel straight forward */ + else if((LDR1value - LDR2value < tolerance) && (LDR2value - LDR1value < tolerance)){ + angle = centreValue; + } + + /* a for loop is used to create a delay in the program to make it run + a little slower, so that the servo position is updated less freqently */ + for(i=0;i<400000;i++){} + + /* the function setDirection is called and passed the variable angle to + set the servo position to the new value of angle */ + setDirection(angle); + } +} + + + + + + + + + + \ No newline at end of file