Hola a todos hoy vamos a ver como podemos controlar un motor paso a paso con arduino y poder hacer una retro alimentación de posición por medio de un encoder rotativo acoplado a su eje.
Esto nos puede ser muy útil para algún proyecto en el que necesitemos asegurarnos que el motor paso a paso esta en una posición determinada o que ha dado efectivamente una cierta cantidad de pasos.
Ademas en caso de que el eje del motor se mueva por alguna razón el programa sera capaz de corregir ese error y llevar al motor a la posición correcta.
Para llevar a cabo esto vamos a utilizar un arduino uno, un driver para motores pap, yo utilice un driver A4988 (pololu), un motor paso a paso bipolar, un encoder rotativo o electromecánico y algunas resistencias, cables, protoboard etc.
A continuación se muestra el circuito en protoboard:
Para el montaje del circuito vamos a necesitar los siguientes materiales:
Protoboard x 1
arduino uno x 1
capacitor 100nf x 2
capacitor 100uf x 1
resistencias 10k ohms x 4
driver A4988 x 1
motor paso a paso bipolar x 1
encoder rotativo x 1
cables para conexion
fuente de alimentación x 12 volts
En mi caso yo use un motor paso paso modelo PM24M-048 que es un motor bipolar de 48 pasos por revolución y 7.5 grados por paso.
pero se puede usar cualquier motor paso a paso bipolar que tengamos a la mano.
El encoder tendrá que ser acoplado al eje del motor, en mi caso yo lo pegue con un poco de pegamento del lado posterior y soldé un alambre rígido entre el cuerpo del encoder y el cuerpo del motor. De modo que cuando gire el eje del motor solo se mueva el eje del encoder.
El driver que use para controlar el motor es un A4988, estos se controlan muy fácilmente con solo 3 señales desde arduino las cuales deberemos conectar a salidas digitales:
Estos 3 pines son el pin de STEP o paso, que es donde deberemos aplicar un pulso por cada paso que queramos que de el motor, el pin DIR o dirección es el pin que controla el sentido de giro del motor y el sentido dependerá del estado lógico que apliquemos a este pin 0 o 1. Y por ultimo el pin de ENABLE que lo que hace es permitir o no el paso de corriente hacia las bobinas del motor. Cuando este pin esta en estado alto o 1 no circula corriente por las bobinas de modo que por mas que apliquemos pulsos en el pin STEP el motor no se moverá.
En cambio si este pin esta en estado bajo o 0 el motor quedara energizado y permitirá que este funcione. Estos drivers se alimentan con 2 fuentes una de 5 voltios para el circuito lógico (VDD) y otra alimentación de 8 a 35 volts para la parte de potencia del driver (VMOT). En este caso yo voy a alimentar la parte lógica desde la salida de 5 volts de arduino uno y con una fuente externa de 12 volts alimentare la parte de potencia del driver.
Ademas este driver tiene unos pines adicionales con los que podemos configurar los micro pasos del motor, estos pines son ms1 ms2 y ms3, yo voy a configurar el driver en 16 micro pasos asi que a estos 3 pines los voy a conectar a 5 volts. Los pines reset y sleep los vamos a conectar entre si para que estos mantengan un estado alto,, cuando aplicamos un estado bajo o 0 volts al pin de reset este reinicia todos los circuitos internos del driver y los pulsos de control no tendrán efecto hasta que este regrese a su estado alto o 1, por otro lado el pin de Sleep al tener un estado bajo o 0 volts, pone el driver en modo de bajo consumo de energía apagando gran parte de los circuitos internos del driver. Esto sirve para reducir el consumo de energía en aquellos momentos en los que el driver no esta siendo utilizado.
Por ultimo las salidas 1A y 1B corresponden a una bobina del motor y las salidas 2A y 2B corresponden a la otra bobina del motor paso a paso.
Ahora para la conexión del encoder tenemos que observar que el encoder usado por mi es un encoder de 3 pines en las cuales el pin central es el punto medio y los pines de los extremos son las salidas. El pin central lo vamos a conectar a GND o tierra. Los pines de los extremos los vamos a conectar a los pines digitales 2 y 3 de nuestro arduino uno.
Pero al ser un encoder electromecánico estos suelen generar un ruido producido por los contactos internos del mismo, que podrían resultar en una mala lectura del encoder y por lo tanto vamos a montar un simple filtro para eliminar este ruido.
En el esquema anterior se puede observar el circuito del filtro que consta de 4 resistencias de 10k ohms y 2 capacitares de 0.01uf, yo en mi caso use unos de 104 o 100nf por que era lo que tenia a mano pero estos funcionan de todos modos.
Una vez montados todo los circuitos podemos proceder a programar nuestro arduino para controlar el motor y leer los datos del encoder. Para esto yo voy a hacer uso de 2 librerías, una es la librería BasicStepperDriver.h que lo que tiene como ventaja es que tiene soporte para el driver A4988 y otros similares. También vamos a utilizar la librería Encoder.h con la que vamos a leer el encoder.
/*------------------------------------------------------------------------------- * Control de posicion de un motor paso a paso con ecoder rotativo * Se envían las posiciones a la que se desea que el motor se mueva por medio de * el monitor serial ej: 100 o -200 * El motor se acciona hasta que el encoder alcanza la posición indicada. * Texolab.net */ #include <Encoder.h> // libreria para la lectura del encoder rotativo #include <Arduino.h> // librerias para el control del motor paso a paso #include "BasicStepperDriver.h" #define MOTOR_PASOS 48 // cantidad de pasos por revolucion de mi motor #define STEP_PIN A3 // pin de arduino donde conectamos el Pin STEP de Driver #define DIR_PIN A2 //Pin de arduino conde conectamos el PIN direccion del driver #define ENABLE_PIN A4 //Pin de arduino donde conectamos el pin de Enable del driver BasicStepperDriver motor(MOTOR_PASOS, DIR_PIN, STEP_PIN, ENABLE_PIN); // Configuramos nuestro motor Encoder myEnc(2, 3); //Configuramos nuestro encoder en los pines 2 y 3 int oldPosition = 0; // variable donde almacenamos la posicion del encoder int tgtpos = 0; // variable donde almacenamos la posicion a la que debe moverse el motor void setup() { Serial.begin(115200); // configuramos el puerto serie a 115200 buadios motor.setRPM(500); // establecemos las RPM maximas de nuestro motor motor.setMicrostep(16); // micropasos del motor motor.disable(); // desactivamos el motor al inicio } void loop() { // Leemos el puerto serie en busca de la posicion a la que debe moverse el motor while(Serial.available()){ tgtpos = Serial.parseInt(); Serial.print(tgtpos); } // Leemos el encoder y almacenamos la posicion en la variable oldPosition si esta a cambiado int newPosition = myEnc.read(); if (newPosition != oldPosition) { oldPosition = newPosition; Serial.println(newPosition); } delayMicroseconds(2); // Al inicio del programa la posicion del encoder es 0 al igual que la posicion del motor if(oldPosition != tgtpos){ //comparamos la posicion del encoder y la del motor son las misma if(tgtpos > oldPosition){ // si las posiciones son distintas motor.enable(); //movemos el eje del motor hasta igualar las 2 posiciones. motor.move(1); // para mover el motor por a la derecha usamos la funcion ej: motor.move(1); motor.disable(); //si queremeos mover el motor en la direccion contraria el numero debera ser negativo ej: motor.move(-1); } if(tgtpos < oldPosition){ motor.enable(); motor.move(-1); motor.disable(); } } }
Ahora podemos conectar nuestro arduino al puerto serie cargar el programa y podremos ver como enviando números desde el monitor serie de arduino ide podremos controlar el motor. Por ejemplo si enviamos un 100 veremos que el motor comienza a girar en dirección positiva hasta que el encoder se encuentre en la posición indicada. Si con interrumpimos el movimiento del eje del motor frenandolo veremos como al soltarlo el motor continua dominemos hasta alcanzar la posición correcta.
Del mismo modo si con el motor detenido ya en su posición nosotros movemos el eje del motor este movimiento forzado se vera reflejado en el monitor serial y al soltar el eje este se moverá de regreso a la posición en la que estaba anteriormente.
Este tipo de control de motor con feedback nos permite ver como podríamos implementar un sistema en el que la posición del motor se corrija automáticamente en caso de que esta sea modificada por un factor externo. O también podríamos activar alguna especie de alarma en caso de que el motor sea bloqueado y no logre alcanzar su posición correcta.
Ahora les dejo un video del sistema funcionando:
Espero que les haya gustado este post, no olviden compartir.
Hasta la próxima.
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.