Code for the Poolinator

Dependencies:   mbed QEI HIDScope Pulse biquadFilter MODSERIAL FastPWM

main.cpp

Committer:
sjoerd1999
Date:
2019-10-25
Revision:
7:bfcb74384f46
Parent:
6:1e9c8577f7c9
Child:
8:1733338758d3

File content as of revision 7:bfcb74384f46:

/*
    The Poolinator - A pool playing robot for people with DMD

GROUP 10
Sjoerd de Jong              - s1949950
Joost Loohuis               - s1969633
Viktor Edlund               - s2430878
Giuseppina Pinky Diatmiko   - s1898841
Daan v.d Veen               - s2003171
*/

#include "mbed.h"
#include "HIDScope.h"
#include "QEI.h"
#include "MODSERIAL.h"
#include "BiQuad.h"
#include "FastPWM.h"

MODSERIAL pc(USBTX, USBRX);

AnalogIn pot(A1);

// DC MOTORS CODE //
QEI encoder1(D10,D11,NC,32), encoder2(D12,D13,NC,32), encoder3(PTC5,PTC7, NC, 32);
PwmOut motor1_pwm(D5), motor2_pwm(D6);
DigitalOut motor1_dir(D4), motor2_dir(D7), motor3_A(D2), motor3_B(D3);

int frequency_pwm = 10000;

int motor1_targetPos = 0, motor2_targetPos = 0, motor3_targetPos = 0;

void setMotor(int motor, float motor_spd) // Between -1 and 1;
{
    int motor_dir = (motor_spd >= 0) ? 0 : 1;
    motor_spd = fabs(motor_spd);

    if(motor == 1) {
        motor1_dir.write(motor_dir);
        motor1_pwm.write(motor_spd);
    } else if(motor == 2) {
        motor2_dir.write(motor_dir);
        motor2_pwm.write(motor_spd);
    } else if(motor == 3) {
        motor3_A.write((motor_dir == 0) ? 0 : int(motor_spd)); // Motor 3 has digital pins so no PWM
        motor3_B.write((motor_dir == 0) ? int(motor_spd) : 0);
    }
}

// STEPPER MOTOR CODE //
DigitalOut STEPPER_IN1(PTB18), STEPPER_IN2(PTB19), STEPPER_IN3(PTC1), STEPPER_IN4(PTC8);

int stepper_steps = 0;
float stepper_angle = 0;

void stepper_move(int direction_) // Requires ~1.5ms wait time between each step
{
    STEPPER_IN1 = (stepper_steps == 5 || stepper_steps == 6 || stepper_steps == 7);
    STEPPER_IN2 = (stepper_steps == 3 || stepper_steps == 4 || stepper_steps == 5);
    STEPPER_IN3 = (stepper_steps == 1 || stepper_steps == 2 || stepper_steps == 3);
    STEPPER_IN4 = (stepper_steps == 7 || stepper_steps == 0 || stepper_steps == 1);
    stepper_steps += (direction_ == 0) ? - 1 : 1;
    stepper_steps = (stepper_steps + 8) % 8;
    stepper_angle += ((direction_ == 0) ? -1 : 1) * (360.00 / 4096.00);
}

// SERVO CODE //
PwmOut servo(D9);
void setServo(float angle)
{
    float i = angle / 1.800;
    float duty = (i + 20) / 1000.00;
    servo.write(duty);
}

// SOLENOID CODE //
DigitalOut solenoidA(PTC0), solenoidB(PTC9);
void setSolenoid(int dir)
{
    solenoidA = (dir == 0) ? 1 : 0;
    solenoidB = (dir == 0) ? 0 : 1;
}

// LASER CODE //
DigitalOut laserPin(D8);
void setLaser(bool on)
{
    if(on) laserPin.write(1);
    else laserPin.write(0);
}

// CALIBRATION //
AnalogIn switch1(A2), switch2(A3), switch3(A4);
void calibrate()
{
    setMotor(1,0.2);
    setMotor(2,1);
    setMotor(3,1);

    while(!(switch1.read() > 0.5 && switch2.read() > 0.5 && switch3.read() > 0.5)) {
        wait_ms(40);
        if(switch1.read() > 0.5) setMotor(1,0);
        if(switch2.read() > 0.5) setMotor(2,0);
        if(switch3.read() > 0.5) setMotor(3,0);
    }
    for(int i = 1; i <= 3; i++) setMotor(i,0);
    
    encoder1.reset();
    encoder2.reset();
    encoder3.reset();
    
    setServo(0);
}


int main()
{
    pc.baud(115200);
    pc.printf("\r\nStarting...\r\n\r\n");
    motor1_pwm.period(1.0 / frequency_pwm);
    motor2_pwm.period(1.0 / frequency_pwm);
    servo.period(0.020);

    //calibrate();

    while (true) {
//        float value1 = switch1.read();
//        pc.printf("s1: %f\r\n",value1);
//        float value2 = switch2.read();
//        pc.printf("s2: %f\r\n",value2);
//        float value3 = switch3.read();
//        pc.printf("s3: %f\r\n",value3);
//        wait_ms(100);
        /*
        SOME EXAPLE CODE

        * MOTOR
        setMotor(..., ...) // which motor (1,2,3), and speed (-1, +1)

        * PID
        double currentPos1 = encoder1.getPulses();
        double targetPos1 = 10000;
        double error1 = targetPos1 - currentPos1;
        float PID_speed1 = pid(error) * PID_gain;
        setMotor(1, PID_speed1);

        * STEPPER
        stepper_move(1); // direction (0 or 1)
        wait_ms(1.5); // requires some time between steps

        * SERVO
        setServo(...) // value between 0.0 and 180.0 (= 0 and 180 degrees)

        * SOLENOID
        setSolenoid(1); // shooting
        wait_ms(1000);
        setSolenoid(0);

        */

        // DEMO
//        for(int i = 0; i < 180; i++) {
//            moveServo(i);
//            wait_ms(20);
//        }
//        for(int i = 180; i > 0; i--) {
//            moveServo(i);
//            wait_ms(20);
//        }
//        for(int i = 0; i < 2000; i++) {
//            stepper_move(1); // direction (0 or 1)
//            wait_ms(1.5); // requires some time between steps
//        }
//        for(int i = 0; i < 2000; i++) {
//            stepper_move(0); // direction (0 or 1)
//            wait_ms(1.5); // requires some time between steps
//        }
//        setSolenoid(1);
//        wait_ms(1000);
//        setSolenoid(0);

        float value = pot.read();
        if(value < 0.4) setMotor(3, 1);
        else if (value > 0.6) setMotor(3, -1);
        else setMotor(3,0);

        wait_ms(30);

    }
}