mirror of
https://github.com/digistump/DigistumpArduino.git
synced 2025-04-27 23:29:01 -07:00
60 lines
2.6 KiB
C
60 lines
2.6 KiB
C
![]() |
/*
|
||
|
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_
|