Codigo do seguidor de linha V2 2020.2

Dependencies:   mbed

encoder.cpp

Committer:
rperoba
Date:
2020-10-10
Revision:
6:5551834026ef
Parent:
1:573dc2b44591

File content as of revision 6:5551834026ef:

//--------------------------------BIBLIOTECAS-----------------------------------
#include "mbed.h"
#include "encoder.h"
#include "LineSensor.h"

#define TAMANHODOMAPA 50
#define ACELERACAO  2 // Deve ser alterado na fase de teste

//------------------------------------------------------------------------------

//---------------------------------ENCODERS-------------------------------------
/* InterruptIn OUTA_RIGHT(p26);
DigitalIn OUTB_RIGHT(p11);

InterruptIn OUTA_LEFT(p21);
DigitalIn OUTB_LEFT(p7);*/
//------------------------------------------------------------------------------

//-----------------------------------VARIAVEIS----------------------------------
float diametro_roda = 26; // Diametro da roda
float reducao = 10; // Redução do motor 10:1
float perimetro_pulso = 3.14*diametro_roda/(12*reducao); // Perimetro da roda por pulso do encoder
float D = 149; // Distancia entre as rodas do line (mm)
float mi = 1.45; // Coeficiente de atrito (Valor aproximado, testar em lab)
float mapa[TAMANHODOMAPA][4]; /* Matriz de dados:
mapa[i][0]-> distancia percorrida pela roda direita no trecho i;
mapa[i][1]-> distancia percorrida pela roda esquerda no trecho i;
mapa[i][2]-> velocidade maxima do line do trecho i;
mapa[i][3]-> Distancia antes da curva em que precisa comecar a desacelerar*/

int i = 0;
int pulso_direito = 0; // Contador de pulsos da roda direita
int pulso_esquerdo = 0; // Contador de pulsos da roda esquerda
float velAtual_direita = 0;
float velAtual_esquerda = 0;

Timer timer_direito; // Armazena o tempo de cada pulso na roda direita
Timer timer_esquerdo; // Armazena o tempo de cada pulso na roda esquerda

LocalFileSystem local("local"); // Cria o local fylesystem com o nome de "local"
//------------------------------------------------------------------------------

//------------------------------------FUNÇÕES-----------------------------------
    
/*==============================================================================
Nome: contaPulso_direito; contaPulso_esquerdo;
Objetivo: Conta os pulsos do encoder e calcula a velocidade atual;
==============================================================================*/
void contaPulso_direito()
{
    pulso_direito++;
    timer_direito.stop();
    velAtual_direita = perimetro_pulso/timer_direito.read();
    timer_direito.reset();
    timer_direito.start();
}

int retornaPulsoDireito ()
{
    return pulso_direito;
}

void contaPulso_esquerdo()
{
    pulso_esquerdo++;
    timer_esquerdo.stop();
    velAtual_esquerda = perimetro_pulso/timer_esquerdo.read();
    timer_esquerdo.reset();
    timer_esquerdo.start();
}
/*==============================================================================
Nome: retornaVelDireita; retornaVelEsquerda;
Objetivo: Retorna as velocidades reais das rodas para podermos usa-las na main
==============================================================================*/
float retornaVelDireita (){
    return velAtual_direita;
}

float retornaVelEsquerda (){
    return velAtual_esquerda;
}
/*==============================================================================
Nome: calcula_velmax;
Objetivo: Calcula a velocidade máxima em cada trecho sem que o line derrape;
==============================================================================*/
float calcula_velmax()
{
    float raio; // Raio da curva
    float dif = mapa[i][0] - mapa[i][1]; // Diferença entra a distancia percorrida pela roda direita e a roda esquerda
    float soma = mapa[i][0] + mapa[i][1]; // Soma entra a distancia percorrida pela roda direita e a roda esquerda
    if (abs(dif) > 0.1) // Margem de erro de 0.1 na reta (A ser testada)
    {
        raio = abs((D/2) * (soma/dif));
        return sqrt(raio * 9810 * mi);
    }
    else
        return 0; // Se retornar 0 será feito um novo calculo maximo da velocidade
        
    
}   
/*==============================================================================
Nome: mapeamento;
Objetivo: Faz o mapeamento da pista e armazena na matriz de dados;
==============================================================================*/
void mapeamento(bool esq, bool dir) // Variaveis esq e dir estarão gravadas o estado do sensor da asa
{
    mapa[i][0] = pulso_direito*perimetro_pulso;
    mapa[i][1] = pulso_esquerdo*perimetro_pulso; 
    mapa[i][2] = calcula_velmax(); 
    if (esq && !dir) // Verifica se não está passando por um cruzamento
    {
        i++;
        pulso_direito = 0;
        pulso_esquerdo = 0; 
    }
    else if (dir && !esq) // Zera o contador ao passar pela marcação de inicio da pista
    {
        pulso_direito = 0;
        pulso_esquerdo = 0;
    }
}

/*==============================================================================
Nome: DistanciaPraDesacelerar;
Objetivo: Calcula o 4o item do mapa, a distancia para desacelerar para chegar na proxima parte da pista (curva) com a velocidade certa;
==============================================================================*/
    

float DistanciaPraDesacelerar (float velAtual, float proxVel,float aceleracao)
{   
    if (proxVel == NULL)//para evitar problema na ultima parte da pista,em que nao teremos uma proxima velocidade
    {
        proxVel = 0;
    }
    float distancia = (pow(proxVel,2) - pow(velAtual,2))/2*aceleracao ;
    return distancia;
}

/*==============================================================================
Nome: CriaParteQuatro;
Objetivo: Adiciona a distancia para comecar a desaceleracao no mapa da pista;
==============================================================================*/

void CriaParteQuatro ()
{
    for(int i = 0;i<TAMANHODOMAPA;i++){
        if (mapa[i][0] > mapa[i][1] + 1 || mapa[i][0] + 1 < mapa[i][1] ) // +1 é um parametro arbitrario para evitar que seja uma diferenca minima dos periodos de cada roda
        {
            mapa[i][3] = DistanciaPraDesacelerar(velAtual_direita,mapa[i+1][2],ACELERACAO);
        }
        else 
        {
            mapa[i][3] = 0;
        }
    }
}
/*==============================================================================
Nome: criaArquivo;
Objetivo: Cria e coloca as informacoes do mapa da pista dentro de um arquivo;
==============================================================================*/
    
void criaArquivo ()
{

    FILE *mapaArquivo = fopen("/local/mapaTeste.txt","w");
    if(mapaArquivo == NULL){
        printf("Impossivel criar o arquivo");
        return;
    }
    //fprintf(mapaArquivo,"Teste\n");
    for(int i = 0;i<TAMANHODOMAPA;i++)
    {
        fprintf (mapaArquivo,"%f-%f-%f-%f\n",mapa[i][0],mapa[i][1],mapa[i][2],mapa[i][3]);
    }
    
    fclose(mapaArquivo);

}