Wrapper library for controlling servos using Designer Systems DS-SCX18.Shield servo driver. See http://www.designersystems.co.uk/SCX18.S_info.htm

SCX18S.cpp

Committer:
Ingram
Date:
2016-04-27
Revision:
3:1812150d7a4d
Parent:
2:e5bc45ecdaca

File content as of revision 3:1812150d7a4d:

#include "mbed.h"
#include "SCX18S.h"

SCX18S::SCX18S(PinName p_sda, PinName p_scl, bool j_a0, bool j_a1) : i2c(p_sda, p_scl)
{
    i2c_address = (SCX18_I2C_BASE_ADDR | ((!j_a0) << 1) | (!j_a1)) << 1;
}

SCX18SServoStatusRegister SCX18S::readStatus(uint8_t channel)
{
    SCX18SServoStatusRegister ssr;
    ssr.value = readRegister(channel);
    return ssr;
}

void SCX18S::writePosition(uint8_t channel, uint8_t position)
{
    writeRegister(2 * channel + 1, position);
}

void SCX18S::writeControl(uint8_t channel, bool enabled, bool reversed, bool softstart, bool speedcontrol, uint8_t speed)
{
    if (speed > 15) {
        error("%s speed specified greater than allowed (15)", __func__);
    }

    if (enabled) {
        speed |= SCX18_SERVO_ENABLED;
    }

    if (reversed) {
        speed |= SCX18_SERVO_REVERSED;
    }

    if (softstart) {
        speed |= SCX18_SERVO_SOFT_START;
    }

    if (speedcontrol) {
        speed |= SCX18_SERVO_SPEED_CONTROL;
    }

    writeRegister(2 * channel + 2, speed);
}

void SCX18S::writeEnable()
{
    writeRegister(37, 0);
}

void SCX18S::writeRegister(uint8_t reg, uint8_t value)
{
    char i2c_data[] = {reg, value};
    i2c.write(i2c_address, i2c_data, 2);
}

uint8_t SCX18S::readRegister(uint8_t reg)
{
    char tmp = reg;
    i2c.write(i2c_address, &tmp, 1);
    i2c.read(i2c_address, &tmp, 1);
    return tmp;
}