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.cpp	Sun Jan 05 17:24:40 2014 +0000
+++ b/Maestro.cpp	Mon Jan 06 11:14:19 2014 +0000
@@ -31,4 +31,78 @@
 void Maestro::setServoAngle(uint8_t channel, int8_t angle)
 {
     setTarget(channel, angle * 40 + 6000);
+}
+
+void Maestro::setMultipleTargets(uint8_t count, uint8_t firstChannel, uint16_t* targets)
+{
+    serial.putc(SET_MULTIPLE_TARGETS);
+    serial.putc(count);
+    serial.putc(firstChannel);
+
+    for (uint8_t i = 0; i < count; i++) {
+        serial.putc(*targets & 0x7F);
+        serial.putc((*targets >> 7) & 0x7F);
+        targets++;
+    }
+}
+
+void Maestro::setServosAngles(uint8_t count, uint8_t firstChannel, int8_t* angles)
+{
+    uint16_t targets[count];
+
+    for (uint8_t i = 0; i < count; i++) {
+        targets[i] = angles[i] * 40 + 6000;
+    }
+
+    setMultipleTargets(count, firstChannel, targets);
+}
+
+void Maestro::setSpeed(uint8_t channel, uint16_t speed)
+{
+    serial.putc(SET_SPEED);
+    serial.putc(channel);
+    serial.putc(speed & 0x7F);
+    serial.putc((speed >> 7) & 0x7F);
+}
+
+void Maestro::setAcceleration(uint8_t channel, uint16_t acceleration)
+{
+    serial.putc(SET_ACCELERATION);
+    serial.putc(channel);
+    serial.putc(acceleration & 0x7F);
+    serial.putc((acceleration >> 7) & 0x7F);
+}
+
+void Maestro::setPWM(uint8_t channel, uint16_t time, uint16_t period)
+{
+    serial.putc(SET_PWM);
+    serial.putc(channel);
+    serial.putc(time & 0x7F);
+    serial.putc((time >> 7) & 0x7F);
+    serial.putc(period & 0x7F);
+    serial.putc((period >> 7) & 0x7F);
+}
+
+uint16_t Maestro::getPosition(uint8_t channel)
+{
+    serial.putc(GET_POSITION);
+    serial.putc(channel);
+    return serial.getc() | (serial.getc() << 8);
+}
+
+bool Maestro::getMovingState()
+{
+    serial.putc(GET_MOVING_STATE);
+    return serial.getc();
+}
+
+uint16_t Maestro::getErrors()
+{
+    serial.putc(GET_ERRORS);
+    return serial.getc() | (serial.getc() << 8);
+}
+
+void Maestro::goHome()
+{
+    serial.putc(GO_HOME);
 }
\ No newline at end of file