Permalink
Cannot retrieve contributors at this time
59 lines (49 sloc)
2.56 KB
| /* | |
| Copyright (c) 2013 Benjamin Holt | |
| The MIT License (MIT) - See README for complete license | |
| */ | |
| #ifndef _SimpleServo_h_ | |
| #define _SimpleServo_h_ | |
| #include <inttypes.h> | |
| #include <WProgram.h> | |
| class SimpleServo { | |
| private: | |
| // Movement | |
| uint8_t _pin; | |
| uint8_t _degrees; | |
| uint16_t _microseconds; | |
| // Servo Parameters | |
| // REM: nasty bit about when to constrain vs. not... more below... | |
| uint8_t _maxDegrees; | |
| uint16_t _millisPer60degrees; | |
| uint16_t _minWriteMillis; | |
| uint16_t _maxWriteMillis; | |
| uint16_t _minPulse; | |
| uint16_t _maxPulse; | |
| uint8_t _pulseMillis; | |
| void _pulse(uint16_t); | |
| public: | |
| // TODO: update keywords file | |
| // Setup | |
| SimpleServo(); | |
| uint8_t attach(uint8_t); // Note: resets position, but not servo parameters, doesn't signal servo | |
| void detach(); | |
| uint8_t attached(); | |
| // Movement | |
| void write(uint8_t); | |
| void writeMicroseconds(uint16_t); | |
| uint32_t millisToTarget(uint8_t); // Estimates time from current (expected) position to a target; if millisPer60Degrees is too small, this will come up short and the servo may not reach the target, too large and the write methods may signal longer than needed | |
| void writeMillis(uint8_t, uint16_t); // Allows unconstrained millis | |
| void writeMicrosecondsMillis(uint16_t, uint16_t); // Allows unconstrained microseconds and millis, full manual control | |
| uint8_t read(); | |
| uint16_t readMicroseconds(); | |
| // Servo Parameters | |
| void setMaximumDegrees(uint8_t); // A lot of servos move a bit more than 180 | |
| void setMillisPer60Degrees(uint16_t); // For estimating time from last set position to newly requested position; different for every servo, http://www.servodatabase.com has many specs, default is 230 from Futaba S3003 | |
| void setMinimumMillis(uint16_t); // The smallest time to signal the servo; some write methods do not enforce this | |
| void setMaximumMillis(uint16_t); // This longest time to signal the servo, even if it probably has not yet reached the requested position; some write methods do not enforce this | |
| void setMinimumPulse(uint16_t); // The shortest pulse (in microseconds) to send to the servo, maps to 0deg; only writeMicrosecondsMillis does not enforce this | |
| void setMaximumPulse(uint16_t); // The shortest pulse (in microseconds) to send to the servo, maps to 0deg; only writeMicrosecondsMillis does not enforce this | |
| void setPulseMillis(uint8_t); // Delay between pulses; defaults to 16 which is a bit quicker than spec. Experiment, different servos may react differently | |
| }; | |
| #endif // _SimpleServo_h_ |