Codigo do seguidor de linha V2 2020.2

Dependencies:   mbed

main.cpp

Committer:
lucalm
Date:
2020-10-03
Revision:
5:b07a3cfe017d
Parent:
4:af8cfbac17bb

File content as of revision 5:b07a3cfe017d:

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

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

int botao = 0;
int comando = 1;
int contadorAsaDireita = 0;
 
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;

void AlteraComando(){
    botao++;
}

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

int main()
{
    Botao.rise(&AlteraComando);
    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);                              
                            ParadaFinal();                                                              //Para o seguidor na segunda marcacao
                        }
                    }
                }
              }

            break;

            case 2:                                                                           //Percorre a pista com o uso do mapa
              while(1){ 
                /* 
                if(ditancia pra curva < distancia pra desacelerar){                                     //Seleciona a velocidade
                    novaVelocidade = VelocidadeBateria ( VELOCIDADE DO MAPA + 1)
                }
                else{
                    novaVelocidade = VelocidadeBateria(VELOCIDADE DO MAPA);
                }  
                Acelerando(float novaVelocidade);                                                       //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
                        //MAPA + 1 POSICAO                                                              //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;
    }    


    
    
}