control for robotic arm that can play chess using a granular gripper

Dependencies:   Encoder mbed HIDScope Servo MODSERIAL

Fork of chessRobot by a steenbeek

actuators.cpp

Committer:
annesteenbeek
Date:
2015-10-05
Revision:
3:47c76be6d402
Parent:
2:95ba9f6f0128
Child:
4:80e2280058ed

File content as of revision 3:47c76be6d402:

// functions for controlling the motors

void motorInit(){
    // Initialze motors
    PwmOut motor1(motor1PWMPin);
    PwmOut motor2(motor2PWMPin);

    // Set motor direction pins.
    DigitalOut motor1Dir(motor1DirPin);
    DigitalOut motor2Dir(motor2DirPin);

    // Set initial direction
    motor1Dir.write(direction1);
    motor2Dir.write(direction2);

    // Set motor PWM period
    motor1.period(1/pwm_frequency);
    motor2.period(1/pwm_frequency);

    // Initialize encoders
    Encoder encoder1(enc1A, enc1B);
    Encoder encoder2(enc2A, enc2B);

    // create PID instances for motors
    // PID pidname(input, output, setpoint, kp, ki, kd, direction)
    PID PIDmotor1(&motorSpeed1, &motorPWM1, &motorSetSpeed1, Kp1, Ki1, Kd1, DIRECT);
    PID PIDmotor2(&motorSpeed2, &motorPWM2, &motorSetSpeed2, Kp2, Ki2, Kd2, DIRECT);

    // set PID mode
    PIDmotor1.SetMode(AUTOMATIC);
    PIDmotor2.SetMode(AUTOMATIC);

    // set limits for PID output to avoid integrator build up.
    PIDmotor1.SetOutputLimits(-1, 1);
    PIDmotor2.SetOutputLimits(-1, 1);
    }


void motorControl(){
    if(motorEnable){  // only run motors if switch is enabled

    // get encoder positions
        motor1Pos = encoder1.getPosition();
        motor2Pos = encoder2.getPosition();

        // check if motor's are within rotational boundarys
    // calculate  encoder speeds
        motorSpeed1=(motor1Pos-prevMotor1Pos)/(time.read()-prevTime);
        motorSpeed2=(motor2Pos-prevMotor2Pos)/(time.read()-prevTime);

        // store current positions and time
        prevMotor1Pos = motor1Pos;
        prevMotor2Pos = motor2Pos;
        prevTime = time.read();
    // translate to x/y speed
    // compute new PID parameters using setpoint speeds and x/y speeds
        PIDmotor1.compute();
        PIDmotor2.compute();
    // translate to motor rotation speed
    // write new values to motor's
        motor1.write(motorPWM1);
        motor2.write(motorPWM2);

    }else{
        // write 0 to motors
        motor1.write(0);
        motor2.write(0);
    }
}

void servoControl(){
    // use potMeter Value to set servo angle
    // (optionaly calculate xy position to keep balloon in position)
        // calculate z position using angle
        // calculate x y translation of endpoint
        // find new x and y speed.
    
    }
    
void pumpControl(){
    if (pumpButton == HIGH){
        // write pumpPin High 
        }else{
        // write pumpPin Low    
        }
    }