En el tutorial anterior ya hemos explicado en que se basa el funcionamiento de nuestros motores paso a paso NEMA. Ahora mismo vamos a desarrollar la programación que nos permite controlar este tipo de motores con un Driver L298N.
¿Que necesitamos?
Para este tutorial requeriremos de:
- Placa Arduino
- Motor NEMA
- Driver de control motor paso a paso. (Driver L298N )
- Fuente de alimentación
¿Como funciona un L298N?
El driver L298N es en realidad un doble puente H, lo que nos permite controlar dos motores DC, o un motor de pasos. En este caso lo usaremos para el control de un motor de pasos NEMA.
El driver dispone de 4 entradas que controlan las 4 salidas a las que vamos a conectar nuestro motor NEMA.
Con el controlador L298N podemos controlar un solo motor paso a paso, ya que se necesitarán las 4 entradas para gobernar las 4 salidas que se dirigen al motor.
La fuente de alimentación está representada por unas pilas, pero estas deberían dar 12V o estar conectadas directamente a la red con un adaptador o fuente de 12 V.
Los cables que van de la placa Arduino a los pines de control, deben controlar cada una de las bobinas por parejas independientemente del orden que se conecten. Es decir, que los pines 5 y 6 controlarán una de las bobinas y los pines 9 y 10 la segunda bobina. Si invertimos los cables de la bobina el motor funcionará, pero en sentido inverso.
A veces el motor y el driver se calientan bastante, ya que este driver no posee un control de intensidad y trabaja con el voltaje nominal. En cambio, existen otros Drivers que poseen un potenciómetro y que podemos regular la intensidad que circulan por ellos para no saturarlos.
Librería Stepper
Para el control de este tipo de motores, Arduino ya dispone de una librería llamada Stepper. Podriamos controlar nuestro motor definiendo todo el orden de las señales como hemos comentado en el tutorial anterior. Pero en lugar de eso vamos a simplificar el proceso, usando esta librería.
La librería Stepper solamente contiene 3 métodos, que son:
- Constructor Stepper – Hay que definir el número de pasos, y los pines a los que se conecta.
- step() – Determina cuantos pasos se desplaza en cada momento
- setSpeed() – Establece la velocidad de movimiento
Un aspecto muy importante a tener en cuenta, es que el movimiento no dispone una referencia absoluta. Esto quiere decir que necesitaremos programar a mano el algoritmo en el que el motor alcanza las posiciones desde una referencia cero. El método step() realiza un movimiento relativo de pasos con respecto a su posición anterior.
Es muy importante definir bien el numero de pasos por vuelta ( 200 pasos usualmente) del motor correctamente en el constructor, ya que tendrán que coincidir, el movimiento de 200 pasos en una vuelta completa.
#include <Stepper.h> int actual_pos; int dir; int steps; int position; Stepper motor(200, 5, 6, 9, 10); void setup() { Serial.begin(9600); motor.setSpeed(100); actual_pos = (int)(0); dir = (int)(1); steps = (int)(5); position = (int)(600); } void loop() { actual_pos = actual_pos + dir * steps; motor.step((dir * steps)); Serial.println(actual_pos); if (actual_pos == position) { dir = -dir; position = -position; Serial.println("Change Direction"); Serial.println(dir); } }
Para que nuestro programa no sea constante, vamos a usar el monitor serie para mandar información y ejecutar instrucciones de movimiento desde el monitor.
En este aspecto, nos podremos dar cuenta, de que no necesitamos revisar la posición manualmente como haciamos anteriormente en cada iteración del bucle. Aunque hemos perdido la referencia absoluta, podemos añadir variables que definan esa referencia con el movimiento.
#include <Stepper.h> const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution // for your motor // initialize the stepper library on pins 8 through 11: Stepper myStepper(stepsPerRevolution, 5, 6, 9, 10); void setup() { Serial.begin(9600); // set the speed at 60 rpm: myStepper.setSpeed(60); // initialize the serial port: Serial.begin(9600); } void loop() { if (Serial.available()){ int serialData = Serial.read(); if( serialData== 'U'){ int val = Serial.readString().toInt(); myStepper.step(val); } if( serialData== 'D'){ int val = Serial.readString().toInt(); myStepper.step(-val); } if( serialData== 'V'){ int val = Serial.readString().toInt(); myStepper.setSpeed(val); } } }
Si nos damos cuenta, este ejercicio es muy parecido al que desarrollamos en la clase anterior de comunicación Bluetooth, por lo que aplicando el mismo contenido, podríamos desarrollar un control remoto de motores paso a paso.
La velocidad suele saturar aproximadamente en un valor de 300, ya que mecanicamente el motor no le dará tiempo a responder a las variaciones de señal en frecuencia. Aunque los motores paso a paso no son tan rápidos como los motores de corriente continua, es suficiente para muchas aplicaciones; pero lo que más interesa de estos motores es la precisión en posición para llegar a un punto determinado.
Movimiento angular vs Movimiento lineal
En el caso de querer construir una máquina que se mueva en una dirección con un motor paso a paso, deberemos definir una conversión de unidad angular a lineal.
La transmisión de movimiento ha de quedar definida con una relación de transmisión que dependerá de los diámetros utilizados en el mecanismo utilizado.
La transmisión más utilizada para este tipo de motores es la transmisión por correas o con un tornillo sinfin o guias dentadas.
Podemos encontrar muchas aplicaciones online que realizan este tipo de conversión para determinar el ratio de movimiento y que tienen en cuenta aspectos como los dientes de correa más utilizados o los pasos de un tornillo sin fin.
Para finalizar, podemos añadir que la librería Stepper aunque ya tiene integrado toda la programación para lo básico, a veces no es suficiente. En el siguiente tutorial avanzaremos con la librería AccelStepper que nos permite añadir un control de velocidad y aceleraciones y nos permite controlar una referencia absoluta.
Hemos añadido en el repositorio un ejemplo para controlar los motores sin librerías y que podréis modificar para hacer pruebas.
Una vez completado este tutorial, puedes acceder al siguiente nivel.
Los ejercicios de código, proyectos y recursos que desarrollaremos durante el curso se pueden consultar a través de nuestro Github.
Master primero agradecer el tutorial. Esta muy bueno y completo.
Solo tengo una duda. Los motores que deseo mover, son bipolares de 12 V, 30 ohm (1:62).
Entonces no me queda tan claro donde colocar la fuente de poder que es de 12V , ya que esta justo en el umbral , donde en ocasiones marca 12,3 V o 11,8V. Que me sugieres?
La ultima consulta, ¿este driver no tiene impedimentos para funcionar con motores de 30 ohmios de resistencia?
Muchas gracias!! ?
Hola César.
Los motores paso a paso pueden ser de cualquier carga ( siempre que no consuman demasiado amperaje ). En función de la resistencia, el módulo consumira distinta intensidad para generar el movimiento.
El voltaje casi nunca son 12V exactos, los módulos suelen tener un filtro que ajusta el voltaje al nivel requerido, por lo que eso no debería preocuparte. Conecta siempre el voltaje de alimentación a los bornes positivo y negativo.
El número de pasos sí que deberas controlarlos tú mismo para realizar una vuelta, en función de las características del motor.
Un saludo
Excelente aporte muchachos!! Un saludo enorme desde Argentina.