dhfdf

Dependencies:   mbed tsi_sensor TextLCD

main.cpp

Committer:
benbrou06
Date:
2020-01-05
Revision:
0:80e5a644fec8

File content as of revision 0:80e5a644fec8:

///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//             Programme Robot Sans_Titre.jpg :                  //
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////


#include <stdio.h>
#include "mbed.h"
#include <stdlib.h>
#include "TextLCD.h"

TextLCD lcd(D15, D14, D13, D12, D11, D10); // rs, e, d4-d7

//Décla globale des entrées et sorties
DigitalIn Jack(D3); //C'est le jack qu'il faudra retirer pour lancer le robot

PwmOut Motd(PTC8); //Moteur 1 = Moteur droit
PwmOut Motg(PTA13); //Moteur 2 = Moteur gauche

//Entrées analogiques des capteurs
AnalogIn Captd1(PTB1); //capteur droite 1
AnalogIn Captd2(PTB2); //capteur droite 2
AnalogIn Captg1(PTC2); //capteur gauche 1
AnalogIn Captg2(PTB3); //capteur gauche 2

AnalogIn CaptDist(PTE30); //capteur de distance

DigitalOut In1(D7); //Sens rotation moteur droit
DigitalOut In2(D9); //Sens rotation moteur gauche

DigitalIn FDC(D2); //Contact Fin de course (ou PTD4)

DigitalIn bp1(D5); //Boutons du IHM
DigitalIn bp2(D4);

DigitalOut ledR(LED_RED); //Déclaration Pwm des 3 leds de couleur Rouge, Verte et Bleu (dans l'ordre)
DigitalOut ledV(LED_GREEN);
DigitalOut ledB(LED_BLUE);


int main()
{
    int b1,b2;
    int state=0;
    int mode=0;
    float tcarre=0.6;
    int Depart=0,etat=0;
    float Vmg=0,Vmd=0; //Les 2 moteurs
    float FinDeCourse=0;
    int confettis;
    float d1,d2,d3; //Delta entre les capteurs
    float CG1,CG2,CD1,CD2,Cdist;
    Motg.period_us(100);
    Motd.period_us(100);                                                                           //Decla des variables du main
    Motg.pulsewidth_us(Vmg); //Vitesses des 2 moteurs
    Motd.pulsewidth_us(Vmd);



    printf("debut pgrm !\n\r"); //Test teraterm pour le début du prgm


/////////////////////////////////////////////////////////////////
/////Demarage du robot                                      /////
/////Debut suivi de ligne                                   /////
/////////////////////////////////////////////////////////////////

    while (1) {
        b1=bp1;
        b2=bp2;

        switch (state) { // gestion des états
            case 0 :
                if (b1==0) {
                    lcd.cls();
                    state=100;
                }
                break;

            case 100 : //etat de transition de E0 vers E1
                if (b1==1) {
                    state=1;
                }
                break;

            case 1 : // choix 1 : bp1= suivant, bp2= confirmation
                if (b1==0) {
                    state=12;
                } else if (b2==0) {
                    state=13;
                }
                break;

            case 11 :
                if (b2==0 && b1==0) {
                    state=1000;
                }
                break;

            case 12 :
                if (b1==1) {
                    state=2;
                }
                break;

            case 13 :
                if (b2==1) {
                    state=11;
                }
                break;

            case 2 : // choix 2 : bp1= suivant, bp2= confirmation
                if (b1==0) {
                    state=22;
                } else if (b2==0) {
                    state=23;
                }
                break;

            case 21 :
                if (b2==0 && b1==0) {
                    state=1000;
                }
                break;

            case 22 :
                if (b1==1) {
                    state=3;
                }
                break;

            case 23 :
                if (b2==1) {
                    state=21;
                }
                break;

            case 3 : // choix 3 : bp1= suivant, bp2= reglage puis confirmation
                if (b1==0) {
                    state=321;
                } else if (b2==0) {
                    state=33;
                }
                break;


            case 31 : //reglage taille carre et stockage dans la variable tcarre (float) | bp1= augmente taille carré, bp2= confirmation
                if (b1==0) {
                    state=311;
                } else if (b2==0) {
                    state=322;
                } else if (tcarre==2.1) {
                    tcarre=0;
                }
                break;


            case 311 :
                if (b1==1) {
                    state=31;
                    tcarre+=0.1;
                }
                break;


            case 32 :
                if (b2==0 && b1==0) {
                    state=1000;
                }
                break;

            case 321 :
                if (b1==1) {
                    state=1;
                }
                break;

            case 322 :
                if (b2==1) {
                    state=32;
                }
                break;

            case 33 :
                if (b2==1) {
                    state=31;
                }
                break;

            case 1000 : // etat de remise à 0
                if (b2==1 && b1==1) {
                    state=0;
                }

        }

        switch (state) { // gestion des sorties
            case 0 : // case début choix
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Choisir");
                lcd.locate(0,1);
                lcd.printf(" mode");
                ledR.write(1);
                ledV.write(1); //Eteint!
                ledB.write(1);
                break;

            case 1 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Suivi ?");
                ledR.write(1);
                ledV.write(1); //Eteint!
                ledB.write(1);
                break;

            case 2 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Confetti");
                lcd.locate(0,1);
                lcd.printf(" ?");
                break;

            case 3 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Carre ?");
                break;

            case 11 :   //suivi de ligne en cours
                ledR.write(0);
                ledV.write(1); //Rouge!
                ledB.write(1);
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("SDL en ");
                lcd.locate(0,1);
                lcd.printf("cours");
                mode=1;
                etat=0;
                break;

            case 21 :   // mode confetti en cours
                ledR.write(0);
                ledV.write(0); //Blanc!
                ledB.write(0);
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("CFT en ");
                lcd.locate(0,1);
                lcd.printf("cours");
                mode=2;
                etat=0;
                break;

            case 31 : //reglage taille carre et stockage dans la variable tcarre (float)
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Taille : ");
                lcd.locate(0,1);
                lcd.printf("%gm",tcarre);
                break;

            case 32 :   //mode carre en cours
                ledR.write(1);
                ledV.write(1); //Bleu!
                ledB.write(0);
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("CRE en ");
                lcd.locate(0,1);
                lcd.printf("cours");
                mode=3;
                etat=0;
                break;

            case 1000 : // etat de remise à 0
                lcd.cls();
                tcarre=0.6;
                etat=0;
                break;
        }



        if (mode==1)  { //code du SDL

            Depart = Jack.read(); //Si le Jack est enlevé, alors Depart = 1, donc le robot démarre (Etat = 1). Sinon il reste à l'arrët
            FinDeCourse = FDC.read(); //Si FDC activé, alors FinDeCourse = 1, donc le robot s'arrete (Etat = 100-->0)

            CG1 = Captg1;
            CG2 = Captg2;
            CD1 = Captd1;
            CD2 = Captd2;

            Cdist = CaptDist;

            d1 = CG2-CG1;
            d2 = CG1-CD1;
            d3 = CD1-CD2;


            switch (etat) { // gestion des états
                case 0 :
                    if (Depart==1) {
                        //printf("Depart \n\r");
                        etat=1;
                    }
                    break ;

                case 1 : //roule tout droit
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if (CaptDist == 4) { //capteur Distance actif
                        etat=6;
                    } else if ((Captg1 < 0.1)&&(Captg2 < 0.1)) { //capteur CG1 et CG2 sont sur du blanc
                        etat=17;
                    } else if ((Captg1 < 0.1)&&(Captg2 < 0.1)&&(Captd1 < 0.1)&&(Captd2 < 0.1)) { //capteur CG1, CG2, CD1, CD2 sont sur du blanc
                        etat=9;
                    } else if (d2<-0.4) { //capteur CG1 sur du blanc
                        etat=2;
                    } else if (d2>0.4) { //capteur CD1 sur du blanc
                        etat=3;
                    }
                    break ;


                case 17 :  //état de transition (vers E7)
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if ((Captg1 > 0.1)&&(Captg2 > 0.1)) { //capteur CG1 et CG2 ne sont plus sur du blanc
                        etat=171;
                    }
                    break ;

                case 171: //virage scotch coté gauche
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if ((Captg1 < 0.1)&&(Captg2 < 0.1)) {
                        etat=7;
                    }
                    break;

                case 2 :  //virage gauche
                    if (Depart == 0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if (d1<-0.4) {
                        etat=4;
                    } else if ((Captg1>0.1)&&(Captd1>0.1)) {
                        etat=1;
                    }
                    break ;

                case 3 : //virage droit
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if (d3>0.4) {
                        etat=5;
                    } else if ((Captg1>0.1)&&(Captd1>0.1)) {
                        etat=1;
                    }
                    break ;

                case 4: //virage ++ gauche
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if ((Captg1>0.1)&&(Captd1>0.1)&&(Captg2>0.1)&&(Captd2>0.1)) {
                        etat=1;
                    }
                    break;

                case 5: //virage ++ droite
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if ((Captg1>0.1)&&(Captd1>0.1)&&(Captg2>0.1)&&(Captd2>0.1)) {
                        etat=1;
                    }
                    break;

                case 6: //Capteur distance actif
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if (CaptDist != 4 ) {/*valeur à tester*/
                        etat=1;
                    }
                    break;

                case 7: //Virage stotch
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    } else if ((Captg1>0.1)&&(Captg2>0.1)) {
                        etat=1;
                    }
                    break ;

                case 9: //plot
                    if ((Captg1 < 0.1)&&(Captg2 < 0.1)&&(Captd1 < 0.1)&&(Captd2 < 0.1)) {
                        etat=1;
                    }
                    break ;

                case 100 :
                    if (Depart==0) {
                        etat=0;
                    }
                    break ;

                case 101 :
                    etat=0;
                    break ;

            }

            switch (etat) { // gestion des sorties
                case 0 :
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (arreté)
                    Motd.pulsewidth_us(Vmd);
                    break ;

                case 1 :
                    In1=0;
                    In2=1; //avance
                    Vmg=40;
                    Vmd=40;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (roule à 40%)
                    Motd.pulsewidth_us(Vmd);
                    break ;

                case 17 :
                    Vmg=30;
                    Vmd=30;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (roule à 30%)
                    Motd.pulsewidth_us(Vmd);
                    break ;

                case 2 :
                    Vmd=100*abs(d2)- 40; //Exemple si d2 = -0.8 (donc CG1 = 0.1 et CD1 = 0.9), alors la vitesse de la roue droite est 100*0.8-40 = 40
                    Vmg=Vmd-10;
                    Motd.pulsewidth_us(Vmd);
                    Motg.pulsewidth_us(Vmg);
                    break ;

                case 3 :
                    Vmg=100*abs(d2)- 40; //Exemple si d2 = 0.8 (donc CG1 = 0.9 et CD1 = 0.1), alors la vitesse de la roue gauche est 100*0.8-40 = 40
                    Vmd=Vmg-10;
                    Motg.pulsewidth_us(Vmg);
                    Motd.pulsewidth_us(Vmd);
                    break ;

                case 4 :
                    Vmd=100*abs(d1)- 50; //Exemple si d1 = -0.8 (donc CG2 = 0.1 et CG1 = 0.9), alors la vitesse de la roue droite est 100*0.8-50 = 30
                    Vmg=Vmd-10;
                    Motg.pulsewidth_us(Vmg);
                    Motd.pulsewidth_us(Vmd);
                    break;

                case 5 :
                    Vmg=100*abs(d3)- 50; //Exemple si d3 = 0.8 (donc CD1 = 0.9 et CD2 = 0.1), alors la vitesse de la roue gauche est 100*0.8-50 = 30
                    Vmd=Vmg-10;
                    Motg.pulsewidth_us(Vmg);
                    Motd.pulsewidth_us(Vmd);
                    break;

                case 6: //Capteur distance actif
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (roule à 0%)
                    Motd.pulsewidth_us(Vmd);
                    break;

                case 7: //virage scotch coté gauche
                    Vmg=0;
                    Vmd=0;
                    wait(0.5);
                    Vmg=0;
                    Vmd=20;
                    Motg.pulsewidth_us(Vmg);
                    Motd.pulsewidth_us(Vmd);
                    break;


                case 100 :
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (arreté)
                    Motd.pulsewidth_us(Vmd);
                    break ;
            }
        } //fin SDL




        if (mode==2)  { //code du mode confettis

            Depart = Jack.read(); //Si le Jack est enlevé, alors Depart = 1, donc le robot démarre (Etat = 1). Sinon il reste à l'arrët
            FinDeCourse = FDC.read(); //Si FDC activé, alors FinDeCourse = 1, donc le robot s'arrete (Etat = 100-->0)


            switch (etat) { // gestion des états
                case 0 :
                    if (Depart==1) {
                        etat=1;
                    }
                    break ;

                case 1 :
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    }

                    if ((Captg1<0.3)&&(Captd1<0.3)&&(Captg2<0.3)&&(Captd2<0.3)) {
                        confettis++;
                        wait(1);
                    }

                    if (confettis ==3) {
                        etat=0;
                    } else {
                        confettis=0;
                    }
                    break ;

                case 100 :
                    if (Depart==0) {
                        etat=0;
                    }

                    break ;

                case 101 :
                    etat=0;
                    break ;
            }



            switch (etat) { // gestion des sorties
                case 0 :
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (arreté)
                    Motd.pulsewidth_us(Vmd);
                    ledR.write(0);
                    ledV.write(1); //Led = Rouge!
                    ledB.write(1);
                    break ;


                case 1 :
                    Vmg=20;
                    Vmd=20;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (roule à 20%)
                    Motd.pulsewidth_us(Vmd);
                    ledR.write(1);
                    ledV.write(0);  //Led = Verte!
                    ledB.write(1);
                    break ;

                case 100 :
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (arreté)
                    Motd.pulsewidth_us(Vmd);
                    ledR.write(0);
                    ledV.write(1); //Led = Rouge!
                    ledB.write(1);
                    break ;

            }
        }//fin confettis

        if (mode==3)  { //code du mode carré
            Depart = Jack.read(); //Si le Jack est enlevé, alors Depart = 1, donc le robot démarre (Etat = 1). Sinon il reste à l'arrët
            FinDeCourse = FDC.read(); //Si FDC activé, alors FinDeCourse = 1, donc le robot s'arrete (Etat = 100-->0)


            switch (etat) { // gestion des états
                case 0 :
                    if (Depart==1) {
                        etat=1;
                    }
                    break ;

                case 1 :
                    if (Depart ==0) {
                        etat=101;
                    } else if (FinDeCourse==1) {
                        etat=100;
                    }
                    break ;

                case 100 :
                    if (Depart==0) {
                        etat=0;
                    }

                    break ;

                case 101 :
                    etat=0;
                    break ;
            }



            switch (etat) { // gestion des sorties
                case 0 :
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (arreté)
                    Motd.pulsewidth_us(Vmd);
                    break ;


                case 1 :
                    Vmg=20;
                    Vmd=20;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (roule à 20%)
                    Motd.pulsewidth_us(Vmd);
                    break ;

                case 100 :
                    Vmg=0;
                    Vmd=0;
                    Motg.pulsewidth_us(Vmg);//Vitesses des 2 moteurs (arreté)
                    Motd.pulsewidth_us(Vmd);
                    ledR.write(0);
                    ledV.write(1); //Led = Rouge!
                    ledB.write(1);
                    break ;

            }
        }//fin carré

    }//fin de la boucle
}