Repository navigation
Uso da dashboard
A dashboard foi desenvolvida com o intuito de permitir que o usuário alterasse e visualizasse parâmetros do robô de maneira simples e rápida, através de um site hospedado no firebase sendo utilizado em sua programação principalmente Javascript e o framework VUE.js, também usamos o Quasar framework, typescript e HTML. A comunicação com o robô é feita pelo navegador usando a Web Bluetooth API do google que se baseia no protocolo BLE GATT (perfil de atributo genérico), permitindo que o robô envie e receba dados ou comandos da dashboard.
- Ler e alterar parâmetros do robô
- Editar ou criar o mapeamento da pista
- Informar a tensão da bateria
- Gerar gráficos com os dados obtidos pelos sensores do robô
- Salvar parâmetros do robô e mapeamento da pista na nuvem
Ela pode ser acessada nesse link:
A página inicial é essa mostrada na figura abaixo:

Nela aparecem no canto superior três ícones sendo o mais a esquerda o botão para se conectar à algum dispositivo bluetooth, no caso o robô, o do meio para verificar a tensão da bateria e o último serve para fazer login na dashboard, pois apenas usuários que logarem com uma conta do github que faça parte da organização Tamandutech poderão acessar as funcionalidades do site. Dessa forma, após o login o usuário poderá interagir com as outras páginas do site que podem ser acessadas pelo menu lateral, que é exibido ou ocultado quando os três traços no canto superior esquerdo do site é clicado, nesse menu existem dois itens principais o início que leva para a página inicial e robô ao clicar em robô aparecerá dois subitens que são parâmetros e mapeamento.
O robô possui vários parâmetros que podem ser facilmente criados no código principal de acordo com a necessidade e através deles que os ajustes para tornar o robô o mais competitivo possível durante a competição são feitos, existem vários tipos de parâmetros que são separados em classes baseadas nas classes do código principal sendo atualmente 7 classes de parâmetros que são: slatmarks (parâmetros de mapeamento), PIDVEL (parâmetros do PID da velocidade linear), PIDRot (parâmetros do PID da velocidade rotacional) e speed (parâmetros de velocidade do robô), RobotStatus (parâmetros para habilitar ou desabilitar recursos do robô), PIDClassic (parâmetros do PID básico do robô) e PIDIR (parâmetros do PID do robô que calcula a velocidade rotacional necessária para ele corrigir o erro). Entretanto, nem todas as classes de PID estarão disponíveis na dashboard as classes disponíveis dependerão do tipo de PID selecionado para o robô, caso o PID básico seja selecionado apenas a classe de PIDClassic estará disponível, porém se o PID linear e rotacional for selecionado todas as classes de PID estarão disponíveis menos a classe PIDClassic.
A função de cada um dos parâmetros será descrita abaixo separando-os por classe:
ThresholdtoCurve - Valor em mm de diferença de comprimento entre as duas rodas ao passar em um trecho da pista para que ele seja considerado uma curva,logo se essa diferença for maior que o valor desse parâmetro então o trecho é uma curva, caso o contrário ele é uma reta já que idealmente em uma reta as duas rodas percorreriam a mesma distância.
MarkstoStop - Marcações direita que o robô precisa ler para parar o normal é que sejam duas mas como o robô pode ler marcações incorretamente pode ser interessante colocar mais.
MarkstoMean - Número de leituras que serão feitas para o cálculo das médias que serão utilizadas para a identificação de marcações laterais.
PulsesBeforeCurve - O quanto antes de uma curva o robô começará a desacelarar a unidade de medida desse parâmetro são os pulsos do encoder que a conversão para mm depende do tamanho da roda e de algumas carcterísticas dos encoders e motores. (isso só vale se o robô estiver numa reta antes de entrar na curva)
PulsesAfterCurve - O quanto depois de terminar uma curva o robô começará a desacelarar a unidade de medida desse parâmetro são os pulsos do encoder que a conversão para mm depende do tamanho da roda e de algumas carcterísticas dos encoders e motores. (isso só vale se o robô entrar numa reta depois de terminar a curva)
thresholdLongLine - Caso o trecho da pista seja uma reta qual tamanho ela deve ter para ser considerada uma reta longa. (unidade de medida pulsos do encoder)
thresholdMediumLine - Caso o trecho da pista seja uma reta qual tamanho ela deve ter para ser considerada uma reta média, caso o tamanho do trecho seja menor que esse valor então ele será considerado uma reta curta. (unidade de medida pulsos do encoder)
thresholdLongCurve - Caso o trecho da pista seja uma curva qual o comprimento ela deve ter para ser considerada uma curva longa. (unidade de medida pulsos do encoder)
thresholdMediumCurve - Caso o trecho da pista seja uma curva qual tamanho ela deve ter para ser considerada uma curva média, caso o comprimento do trecho seja menor que esse valor então ele será considerado uma curva curta. (unidade de medida pulsos do encoder)
Kp,KI,KD - São as constantes do controlador PID e devem ser ajustadas de modo que o robô percorra a pista o mais rápido possível, no caso do PIDVel esses parâmetros estão relacionados com a velocidade linear do robô.
Kp,KI,KD - São as constantes do controlador PID e devem ser ajustadas de modo que o robô percorra a pista o mais rápido possível, no caso do PIDRot esses parâmetros estão relacionados com a velocidade rotacional do robô.
Krot - Esse parâmetro serve para dizer ao controlador PID qual velocidade rotacional o robô deve de ter com base no quão fora da linha o robô está, sendo assim dependendo desse valor o robô vai girar mais rápidamente ou lentamente para corrigir um erro.
As constantes do PIDClassic Kp e Kd devem ser ajustadas de modo que o robô percorra a pista o mais rápido possível. Kp_IRline,Kd_IRline - Constantes do PID para as retas curta, média e longa.
Kp_IRCurve,Kd_IRCurve - Constantes do PID para as curvas médias.
Kp_IRShortCurve,Kd_IRShortCurve - Constantes do PID para as curvas curtas.
Kp_IRZigZag,Kd_IRZigZag - Constantes do PID para o zigzag.
Kp_IRXLongLine,Kd_IRXLongLine - Constantes do PID para as retas extra longas.
Kp_IRLongCurve,Kd_IRLongCurve - Constantes do PID para as curvas longas.
Kp_IRXLongCurve,Kd_IRXLongCurve - Constantes do PID para as curvas extra longas.
MPR - Quantidade de "pulsos" que o encoder precisa enviar ao microcontrolador para ele considerar que a roda deu uma volta.
Max - Duty cycle máximo que o microcontrolador será permitido de colocar no PWM dos motores em porcentagem.
Min - Duty cycle mínimo que o microcontrolador será permitido de colocar no PWM dos motores em porcentagem (aceita valores negativos).
PWM_initial_accel - aceleração que o robô utilizará na arrancada (até a marcação inicial), a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM por segundo.
PWM_accel - aceleração que o robô utilizará na pista, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM por segundo.
PWM_desaccel - desaceleração que o robô utilizará na pista, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM por segundo.
PWM_initial_speed - Velocidade que o robô utilizará no trecho inicial da pista (antes da primeira marcação), a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
Pwm_Long_line - Velocidade que o robô utilizará nos trechos da pista identificados como reta longa, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_Medium_line - Velocidade que o robô utilizará nos trechos da pista identificados como reta média, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_Short_line - Velocidade que o robô utilizará nos trechos da pista identificados como reta curta, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_XLong_curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva extra longa, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_Long_curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva longa, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_Medium_curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva média, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_Short_curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva curta, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_ZigZag - Velocidade que o robô utilizará nos trechos da pista identificados como zigzag, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_SpecialTrack - Velocidade que o robô utilizará nos trechos da pista identificados como especial servindo para trechos específicos da pista, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_DefaultSpeed - Velocidade que o robô utilizará nos trechos da pista identificados como padrão, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
PWM_Tunning_speed - Velocidade que o robô utilizará no modo tuning, a unidade de medida desse parâmetro é a porcentagem do duty cycle do PWM.
Long_line - Velocidade que o robô utilizará nos trechos da pista identificados como reta longa, a unidade de medida desse parâmetro é rpm, sendo a soma das velocidades de cada roda em rpm.
Medium_line - Velocidade que o robô utilizará nos trechos da pista identificados como reta média, a unidade de medida desse parâmetro é rpm, sendo a soma das velocidades de cada roda em rpm.
Short_line - Velocidade que o robô utilizará nos trechos da pista identificados como reta curta, a unidade de medida desse parâmetro é rpm, sendo a soma das velocidades de cada roda em rpm.
Long_Curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva longa, a unidade de medida desse parâmetro é rpm, sendo a soma das velocidades de cada roda em rpm.
Medium_Curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva média, a unidade de medida desse parâmetro é rpm, sendo a soma das velocidades de cada roda em rpm.
Short_Curve - Velocidade que o robô utilizará nos trechos da pista identificados como curva curta, a unidade de medida desse parâmetro é rpm, sendo a soma das velocidades de cada roda em rpm.
Na imagem abaixo está a página de parâmetros que é constituída de um botão para carregar os parâmetros e um campo para pesquisar (atualmente só pesquisa as classes de parâmetros, mas não parámetros específicos), esses dois itens estão apontados pelas setas vermelhas. Além disso, a página de parâmetros após carregar os parâmetros, depois que o usuário clicou no botão com essa função, mostra eles em cards como os que estão na imagem em que no topo do card está o nome da classe dos parâmetro que ele contém.

Assim, para alterar um parâmetro basta clicar em cima do valor dele e aparecerá um popup solicitando o novo valor do parâmetro basta escolher um valor e clicar no botão escolher que está no popup, após isso a dashboard enviará o valor desejado ao robô e irá ler novamente do robô esse mesmo parâmetro para verificar se a alteração foi bem sucedida, dessa forma caso o valor do parâmetro não mude na dashboard para o valor escolhido isso significa que provavelmente houve uma falha na alteração do parâmetro, a imagem abaixo ilustra como funciona a alteração de um parâmetro:

A página de mapeamento serve para editar o mapeamento da pista que está armazenado na memória flash do robô, nela é possível adicionar, deletar e editar os registros do mapeamento e além disso salvá-los na memória flash ou na ram. Essa página contém uma tabela chamada Mapeamento que contém as informações do mapeamento da pista obtidas do robô possibilitando que essas informaçoes sejam alteradas, as figuras abaixo mostram a página de mapeamento:


Atualmente cada registro do mapeamento possui 7 informações que são:
id - O identificador de cada registro.
Média dos encoders(pulsos) - Quantidade de pulsos do encoder necessários para alcançar a marcação na pista relativa à esse registro, começando a contar à partir da primeira marcação da pista, no caso o valor utilizado se refere à média de pulsos do encoder da roda direita e esquerda para alcançar essa marcação no modo mapeamento na prática esses valores podem mudar um pouco pois o robô estará com velocidades maiores e não percorrerá a pista da mesma maneira, assim para identificar um trecho da pista são utilizados dois registros (marcações), uma marcação para o início do trecho e outra para o fim, sendo que as informações sobre o trecho estarão contidas na marcação de fim do trecho.
Tempo (ms) - O tempo que leva para o robô alcançar a marcação relativa a esse registro contando à partir da marcação inicial da pista, esse tempo se refere ao tempo que levou para o robô ler essa marcação no modo mapeamento e é registrado em milissegundos.
Encoder direito (pulsos) - Quantidade de pulsos do encoder direito necessários para alcançar a marcação na pista relativa à esse registro, começando a contar à partir da primeira marcação da pista, esse valor se refere ao obtido no modo mapeamento.
Encoder esquerdo (pulsos) - Quantidade de pulsos do encoder esquerdo necessários para alcançar a marcação na pista relativa à esse registro, começando a contar à partir da primeira marcação da pista, esse valor se refere ao obtido no modo mapeamento.
Offset - Quantidade de pulsos em que a marcação deve ser deslocada, caso seja positiva a marcação ficará mais para frente e se for negativo a marcação ficará mais para trás.
Status - Informa o estado do robô naquele trecho da pista que pode ser reta(1) ou curva(0), também pode informar outros tipos de estados para o robô, entretanto o padrão é reta ou curva.
Um trecho da pista será definido por duas marcações, uma para o início do trecho e outra para o fim dele, sendo assim as informações de status de um determinado trecho estarão na marcação no fim do trecho. Logo, ao alterar o status de uma marcação o que estará sendo alterado é o trecho que vem antes da marcação.
TrackStatus - Informa o tipo de trecho da pista, sendo eles
- Reta Longa (0),
- Reta Média (1),
- Reta Curta (2),
- Reta extra longa (11) - NÃO identificado automaticamente,
- Curva Longa (3),
- Curva Média (4),
- Curva Curta (5),
- Curva extra longa (12) - NÃO identificado automaticamente,
- Zigzag (6 - tipo de curva) - NÃO identificado automaticamente
- Trecho especial (7) - NÃO identificado automaticamente.
Obs: Logo, para que o Trackstatus funcione o status deve ser coerente, ou seja, se o status for curva(0) o Trackstatus deverá ser algum tipo de curva e o mesmo vale para reta, caso contrário o robô utilizará uma velocidade padrão que também é definida na dashboard, entretanto se o status e Trackstatus forem definidos corretamente essa velocidade padrão não precisará ser utilizada.
Um trecho da pista será definido por duas marcações, uma para o início do trecho e outra para o fim dele, sendo assim as informações de Trackstatus de um determinado trecho estarão na marcação no fim do trecho. Logo, ao alterar o Trackstatus de uma marcação o que estará sendo alterado é o trecho que vem antes da marcação.
As funções de cada botão dessa página são listadas abaixo:
Enviar Mapeamento - Envia o mapeamento que está na tabela "Mapeamento" para a memória ram do robô, dessa forma o mapeamento ainda não estaria salvo na flash e o mapeamento anterior não seria sobreescrito, entretanto se o robô fosse reiniciado ou desligado esse novo mapeamento seria apagado da memória do robô e precisaria ser enviado novamente, além disso, o envio do mapeamento só estará finalizado quando a imagem de envio bem sucedido aparecer e caso apereça uma mensagem de falha no envio será necessário fazer o envio novamente.
Ler Mapeamento - Lê o mapeamento que está armazenado na memória flash do robô e o exibe na tabela "Mapeamento", esse comando também carrega o mapeamento que está na flash do robô na ram, sobreescrevendo outros mapeamentos que estejam armazenados na ram no momento.
Ler Mapeamento na Ram - Lê o mapeamento que está armazenado na memória ram do robô e o exibe na tabela "Mapeamento", sendo útil para verificar se o mapeamento foi enviado corretamente para a ram.
Salvar Mapeamento - Salva o mapeamento que está na ram na memória flash, garantindo que ele se manterá salvo mesmo após o robô ser desligado ou reiniciado, essa função sobreescreve o mapeamento que estava anteriormente salvo na flash do robô, além disso, o mapeamrnto só estará completamente salvo na flash quando for exibida uma mensagem de sucesso ao salvar o mapeamento e caso seja exibida uma mensagem de falha será necessário tentar salvar novamente o mapeamento.
Deletar registro - Deleta um registro do mapeamento com base no seu id, para selecionar o id basta ir no campo "selecione o registro que será deletado" e escolher o id que deseja deletar, após isso basta pressionar o botão deletar registro, isso apenas deletará o registro na tabela "Mapeamento" e nada será alterado no robô, até que o mapeamento seja enviado à ele.
Deletar todos os registros - Deleta todos os registros do mapeamento na tabela "mapeamento" e no robô tanto na memória ram como na memória flash.
Adicionar registro - Adicionar um registro na tabela "mapeamento", o registro adicionado pode ser editado antes de ser incluído na tabela, bastando clicar nos campos para edição do registro na seção adicionar registro e após a conclusão da edição clicar no botão adicionar registro que ele será incluído na tabela do mapeamento, entretanto isso não alterará nada no robô até que o mapeamento seja enviado.
Dessa forma, para enviar um novo mapeamento ao robô bastaria primeiro clicar no botão ler mapeamento que carrega na tabela "Mapeamento" o mapeamento que está atualmente gravado na memória flash do robô, então fazer as alterações desejadas nesse mapeamento pela tabela "Mapeamento" e após isso clicar em enviar mapeamento com isso o mapeamento estará na memória ram do robô caso o envio seja bem sucedido e por fim para salvá-lo na memória flash basta clicar em salvar mapeamento e quando o mapeamento estiver salvo aparecerá uma mensagem confirmando isso, bastando clicar em "ok" e pronto o mapeamento do robô terá sido alterado e salvo e já estará em uso pelo robô. Abaixo está uma imagem que ilustra a alteração de um registro na tabela "Mapeamento" essa alteração é feita de forma semelhante à de um parâmetro, bastando clicar em cima do valor que você deseja alterar, como mostra a figura:
