30 nov 2017

Motor Paso a Paso y Encoder en Arduino

Motor Paso a Paso y Encoder en Arduino


Tutorial

En este tutorial, el motor paso a paso (en adelante, MPP) se moverá de acuerdo a cómo se rota el encoder. Además, el encoder posee un botón central, el cual se utiliza para devolver el MPP hacia su posición inicial. En este proyecto, se utiliza, un MPP NEMA 17 (ver Figura 1) con un encoder rotatorio con botón (o pulsador) incluido (ver Figura 2), como controlador para el motor se utiliza la tarjeta Easy Driver (ver Figura 3), la tarjeta de programación electrónica utilizada es un Arduino UNO (ver Figura 4).

Figura 1: Motor Paso a Paso NEMA 17

Figura 2: Encoder Rotatorio con botón central en la manilla

Figura 3: Tarjeta controladora para Motores Paso a Paso ‘Easy Driver

Figura 4: Tarjeta Electrónica de Programación ‘Arduino UNO’

En la Figura 5 se muestra el diagrama esquemático del proyecto. Como se muestra en el diagrama, se utilizan 5 pines para conectar el controlador Easy Driver y 3 pines para el Encoder. Los 4 cables del MPP NEMA (2 por bobina), son conectados directamente a las salidas A y B del Easy Driver. Los pines 2, 3 y 4 del Arduino están conectados a los pines CLK, DT y SW, respectivamente, del encoder rotatorio. El pin voltaje y GND Easy Driver son conectados a una fuente de alimentación de 12V 1A. El motor NEMA 17 que se utiliza tiene un amperaje máximo de alrededor de 0.45A. Se conecta el GND del Arduino UNO al Easy Driver para servir como una referencia.

Para la programación del Arduino, se utiliza como apoyo explicativo el diagrama de flujo mostrado en la Figura 6. En primera instancia, se definen los pines que se conectan a la tarjeta Easy Driver, se declaran las variables para las interrupciones para detectar el movimiento del Encoder Rotatorio , se declaran las constantes para las conexiones del Encoder, se declaran las variables para almacenar la posición del MPP, para el control de la velocidad y para setear la dirección de la rotación del MPP, ya sea derecha o izquierda. La variable para guardar la posición actual, se utiliza para poder mover de regreso a la posición inicial, cuando el botón es presionado. A continuación, se muestra el código correspondiente.


 


Figura 5: Diagrama Esquemático del Proyecto


 


Figura 6: Diagrama de Flujo Generalizado para la programación

Luego, se desarrolla una función para una rutina de interrupción que se ejecuta si la señal CLK va desde HIGH a LOW. Si la señal en el PinCLK es HIGH, entonces la señal en el PinDT también es HIGH. Lo mismo ocurre con LOW. Esto permite determinar el sentido de la variable DeteccionRotacion de acuerdo a cómo se mueva el encoder rotatorio. Debido a que es una función, se ejecutarán las instrucciones cuando sea llamada o invocada.

En la función setup() se inicializan los pines de entrada y salida, y aquellas instrucciones que se ejecutan una vez al iniciar la ejecución del programa.

En la función loop() se ejecutan aquellas instrucciones que se repiten durante el funcionamiento. En esta función se tienen las siguientes instrucciones. Se consulta si el botón del encoder PinSW es presionado. Luego se consulta si la posición del motor PosicionMpp es distinto de cero, es decir que se ha movido y no se encuentra en la posición inicial. Luego, se consulta si el motor se ha movido hacia la derecha, para ello, la PosicionMpp debió haber aumentado con respecto a la posición inicial. Si se cumplen las tres condiciones anteriores, entonces el motor regresará a la posición inicial moviéndose hacia la izquierda. Como no se utiliza ninguna librería en este proyecto, para mover el Motor NEMA 17, se debe ingresar HIGH y Low muy rápido. La variable PasosRecorrido se utiliza para controlar de cierta manera, la velocidad por cada movimiento. Hay librerías que permiten más opciones, como establecer la velocidad, la aceleración y más.

De manera similar al algoritmo anterior, en caso de que el motor se ha movido hacia la izquierda, se regresará a la posición inicial moviéndose el motor hacia la derecha.

La decisión principal anterior, corresponde a la decisión de cuándo es presionado el botón del encoder para regresar al motor a su posición inicial. Otra decisión principal, corresponde a la decisión de cuándo es rotado el encoder para mover el motor hacia una determinada posición y dirección, de acuerdo al movimiento de rotación del encoder. Para lograr esta decisión principal, en primera instancia se consulta si hay una vuelta detectada en el encoder rotatorio, es decir, si la variable VueltaDetectada es igual a true. Luego, la misma variable se iguala a false, para evitar que el encoder rotatorio genere pasos adicionales, lo que podría provocar una posición incorrecta del motor. A continuación, se consulta la dirección de la rotación del encoder, por medio de la variable DireccionRotacion. Si DireccionRotacion es igual a true, significa que el encoder se ha movido en sentido anti-horario, por lo que el motor se moverá en la misma dirección. Las instrucciones para mover el motor son similares a las utilizadas anteriormente, para cuando se mueve el motor en el momento en que el botón es presionado.

En el caso de que la rotación del encoder sea a la derecha (sentido horario), DireccionRotacion = false, entonces se moverá el motor en la misma dirección.

Vídeo y Documento PDF


Suscríbete