Codigo do seguidor de linha V2 2020.2

Dependencies:   mbed

Revision:
6:5551834026ef
Parent:
1:573dc2b44591
--- a/encoder.cpp	Sat Sep 19 21:31:41 2020 +0000
+++ b/encoder.cpp	Sat Oct 10 19:08:11 2020 +0000
@@ -1,34 +1,43 @@
 //--------------------------------BIBLIOTECAS-----------------------------------
 #include "mbed.h"
 #include "encoder.h"
-#include "Line_Sensor.h"
+#include "LineSensor.h"
+
+#define TAMANHODOMAPA 50
+#define ACELERACAO  2 // Deve ser alterado na fase de teste
+
 //------------------------------------------------------------------------------
 
 //---------------------------------ENCODERS-------------------------------------
-InterruptIn OUTA_RIGHT(p26);
+/* InterruptIn OUTA_RIGHT(p26);
 DigitalIn OUTB_RIGHT(p11);
 
 InterruptIn OUTA_LEFT(p21);
-DigitalIn OUTB_LEFT(p7);
+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 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[50][3]; /* Matriz de dados:
-mapa[i][0]-> distância percorrida pela roda direita no trecho i;
+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][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-----------------------------------
@@ -46,6 +55,11 @@
     timer_direito.start();
 }
 
+int retornaPulsoDireito ()
+{
+    return pulso_direito;
+}
+
 void contaPulso_esquerdo()
 {
     pulso_esquerdo++;
@@ -54,7 +68,17 @@
     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;
@@ -64,16 +88,16 @@
     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)
+    if (abs(dif) > 0.1) // Margem de erro de 0.1 na reta (A ser testada)
     {
-        abs raio = (D/2) * (soma/dif);
+        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;
@@ -87,20 +111,73 @@
     {
         i++;
         pulso_direito = 0;
-        pulso_esquero = 0; 
+        pulso_esquerdo = 0; 
     }
     else if (dir && !esq) // Zera o contador ao passar pela marcação de inicio da pista
     {
         pulso_direito = 0;
-        pulso_esquero = 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);
+
+}
 
 
 
 
 
-