Control de Motores de baja resolución con Arduino


Este proyecto sólo es posible para encoders de muy baja resolución.

Menos de 20 PPR.

En este apartado controlaremos la posición de una reductora con motor DC mediante un encoder incremental de muy baja resolución y un Arduino. 

En la imagen de arriba puedes ver los pines de interrupción externa para diferentes tipo de Arduinos. En este proyecto usaré un Arduino Nano, que además es 100% compatible con Arduino UNO.

A través de los pines de interrupción externa D2 y D3 contabilizaremos los pulsos. Mediante software haremos que cuando el encoder tome un sentido, cuente un contador y cuando vaya en sentido contrario descuente el contador.

Hay trucos para conseguir un contaje de x1, x2 y x4. Por ejemplo en "x4" conseguimos multiplicar por 4 la resolución del encoder. Para ello necesitamos las dos líneas de interrupción nombradas antes (D2 y D3).

El funcionamiento es muy sencillo, se trata de un simple comparador digital. Compara lo que le hayamos introducido a través del puerto serie (RS232) con la posición del encoder (contador de pulsos bidireccional). Si es mayor el motor ha de girar en un sentido, si es menor ha de girar en sentido contrario y si es igual el motor ha de parar.

A este tipo de control de motores se le llama Comparación Numérica. El motor funcionará en un "todo o nada" y esto significa que si lleva mucha velocidad o inercia, quizás el motor al intentar parar no lo haga de golpe, sino que tendrá un movimiento pendular hasta parar. En pequeños motores con reductora (engranajes) esto no será mucho problema y en el caso de que lo fuese sólo has de bajar el voltaje que alimenta del motor. 

Por otra parte, recuerda que esta técnica de control sólo es aplicable a motores de muy baja resolución, y es debido a que ha de tener un espacio para poder parar. Si el espacio es muy estrecho (por ejemplo, cuando se usa encoders de media o alta resolución) no tendría espacio donde parar, y estaría todo el rato vibrando.

Los pines D5 y D6 son los que han de ir al Puente en H para controlar el motor. Los puentes en H suelen tener un pin llamado "enable".  Si está a 1 lógico permitirá el movimiento del motor, y si está a 0 lógico deshabilitará el movimiento. El pin "enable" en este proyecto siempre ha de estar a 1 lógico de manera fija.

Cuando lo tengas todo cableado, alimentado y el código subido al Arduino, lo primero que has de hacer es mover el encoder o eje del motor. Si se pone en marcha y no para de girar significa que los cables del motor están al revés. Lo que has de hacer es invertir esos cables, o bien, los cables que van al puente en H, los inviertes. Es decir, que el cable que va en D5 lo pones en D6, y el otro cable que iba en D6, lo pones en D5.

El motor ha de estar en reposo, y si lo movemos ha de mantener la posición en la que estaba en reposo.

Cuando quieras llevar el motor a una posición determinada, has de introducir un valor a través del terminal serie. Por defecto el serial está programado para funcionar a 115200 baudios. En el terminal serie escribes la letra 'G' y después la posición. Por ejemplo:

G3200

Esa G siempre ha de estar delante del número (posición). La G significa "go", es decir, "ir". El contador del encoder y la variable de posición final (setpoint) son de 32 bits con signo. Esto significa que puedes introducir posiciones desde 2147483647 hasta -2147483648. Son muchos pulsos los que puede contar (miles de millones)...

Si has de introducir posiciones negativas, hazlo de esta manera (es un ejemplo) :

G-1846

Le pones el "signo menos" '-' delante del número.

La letra G que va delante puede ser en mayúscula o en minúscula, el programa reconocerá ambas formas de escribir la letra G.

Cuando se trabaja con encoders incrementales, en la vida real el motor ha de tener una posición cero fija, y al ponerlo en marcha ha de buscar esa posición cero. Esto significa que debería ir hacia atrás hasta encontrar dicha posición. Esta parte no la he incluido en el proyecto porque se volvería más complicado ponerlo en marcha, pero como ejercicio estaría bien que lo intentases hacer. Necesitarás un pin cualquiera de Arduino, que al activarse pusiera el contador del encoder y el "setpoint" (posición deseada) a cero.

Recuerda que si al poner en marcha el circuito, el motor no para de girar, o al mover el motor hace eso mismo, lo que has de hacer es enrocar (intercambiar) los cables que van del microcontrolador al puente en H. El motor ha de estar completamente parado al inicio, y si lo obligases manualmente, el motor ha de querer volver a su posición de reposo.