Ren Buggy
/
3-LightSeekingRobot
A program that allows the RenBuggy to detect the direction of a light source and drive towards it.
Diff: ServoDrive.cpp
- Revision:
- 0:575ce3f4b7ec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ServoDrive.cpp Fri Mar 11 10:39:05 2016 +0000 @@ -0,0 +1,112 @@ +/********************************************************* +*ServoDrive.cpp * +*Author: Elijah Orr * +* * +*A library of functions that can be used to control the * +*RenBuggy via a servo motor. * +*********************************************************/ + +#ifndef SERVODRIVE_C +#define SERVODRIVE_C + +#include "mbed.h" +#include "ServoDrive.h" + + +/* A pin is configured as PwmOut to output the PWM signal that will +control the servo. Two pins are configured as DigitalOut to switch +the drive motors on/off. Information about classes used here can be +found in the mbed library. */ +PwmOut servo(servoPin); +DigitalOut Lmotor(LeftMotorPin); +DigitalOut Rmotor(RightMotorPin); + +/* functions to start and stop the drive motors simply set the DigitalOut +pins to 1 or 0 to switch the motors on/off */ + +/**************************************************************** +* Function: go() * +* * +* Enables the two drive motors of the RenBuggy * +* * +* Inputs: none * +* * +* Returns: none * +****************************************************************/ +extern void go() +{ + Lmotor = Rmotor = 1; +} + +/**************************************************************** +* Function: stop() * +* * +* Disables the two drive motors of the RenBuggy * +* * +* Inputs: none * +* * +* Returns: none * +****************************************************************/ +extern void stop() +{ + Lmotor = Rmotor = 0; +} + +/* a function is set up to configure the PWM output so that it will have the +correct properties to operate the servo. */ + +/**************************************************************** +* Function: configurePWM() * +* * +* Configures a PWM signal for controlling the servo * +* * +* Inputs: Period is the period of the signal in microseconds * +* and Pulsewidth is the pulsewidth of the signal in microseconds* +* * +* Returns: none * +****************************************************************/ +extern void configurePWM(int Period, int Pulsewidth) +{ + /* classes that set the properties of the PWM signal are passed the variables + Period and Pulsewidth to set the frequency and duty cycle of the signal. */ + servo.period_us(Period); + servo.pulsewidth_us(Pulsewidth); +} + +/* to make the main function easy to write, setDirection will allow a value in +degrees to be passed to it, and then do any necessary conversions. angle must be +a float as the conversion involves non integer values. */ + +/**************************************************************** +* Function: setDirection() * +* * +* Sets the direction in which the steering servo is pointing * +* * +* Inputs: A floating point value representing the angle of the * +* servo in degrees * +* * +* Returns: The pulsewith of the signal in microseconds * +****************************************************************/ +extern int setDirection(float angle) +{ + /* it is possible to pass numbers outside the operational range of the servo + to setDirection, to resolve this there are two checks here. If angle is outside + the boundaries it will be set to either the maximum or minimum value. */ + if(angle < 0) + { + angle = 0; + } + if(angle > 90) + { + angle = 90; + } + /* to properly control the servo, the pulsewidth must be between 1000 and 2000 + micro seconds, so a simple conversion is used to translate the angle into a value + within these bounds. The new value is stored in the variable pulse. */ + int pulse = 1000 + ((angle/90)*1000); + servo.pulsewidth_us(pulse); + + return pulse; +} + +#endif //SERVODRIVE_C \ No newline at end of file