diff options
Diffstat (limited to 'peripheral/libupm/src/servo/servo.h')
-rw-r--r-- | peripheral/libupm/src/servo/servo.h | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/peripheral/libupm/src/servo/servo.h b/peripheral/libupm/src/servo/servo.h new file mode 100644 index 0000000..17bdf13 --- /dev/null +++ b/peripheral/libupm/src/servo/servo.h @@ -0,0 +1,168 @@ +/* + * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com> + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#pragma once + +#include <string> +#include <mraa/pwm.h> + +namespace upm { + +#define MIN_PULSE_WIDTH 600 +#define MAX_PULSE_WIDTH 2500 +#define PERIOD 20000 + +#define HIGH 1 +#define LOW 0 + +#define DEFAULT_WAIT_DISABLE_PWM 0 + +/** + * @brief Servo library + * + * The base Servo class provides routines for setting the angle of the shaft + * as well as setting and getting the minimum and maximum pulse width and + * the maximum period. + * + * @defgroup servo libupm-servo + * @ingroup seeed emax pwm servos gsk + */ +class Servo { + public: + /** + * Instantiates a Servo object + * + * @param pin Servo pin number + */ + Servo (int pin); + + /** + * Instantiates a Servo object + * + * @param pin Servo pin number + * @param minPulseWidth Minimum pulse width, in microseconds + * @param maxPulseWidth Maximum pulse width, in microseconds + */ + Servo (int pin, int minPulseWidth, int maxPulseWidth); + + /** + * Instantiates a Servo object + * + * @param pin Servo pin number + * @param minPulseWidth Minimum pulse width, in microseconds + * @param maxPulseWidth Maximum pulse width, in microseconds + * @param waitAndDisablePwm If 1, PWM is enabled only during the setAngle() execution + * for a period of 1 second, and then turned back off. If 0, PWM remains on afterward. + */ + Servo (int pin, int minPulseWidth, int maxPulseWidth, int waitAndDisablePwm); + + /** + * Servo object destructor + */ + ~Servo(); + + /** + * Sets the angle of the servo engine. + * + * @param angle Number between 0 and 180 + * @return 0 if successful, non-zero otherwise + */ + mraa_result_t setAngle (int angle); + + /** + * Halts PWM for this servo and allows it to move freely. + */ + mraa_result_t haltPwm (); + + /** + * Returns the name of the component + * + * @return Name of the component + */ + std::string name() + { + return m_name; + } + + /** + * Sets the minimum pulse width + * + * @param width Minimum HIGH signal width + */ + void setMinPulseWidth (int width); + + /** + * Sets the maximum pulse width + * + * @param width Maximum HIGH signal width + */ + void setMaxPulseWidth (int width); + + /** + * Sets the maximum period width + * + * @param period PWM period width + */ + void setPeriod (int period); + + /** + * Returns the minimum pulse width + * + * @return Minimum pulse width + */ + int getMinPulseWidth (); + + /** + * Returns the maximum pulse width + * + * @return Maximum pulse width + */ + int getMaxPulseWidth (); + + /** + * Returns the maximum PWM period width + * + * @return Maximum PWM period width + */ + int getPeriod (); + + protected: + int calcPulseTraveling (int value); + + std::string m_name; + int m_servoPin; + float m_maxAngle; + mraa_pwm_context m_pwmServoContext; + int m_currAngle; + + int m_minPulseWidth; + int m_maxPulseWidth; + int m_period; + + int m_waitAndDisablePwm; + + private: + void init (int pin, int minPulseWidth, int maxPulseWidth, int waitAndDisablePwm); +}; + +} |