# Motores.hpp
[toc]
## Objetivo:
- Passar os sinais que controlarão os motores e, consequentemente, a locomoção do robô. Ela também é responsável por inicializar seus pinos e anexar os canais PWM.
## Ferramentas utilizadas:
- Não são utilizadas bibliotecas, além da biblioteca do Arduino que permite usar as funções de inicialização dos pinos e da chamada do Datacenter.
## Passo a passo para rodar o projeto:
- Por ser um arquivo responsavel pela locomoção ele deve receber os principais parâmetros, como o valor das constantes a serem enviadas para os motores, que são geradas por outros arquivos que fazem os cálculos nescessários para se chegar ao valor ideal.
## Instruções de teste:
- Para testar o código, é nescessário ligar o robô no estado de "running" e "maping", para verificarmos se todos os sinais nescessários para cada estado foram enviados corretamente aos motores.
## Fluxograma:
- [Fluxograma](https://miro.com/app/board/uXjVPBOHiqc=/)
## Partes técnicas e afins:
### Funções no código e seus propósitos:
**initMotors()**
**stopRobot()**
**setPWMs()**
### moveSimple()
**Explicando o funcionamento**
A moveSimple não recebe nenhum parâmetro como entrada, porém, ao longo da função, disversas variáveis globais são lidas e modificadas (como contadores de tics, variaveis que indicam se o robo esta freiando ou não, dados armazenados nos arrays de trechos e etc)
O objetivo da move simple é avaliar todas as informações relevantes disponíveis no código e usa-las para determinar qual deve ser a potência enviada para o motor através da função setPWMs
Algumas informações que são levadas em consideração pela move simple são:
* o PID
* Em que parte do trecho o robô se encontra
* Qual é o multiplicador de velocidade foi escolhido para esse trecho
* o robô está fazendo uma curva ou não
* A velocidade atual do robô
Todas essas informações são utilizadas para processar as variáveis associadas a volocidade de cada roda do robô (right e left) que são usadas de imput na função setPWM no final da movesimple
para entender melhor as tomadas de decisão da função, ver fluxograma
**Problemas no código da move simple:**
existe uma inconsistência entre chamar o stretch no índice atual ou no índice atual menos 1
O primeiro if que verifica se ele está TryingTobreak é inútil, pois aplica um modificador que é ignorado pelo resto do código
A curveConstant está mal comentada, curve constant é a constante que indica o peso que o erro terá sobre a diminuição da velocidade durante as curvas. Em outras palavras: a curve constant determina se a diminuição da velocidade nas curvas será igual a 2 vezes o erro? 3 vezes o erro? 0.5 vezes o erro? ou alguma outra ocnstante
Os 50 tics que são considerados para determinar o fim do trecho poderiam estar guardados em uma variável com nome intuitivo (principalmente pq o número 50 é chamado mais de uma vez)
Muitos pedaços do código poderiam ser organizados em classe. Por exemplo: no meio da função a média da distânicia percorrida pelos encoders em tics é calculada, isso poderia ser um método q calcula a média dos encoders. Em outro pedaço do código é aplicado um freio motor, o freio motor poderia ser um método da classe motores e assim por diante
### Possíveis Dúvidas:
### Possíveis melhorias:
## Problemas encontrados:
Os principais problemas encontrados, estão relacionados à função moveSimple, que não é nem um pouco simples e nem intuitiva de se entender, e boas partes desses problemas já foram comentados acima. Além disso, há partes do código que poderiam ser mais comentadas e parâmetro/valores de constantes que poderiam ter uma explicação.