---
# System prepended metadata

title: Motores.hpp

---

# 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.