O algoritmo para esse seguidor de linha tem suas classes e arquivos separados em pastas de acordo com as suas funções e responsabilidades que podem ser as listadas abaixo:
- Drivers (interface entre software e hardware)
- Serviços (camada de aplicação)
- Estrutura de dados
- Gerenciamento e armazenamento de dados
- Tratamento e execução de comandos do bluetooth
Atualmente, os drivers para cada componente de hardware do robô estão armazenados na pasta robot/components, sendo os drivers responsáveis por se comunicar ou receber informações dos hardwares instalados no robô, abaixo estão listadas as pastas que contém drivers e a sua função:
- ESP32Encoder: leitura dos sinais enviados pelos encoders
- ESP32MotorControl: acionamento dos motores, através da ponte H
- LedStripEncoder: controle dos Leds RGB endereçaveis
- MCP3008: comunicação com o ADC externo
- QTRSensors: leitura e calibração dos sensores infravermelhos
Os serviços do robô estão em sua maioria na pasta robot/services, neles que a lógica utilizada no robô para executar as suas tarefas é implementada, eles possuem cada um a sua função e geralmente executam paralelamente no microcontrolador, atráves das tasks do FreeRTOS, ou auxiliam outros serviços nas suas funções, os serviços utilizados atualmente pelo robô e suas tarefas principais estão listadas abaixo:
- CarStatusService: responsável pela definição do estado do robô com base na pista e nos dados armazenados nele
- LEDsService: responsável por receber comandos de outros serviços para o acionamento dos leds
- MappingService: responsável por criar o mapeamento quando o robô está no modo mapeamento
- PIDService: responsável pelas estratégias de controle implementadas no robô
- SensorsService: responsável pela leitura e calibração dos sensores IR frontais e laterais
- SpeedService: responsável pelo cálculo da velocidade e deslocamento do robô ou de suas rodas
- BLEServerService: responsável pela comunicação bluetooth do robô com a dashboard
Os parâmetros do robô e mapeamento são armazenados na memória flash permitindo que eles sejam salvos no robô, entretanto para possibilitar o gerenciamento desses parâmetros e facilitar o armazenamento e carregamento deles da memória flash, criamos a pasta DataObjects, onde se encontram as classes encarregadas de gerenciar os dados e parâmetros armazenados nas estruturas de dados do robô e também de lidar com o armazenamento do ESP32 para facilitar o uso da flash, as classes que estão nessas pastas são lisatadas abaixo:
-
DataAbstract: classe responsável por lidar com os parâmetros do robô, permitindo a leitura e escrita deles em tempo de execução, funcionando como um tipo genérico para diferentes tipos de parâmetros.
-
DataMap: classe responsável por lidar com os dados do mapeamento.
-
DataStorage: classe responsável por carregar parâmetros da flash ou salvá-los nela, através de arquivos.
-
DataManager: classe responsável por gerenciar os parâmetros do robô através de uma lista de parâmetros que o permite facilmente acessá-los quando necessário.
-
IDataAbstract: Interface utilizada como base para a classe DataMap e DataAbstract.
Os dados utilizados pelo robô são armazenados em classes, em que, cada classe tratará dos dados de sistemas ou funções específicas, sendo essas classes as listadas abaixo:
- dataPID: dados e parãmetros sobre o controlador PID do robô
- dataSensor: dados sobre as leituras dos sensores infravermelho
- dataSLatMarks: dados e parâmetros sobre o mapeamento
- dataSpeed: dados e parâmetros sobre posição, velocidade e aceleração
- RobotStatus: dados e parâmetros sobre o estado do robô
Todas essas classes de dados relacionadas ao robô estão localizadas na pasta RobotData que também armazena algumas enums e maps (dicionários) do robô.
O robô também possui uma dashboard hospedada no firebase que permite a edição e backup de parâmetros, alteração e backup do mapeamento da pista e geração de gráficos em tempo real, e com o intuito de possibilitar a comunicação à distância da dash com o robô, utilizamos comunicação bluetooth (BLE GATT), sendo o serviço BLEService responsável por tratar dessa comunicação sem fio com a dashboard, sendo ele responsável pela interpretação dos comandos enviados pela dash e retorno dos dados solicitados. Os comandos recebidos e enviados pelo robô são comandos de texto e para simplificar a interpretação deles utilizamos a biblioteca BetterConsole para extrair as partes importantes dos comandos e executar as funções relativas à esses comandos que estão na pasta CMDWrapper que encapsula a função executada por cada comando.
Para mais informações sobre o dashboard, acesse o repositório a seguir: LineFollower_CCenter_Code