En el artículo anterior puedes ver la primer parte de esta serie donde hablamos todo sobre motores paso a paso. En esta segunda parte, toca tratar el funcionamiento de los drivers para este tipo de motores.
Cuando hablamos de impresoras 3D, máquinas de Control Numérico computarizado, CNC (Computarized Numeric Control), trazadores gráficos (plotters) o de robots, nos asombramos de los movimientos tan precisos que deben realizar e imaginamos cómo debe ser la electrónica para poder controlar los motores que estas máquinas utilizan. En este artículo vamos a analizar los motores paso a paso y los drivers A4988, DRV8825 y TMC2209 encargados de realizar esta función, también veremos las bases del firmware Marlin.
Así que, si te interesan estos temas de la tecnología, te invito a que te sientes cómodamente y vamos a empezar.
Indice de contenidos
- 1 Partes de una impresora 3D
- 2 Motores NEMA 17 y NEMA 23
- 3 A4988 DRV8825 TMC2209 drivers más usados en impresoras 3D
- 4 Driver para motores paso a paso A4988
- 5 Chip del driver A4988
- 6 Configuración de pines del driver A4988
- 7 Cómo se usa el driver A4988
- 8 Driver para motores paso a paso DRV8825
- 9 Chip del driver DRV8825
- 10 Configuración de pines del driver DRV8825
- 11 Cómo se usa el driver DRV8825
- 12 Driver para motores paso a paso TMC2209
- 13 Chip del driver TMC2209
- 14 Configuración de pines del driver TMC2209
- 15 Esquema de conexiones Arduino, TMC2209 y motor paso a paso
- 16 Cómo se usa el driver TMC2209
- 17 Marlin el firmware para impresoras de código abierto
- 18 ¿Qué es Marlin y para qué sirve?
- 19 Conclusión sobre los drivers para impresoras 3D
Partes de una impresora 3D
Una impresora 3D es un dispositivo capaz de reproducir un objeto sólido en 3 dimensiones mediante la adición de material (método aditivo). En este punto está la gran diferencia con las máquinas CNC, que también imprimen o más bien moldean, realizan torno, rectificación o corte de objetos con la sustracción de material (método sustractivo) y por tanto generan más residuo, aunque también son más rápidas.
En este artículo nos centraremos en las impresoras 3D y cómo se realiza el control de sus motores paso a paso, especialmente aquellas impresoras ensambladas por makers que basan su funcionamiento en el Arduino Mega y el modulo (shield) RAMPS.
Si estás empezando con Arduino y no conoces estos términos, no te preocupes que lo irás entendiendo a lo largo del artículo. Pero antes un resumen general y muy básico del funcionamiento de las impresoras 3D.
Existen muchos tipos de impresoras 3D según la tecnología que se utilice. Algunas de ellas son las FDM o Modelado por Deposición Fundida (Fused Deposition Modeling), SLS o Sintetización Selectiva por Láser (Selective Laser Sintering), SLA o estereolitografía (stereolithography), DLP o Procesamiento Digital por Luz (Digital Light Processing), entre otras. Aquí nos interesa el metodo que permita crear facilmente nuestros propios cacharros.
:) «hazlo tú mismo, DIY (Do It Yourself)».
Por ello en este artículo nos centraremos en las impresoras 3D FDM.
Algunas de las características más importantes de una impresora 3D FDM son:
- Componentes económicos
- Costos por impresión bajos
- Relativamente fáciles de usar
Así mismo hay varios tipos de impresoras 3D FDM.
- Cartesiana
- Delta
- Core XY
- Polar
- Brazo Robot
La gráfica inferior nos muestra una impresora 3D FDM cartesiana típica, que es la que usaremos como referencia en nuestro artículo.
Este tipo de impresoras cuentan con 3 ejes perpendiculares y son de las más comunes en el mercado; utiliza el sistema de coordenadas dimensionales cartesianas X, Y, Z.
Su funcionamiento se basa en un sistema de extrusión (del latín extrudere, que significa expulsar) de un filamento de material termoplástico (hay mucha variedad, ABS (Acrylonitrile Butadiene Styrene), PLA (PolyLactic Acid), que es biodegradable, entre otros), que es empujado por un motor paso a paso, a través de un orificio o boquilla previamente calentada que lo derrite y lo deposita capa por capa sobre la cama o base de impresión (que puede ser caliente o fría), en unas coordenadas que le hemos indicado previamente, para así formar un objeto tridimensional, algo así como un pastelero con su manga pastelera recubriendo un pastel ;).
En la imagen inferior podemos observar un sistema de extrusión que está creando un objeto capa por capa.
Las impresoras 3D las podemos descomponer en tres partes o elementos: hardware, software y mecánica.
- Hardware
Para construir una impresora 3D FDM cartesiana, se requiere el control de varios motores paso a paso (al menos 4, uno para cada eje X, Y, Z y otro para alimentar el filamento) y ese trabajo lo realizará el Arduino MEGA.
Además no podemos utilizar un controlador (driver) como el L298D, ya que para controlar la dirección y la velocidad de giro de cada uno de los cuatro motores paso a paso necesitaríamos muchos puertos del Arduino. Entonces usaremos controladores de motor paso a paso dedicados tales como el A4988, DRV8825 y TMC2209. Estos irán instalados en un modulo RAMPS (RepRap Arduino Mega Pololu Shield), que es una tarjeta de expansión (shield) fabricada para el Arduino MEGA.
RepRap es un proyecto para crear máquinas autorreplicables, es decir impresoras 3D que sean capaces de producir componentes para crear copias de sí mismas, este proyecto popularizó la fabricación de impresoras 3D en la cultura maker, y Pololu es una marca comercial que hace uso del circuito integrado A4988 desde hace bastante tiempo.
La placa RAMPS, que observamos en la imagen superior, no solo puede controlar cinco motores paso a paso por medio de los drivers A4988, DRV8825 o TMC2209 sino también y dependiendo del modelo, otros dispositivos necesarios en la impresora 3D tales como calentador, ventilador, termistores y cama caliente, entre otros.
La extrusora es un componente muy importante en la impresora 3D y se encarga de empujar el filamento hasta la boquilla (Hot End).
Tenemos dos tipos de extrusión: la directa (Direct Drive), que empuja el fiamento directamente a la boquilla y la extrusora Bowden que está montada en el chasis de la impresora y empuja el filamento a través de un tubo hasta el extremo caliente.
Cada tipo de extrusora tiene sus ventajas y desventajas; si se desea trabajar con filamentos flexibles, es recomendable la extrusora directa.
También es necesario en el hardware la fuente de alimentación (Power Supply), sus valores de tensión, corriente y potencia dependerán de la impresora 3D; un ejemplo puede ser 12 VDC, 15 A, 180 W.
- Software
Tenemos dos tipos de software, uno para la calibración de los parámetros de la impresora 3D (firmware) y otro para la impresión.
Hay muchas opciones, como ejemplos para software de calibración tenemos PronterFace y los firmwares Sprinter y Marlin.
Para la impresión, el modelado 3D se puede hacer con Tinkercad, Rhinoceros, Fusion 360, FreeCAD entre otros o bajar de algún repositorio de archivos en 3D como Thingiverse o Cults3D. De estos programas podemos obtener archivos de extensión .STL para luego pasar ese archivo a un laminador y crear el Código G (G-Code), que es lo que entenderá el Arduino MEGA, puede ser con Slicer o Ultimaker Cura, entre otros.
- Mecánica
Son varias las partes mecánicas de la impresora 3D, las más importantes son los motores paso a paso (electromecánico), las correas, los husillos y las varillas roscadas.
Motores NEMA 17 y NEMA 23
Para realizar los movimientos X, Y, Z, alimentar el filamento para el hot end y realizar la impresión 3D, es necesario utilizar motores PaP. Ingresa en el sieguiente artículo si deseas conocer con detalles el funcionamiento de un motor paso a paso.
Un motor paso a paso es un motor de corriente continua sin escobillas cuya rotación se divide en un número discreto de pasos, su eje se desplaza por saltos y no de forma continua como lo hace un motor DC tradicional de escobillas; es decir convierte pulsos eléctricos en desplazamientos angulares. Su principal característica es que permite un desplazamiento preciso, aunque por esta misma razón requieren de un controlador basado en Arduino y un amplificador de corriente, llamados también controladores de motor o drivers.
Aunque existen motores paso a paso unipolares y bipolares, en este artículo nos interesa los bipolares. En la imagen inferior observamos el diagrama esquemático simplificado de un motor paso a paso bipolar. Tiene dos bobinas independientes y por tanto cuatro hilos para su conexión.
Abajo podemos observar el interior de un motor paso a paso.
Dos de los motores paso a paso bipolares más usados en impresoras 3D y CNC son los llamados NEMA 17 y NEMA 23. Estos motores cumplen con las normas NEMA y mirando su referencia, podemos conocer las características más importantes de los mismos. Veamos un listado de ellas para cada uno de estos dos motores.
MOTOR NEMA 17
- Modelo: 17HS4401S
- Tipo de motor: bipolar
- Número de conductores: 4
- Fases: 2
- Resistencia del devanado: 1.5 Ω
- Tensión de alimentación: 2.6-24 VDC
- Pasos por revolución: 200 (paso nominal)
- Ángulo de paso: 1.8°
- Consumo de corriente: 1.7 A / fase
- Torque: 0.43 Newton/metro o 4.3 kg/cm
MOTOR NEMA 23
- Modelo: 57H1876-420-8-21B
- Tipo de motor: bipolar
- Número de conductores: 4
- Fases: 2
- Resistencia del devanado: 0.6 Ω
- Tensión de alimentación: 5-36 VDC
- Pasos por revolución: 200 (paso nominal)
- Ángulo de paso: 1,8°
- Consumo de Corriente: 4.2 A / fase
- Torque: 1.8 Newton/metro o 18 kg/cm
Comparando estas características en estos modelos particulares de motores paso a paso NEMA 17 y NEMA 23, podemos concluir que el NEMA 23 por su mayor torque, es recomendable para situaciones que requieran trabajo con cargas más pesadas.
A4988 DRV8825 TMC2209 drivers más usados en impresoras 3D
Sabemos que Arduino puede proporcionar en sus salidas una tensión de 5 V y una intensidad de corriente baja (unos 40 mA) y vimos que un motor paso a paso necesita tensiones que pueden llegar a ser de 12, 24 o 36 V y corrientes de un amperio o más, por lo tanto no es posible un acoplamiento directo entre Arduino y el motor paso a paso, necesitamos entonces de una interfaz de potencia o driver para satisfacer las necesidades de corriente de nuestro motor.
Las tensiones de alimentación de los motores paso a paso generalmente son de 12 a 24 VDC, pero al tener sus bobinas una resistencia interna tan baja, se generan corrientes muy altas que pueden dañarlas, de allí la necesidad del uso de drivers que trabajan con señales de Modulación por Ancho de Pulso, PWM (Pulse Width Modulation) y así se limita la corriente, ya que el motor no trabajará permanentemente sino por cortos periodos de tiempo, esta forma de limitar la corriente se llama Chopping.
Los drivers dedicados para motores paso a paso nos simplifican mucho el trabajo de control, ya que son autónomos y se encargan de generar todas las señales necesarias para el buen funcionamiento de los motores con solo dos señales de control desde Arduino, una que indique el sentido de giro y otra para indicar el avance de un paso al motor. Estos controladores nos ofrecen también la posibilidad de realizar micropasos (microstepping) para aumentar la precisión en el giro del motor y además ofrecen protección por temperatura y regulación de intensidad de corriente.
Los drivers para motores paso a paso pueden ser colocados en una protoboard para realizar algunas pruebas de verificación, pero para un diseño definitivo se utilizan las llamadas tarjetas de expansión, de esta forma se facilita la conexión del controlador.
La imagen inferior muestra una tarjeta de expansión que puede ser utilizada con los drivers A4988, DRV8825 y TMC2209.
Con las tarjetas de expansión se facilita asignar los micropasos deseados, la conexión de la fuente de poder, del motor y de los pines de control de Arduino (Enable, Step y Dir). Otro detalle, no menos importante es el condensador de 100 µF/35 V que sirve para estabilizar la tensión de alimentación del motor paso a paso.
Cuando se necesita controlar varios motores paso a paso como es el caso de una impresora 3D realizada con el Arduino MEGA, se recurre al uso de una tarjeta RAMPS, como vimos anteriormente, esta tarjeta permite la instalación de 5 drivers.
Como regla general, se debe evitar hacer conexiones y desconexiones del motor paso a paso con estos controladores energizados, para evitar daños en los mismos.
Aunque existen muchos modelos de controladores para motores paso a paso, tres de ellos son ampliamente utilizados en impresoras 3D y son los drivers A4988, DRV8825 y TMC2209. Hay algunas diferencias entre ellos y eso es lo que vamos a tratar a continuación.
No olvides que de cada uno de estos tres drivers, existen diferentes versiones y debes verificar el conexionado de pines (pinout), verificando la hoja de datos técnica (datasheet) ofrecida por el fabricante cuando vayas a implementar tus propios circuitos.
Driver para motores paso a paso A4988
El driver A4988, es un módulo controlador de micropasos que simplifica el control de motores paso a paso bipolares. Lleva muchos años en el mercado, es uno de los más usados por su fiabilidad y bajo costo.
A los módulos que llevan el circuito integrado A4988 se les acostumbra a llamar Pololu, que es una marca comercial que popularizó el uso de este circuito integrado.
En la imagen inferior observamos al driver A4988. Es un módulo que sirve de soporte al circuito integrado del mismo nombre A4988; este integrado o chip está cubierto por un disipador de calor. En el módulo hay otros componentes necesarios para su funcionamiento, el más notorio es el potenciómetro para ajustar la intensidad de corriente máxima que se entregará al motor paso a paso, y se indica con una flecha.
Chip del driver A4988
El componente principal del driver A4988 es el circuito integrado o chip A4988, diseñado por la empresa Allegro MicroSystems y da su nombre a módulo controlador.
El circuito integrado A4988, está compuesto por dos secciones, una parte es la lógica, que permite controlar al motor paso a paso con solo dos pines de entrada de un microcontrolador y la parte de potencia, para poder manejar la tensión y la corriente del motor paso a paso.
La sección de potencia del chip A4988 está diseñada con transistores de efecto de campo de tecnología DMOS o semiconductores de óxido metálico de doble difusión, por sus siglas en inglés. Esto le garantiza que los transistores de potencia trabajen con más seguridad y eficiencia a altas temperaturas.
Especificaciones técnicas A4988
Listemos las características técnicas más importantes del driver A4988 extraídas de su datasheet.
- Tensión de trabajo: 3 a 5.5 VDC para la lógica y 8 a 35 VDC para el motor paso a paso
- Intensidad máxima: 2 A
- Color característico: verde o rojo
- Ajuste de intensidad de corriente mediante un potenciómetro de ajuste en el módulo
- Resolución: paso completo, 1/2 de paso, 1/4 de paso, 1/8 de paso y 1/16 de paso
- Pines de control de paso (STEP) y dirección (DIRECTION)
- Protección por alta temperatura, cortocircuito, sobre tensión y sobre intensidad
- Generan ruido en el motor, pero es muy económico
Configuración de pines del driver A4988
Primero analicemos los terminales del lado izquierdo de la imagen, coloreados en azul, que son los pines de control.
- ENABLE
Esta es la habilitación del módulo y la línea en la parte superior nos indica que la función es activa en bajo, es decir, se debe mantener a nivel bajo (LOW) para que el módulo se encuentre habilitado o en modo de funcionamiento normal. Este pin tiene resistencia de pull-down que mantiene habilitado el módulo.
- MS
Los 3 pines MS o micropasos (microstepping), nos permite configurar los pasos de motor, según la siguiente tabla.
Estas entradas MS, tienen resistencias internas de pull-down y por tanto están a nivel bajo (LOW) y si las dejamos «al aire» o sin conexión, estaremos en el primer caso de la tabla y por tanto el motor paso a paso trabajará en paso completo. Recordemos que en esta configuración se obtiene aproximadamente el 71% de la intensidad total de la corriente que entrega el controlador, a diferencia de los micropasos que obtienen el 100%, en algún momento de su funcionamiento, pero no de forma permanente.
Con el uso de la tarjeta de expansión para el driver A4988 se facilita la configuración de los micropasos por medio de tres pequeños interruptores que están montados en un solo paquete (DIP switch de 3 posiciones) que se muestra en la imagen inferior.
Si utilizas un escudo RAMPS puedes controlar los micropasos mediante puentes (jumpers) que trae para cada uno de los cinco controladores que puede contener.
Hay que considerar que a medida que aumentamos la resolución del motor, el torque disminuye.
- RESET
Permite restablecer o reiniciar el módulo A4988 y es activo en bajo. Este pin no tiene resistencia de pull-up.
- SLEEP
Coloca al circuito integrado en un modo de bajo consumo, también activo en bajo. Este pin sí tiene resistencia de pull-up.
- STEP
Arduino utiliza este pin para enviar un pulso y que el motor realice un paso.
- DIR
Arduino enviará un alto (HIGH) o un bajo (LOW) a este pin y lograremos que el motor gire en una dirección u otra.
Ahora los pines del lado derecho, que son los pines de alimentación y del motor paso a paso.
- Vmotor y GND
Conexión para una fuente de alimentación externa para la etapa de potencia del driver A4988 y las bobinas del motor paso a paso, está comprendida entre 8 y 35 VDC. El valor de tensión y la capacidad de corriente de esta fuente de alimentación dependerán del modelo del motor paso a paso que utilicemos.
- 2B y 2A
Conexión para la bobina 2 del motor paso a paso.
- 1A y 1B
Conexión para la bobina 1 del motor paso a paso.
- VDD y GND
Es la alimentación para la parte lógica del circuito integrado A4988, puede estar comprendida entre 3 y 5.5 VDC. El consumo de corriente de esta sección es baja y por tanto podemos tomar la alimentación directamente desde Arduino.
Sistema de refrigeración: disipador de calor
Si la corriente en el motor paso a paso es inferior a 1 A, el driver A4988 puede trabajar sin disipador de calor de aluminio; para corrientes superiores a 1 A y hasta máximo 2 A, se debe utilizar un disipador de calor y de ser posible ventilación.
En la imagen superior vemos un disipador de calor para el driver A4988. Para adherirse al chip, el disipador trae en la parte inferior una cinta con un protector para el adhesivo, la cinta debe retirarse al momento de colocarse en el chip.
¿Cómo limitar la corriente?
El driver A4988 posee un potenciómetro para ajustar la intensidad de corriente máxima que entregará a las bobinas del motor paso a paso. Esto lo hacemos para ajustarnos al motor específico para nuestros proyectos y se debe reajustar si cambiamos de motor por otro de diferentes características, por ejemplo de un NEMA 17 a un NEMA 23.
El fabricante del circuito integrado nos ofrece una fórmula matemática para limitar la corriente del módulo.
Despejemos a Vref, que es lo que necesitamos calcular:
Donde Vref, es el voltaje o tensión de referencia que debemos ajustar por medio del potenciómeto colocado en el módulo A4988.
Imax, es la máxima corriente que entregará el módulo A4988.
RS (Resistor Sense) es una de las dos resistencias en derivación (shunt) o resistencias de detección, una para cada fase o bobina del motor paso a paso. Son llamadas S1 y S2 (Sense 1 y Sense 2), otras veces R4 y R5, cuyos valores pueden estar comprendidos entre 0.01 hasta 0.2 Ω. Debes encontrar el valor de esas resistencias en tu driver A4988; un valor típico de RS es de 0.1 Ω, pero hay que verificarlo.
En la imagen superior vemos que el valor de RS es R100, según el código de Dispositivos de Montaje Superficial, SMD (Surface Mount Device) cambiamos la R por un punto decimal, entonces RS = 0.1 Ω.
Aunque el datasheet del motor NEMA 17 de referencia 17HS4401S, que usaremos para estos ejemplos, nos indica una corriente máxima de 1.7 A por fase o bobina, usaremos una corriente de 1.5 A para no trabajar al límite.
Reemplazamos en la ecuación:
Para hacer este ajuste de corriente, solo debemos conectar los 5 VDC y GND de nuestro Arduino a la parte lógica del driver A4988, VDD y GND.
Con ayuda de un «cocodrilo» o «caimán» unimos la punta roja o positiva del polímetro o multímetro, que deberá estar ajustado como voltímetro en una escala de 2VDC, a la punta metálica de un destornillador pequeño y la punta negra o negativa a cualquier GND; luego giramos lentamente y con cuidado la perilla del potenciómetro midiendo la tensión en el cursor o parte móvil del potenciómetro hasta llegar al valor de tensión hallado en la fórmula, en tu caso puede ser un valor diferente ya que depende del valor de corriente que desees limitar, de la RS de tu controlador A4988 y de la corriente del motor paso a paso que utilices.
De esta forma, sin importar los micropasos que utilicemos, el controlador A4988, no proporcionará una intensidad de corriente superior a 1.5A; si por algún motivo el motor paso a paso exige una corriente mayor, el driver A4988 quitará la alimentación de las bobinas del motor, protegiéndolas de un posible daño.
Esquema de conexiones Arduino, A4988 y motor paso a paso
Usaremos para el ejemplo básico el diagrama de Pololu para conectar nuestro controlador Arduino con el driver A4988 y el motor paso a paso NEMA17, de referencia 17HS4401S, este esquema es el mismo que recomienda el fabricante del chip A4988 Allegro MicroSystems.
Recuerda: por norma general, no debemos conectar y desconectar las cargas de un circuito electrónico estando encendido, conectar o desconectar el motor paso a paso con el driver A4988 energizado, no es la excepción, podemos destruir el driver.
Cómo se usa el driver A4988
Para todos nuestros ejemplos usaremos el paso completo: MS1, MS2 y MS3 al aire si usamos los drivers en protoboard, si usamos tarjeta de expansión, todos los interruptores en 0 (OFF) y si usamos una RAMPS, no colocamos puentes (jumpers) en los pines ubicados debajo de cada driver. En modo de paso completo tomaremos solo el 70.7% de la intensidad máxima calculada.
También puedes variar la resolución del motor paso a paso variando los pasos según la tabla y observar el cambio en su velocidad, por ejemplo se puede colocar a MS1 en alto o puentear sus pines y trabajar en modo de medio paso y aprovechar el 100% de la intensidad máxima, el recorrido del eje, será la mitad. También se puede ajustar un poco el VREF según las fórmulas, si se nota saltos de pasos en el motor durante su funcionamiento final, siempre respetando la intensidad máxima soportada por el motor.
Consideraciones:
- El controlador A4988 internamente comunica GND de la fuente de baja tensión de la lógica y GND de la fuente de mayor tensión para los transistores de potencia, por tanto no hay necesidad de hacer comunes los GND externamente, aunque podemos hacerlo ya que es costumbre y es necesario en los circuitos que utilizan dos o más fuentes de alimentación independientes.
- Si usas el módulo A4988 en una protoboard sin su tarjeta de expansión o sin tarjeta RAMPS, debes colocar un condensador de 100 µF/35 V en los pines de alimentación de la parte de potencia del chip, respetando la polaridad de sus terminales. Es necesario este condensador ya que el controlador A4988 utiliza condensadores cerámicos de baja Resistencia Equivalente en Serie, ESR (Equivalent Series Resistance) que los hace susceptibles de daño con los picos de tensión.
- Los pines de ajuste de resolución de pasos MS1, MS2 y MS3, pueden quedar sin conexión porque tienen resistores de pull-down y trabajaremos a paso completo.
- El pin de ENABLE puede quedar sin conexión ya que también tiene su resistor de pull-down que habilita el módulo.
- Conectamos con un puente (jumper) los pines RESET y SLEEP para aprovechar el resistor de pull-up de SLEEP y mantener en un nivel alto a RESET. Podemos hacer esto ya que no usaremos estos pines en nuestro circuito básico.
- Los colores de una bobina del motor paso a paso NEMA 17 son negro y verde, la otra bobina son rojo y azul.
Código Arduino: sin biblioteca
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int paso = 2; int direccion = 3; void setup() { pinMode(paso, OUTPUT); pinMode(direccion, OUTPUT); } void loop() { digitalWrite(direccion, HIGH); for(int i = 0; i < 200; i++){ digitalWrite(paso, HIGH); delay(10); digitalWrite(paso, LOW); delay(10); } delay (1000); digitalWrite(direccion, LOW); for(int i = 0; i < 100; i++){ digitalWrite(paso, HIGH); delay(10); digitalWrite(paso, LOW); delay(10); } delay (1000); } |
Primero creamos dos variables que llamaremos paso y dirección, y que son las dos únicas órdenes que necesitan los controladores dedicados A4988, DRV8825 y TMC2209.
1 2 |
int paso = 2; int direccion = 3; |
En la función void setup() declaramos esos pines como salida.
1 2 3 4 5 |
void setup() { pinMode(paso, OUTPUT); pinMode(direccion, OUTPUT); } |
En la función loop(), primero hacemos rotar el motor paso a paso en una dirección.
1 |
digitalWrite(direccion, HIGH); |
Posteriormente, con un ciclo for() creamos los 200 pasos para un giro de nuestro motor paso a paso NEMA 17, que es de 200 pasos por giro.
Formamos una onda cuadrada de 20 milisegundos (10 ms ON y 10 ms OFF), o sea un pulso completo cada 20 ms (0.02 segundos).
Y como la frecuencia es la inversa del tiempo:
Cada segundos se generarán 50 pulsos, pero como el motor paso a paso necesita 200 pulsos para un giro completo, demorará 4 segundos para dar un giro completo en un sentido.
1 2 3 4 5 |
for(int i = 0; i < 200; i++){ digitalWrite(paso, HIGH); delay(10); digitalWrite(paso, LOW); delay(10); |
Esperamos un segundo y repetimos el proceso, pero con dirección contraria y solo durante dos segundos.
1 2 3 4 5 6 7 8 9 10 |
delay (1000); digitalWrite(direccion, LOW); for(int i = 0; i < 100; i++){ digitalWrite(paso, HIGH); delay(10); digitalWrite(paso, LOW); delay(10); } delay (1000); |
En pocas palabras, el motor girará una vuelta completa (360°) en 4 segundos, para y espera un segundo, invierte su giro durante dos segundos (180°), para y espera un segundo y repite este ciclo indefinidamente.
Código Arduino: uso de la biblioteca AccelStepper
Haremos uso de la librería AccelStepper escrita por Mike McCauley, la cual debemos instalar en el IDE de Arduino, si no recuerdas o no sabes cómo hacerlo, puedes ver «cómo instalar librerías» en un artículo muy interesante que se encuentra en el blog.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <AccelStepper.h> #define paso 2 #define direccion 3 #define motorInterfaceType 1 AccelStepper miMotor = AccelStepper(motorInterfaceType, paso, direccion); void setup() { miMotor.setMaxSpeed(1000); miMotor.setSpeed(200); } void loop() { miMotor.runSpeed(); } |
Invocamos la librería AccelStepper y con la directiva del compilador #define nos ahorramos un espacio en memoria que ocupa si declaramos los pines como variables de tipo entero. Podemos hacerlo ya que esos pines 2 y 3 en realidad no van a variar, son constantes y las constantes definidas con #define no ocupan espacio de memoria. En este código tan pequeño no es necesario pero, en proyectos grandes, sí es conveniente hacerlo, aunque también le da elegancia al código :).
También debemos definir el tipo de interfaz del motor, motorInterfaceType 1, esto nos indica que usaremos un controlador de paso y dirección, como el A4988.
1 2 3 4 |
#include <AccelStepper.h> #define paso 2 #define direccion 3 #define motorInterfaceType 1 |
Creamos una nueva instancia de la clase AccelSteper, con el tipo de interfaz de motor y las conexiones de paso y dirección. A nuestro motor paso a paso lo llamaremos miMotor.
Podemos crear varias instancias de la clase AccelSteper con diferente nombres de motor, pines de paso y dirección y así controlar varios motores paso a paso.
1 |
AccelStepper miMotor = AccelStepper(motorInterfaceType, paso, direccion); |
En la función setup() se define la velocidad máxima del motor paso a paso, se recomienda 1000.
Con el método setSpeed() definimos la velocidad, en este ejemplo colocamos 200, si ajustamos este valor observaremos los cambios de velocidad.
Si definimos setSpeed(-200), el motor paso a paso girará en sentido contrario.
1 2 3 4 |
void setup() { miMotor.setMaxSpeed(1000); miMotor.setSpeed(200); } |
En la función loop() dejamos correr libremente al motor paso a paso.
1 2 3 |
void loop() { miMotor.runSpeed(); } |
Driver para motores paso a paso DRV8825
El driver DRV8825 es un controlador para motores paso a paso muy utilizado en impresoras 3D y máquinas CNC. , vino a ser una versión mejorada del driver A4988. Ambos controladores son muy parecidos, pero hay algunas diferencias entre ellos.
Como podemos observar en la imagen superior, la primera diferencia entre los dos controladores es el color del módulo.
Chip del driver DRV8825
La tarjeta controladora DRV8825 incorpora el circuito integrado que le da su nombre al módulo, el chip DRV8825 fabricado por la empresa Texas Instruments.
Al igual que driver A4988, el DRV8825 también se compone de una sección lógica y una sección de potencia.
Especificaciones técnicas DRV8825
Las principales características técnicas del módulo DRV8825 son:
- Tensión de trabajo: 2.5 a 5.5 VDC para la lógica y 8.2 a 45 VDC para el motor paso a paso
- Intensidad máxima: 2.5 A
- Color característico: morado o púrpura
- Ajuste de intensidad de corriente mediante un potenciómetro de ajuste en el módulo
- Resolución: paso completo, 1/2 de paso, 1/4 de paso, 1/8 de paso, 1/16 de paso y 1/32 de paso
- Pines de control de paso (STEP) y dirección (DIRECTION)
- Protección por alta temperatura, cortocircuito, sobre tensión y sobre intensidad
- Genera menos ruido en el motor que el driver A4988, pero es un poco más costoso
Configuración de pines del driver DRV8825
Aunque difieren algunos de los nombres de los pines del controlador DRV8825 de los nombres de los pines del controlador A4988, son drivers muy parecidos en todas sus funciones, se debe tener en cuenta que las prestaciones del driver DRV8825 son un poco superiores a las del driver A4988, como se puede ver en las especificaciones técnicas.
En algunos drivers DRV8825 el pin ENABLE, no tiene resistencia de pull-down interna y se debe forzar el nivel lógico con un puente a GND.
Importante: la ubicación del potenciómetro regulador de corriente es diferente en los dos controladores y puede causar confusión. En el driver A4988 el potenciómetro está al lado de la fuente de alimentación de la sección lógica y en el driver DRV8825 está al lado de la fuente de alimentación de los transistores de potencia. Hay que prestar cuidado al ubicar los controladores en sus tarjetas de expansión o en el escudo RAMPS o se dañará el dispositivo. Se debe buscar los GND y Vmotor como referencia.
El sistema de micropasos sí difiere un poco ya que el driver DRV8825 tiene una resolución hasta 1/32 de paso, los 3 pines Modo, M (Mode), nos permite configurar los micropasos del motor, según la siguiente tabla.
De manera análoga al A4988, los pines Mo, M1 y M2 del driver DRV8825 tienen resistencias internas de pull-down y por tanto si las dejamos «al aire» o sin conexión, estaremos en el modo de paso completo.
Sistema de refrigeración: disipador de calor
Si se trabaja con intensidades de corriente inferiores a 1.5 amperios no es necesario el disipador de calor, para intensidades superiores sí debe llevar el disipador de calor y ventilación.
¿Cómo limitar la corriente?
La limitación de corriente que entrega el driver DRV8825, se realiza de la misma forma que para el controlador A4988, sin embargo hay una pequeña diferencia en la fórmula:
Despejemos a Vref:
El procedimiento es el mismo que se hizo para el driver A4988 y por tanto no lo repetiremos aquí, solo hay que tener en cuenta que para el driver DRV8825, hay que multiplicar por 5 y no por 8 como en el caso del controlador A4988.
Hay que fijarse también en el valor de RS, que puede variar dependiendo del fabricante, un valor típico es 0.1 Ω.
Si es nuestro caso y RS = 0.1 Ω, la fórmula se reduce a:
Esquema de conexiones Arduino, DRV8825 y motor paso a paso
Usaremos para el ejemplo básico con el controlador DRV8825 el mismo diagrama que usamos para conectar nuestro controlador A4988, ya que son compatibles pin por pin, solo teniendo en cuenta las diferencias en la tensión de las fuentes de alimentación.
Cómo se usa el driver DRV8825
Debemos seguir las mismas recomendaciones del montaje del driver A4988.
Código Arduino: sin biblioteca
Con este código puedes jugar, hasta cierto punto, con el tiempo de detención del motor, con el periodo de los pulsos al motor y con la cantidad de giros que dará el motor paso a paso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
int paso = 2; int direccion = 3; int detencion = 2000; int periodo = 1500; void setup() { pinMode(paso, OUTPUT); pinMode(direccion, OUTPUT); } void loop(){ control(1,200); delay(1000); control(0,200); delay(1000); } void control(int giro,int vueltas){ digitalWrite(direccion,giro); delay(detencion); for(int i=0;i<vueltas;i++){ digitalWrite(paso, HIGH); delayMicroseconds(periodo); digitalWrite(paso, LOW); delayMicroseconds(periodo); } } |
Inicializamos las variables paso, dirección, detención y periodo.
Paso y dirección para el comando del driver DRV8825.
Detención, para el tiempo que estará parado el motor paso a paso entre cambios de giro.
Y periodo, para determinar la velocidad del motor paso a paso. Tengamos en cuenta que el periodo es el inverso de la frecuencia, es decir, a mayor periodo, menos velocidad.
1 2 3 4 |
int paso = 2; int direccion = 3; int detencion = 2000; int periodo = 1500; |
En la función setup(), declaramos como salida los pines 2 y 3.
1 2 3 4 |
void setup() { pinMode(paso, OUTPUT); pinMode(direccion, OUTPUT); } |
En la función loop(), llamamos a la función control que tiene como primer parámetro el sentido de giro del motor y puede tener como argumento 1 o 0. El segundo parámetro es la cantidad de vueltas que queremos que de nuestro motor y puede tener como argumento cualquier número que deseemos, teniendo en cuenta que con 200 dará un giro completo, con 300 un giro y medio y así sucesivamente.
1 2 3 4 5 6 |
void loop(){ control(1,200); delay(1000); control(0,200); delay(1000); } |
Creamos la función control.
1 2 3 4 5 6 7 8 9 |
void control(int giro,int vueltas){ digitalWrite(direccion,giro); delay(detencion); for(int i=0;i<vueltas;i++){ digitalWrite(paso, HIGH); delayMicroseconds(periodo); digitalWrite(paso, LOW); delayMicroseconds(periodo); } |
Código Arduino: uso de la biblioteca AccelStepper
Si tienes dudas con el funcionamiento de los micropasos de un motor paso a paso, que es normal si es el primer acercamiento que tienes a este tipo de motores y sus controladores, con este programa puedes aclararlas. Mueve la configuración de los MS según la tabla y observa los cambios en el movimiento del motor paso a paso. También puedes hacer cambios en la velocidad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <AccelStepper.h> #define paso 2 #define direccion 3 #define motorInterfaceType 1 AccelStepper miMotor = AccelStepper(motorInterfaceType, paso, direccion); void setup() { miMotor.setMaxSpeed(1000); } void loop() { miMotor.setCurrentPosition(0); while(miMotor.currentPosition() != 200) { miMotor.setSpeed(500); miMotor.runSpeed(); } delay(1000); miMotor.setCurrentPosition(0); while(miMotor.currentPosition() != -200) { miMotor.setSpeed(-500); miMotor.runSpeed(); } delay(1000); } |
La primera parte del programa es similar al primer ejemplo con librería AccelStepper con el driver 4988, por eso no la repetiremos. Analicemos la función loop().
Con el método setCurrentPosition() definimos el punto de arranque del motor paso a paso.
Con el bucle while() aseguramos el conteo de 200 pasos, para un giro completo, a una velocidad media de 500 pasos por segundo.
El motor se detendrá y esperará un segundo.
1 2 3 4 5 6 7 |
miMotor.setCurrentPosition(0); while(miMotor.currentPosition() != 200) { miMotor.setSpeed(500); miMotor.runSpeed(); } delay(1000); |
Repetimos todo de nuevo, pero invirtiendo el sentido de giro.
1 2 3 4 5 6 7 |
miMotor.setCurrentPosition(0); while(miMotor.currentPosition() != -200) { miMotor.setSpeed(-500); miMotor.runSpeed(); } delay(1000); |
Driver para motores paso a paso TMC2209
Los controladores de la serie TMC2xxx son fabricados por la empresa Trinamic. Estos controladores superan en mucho la tecnología de los populares A4988 y DRV8825.
Debido a la popularidad de los controladores A4988 y DRV8825, los drivers de la serie TMC2xxx son compatibles en la asignación de pines (pinout) con aquellos, esto hace posible una sustitución directa entre los mismos.
El controlador TMC2209, es una versión mejorada del driver TMC2100, TMC2130 y TMC2208.
Conocer a fondo la familia de los controladores TMC2xxx, podría tomarnos varios artículos, ya que solo el modelo TMC2209 tiene 3 versiones. En esta parte de nuestro artículo nos centraremos en el TMC2209 versión 1.1 que se muestra en la imagen inferior.
Como característica especial podemos notar algunos pines en la parte superior del controlador.
Chip del driver TMC2209
La tarjeta controladora TMC2209 incorpora el circuito integrado que le da su nombre al módulo, el chip TMC2209 fabricado en Alemania por la empresa Trinamic y es uno de los más sofisticados controladores de motores paso a paso bipolares del mercado.
La gran ventaja del chip TMC2209 respecto a los chips A4988 y DRV8825, es ser ultra silencioso.
Especificaciones técnicas TMC2209
- Tensión para la lógica: 3 – 5 VDC
- Tensión para el motor paso a paso: 4.75 – 36 VDC
- Intensidad máxima: 2 ARMS
- Resolución: hasta 1/256 pasos
- RDSon: 0.2 Ω, implica menor calentamiento del driver y una vida útil más larga
- Componentes en el lado inferior del módulo: se ven menos afectados por el calor
- Interfaz: UART
- Funcionamiento ultra silencioso, pero más costoso que los drivers A4988 y DRV8825
Al igual que los drivers A4988 y DRV8825, que son sensibles a las corrientes inducidas por el motor, el driver TMC2209 lo es más. Es decir, no se debe desconectar el motor cuando el driver está energizado o con el motor en movimiento. También se recomienda colocar en primera instancia la alimentación de potencia del motor, antes que la alimentación de la lógica y así mismo retirar primero la alimentación de la lógica y de última la tensión de potencia del motor.
TMC2209 y sus características especiales
El controlador TMC2209 posee unas características que lo hacen muy superior a los drivers A4988 y DRV8825. Algunas de ellas son:
- Standby current reduction: reducción de corriente en espera.
- StealthChop2: para un funcionamiento silencioso con el motor parado y a altas velocidades. sin pérdida de torque, también llamado modo silencioso.
- CoolStep: controla la corriente para disminuir drásticamente el calentamiento de los motores y controladores, reduciendo la tensión de manera inteligente cuando no existe carga.
- StallGuard: detecta la carga del motor, reduciendo el consumo de corriente, se usa para eliminar los sensores de fin de carrera (sensorless homing).
- Conexión UART: para configurar desde el firmware mediante puentes (jumpers) en la tarjeta que soporta a los módulos TMC2209 y memoria programabe una sola vez, OTP (One Time Programmable). Los que somos algo mayores la seguimos llamando memoria PROM (Programmable Read Only Memory) ;) para opciones de configuración avanzadas.
- SpreadCycle: funcionamiento más suave al parar el motor y volver a acelerar, también ofrece un rendimiento superior en los micropasos, también conocido como modo fuerza.
- DcStep: permite el movimiento a alta velocidad sin perder pasos.
- MicroPlyer: mayor suavidad en micropasos.
Las características especiales de los drivers TMC2209, no solo se verán reflejadas en la disminución del nivel de ruido generado por los motores paso a paso, sino también en la calidad del objeto impreso en 3D.
Modos de operación
Existen tres modos de operación para los drivers TMC2209.
- Modo Step/Direction (Step/Dir)
Es el llamado modo heredado (Legacy Mode). Este modo es el usual para poder realizar un cambio directo de un controlador A4988 o un DRV8825 por un TMC2209 obteniendo los beneficios de StealthChop y SpreadCycle.
El inconveniente al usar este modo de operación básico es que los driver TMC no pueden devolver información al controlador y por tanto no se pueden obtener los beneficios de StallGuard que permite prescindir del uso de los sensores de fin de carrera.
- Modo UART
El puerto Transmisor Receptor Asíncrono Universal, UART (Universal Asynchronous Receiver Transmitter) utiliza un protocolo para intercambiar datos en serie entre dispositivos. Es un modo avanzado o inteligente y permite gestionar los datos con un par de cables desde otros dispositivos y aprovechar todas las características especiales de los driver TMC.
- Modo SPI
La Interfaz Periférica Serial, SPI (Serial Peripheral interface), es el otro modo avanzado o inteligente que también aprovecha todas las características de los drivers TMC.
Configuración de pines del driver TMC2209
EN: habilita (Enable) las salidas del motor. LOW: ON, HIGH:OFF.
MS2 y MS1: configuran la resolución de los micropasos según la siguiente tabla:
SPREAD: pin de configuración para cambiar entre el modo StealthChop y SpreadCycle (Low=StealthChop, High=SpreadCycle)
PDN-UART: para la comunicación UART.
STEP/DIR: para el modo de operación tradicional o heredado del A4988 y del DVR8825
VM Y GND: tensión de alimentación para los MOSFET de potencia.
M2B-M2A Y M1A-M1B: conexiones para las bobinas del motor paso a paso.
VIO-GNS: tensión de alimentación para la lógica de control.
Diagrama de bloques TMC2209
La imagen inferior muestra un diagrama de bloques del driver TMC2209, ofrecido por la empresa Trinamic, fabricante del dispositivo.
Podemos notar la complejidad de la parte de control del circuito integrado donde, en forma de bloques, destacan las muchas ventajas tecnológicas que ofrece el TMC2209 y solo aparece finalmente el driver con los MOSFET de potencia para el control del motor paso a paso.
¿Cómo limitar la corriente?
Generalmente los drivers TMC2209 tienen una RS = 0.11 Ω, entonces la fórmula de la intensidad máxima es:
Despejemos a Vref:
Supongamos que deseamos una corriente del motor máxima de unos 0.8 A.
TMC2208 vs TMC2209: ¿qué diferencias hay entre ellos?
La tabla que se muestra en la parte inferior compara las características principales de los drivers TMC2208 y TMC2209.
Destacan en la tabla, la menor resistencia en conducción RDSon del TMC2209 que le permite manejar más corriente y tener menor disipación de potencia; la mayor tensión para el motor en el driver TMC2208, pero la mayor corriente del driver TMC2209, así como su mayor cantidad de prestaciones.
Esquema de conexiones Arduino, TMC2209 y motor paso a paso
Cómo se usa el driver TMC2209
Vamos a realizar este ejemplo en el modo Step/Dir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <AccelStepper.h> #define paso 2 #define direccion 3 #define motorInterfaceType 1 AccelStepper miMotor = AccelStepper(motorInterfaceType, paso, direccion); void setup() { miMotor.setMaxSpeed(1000); miMotor.setAcceleration(20); } void loop() { miMotor.moveTo(200); miMotor.runToPosition(); delay(1000); miMotor.moveTo(-200); miMotor.runToPosition(); delay(1000); } |
En este ejemplo final usamos la librería AccelStepper, como lo hemos hecho en los ejemplos anteriores, pero usamos los métodos moveTo() y runToPosition().
Podemos aumentar la aceleración y observar los cambios.
Para posteriores artículos queda el análisis de los modos inteligentes del TMC2209.
El hecho de la compatibilidad de los tres drivers A4988, DRV8825 y TMC2209, sin olvidar las diferencias que hemos visto y teniendo en cuenta el datasheet del fabricante de los drivers, nos permite el reemplazo de un driver por otro en nuestras impresoras 3D, para mejorar sus características técnicas.
Marlin el firmware para impresoras de código abierto
Marlin es un firmware para impresoras 3D de código abierto derivado de Sprinter y GRBL, fue creado en 2011 para las impresoras del Proyecto RepRap basadas en Arduino y otras impresoras 3D FDM; este proyecto ya lo habíamos mencionado al inicio del artículo y ha servido para popularizar la construcción de impresoras 3D.
Marlin también es utilizado por impresoras 3D de tipo delta o cartesiana y en impresoras 3D comerciales como Ultimaker o Prusa Research, además de ser usado en máquinas CNC y grabadoras láser.
¿Qué es Marlin y para qué sirve?
Decimos que Marlin es un firmware. Un firmware es un programa (software) que controla los circuitos electrónicos de cualquier dispositivo; es decir, tu teléfono móvil o tus auriculares bluetooth tienen un firmware. Se puede decir que un firmware es parte del software y del hardware a la vez, o que sirve de puente entre ambos.
Marlin contiene unas instrucciones básicas que le indican a la electrónica de la impresora 3D, cómo tienen qué arrancar y qué funciones tienen que realizar. Estas instrucciones deben almacenarse en una memoria ROM o EPROM donde se almacena Marlin. Algunas de estas instrucciones controlan los movimientos de los motores paso a paso de los ejes X, Y, Z, temperatura del extrusor, cama caliente, entre otros. En el caso de los motores paso a paso, lo que hace Marlin es leer una lista de comandos G-CODE y convertirlos en pulsos que utilizará para mover los motores paso a paso.
El firmware Marlin se ejecuta en la placa de control de la impresora 3D por intermedio de los drivers A4988, DRV8825 y TMC2209.
Marlin está diseñado para microcontroladores de la familia Atmel AVR de 8 bits, aunque su versión 2.x es compatible con placas de 32 bits. La placa más popular que soporta Marlin es la RAMPS 1.4.
¿Por qué debería actualizar el software de mi impresora 3D?
Es necesario actualizar el software de nuestra impresora 3D para renovar o añadir nuevas funcionalidades; además cuando se produzcan desajustes, por ejemplo en el desplazamiento de los motores paso a paso, podemos ajustarlos a los valores correctos.
Marlin no es el único
En resumen, Marlin determina el comportamiento de nuestra impresora 3D frente a los comandos G-CODE para la tarjeta controladora de la misma, además es el firmware más popular en impresoras 3D DIY.
Pero, Marlin no es el único firmware, otros muy utilizados también son Sprinter, Pronterface, FiveD, Teacup, Repetier, Klipper, RepRap, Prusa, MK4duo, entre otros.
Sprinter, es la base del Marlin y nos permite hacer pruebas sin tener conectados todos los componentes.
Pronterface, permite hacer movimiento en los tres ejes y en la extrusora para poder calibrar fácilmente.
Conclusión sobre los drivers para impresoras 3D
Ha sido bastante extenso el artículo, pero el tema de los drivers para impresoras 3D es vasto y hay bastante tela para cortar, así mismo el firmware Marlin merece uno o varios artículos por separado.
Espero que si estás empezando con la tecnología, esta información te haya aclarado algunas dudas y puedas seguir profundizando tus conocimientos.
Gracias por leer.
Gracias a Depositphotos por la cesión de las imágenes.