Programme de test avec librairies minimales et un seul ticker

Dependencies:   PID Pixy mbed

main.cpp

Committer:
haarkon
Date:
2018-06-06
Revision:
0:c3b54b05bf77

File content as of revision 0:c3b54b05bf77:

#include "mbed.h"
#include "Pixy.h"
#include "PID.h"

Serial          pc              (PA_2, PA_3, 921600);

PID             motor           (TIM4, TIM3, PA_9, PA_8, PC_9, PC_8, PC_6, PC_5);

InterruptIn     boussole        (PC_4);

AnalogIn        CNY70ligneD     (PC_3);
AnalogIn        CNY70ligneG     (PC_2);
AnalogIn        CNY70exterior   (PA_7);

AnalogIn        GP2sensorL      (PA_4);
AnalogIn        GP2sensorS      (PB_0);

DigitalOut      trig1           (PB_15);
InterruptIn     echo1           (PA_6);
DigitalOut      trig2           (PB_14);
InterruptIn     echo2           (PC_7);
DigitalOut      trig3           (PB_13);
InterruptIn     echo3           (PB_2);

//PwmOut          ballon          (PB_10);
//PwmOut          verrou          (PA_15);

PIXY            pixy            (PA_0, PA_1, 230400);

DigitalIn       bp              (PC_13);

DigitalOut      led1            (PA_5);
DigitalOut      led2            (PD_2);
DigitalOut      disquette       (PA_12);

Timer           temps;
Ticker          tick;

bool            CMPS03flag, VMA306Flag1, VMA306Flag2, VMA306Flag3;
long            CMPS03startTime, VMA306startTime1, VMA306startTime2, VMA306startTime3;
double          CMPS03bearing, VMA306dist1, VMA306dist2, VMA306dist3;
double          _Kp, _Ki, _Kd;
double          _SpeedG, _SpeedD;
double          _measDistG, _measDistD;
int             _WheelStuckG, _WheelStuckD;
double          _X, _Y, _THETA;

void VMA306rise1(void)
{
    VMA306startTime1 = temps.read_us();
}

void VMA306fall1(void)
{
    VMA306dist1 = (double)(temps.read_us() - VMA306startTime1)/58.0;
    VMA306Flag1 = 1;
}

// Clear and start the timer at the begining of the echo pulse
void VMA306rise2(void)
{
    VMA306startTime2 = temps.read_us();
}

// Stop and read the timer at the end of the pulse
void VMA306fall2(void)
{
    VMA306dist2 = (double)(temps.read_us() - VMA306startTime2)/58.0;
    VMA306Flag2 = 1;
}

// Clear and start the timer at the begining of the echo pulse
void VMA306rise3(void)
{
    VMA306startTime3 = temps.read_us();
}

// Stop and read the timer at the end of the pulse
void VMA306fall3(void)
{
    VMA306dist3 = (double)(temps.read_us() - VMA306startTime3)/58.0;
    VMA306Flag3 = 1;
}

void CMPS03rise (void)
{
    CMPS03startTime = temps.read_us();
}

void CMPS03fall (void)
{
    CMPS03bearing = ((double)(temps.read_us() - CMPS03startTime - 1000)/100.0);
}

double getGP2Distance (double sensorValue, double slope)
{
    return  slope/(sensorValue * 3.3);
}

bool whatIsUnderMyCNY (double sensorValue)
{
    return (sensorValue > 0.5) ? 0 : 1;
}

void baisser (PwmOut *ptr)
{
    ptr->pulsewidth_ms(2);
}

void lever (PwmOut *ptr)
{
    ptr->pulsewidth_ms(1);
}


main ()
{
    int                 nbCC, nbNM, objet = 0;
    T_pixyCCBloc        CCBuf[20];
    T_pixyNMBloc        NMBuf[20];
    double              topDepart, capAuDepart;
    double              x, y, theta;
    double              speedG = 1000, speedD = 1000;
    PwmOut              *ptr;

    boussole.rise       (&CMPS03rise);
    boussole.fall       (&CMPS03fall);

    echo1.rise          (&VMA306rise1);
    echo1.fall          (&VMA306fall1);
    echo2.rise          (&VMA306rise2);
    echo2.fall          (&VMA306fall2);
    echo3.rise          (&VMA306rise3);
    echo3.fall          (&VMA306fall3);

    temps.start();

/*    ptr = new PwmOut(PB_10);
    ptr->period_ms(20);
    baisser(ptr);
    wait (2);
    delete ptr;
    
    ptr = new PwmOut(PA_15);
    ptr->period_ms(20);
    lever(ptr);
    wait (2);
    delete ptr;*/

    pc.printf ("\n\rHelloWorld\n");
    led1 = 1;
    led2 = 0;
    disquette = 0;
    motor.resetPosition();
    wait(3);
    
    pc.printf("\rcheck Pixy\n");
    if (pixy.checkPixy()) led2=1;
    else {
        pc.printf("\rLa pixy ne parle pas\n");
        while(1);
    }
    pc.printf("\rApprochez une balle\n");
    do {
        pixy.detectedObject(&nbNM, &nbCC);
    } while(nbNM!=1);
    pc.printf("\rOK !\n");
    led1 = 0;

    pc.printf("\rApprochez une balise\n");
    do {
        pixy.detectedObject(&nbNM, &nbCC);
    } while(nbCC!=1);
    pc.printf("\rOK !\n");
    led2 = 0;

    pc.printf("\n\rcheck Moteur\n");
    while(bp.read());
    led1 = 1;

    //Avance
    motor.setSpeed (80,80);
    do {
        motor.getPosition (&x,&y, &theta);
    } while (x<50);
    motor.setSpeed (0,0);
    wait_ms(10);

    //Recule
    motor.setSpeed (-80,-80);
    do {
        motor.getPosition (&x,&y, &theta);
    } while (x>5);
    motor.setSpeed (0,0);
    wait_ms(10);

    //Tourne à droite
    motor.setSpeed (80,-80);
    do {
        motor.getPosition (&x,&y, &theta);
    } while (theta > -PI/2.0);

    motor.setSpeed (0,0);
    pc.printf("\rMoteurs OK\n");
    while (bp.read());
    
    pc.printf("\rScan de la zone\n");

    motor.setSpeed (-50,50);
    do {
        pixy.detectedObject(&nbNM, &nbCC);
    } while (nbNM != 1);

    pc.printf("\rBalle trouvee\n");
    pc.printf("\rAlignement\n");

    motor.setSpeed (-30,30);
    do {
        pixy.detectedObject(&nbNM, &nbCC);
        if (nbNM==1) {
            NMBuf[objet] = pixy.getNMBloc ();
            nbNM--;
        }
    } while (NMBuf[objet].x != 160);

    pc.printf("\rBalle alignee\n");
    pc.printf("\n\rREADY TO GO\n");

    do {
        led1 = !led1;
        wait(0.1);
    } while (bp);

    topDepart = temps.read();
    capAuDepart = CMPS03bearing;

    while (1) {
        do {
            motor.setSpeed (speedG, speedD);
            pixy.detectedObject(&nbNM, &nbCC);
            if (nbNM == 1) {
                NMBuf[0] = pixy.getNMBloc ();
                nbNM--;
            }
            speedG = 1000 - 10*(double)(NMBuf[0].x - 160);
            speedD = 1000 - 10*(double)(NMBuf[0].x + 160);
        } while (NMBuf[0].y < 170);
        
        


    }
}