sexta-feira, 26 de agosto de 2016

Sincronizar a rotação de rodas usando encoders e arduíno

Estou trabalhando em um projeto envolvendo um robô holonômico, esse robô se movimenta utilizando rodas ligadas a dois motores DC.  Um problema que tenho enfrentado diz respeito à sua movimentação. Devido a uma série de motivos, as rodas em certos momentos não giram a mesma velocidade, por consequência, tenho um desvio indesejado na direção de movimentação do robô. 
A princípio, tentei corrigir isso utilizando 2 encoders, utilizando os mesmos para garantir que as rodas girassem a mesma quantidade, ou seja, realizassem o mesmo deslocamento. Não foi uma técnica muito eficiente, pois mesmo garantindo que as duas rodas realizassem o mesmo deslocamento, não consegui garantir a mesma velocidade em ambas, logo, ainda assim estava sofrendo mudanças de trajetórias, mesmo que ao final do movimento a direção fosse preservada. 
Então utilizei uma outra técnica, onde a sincronização das rodas são realizadas a todo momento em pleno movimento. Para isso, implementei um algoritmo onde o arduíno realiza continuamente leituras nos encoders de forma individual, e quando um encoder estiver adiantado em relação ao outro mesmo que por 2bits, ele para o motor adiantado e o ativa novamente quando o próximo acompanhar. Como a precisão é de 2 bits, ou seja, um estado lógico alto do encoder, esse procedimento leva milésimos de segundo a depender da velocidade com que a roda gira.