Codigo do seguidor de linha V2 2020.2

Dependencies:   mbed

main.cpp

Committer:
rperoba
Date:
2020-10-10
Revision:
6:5551834026ef
Parent:
0:9efe13b5d868

File content as of revision 6:5551834026ef:

#include "mbed.h"
#include "LineSensor.h"
#include "bluetooth.h"
#include "encoder.h"
#include "motors.h"
#include "PID.h"

#define TAMANHODOMAPA 50
#define PERIMETRODARODA 26

InterruptIn Botao (p5);
DigitalOut Led (p6);

InterruptIn OUTA_RIGHT(p26);
DigitalIn OUTB_RIGHT(p11);

InterruptIn OUTA_LEFT(p21);
DigitalIn OUTB_LEFT(p7);

int botao = 0;
int comando = 1;
int contadorAsaDireita = 0;
int posicaoNoMapa = 0;
float distanciaPraCurva;

float correcaoPD;
double erroSensores; 

float velocidadeEsquerda;
float velocidadeDireita;
float velocidadeRealEsquerda;
float velocidadeRealDireita;
float velocidadeAtual = 0.18;
float novaVelocidade;
float correcaoEsquerda;
float correcaoDireita;

bool estadoAsaDireita = false;
bool estadoAsaEsquerda = false;

float mapaPraCorrer[TAMANHODOMAPA][4];

void leArquivo ()
{
    FILE *mapaArquivo = fopen("/local/mapaTeste.txt","r");
    if(mapaArquivo == NULL){
        printf("Impossivel criar o arquivo");
        return;
    }
    for(int i = 0;i<TAMANHODOMAPA;i++)
    {
        fscanf(mapaArquivo,"%f-%f-%f-%f\n",&mapaPraCorrer[i][0],&mapaPraCorrer[i][1],&mapaPraCorrer[i][2],&mapaPraCorrer[i][3]); // talvez tenha q salvar numa variavel, igualar a um vetor
    }
    
    fclose(mapaArquivo);
}

void AlteraComando(){
    botao++;
}

void PiscaLed(){
    if(Led){
        Led = 0;
    }
    else{
        Led = 1;
    }
}

int main()
{
    Botao.rise(&AlteraComando);
    OUTA_RIGHT.rise(&contaPulso_direito);
    OUTA_LEFT.rise(&contaPulso_esquerdo);
    leArquivo();

    Setup_Motores();
    while(botao == 0){          //Espera o aperto do botao para iniciar a calibragem, o led permanecera acesso para indicar esta fase
        wait_us(10);
        Led = 1;
    }
    while (botao == 1)          //Inicialmente calibra os sensores ao ligar o seguidor,o led fica piscando para mostrar que a calibragem esta acontecendo
    {                           //Espera que se aperte o botao para terminar a calibragem
        CalibragemDosSensores();
        PiscaLed();
    }

    Led = 0;                    //Certificando que o led esta apagado depois da calibragem

    wait_us(5000);              //Espera 5 segundos para poder mudar a posição de calibrar os sensores para a de correr
    //Tocar o buzzer parar avisar q ai começar a correr                  
        switch(comando){        
                                //Comando = 1 -> Faz a pista devagar e mapeando 
                                //Comando = 2 -> Faz a pista usando a leitura do mapa
                                //Comando = 3 -> Faz a usando a leitura do mapa e ultrapassando os limites de velocidade
            case 1:
              while(1){ 
                velocidadeAtual = VelocidadeBateria(velocidadeAtual);                                     //Ajuste da velocidade por causa da descarga da bateria 
                LerSensoresFrontais();                                                                  //Leitura dos sensores frontais
                erroSensores = CalculaErro();                                                           //Calcula o arco do erro dos sensores
                correcaoPD = PID_Sensores(erroSensores);                                                //Calcula a correção do PD angular
                velocidadeEsquerda = velocidadeAtual + correcaoPD;                                       //Ajusta a inicialmente a velocidade das rodas para manter na linha
                velocidadeDireita = velocidadeAtual - correcaoPD;
                velocidadeRealDireita = retornaVelDireita();                                            //velocidade em /m/s
                velocidadeRealEsquerda = retornaVelEsquerda();
                velocidadeEsquerda = transformaPWM(velocidadeEsquerda);                                  //Converte velocidade PWM em m/s
                velocidadeDireita = transformaPWM(velocidadeDireita);
                correcaoEsquerda = PID_rodaEsquerda(velocidadeEsquerda,velocidadeRealEsquerda);       //Faz o ajusta final da velocidade das rodas
                correcaoDireita = PID_rodaDireita(velocidadeDireita,velocidadeRealDireita);
                velocidadeEsquerda += correcaoEsquerda;
                velocidadeDireita += correcaoDireita;
                ControleMotores(velocidadeEsquerda,velocidadeDireita);                                  //Muda a velocidade das rodas para as velocidades calculadas anteriormente
                estadoAsaDireita = LerAsaDireita();
                estadoAsaEsquerda = LerAsaEsquerda();
                if(estadoAsaEsquerda || estadoAsaDireita ){                                             //Checa os sensores laterais
                    mapeamento(estadoAsaEsquerda,estadoAsaDireita);                                     //faz o mapeamento da pista
                    if (estadoAsaDireita && !estadoAsaEsquerda){
                        contadorAsaDireita++;                                                           //Faz as contagens das marcacoes a direita
                        if(contadorAsaDireita >=2){//ARRUMAR UM JEITO DE DAR UM TEMPO ENTRE A LEITURA E O SEGUIDOR PARAR PARA ELE PASSAR TODO PELA LINHA DE CHAGADA
                            Aceleracao(0,0);
                            CriaParteQuatro();
                            criaArquivo();
                            ParadaFinal();                                                              //Para o seguidor na segunda marcacao
                        }
                    }
                }
              }

            break;

            case 2:                                                                           //Percorre a pista com o uso do mapa
              while(1){ 
                distanciaPraCurva =retornaPulsoDireito() * PERIMETRODARODA  ;
                if(distanciaPraCurva < mapaPraCorrer[posicaoNoMapa][1] - mapaPraCorrer[posicaoNoMapa][3]){                                     //Seleciona a velocidade
                    novaVelocidade = VelocidadeBateria (mapaPraCorrer[posicaoNoMapa+1][2]);
                }
                else{
                    novaVelocidade = VelocidadeBateria(mapaPraCorrer[posicaoNoMapa][2]);
                }  
                Aceleracao(novaVelocidade,1);                                                       //Acelera ou desacelera o robo
                LerSensoresFrontais();                                                                  //Leitura dos sensores frontais
                erroSensores = CalculaErro();                                                           //Calcula o arco do erro dos sensores
                correcaoPD = PID_Sensores(erroSensores);                                                //Calcula a correção do PD angular
                velocidadeEsquerda = velocidadeAtual + correcaoPD;                                       //Ajusta a inicialmente a velocidade das rodas para manter na linha
                velocidadeDireita = velocidadeAtual - correcaoPD;
                velocidadeRealDireita = retornaVelDireita(); 
                velocidadeRealEsquerda = retornaVelEsquerda();
                velocidadeEsquerda = transformaPWM(velocidadeEsquerda);                                  //Converte velocidade PWM em m/s
                velocidadeDireita = transformaPWM(velocidadeDireita);
                correcaoEsquerda = PID_rodaEsquerda(velocidadeEsquerda,velocidadeRealEsquerda);       //Faz o ajusta final da velocidade das rodas
                correcaoDireita = PID_rodaDireita(velocidadeDireita,velocidadeRealDireita);
                velocidadeEsquerda += correcaoEsquerda; 
                velocidadeDireita += correcaoDireita;
                ControleMotores(velocidadeEsquerda,velocidadeDireita);                                  //Muda a velocidade das rodas para as velocidades calculadas anteriormente
                estadoAsaDireita = LerAsaDireita();
                estadoAsaEsquerda = LerAsaEsquerda();
                if(estadoAsaEsquerda || estadoAsaDireita ){                                             //Checa os sensores laterais
                    if(!estadoAsaEsquerda || estadoAsaDireita){                                         //Leu somente o asa direita
                        posicaoNoMapa++;                                                             //Atualiza a etapa do mapa da pista que esta sendo lido
                    }                                                                                   
                    if(estadoAsaDireita && !estadoAsaEsquerda){                                        //Leu somente a asa esquerda
                        contadorAsaDireita++;                                                           //Faz as contagens das marcacoes a direita
                        if(contadorAsaDireita >=2){
                            Aceleracao(0,0);
                            ParadaFinal();                                                              //Para o seguidor na segunda marcacao
                        }
                    }
                }
              }

            break;

            case 3:  
                while(1){

                 }
            break;

            default:
            ParadaFinal();
            break;
    }    


    
    
}