Recicla!

Siguiendo las ideas del Zero Waste, en esta entrada vamos a ver como dar vida a los motores paso a paso que nos podemos encontrar en viejas impresoras, usando un driver DRV8825 y Arduino. En este caso vamos a usar unos motores que encontré en una impresora de un punto limpio (no recuerdo cuál era). La impresora debió morir, pero no todas sus piezas, de echo de una impresora se pueden recuperar, para luego usar en nuestros proyectos, multitud de sensores, engranajes y motores (entre otras cosas). Os animo a intentar dar vida a todas estas piezas de tecnología que parecen inútiles una vez termina su función principal, pero que con algo de creatividad se pueden convertir en proyectos muy interesantes.

Materiales

Motor paso a paso

Hay millones de tutoriales y explicaciones online de qué son y como funcionan los motores paso a paso(Wikipedia). Pero en resumidas cuentas, lo que nos interesa a nosotros es que, son un grupo de imanes y un par de bobinas que si se alimentan en el orden correcto la atracción/repulsión de los imanes con las bobinas se puede controlar, y de esta manera hacer girar el motor de manera muy precisa. En función del número de bobinas e imanes que formen nuestro motor paso a paso, cada vez que accionemos una y otra bobina, avanzará unos grados u otros. El cambio de ángulo que ejecuta un motor se conoce como paso del motor.

Modos de funcionamiento

Aunque los motores tienen un paso fijo, se pueden accionar las bobinas de diferentes maneras para aumentar la precisión o el par del motor. Por ejemplo, en el modo Full step o Paso completo, se va accionando la bobina con la que quieres atraer el motor. Si este modo van activando de manera secuencial las bobinas conseguimos girar el motor. En el modo Full Step se dan los giros más grandes posibles, haciendo que este sea un modo perfecto para conseguir velocidad.

Sin embargo, si en nuestro proyecto necesitamos que el motor tenga que realizar mucho par, el modo ideal sería el Half Step. En este se consigue el medio paso, activando dos bobinas a la vez, haciendo que el imán se quede en medio de las dos. Como en este caso tenemos dos bobinas actuando sobre el imán, este hará más fuerza y se opondrá más al movimiento, generando más fuerza.

Además de los modos que ya hemos comentado (Full Step y Half Step), cuando se necesita mucha precisión existen los modos de micropasos. En estos modos podemos llegar a bajar los grados de giro hasta 1/32 los grados del paso completo. Es decir, si ponemos el modo 1/32 pasos en un motor de 48 pasos, necesitaremos 1536 pasos para dar una vuelta completa.Con 1536 pasos, cada paso solo giraría el motor en 0.23º. Como vemos, estos modos se pueden usar en aplicaciones que necesiten mucha precisión.

DRV8825

El DRV8825 es un chip preparado para controlar el movimiento de motores paso a paso. Consta, entre otras cosas, de un par de puentes H y controlador de corriente. El par de puentes H sirve para energizar cada una de las bobinas del motor de manera independiente y en ambas polarizaciones (Wikipedia). Por su parte, el controlador de corriente permite usar este chip para controlar motores de menor voltaje que el mínimo de la placa (8.2V). Es decir, podemos usar una fuente de 10V para manejar un motor paso a paso de 5V, siempre que configuremos la corriente máxima, a la corriente del motor.

Conexión

La manera de conectar el DRV8825 es como se ve en la siguiente imagen. De acuerdo al fabricante es muy importante poner un condensador de al menos 47 uF (aunque es si es mayor, es mejor) muy cerca de los pines de alimentación de la placa.

Conexión DRV8825

Conexión DRV8825

  • RESET, SLEEP y FAULT – +5V
  • Vm y GND (El más cercano) – Fuente de 8.2-45V
  • GND (el de abajo) – GND de los +5V
  • M0-M1 – Se usan para elegir los pasos según la siguiente tabla. Si se dejan al aire tienen un pulldown para ponerlas por defecto a GND
  • STEP y DIR – Pines digitales del Arduino (en mi caso el digital 8 y 9)
  • B2B1 y A1A2 – A las entradas del motor
Configuración de pasos del DRV8825

Configuración de pasos del DRV8825

Limitando la corriente

Una característica muy importante del DRV8825 es la capacidad de hacer Chopping (Limitación de corriente). Imaginemos que tenemos un motor con una corriente nominal de 1A y 1 Ohm de resistencia en las bobinas. Seguramente si a este motor lo alimentamos con 1V, ni siquiera se mueva. Sin embargo, si fijamos la corriente máxima a 1A en el DRV8825 y luego lo alimentamos con 12V, el chip se encargará de no destrozarnos el motor mientras lo mueve con más soltura.

En el caso de la plaquita que estamos usando nosotros (teneis el link más abajo), la limitación de corriente se configura con un potenciometro. La relación entre el voltaje de referencia y la intensidad es de 0,5*Vref. Y podemos medirla entre cualquier tierra del circuito y la parte superior del potenciometro. Por ejemplo, en el caso de que la corriente de nuestro motor sea de 1.4A, necesitaremos configurar la Vref hasta que midamos con el multímetro 0,7V.

Manos a la obra

Como ya he explicado al inicio, voy a usar un motor que saqué de una impresora antigua. Es un motor que parece bastante potente y con unas dimensiones aceptables para cualquier proyecto casero. Lo que vamos a hacer es un programa simple con Arduino y el DRV8825 para girar el motor y hacerle dar un par de vueltas. Luego haremos algunos ajustes para encontrar cual es la mayor velocidad de giro posible.

Para esto necesitamos:

Paso 1: Conectar el DRV8825 al Arduino

Primero conectaremos el DRV8825 y el Arduino. Tendremos que conectar el pin de 5V de alimentación del Arduino al pin nRESET y nSLEEP del DRV8825. Luego conectamos la tierra del Arduino con la tierra que está al lado del nFAULT. Y por último, conectamos los pines STEP y DIR a algún pin digital del Arduino, en mi caso los pines D8 y D9.

Paso 2: Configurar el DRV8825

Una vez tenemos el primer paso completado, podemos conectar el Arduino con nuestra PC a través del USB y medir la Vref del DRV8825 (La explicación del porqué la tenéis más arriba). Yo estoy usando un motor de 1A así que configuro la Vref a 0,5V.

Es importante no conectar todavía el motor ya que si al arrancar la corriente está mal configurada, podría destrozar el motor o la placa.

Paso 3: Terminar de conectar y programar

Por último, y con la corriente ya configurada, podemos conectar la fuente de 12V y el motor. Además, no olvideis conectar un condensador de al menos 47uF (aunque si tenéis de 100uF, mejor) y que soporte con holgura los 12V. En mi caso, y para evitarme problemas, he colocado uno de 18V y 100uF muy cerca de la entrada del chip. Con todo conectado el circuito debería quedar como en la siguiente imagen.

Diagrama DRV8825 completo

Diagrama DRV8825 completo

Una vez todo está conectado, solo nos queda programar el Arduino. El código es muy sencillo, para controlar el DRV8825 solo tenemos que marcarle la dirección y cuando queremos que avance “un paso”. Depende de como estén conectadas las bobinas a las salidas A1-A2/B1-B2 de la placa, la dirección será una u otra. Es decir, tendréis que probar si al poner el pin DIR a HIGH el motor se mueve hacia la derecha o hacia la izquierda. Por la otra parte, cada vez que el valor del pin STEP cambia de ‘0’ a ‘1’ el motor avanza un paso, qué dependerá del modo en el que esté el motor. Si habéis seguido este tutorial, los pines M0-M2 estarán al aire, lo que significa que estaréis en el modo Full Step. En este modo, y con mi motor, necesitamos 48 pasos para dar una vuelta completa.

Tenemos que tener en cuenta que el motor tarda un tiempo en reaccionar a la entrada, y que si mandamos avanzar los pasos demasiado rápido podemos hacer que el motor no avance nada. En el código que os añado después de este párrafo he configurado el motor para girar lo más rápido posible (avanzando un paso cada 1,1ms). En mi caso, si bajo ese valor, el motor se queda atascado ya que no le da tiempo a avanzar entre los diferentes imanes.

Para conseguir todo esto hay que realizar una configuración mínima: poner los pines que están conectados al STEP y DIR en modo salida, y setear la dirección de giro que queremos. Luego en el bucle principal, tenemos que realizar un bucle para enviar los pasos que necesitamos para movernos lo que queremos. En nuestro ejemplo vamos a girar una vuelta completa, que en nuestro motor son 48 pasos. Si quisiéramos girar solo media vuelta, pondríamos 24 repeticiones del bucle. Luego, para ver que gira bien, y que hace lo que le decimos, esperamos un segundo entre vueltas para poder comprobar la posición de inicio y de final.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const int dirPin = 8;
const int stepPin = 9;

int deltaStep;
 
void setup() {
   // Marcar los pines como salida
   pinMode(dirPin, OUTPUT);
   pinMode(stepPin, OUTPUT);
   digitalWrite(dirPin, HIGH);
}
 
void loop() {

   deltaStep= 1100;
   // Enviamos 48 steps
   for (int i = 0; i < 48; i++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(deltaStep);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(deltaStep);
   }
   delay(1000);
}

Y con esto estaría todo! Si encendéis la fuente de 5V y la de 12V, el motor empezará a hacer giros cada segundo.

Si tenéis cualquier pregunta no dudéis en escribir un comentario!


Gluón

Teleco con ganas de aprender más y compartirlo. Viajero empedernido y amante de la fotografía y la tecnología. Espero dejar mi granito de arena y que este pueda servir de ayuda.