Library to control a 3DOF leg with a PCA9685.

HEXAPOD_LEG.cpp

Committer:
el13cj
Date:
2016-05-02
Revision:
3:9cc530686346
Parent:
0:ead365546ca5
Child:
4:4d4cea424b7f

File content as of revision 3:9cc530686346:

#include "mbed.h"
#include "HEXAPOD_LEG.h"
#include "structs.h"


Hexapod_Leg::Hexapod_Leg(PCA9685 Driver, calibrated_leg_centre leg_cent, calibrated_leg_1_degree leg_step, leg_outputs leg_out, bool ON_RHS) :

    a_ref(leg_cent.a),
    b_ref(leg_cent.b),
    c_ref(leg_cent.c),

    a_1deg(leg_step.a),
    b_1deg(leg_step.b),
    c_1deg(leg_step.c),

    a_pin(leg_out.a),
    b_pin(leg_out.b),
    c_pin(leg_out.c),

    RHS(ON_RHS),

    driver(Driver)

{

}



float Hexapod_Leg::angle_to_pwm(float angle, char joint)
{

    float pwm = 0;

    switch (joint) {
        case 'a':
        case 'A':
            pwm = a_ref + (angle * a_1deg);
            break;
        case 'b':
        case 'B':
            if (RHS) {
                pwm = b_ref - (angle * b_1deg);
            } else {
                pwm = b_ref + (angle * b_1deg);
            }
            break;
        case 'c':
        case 'C':
            if (RHS) {
                pwm = c_ref + (angle * c_1deg);
            } else {
                pwm = c_ref - (angle * c_1deg);
            }
            break;
        default:
            pwm = 1500;
            break;
    }

    return pwm;
}


void Hexapod_Leg::set_joint_angles(float angle_a, float angle_b, float angle_c)
{
    driver.set_pwm_pw(a_pin, angle_to_pwm(angle_a, 'a'));
    driver.set_pwm_pw(b_pin, angle_to_pwm(angle_b, 'b'));
    driver.set_pwm_pw(c_pin, angle_to_pwm(angle_c, 'c'));
}

void Hexapod_Leg::set_leg_position(leg_x_angles angles)
{
    driver.set_pwm_pw(a_pin, angle_to_pwm(angles.a, 'a'));
    driver.set_pwm_pw(b_pin, angle_to_pwm(angles.b, 'b'));
    driver.set_pwm_pw(c_pin, angle_to_pwm(angles.c, 'c'));
}