Tras la proliferación de las impresoras 3D y utilizando el mismo sistema de ejes XY han aparecido en el mercado los grabadores laser de escritorio, basta con googlear el título de este post para darse cuenta de la amplia variedad existente.

El “montaje” que se expone en este artículo es ya un clásico en el mundo DIY, se trata de reutilizar piezas de viejos lectores de CD o DVD, en concreto los motores paso a paso y el correspondiente sistema de carriles de dos unidades lectoras para conseguir nuestros ejes X e Y. Eso sí, debido al reducido tamaño de estas partes recicladas, nos conformaremos con un área de grabado de tan solo 38 x 38 mm.

Estos motores serán controlados igual que los de una impresora 3D mediante módulos A4988 también conocidos como “pololu” o “step-stick”. Estos circuitos generan las cuatro señales que controlan los bobinados de un motor paso a paso típico con cuatro cables (motor bipolar) a partir de dos señales de entrada, STEP donde introducimos un pulso para que el motor avance un paso y DIR para seleccionar la dirección.

Estos dos pines se conectan al MCU / Arduino, con lo que usaremos cuatro líneas IO, dos para el eje X y otras dos para el Y. Utilizaremos un Arduino Nano ejecutando grbl que es un firmware de CNC de uso habitual en este tipo de proyectos, quedando la conexión tal que así:

  • STEP X ———- D2
  • STEP Y ———- D3
  • DIR X ———— D5
  • DIR Y ———— D6

El StepStick se alimenta a 5V en los pines Vdd y GND pero los motores paso a paso requieren de 8V a 35V en los pines Vm y GND. Reset y Sleep conectados entre si y enable a GND, aunque lo podriamos controlar con el MCU para activar y desactivar los motores consiguiendo cierto ahorro energetico.

Por último hay tres pines que merecen especial atención: M0, M1 y M2 sirven para configurar la opción de microstepping, muy recomendable por varias razones y además es utilizado por Grbl. El microstepping es una técnica que consigue aumentar sensiblemente la resolución del motor y por tanto su precisión y suavidad de funcionamiento, reduciendo el consumo energético y la emisión de interferencias electromagnéticas. Si un motor normalmente funciona a 200 pasos por vuelta con microstepping se divide cada paso entre 2, 4, 8, o 16 micropasos de forma que tendremos 400, 800, 1600 o 3200 pasos por vuelta. Podemos seleccionar el número de micropasos poniendo a Vcc o Gnd los pines M0, M1 y M2 de la siguiente manera (usaremos 1/16):

M0M1M2
000Full step 1/1
1001/2 step
0101/4 step
1101/8 step
1111/16 step

El láser irá montado en el eje X y la superficie a grabar se desplazará en dirección perpendicular sobre los raíles del eje Y de forma similar al extrusor y cama de la mayoría de las impresoras. El control ON/OFF del láser se hace mediante un transistor MOSFET controlado por el pin D12 del nano.

En cuanto al láser a utilizar existen varias opciones, hay quien reutiliza el diodo láser de una de las unidades DVDR usadas pero a mi me ha parecido engorroso y poco fiable y no deben albergarse muchas esperanzas si se decide recorrer ese camino, además los diodos de las unidades DVDR aunque validos no tienen demasiada potencia. Lo mas fiable es adquirir un diodo láser en ebay o similares. Uno de los más usados es el azul de 445nm de 1W que puede salir por unos 10 euros. Por otro lado se necesita un circuito especial o driver para alimentar el diodo ya que este trabaja a corriente constante y si se sobrepasa su corriente nominal quedaría deteriorado o incluso inservible.

Se puede construir un driver en base al integrado LM317 de forma sencilla como muestra el siguiente esquema:

No obstante yo he adquirido uno un poco mas fiable en www.odicforce.com basado en el operacional LM358 y un transistor FET que permite corrientes de hasta 1500mA. Es importante disponer de un driver fiable pues los diodos láser son extremadamente sensibles y delicados. Este circuito también puede replicarse según el siguiente esquema:

Además el diodo láser debe estar montado en una carcasa con la debida capacidad de disipación térmica ya que aunque lo alimentemos correctamente requiere disipar una cantidad importante de calor, sin lo cual la creciente temperatura acabaría arruinando el semiconductor. Existen diferentes modelos de carcasas o “housings” en el mercado que, además incorporan lentes colimadoras que son imprescindibles para focalizar el haz laser que, de otra manera seria totalmente divergente.

Para unir físicamente todo el conjunto yo me he diseñado un soporte con el software de diseño 3D Autodesk Fusion 360, que es gratuito para estudiantes y educadores y es bastante potente, sencillo y muy recomendable. Si no siempre se puede hacer un apaño con materiales sencillos y un poco de ingenio.

Una vez montado todo instalaremos Grbl en el Arduino Nano o cualquier otro basado en el Atmega 328p. Para ello lo descargamos desde su repositorio de Github y tal como explica su wiki lo instalamos en el IDE de Arduino como librería y lo compilamos y flasheamos a traves de un ejemplo de esta librería llamado GrblUpload. Sobra decir que conviene leerse la documentación…

Una vez flasheado el firmware hay que configurarlo. Para ello conectamos el arduino al pc y abrimos el monitor serie. Debería aparecer un mensaje como:

 Grbl 0.9b 
'$' to dump current settings

Obteniendo un listado de las opciones de configuración al introducir el comando $:

$0 = 400.0 (steps/mm x) 
$1 = 400.0 (steps/mm y)
$2 = 400.0 (steps/mm z)
$3 = 30 (microseconds step pulse)
$4 = 480.0 (mm/sec default feed rate)
$5 = 480.0 (mm/sec default seek rate)
$6 = 0.100 (mm/arc segment)
$7 = 0 (step port invert mask. binary = 0)
$8 = 25 (acceleration in mm/sec^2)
$9 = 300 (max instant cornering speed change in delta mm/min)
'$x=value' to set parameter or just '$' to dump current settings

Lo más importante que debemos configurar es el número de pasos por milímetro para los ejes X e Y que fijaremos a 53.333 introduciendo “$1=53.333” y “$2=53.333”. Una vez hecho lo comprobamos introduciendo la línea gcode: “G91 G28 X0 Y0” que asigna como origen de coordenadas a la posición actual y selecciona desplazamientos en mm, seguida de “X10 Y10”, lo que debería producir un desplazamiento de 10mm en cada eje. Si el movimiento no se ejecuta en las direcciones deseadas se puede invertir el movimiento de los ejes con el comando $7. Se puede aumentar la aceleración por encima de 100 y el feed rate y seek rate hasta 1000.

Una vez configurado, como cualquier máquina CNC, nuestro grabador láser ejecutará los movimientos que le pidamos mediante instrucciones gcode transmitidas a través del puerto serie desde un PC. Para esto necesitamos una aplicación en el PC que va mandando el contenido de un archivo gcode. Encontraremos varias opciones si buscamos en google “gcode sender”. Yo utilizo SourceRabbit GCode Sender.

Para convertir un archivo gráfico, ya sea fotografía o dibujo, a formato gcode para enviarlo a nuestra máquina tenemos dos opciones muy distintas que no siempre son aplicables indistintamente a cualquier tipo de imagen, trabajar en formato “raster” o mapa de bits o en formato vectorial.

En formato “raster” la imagen esta formada por líneas horizontales de pixeles blancos o negros siendo el archivo gcode generado muy grande así como el tiempo de ejecución del grabado. Este procedimiento es adecuado para grabar imágenes fotográficas de retratos, paisajes, etc. y utilizaremos para esto la utilidad DotG, que requiere como entrada archivos bmp de 1bit es decir en blanco y negro. Estos se pueden conseguir a partir de cualquier imagen con una de las muchas aplicaciones de retoque fotográfico o procesado de imágenes y yo en este caso utilizo FastStone Image Viewer.

Hay que señalar que para poder utilizar DotG tenemos que definir un postprocessor. Hay un manual de uso donde queda mas o menos claro como generar un archivo .dgp a utilizar como postprocesador, en él se especifica que tipo de comandos gcode se corresponden con las acciones de movimiento generadas a partir de la imagen. Yo he escrito un postprocessor sencillo que me funciona perfectamente:

{header
( - DotG program - processed by amalzaga - amadoralzaga.com )
( - BMP:[bmpfile] - )
( Xmin:[xmin] Ymin:[ymin] )
( Xmax:[xmax] Ymax:[ymax] )
X[xh] Y[yh]
}
{moving
X[xa] Y[ya] F[f]
M3
ifsl
X[sl] F[f]
endsl
M5
}
{pgmend
( end of program )
X[xh] Y[yh]
}

Aquí dejo un link para descargar, hay renombrarlo con extensión .dgp y copiarlo a la carpeta Post dentro de la instalación de DotG, posteriormente seleccionarlo desde la interfece de usuario del programa

Las siguientes imágenes son una muestra de grabados obtenidos mediante la técnica de rasterizado

Por otro lado, para trabajar con gráficos en formato vectorial, idoneos para el grabado de figuras geométricas más o menos complejas, utilizaremos el software de código abierto Inkscape. Es un potente programa de edición para este tipo de gráficos que trabaja con archivos de extensión .SVG, acrónimo de “Scalable Vector Graphics”. En este formato las imágenes están formadas por líneas definidas por vectores, cuyas coordenadas son guardadas en el archivo, de forma que son susceptibles de se transformadas matemáticamente (mediante álgebra matricial) sin la menor perdida de calidad. Pueden escalarse, rotarse, aplicar simetrías, etc.

Para poder usar un grabador láser y que Inkscape nos genere el correspondiente gcode debemos instalar una extensión llamada Laser Engraver. Si la buscamos en la web es probable que no nos funcione debido a un bug causado por cambios en la versión 0.92 de Inkscape, esto se soluciona sustituyendo la linea de código 3080 del archivo laserengraver.py de la siguiente manera:

 Línea original:
doc_height = inkex.unittouu(self.document.getroot().get('height'))

Nueva línea:
doc_height = self.unittouu(self.document.getroot().xpath('@height', namespaces=inkex.NSS)[0])

He intentado dejar una copia ya corregida de la extensión laserengraver, pero mi proveedor de hosting no me deja insertar archivos zip por seguridad :-(, habrá que subirlo a github… Y en el siguiente enlace lo tenemos disponible —> https://github.com/amalzaga/LaserEngraver

Debemos copiar los archivos del repositorio en la carpeta shared/extensions/ dentro de la ruta de instalación de Inkscape en nuestro sistema, requerirá permisos de administrador. Una vez hecho al iniciar Inkscape tendremos la extensión disponible pero ¿Cómo utilizarla?

Tenemos que partir de un gráfico en formato vectorial que podemos dibujar nosotros mismos en Inkscape, bajarnos archivos SVG de internet (la mayoría o son de pago o son una caca) o, lo que es muy, pero que muy interesante, podemos vectorizar con Inkscape imágenes que originalmente estén en formato de mapa de bits, es decir, cualquier archivo de imagen. Si la imagen original esta formada por formas geométricas bien definidas y no es excesivamente compleja el resultado puede ser muy bueno, en cambio con fotografías con muchos detalles y una iluminación deficiente la cosa no suele funcionar. Para hacer esto en Inkscape importamos el archivo de imagen y luego seleccionamos “vectorizar mapa de bits” en el menú “Trayecto”. Nos generará un objeto formado por trayectorias vectoriales que definen las líneas del dibujo y podemos guardarlo como archivo SVG.

Una vez disponemos de una imagen vectorial, con ella seleccionada vamos a extensiones->laserengraver, seleccionamos el directorio de salida y nombre de archivo, así como la velocidad de grabado en mm/s y al aplicar nos generará el archivo gcode correspondiente que, por fín, mandaremos a nuestro CNC-Laser con SourceRabbit GCode Sender. Se obtienen resultados como los que muestran las imágenes siguientes.