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:

/media/uploads/kochansky/maestro.jpg

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: