Library for Pololu Maestro Servo Controller http://www.pololu.com/docs/0J40
Library for Pololu Maestro Servo Controller
Library docs: https://developer.mbed.org/users/kochansky/code/Maestro/docs/f374c7b60318/classMaestro.html
Example usage:
#include "mbed.h" #include "Maestro.h" Maestro maestro(PTC4,PTC3); int main() { maestro.setBaudRate(9600); // limit speed for each servo for (uint8_t i = 0; i < 17; i++) { maestro.setSpeed(i, 10); } while (true) { // set servo on channel 0 to 90 degrees maestro.setServoAngle(0, 90); wait(2); // set servo on channel 0 to 45 degrees maestro.setServoAngle(0, 45); wait(2); } }
Serial commands based on manual: http://www.pololu.com/docs/0J40/5.e
Device pinout:
Diff: Maestro.h
- Revision:
- 5:0fd491357750
- Parent:
- 4:ef4d23c023ea
- Child:
- 6:1d8357775b6d
--- a/Maestro.h Sun Jan 05 17:24:40 2014 +0000 +++ b/Maestro.h Mon Jan 06 11:14:19 2014 +0000 @@ -16,7 +16,7 @@ * Compact Protocol Command Bytes */ #define SET_TARGET 0x84 -#define SER_MULTUPLE_TARGETS 0x9F +#define SET_MULTIPLE_TARGETS 0x9F #define SET_SPEED 0x87 #define SET_ACCELERATION 0x89 #define SET_PWM 0x8A @@ -27,6 +27,19 @@ #define BAUD_RATE_IDICATION 0xAA /** + * Errors bits numbers + */ +#define SERIAL_SIGNAL_ERROR 0 +#define SERIAL_OVERRUN_ERROR 1 +#define SERIAL_RX_BUFFER_FULL_ERROR 2 +#define SERIAL_CRC_ERROR 3 +#define SERIAL_PROTOCOL_ERROR 4 +#define SERIAL_TIMEOUT_ERROR 5 +#define SCRIPT_STACK_ERROR 6 +#define SCRIPT_CALL_STACK_ERROR 7 +#define SCRIPT_PROGRAM_COUNTER_ERROR 8 + +/** * Pololu Maestro Servo Controller */ class Maestro @@ -65,7 +78,17 @@ */ void setServoAngle(uint8_t channel, int8_t angle); - //void setMultipleTargets(int* channels, int* targets); + /** + * Simultaneously sets the targets for a contiguous block of channels + * + * @param count - number of channels in the contiguous block + * @param firstChannel - lowest channel number in the contiguous block + * @param target - target values (the pulse width to transmit in units of + * quarter-microseconds) for each of the channels, in order by channel number + */ + void setMultipleTargets(uint8_t count, uint8_t firstChannel, uint16_t* targets); + + void setServosAngles(uint8_t count, uint8_t firstChannel, int8_t* angles); /** * Limits the speed at which a servo channel's output value changes @@ -73,7 +96,7 @@ * @param channel - number of a servo channel * @param speed - speed of the servo in units of 0.25 μs / (10 ms) */ - void setSpeed(int channel, int speed); + void setSpeed(uint8_t channel, uint16_t speed); /** * Limits the acceleration of a servo channel's output @@ -81,7 +104,44 @@ * @param channel - number of a servo channel * @param acceleration - acceleration of the servo in units of (0.25 μs) / (10 ms) / (80 ms) */ - void setAcceleration(int channel, int acceleration); + void setAcceleration(uint8_t channel, uint16_t acceleration); + + /** + * Sets the PWM output to the specified on time and period + * + * @param channel - number of a servo channel + * @param time - time in units of 1/48 μs + * @param period - period in units of 1/48 μs + */ + void setPWM(uint8_t channel, uint16_t time, uint16_t period); + + /** + * Gets current servo position + * + * @param channel - number of a servo channel + * + * @return - current pulse width that the Maestro is transmitting on the channel + */ + uint16_t getPosition(uint8_t channel); + + /** + * Determine whether the servo outputs have reached their targets or are still changing + * + * @return - true if servos are moving, false otherwise + */ + bool getMovingState(); + + /** + * Examine the errors that the Maestro has detected + * + * @return - error bits + */ + uint16_t getErrors(); + + /** + * Send all servos and outputs to their home positions + */ + void goHome(); private: