Codigo do seguidor de linha V2 2020.2

Dependencies:   mbed

motors.cpp

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

File content as of revision 6:5551834026ef:

#include "mbed.h"
#include "motors.h"
#include "PID.h"

/*=================================================
--------------- CODIGO DOS MOTORES ----------------
=================================================*/

//------------------ FUNCOES ----------------------
float velocidadePadrao = 0.18;

PwmOut rodaEsquerda(p25); // Potencias da roda e direções
DigitalOut direcaoEsquerda (p26);
PwmOut rodaDireita(p24);
DigitalOut direcaoDireita (p23);
AnalogIn batMeasure (p22);


void Setup_Motores(void)//Funcao de setup dos motores, ajustando o periodo para inicializar o pwm
{ 
rodaEsquerda.period(0.01); 
rodaDireita.period(0.01); 
}

void ControleMotores (float VelocidadeEsquerda, float VelocidadeDireita ){ //Função drive, controla a velocidade de cada roda
    
    if (VelocidadeEsquerda <= 0){
        VelocidadeEsquerda = abs(VelocidadeEsquerda);//Utiliza o modulo da velocidade, pois esta nao pode ser negativa
        direcaoEsquerda = 0;//Muda a direcao da roda.
        rodaEsquerda.write(VelocidadeEsquerda);
    }
    else { direcaoEsquerda = 1; rodaEsquerda.write(VelocidadeEsquerda); }//Mantem a direcao da roda.
    
    if (VelocidadeDireita <= 0){
        VelocidadeDireita = abs(VelocidadeDireita);
        direcaoDireita = 0;
        rodaDireita.write(VelocidadeDireita);    
    }
    else { direcaoDireita = 1; rodaDireita.write(VelocidadeDireita); }
}

void Aceleracao(float velocidadeDesejada,int comando)
{
    int bandeira = 0; //bandeira para controle do while
    float novaVelocidade = velocidadePadrao;
    if(comando==1)
    {
    while(bandeira == 0)
    {
        novaVelocidade = novaVelocidade + 0.01;
        wait_us(1);//Deve ser testado se e necessario esse wait
        if (novaVelocidade <= velocidadeDesejada)
        {
            bandeira = 1;
        }
    }
    }
    else
    {
        while(bandeira == 0)
    {
        novaVelocidade = novaVelocidade - 0.01;
        wait_us(1);//Deve ser testado se e necessario esse wait
        if (novaVelocidade <= velocidadeDesejada)
        {
            bandeira = 1;
        }
    }
    }
}

float transformaPWM(float velocidadePWM)
{
    float leituraBateria = batMeasure;
    int kv=1100;
    int R=13;                                           //Raio da roda
    float rpm=leituraBateria*kv;
    float velocidadeNova = (2*3.14*R/60)*rpm ;           //Ao calcular essa velocidade temos o equivalente da velocidadePWM=1
                                                        
    velocidadeNova=velocidadeNova*velocidadePWM;         //Logo em seguida multiplicamos pela velocidadePWM, dando a porcentagem desejada da nossa velocidade
    return velocidadeNova;
}

float VelocidadeBateria(float velocidadeBase) // Funcao de setup da velocidade base dos motores
{
    float leituraBateria = batMeasure; //Lendo a carga da bateria em um numero de 0 a 1
    float tensaoBateria = 12.6 * leituraBateria; // Carga atual da bateria em Volts
    float novaVelocidade = velocidadeBase * 8.4/tensaoBateria;// Calculando a nova velocidade de acordo com a medida de carga atual da bateria
    return novaVelocidade;
}

/*float ajustaVelocidade(float velocidadeEsperada, float velocidadeReal)
{
    Correcao_roda=PID_roda();
    velocidadeEsperada=velocidadeReal + Correcao_roda
    return velocidadeEsperada;
}*/

void ParadaFinal()//Para o seguidor de linha
{ 
while(1) 
{ 
 rodaEsquerda.write(0); 
 rodaDireita.write(0);
 }
}