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:
Maestro.cpp
- Committer:
- kochansky
- Date:
- 2014-01-06
- Revision:
- 5:0fd491357750
- Parent:
- 4:ef4d23c023ea
- Child:
- 6:1d8357775b6d
File content as of revision 5:0fd491357750:
/** * @author Przemysław Kochański * * @section DESCRIPTION * * Library for Pololu Maestro Servo Controller * Serial Servo Commands: http://www.pololu.com/docs/0J40/5.e */ #include "Maestro.h" Maestro::Maestro(PinName tx, PinName rx) : serial(tx, rx), pc(USBTX, USBRX) { serial.format(8, SerialBase::None, 1); //8N1 } void Maestro::setBaudRate(uint16_t baud) { serial.baud(baud); serial.putc(BAUD_RATE_IDICATION); } void Maestro::setTarget(uint8_t channel, uint16_t target) { serial.putc(SET_TARGET); serial.putc(channel); serial.putc(target & 0x7F); serial.putc((target >> 7) & 0x7F); } 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); }