2021-05-22
Introducción al GCODE y GRBL
Contenido
¿Qué es el GCODE?
Una máquina de control númerico (CNC) es una máquina "tonta", solo sabe moverse de una coordenada a otra realizando o no una operación. En una impresora 3d, por ejemplo, la máquina mueve el cabezal depositando cierta cantidad de material; en una fresa se mueve en una dirección cortando la pieza; en un plotter mueve el puntero dibujando una curva, etc.
Pero esos movimientos que hace deben ser especificados de una manera que la CNC sepa interpretarlos. Aquí es donde entra GCODE o lenguaje G.
El GCODE es una secuencia de comandos básicos que la CNC sabe interpretar y que generalmente se corresponden a movimientos o acciones que debe llevar a cabo.
Cuando diseñamos una pieza y queremos trabajarla en una máquina CNC, primero hacemos el diseño y cuando hemos acabado generamos un archivo de CNC que no es nada más que un programa en lenguaje G. Este archivo será un simple archivo de texto plano en el cual cada línea será un comando a ejecutar por la CNC.
El GCODE se le conoce también como RS-274 o ISO-code y aunque es el lenguaje de programación más utilizado en control numérico no es el único lenguaje existente.
Los planos de una CNC.
En una CNC se realizaran movimientos en una dirección u otra según le indiquemos, para ello las CNC utilizan un sistema cartesianos de ejes X, Y, Z, que representan las coordenadas de un punto.
Generalmente en este sistema de coordenadas el eje X representa la longitud, el eje Y representa el ancho y Z la altura. Cada par de ejes forma un plano.
En una CNC podemos indicar quien es cada eje y que plano forma.
En GCODE un punto se especifica con el nombre del eje (X,Y,Z) y un valor númerico que expresa una distancia. Dicha distancia suele expresarse sin medida y a la CNC hemos de indicarle si se trata de milimetros o pulgadas.
Existen otros tres ejes llamados A, B, C que representan giros sobre el eje X, Y, Z respectivamente. Su valor suele especificar un ángulo, generalmente en grados.
La distancia que es expresa en cada coordenada puede ser de dos tipos. Absoluta o incremental. Cuando damos una posición absoluta, la distancia será la que existe al origen o punto (0,0,0). En una incremental la distancia representa un desplazamiento desde el punto actual donde se halle la máquina.
Pongamos un ejemplo: La máquina se halla en la posición X10 Y10 y le indicamos que que las siguientes coordenadas son X20 Y20. Usando un movimiento absoluto la máquina irá a la posición 20, 20 tomando como referencia el origen. En cambio, usando movimiento incremental la máquina se posicionará en las coordenas 30, 30 ya que tomará el valor de las nuevas coordenadas como un incremento a la posición actual.
Las letras de GCODE y los comandos
En GCODE cada comando/sentencia se compone de un conjunto de letras acompañadas de un número. Cada letra representa "algo", por ejemplo X Y Z representan coordenadas.
La letra G indica un comando, veremos los comandos más adelante.
Las letras X, Y y Z como ya vimos, representan coordenadas.
La letra F representa la velocidad de movimiento o feedrate. Con ello le indicamos a la máquina que queremos movernos de una posición a otra en un determinado tiempo. Generalmente esta unidad se expresa en milimetros por minuto.
La letra S indica la velocidad de corte de la herramienta generalmente en revoluciones por minuto (rpm).
La letra T sirve para indicar que tipo de herramienta estamos utilizando.
La letra M suele usarse con T y cada valor representa alguna acción a realizar.
La letra N es un número de línea
GCODE es complejo y permite hasta bifurcaciones, el mecanismo para controlarlas es mediante el número de línea. No es algo muy usado, pero hay que tener en cuenta que es factible.
Las letras I, J, K son desplazamientos o un offset con respecto a los ejes X,Y,Z.
Usaremos el ; (punto y coma) para añadir comentario en nuestra línea de programa. Todo lo que haya después del punto y coma será ignorado.
El comando G0
G0 realiza un movimiento en línea recta a máxima velocidad. Usaremos este comando queramos que la herramienta se ponga en posición pero sin realizar trabajo, es decir, la impresora 3d no imprimirá o la fresadora no cortará.
G00 X0 Y0 Z0 ; Mueve el cabezal a la posición (X,Y,Z).
El comando G1
Es igual que el G0, realiza una línea recta, pero a diferencia que este la velocidad de movimiento será la que le indiquemos con el comando F o el que hayamos especificado previamente. Ejemplo:
G01 X30 Y30 F100
o especificando, previamente la velocidad
F100 G01 X30 Y30
Una cosa importante a tener en cuenta es que en GCODE los valores de posición, velocidad, etc se guardan en variables que se mantienten.
Ejemplo: realizamos un movimiento rápido a la posición X30,Y30,Z20. Luego realizamos un trabajo hacia la posición X60,Y30,Z20. El código sería:
G00 X30 Y30 Z20 ; Nos posicionamos rápido. G01 X60 ; Trabajamos en el eje X.
Como se observa, en el comando G01 no se ha indicado coordenada Y. Si bien podriamos haber mandado el comando "G01 X60 Y30 Z20", pero la máquina CNC tomara nuestro Y (y el Z) como el valor anterior. Tampoco hemos indicado una velocidad, así la velocidad de trabajo seria la velocidad indicada en lineas anteriores por algún F.
Igualmente ocurre con los comandos:
G01 X60 Y30 ; realiza una línea hacia esa posición. X100 Y50 ; realiza una línea hacia esa posición.
Como se observa en el segundo comando no hemos indicado el comando G, así que la máquina asumirá que el comando actual será el mismo que el anterior.
Si bien este mecanismo es útil para reducir el tamaño de la instrucción y para comandos repetitivos, puede llegar a crear confusión así que es mejor especificar cada cosa cuando nos hace falta.
Los comandos G2 y G3
Estos comandos son exactamente iguales y sirven para realizar un movimiento circular. La única diferencia es que G2 realizará la curva en sentido horario y G3 realizará la curva en sentido antihorario.
En ambos casos, debemos indicar el punto final donde queremos que termine de hacer la línea y un offset para indicar el centro relativo de dicho circulo.
Para hacer una circunferencia completa podemos utilizar como punto final el mismo que el inicial especificando en el offset el radio.
El comando G02/03 es muy complejo, y hay que probar mucho para conseguir buenos resultados. Muchos programas lo que hacen para hacer una curva es enviar muchos comandos G01 con los puntos de la circunferencia.
Otros comandos G
Aquí mostramos una lista de otros códigos G importantes:
| G20 | Establece las unidades en pulgadas. |
| G21 | Establece las unidades en milimetros. |
| G17 | Se usa el plano XY. |
| G18 | Se usa el plano XZ. |
| G19 | Se usa el plano YZ. |
| G28 | Retorno a casa. Se mueve a la posición (0,0,0). Para evitar obstaculos podemos pasar un parametro X,Y,Z indicando un punto intermedio. |
| G90 | Las coordenadas serán ABSOLUTAS. |
| G91 | Las coordenadas serán RELATIVAS. |
Los comandos M
Estos comandos son más genéricos y tienen más funciones, la lista es extensa pero veremos los mas importantes:
| M00 | Parada de programa. |
| M02 | reset del programa. |
| M03 | Enciende el motor de la herramienta en sentido horario. |
| M04 | Enciende el motor de la herramienta en sentido antihorario. |
| M05 | Parar el motor de la herramienta. |
| M06 | Cambiar la herramienta. |
| M08 | Encender el alimentador del refrigerante. |
| M09 | Apagar el alimentador del refrigerante. |
| M30 | Fin del programa. |
GRBL
Muchas máquinas CNC se controlaban mediante el puesto paralelo del ordenador, pero ya casí no existen ordenadores con este tipo de puerto. GRBL soluciona este problema convirtiendo a un Arduino Uno en un controlador para máquinas CNC de bajo costo y alta fiabilidad.
GRBL no es perfecto, es capaz de ejecutar muchos códigos estándar de código G, pero deja otros muchos fuera. Por ejemplo el uso de macros y funciones del lenguaje, que pueden ser obviados programando un buen codigo G.
El código es open source bajo licencia GNU con lo que se puede leer y modificar a gusto.
Como programo mi Arduino para que sea un dispositivo de GRBL?
Lo primero es descargarnos el código de la pagina oficial del proyecto: GTBL en GITHUB. El archivo descargado será un fichero .zip con el nombre grbl-master.
En el interior de este zip hay varias carpetas. En la carpeta doc encontraremos la documentación en formato markdown. La carpeta que nos interesa es la carpeta llamada grbl.
La instalación la podemos hacer de dos formas:
Extraeremos la carpeta en algún lugar, por ejemplo el escritorio. Abriremos el IDE de Arduino y en la ruta de menú "Programa>Incluir Libreria" elegiremos la opción "Añadir libreria .ZIP". Se abrirá una ventana en la que podremos seguir el árbol de archivs hasta llegar a la carpeta "grbl". La seleccionamos y el IDE cargará automáticamente la libreria.
La otra forma consiste en copiar la carpeta "grbl" en la carpeta de documentos de Arduino. Para ello, buscaremos la carpeta "Documentos>Arduino>libraries" y copiaremos la carpeta "grbl" allí.
A partir de este momento, cuando abramos el IDE podemos ir al menú "Archivo>Ejemplos" y encontraremos un submenú llamado "grbl" y dos ejemplos. El que nos interesa se llama "grblUplodad" que abriremos.
Si vemos el contenido de este archivo observaremos que no hay código solo un comentario diciendo que sirve para subir el código a un arduino basado en atmega328p y como código una macro incluyendo la libreria grbl.h.
Ahora ya solo hemos de subir el código a nuestro Arduino, para ello pulsaremos el botón upload o en daremos en el menú "Programa>Subir Usando Programador". Una vez el proceso finalice ya tendremos el código grbl cargado en el arduino.
Durante la compilación se producirá un error del tipo:
Poca memoria disponible, se pueden producir problemas de estabilidad.
Este error es normal y de momento no es importante.
Conexión de dispositivos al Arduino.
Una vez que tenemos nuestro Arduino programado tendremos que ver como se conectan los dispositivos.
GRBL permite controlar tres motores paso a paso usando drivers del tipo A4988 o DRV8825. Estos motores serán los encargados de mover nuestros ejes X, Y y Z. Estos drivers solo necesitan una señal de dirección y una señal de pulso para mover un paso, por lo que solo son necesarios dos pines para cada motor.
Existe un pin de habilitación para los motores paso a paso. Debemos conectar este pin a cada uno de los drivers de los motores paso a paso para el correcto funcionamiento de la máquina.
También permite controlar la velocidad del huso de la herramienta y su dirección. La velocidad del huso se controla mediante una salida PWM del Arduino. la dirección se controla mediante un pin digital.
En este caso estamos trabajando con la versión 1.11 de GBRL. En versiones anteriores no se podia controlar la velocidad con PWM, asi que en esta versión se movieron los pines. No es un problema importante pero hay que tener en cuenta esto dado que algunos shields están diseñados de tal manera que no permiten controlar el huso correctamente.
Algunas herramientas necesitan refrigerante, por ejemplo en una impresora 3d se necesitan ventiladores para enfriar los mecanismos y en una fresadora de metal será necesario aportar agua para enfriar la pieza. Nuestro Arduino dispone de una salida digital que permite encender/apagar dicho refrigerante. Este pin también puede utilizarse para alimentar un ventilador que nos limpie la superficie de trabajo mientras va cortando.
Disponemos de una serie de entradas que nos permiten añadir una funcionalidad extra a nuestra máquina. Todos estos pines de entrada estan en configuración PULL-UP usando la resistencia interna del microcontrolador, por lo que para activar una entrada deberemos llevarla a GND.
Existen tres entradas para limites de carrera en los ejes X, Y, Z. Estos finales de carrera impedirán que la máquina siga moviendose hacia fuera del limite impuesto. Por ejemplo: si la máquina se está moviendo sobre el eje X y hemos programado mal la distancia seguirá avanzando aunque haya llegado al final del recorrido pudiendo dañar el husillo/tuerca. Si colocamos un final de carrera, el controlador detendrá el motor.
Los limites de carrera sirven tanto para coordenadas crecientes como decrecientes, tan solo hemos de poner dos interruptores a cada extremo conectados en paralelo.
Ciertas entradas nos permiten un control manual del proceso incluyendo un botón de abortar, otro para pausar (detener alimentador) y otro para continuar.
Por último, tenemos una sonda que nos permite buscar "algo". Por ejemplo si estamos fresando placas de circuito esta entrada nos permitirá buscar con exactidud donde empieza la capa de cobre.
Configurando GRBL
La consola de grbl
grbl se comunica con el mundo exterior via una conexión serie. Sirve tanto para recibir el código G como para recibir comandos de configuración del controlador.
Podemos usar cualquier programa de terminal para realizar este proceso de comunicación (incluido el IDE de arduino). Tan solo hemos de tener en cuenta que hemos de configurar la velocidad del puerto a 115200 bps, usar 8 bits de datos, no usar paridad y usar un bit de parada (8N1).
Los comandos son simples líneas de código terminados con un retorno de carro y de línea (CRLF). Cuando enviamos una línea grbl la analiza y ejecuta dicho comando devolviendo un OK o un ERROR dependiendo de si ha podido realizar o no dicho comando.
Hay comandos especiales que no dan como respuesta solo un OK o un error si no que además muestran mucha información. Además la consola sirver para poder configurar los parametros de nuestra máquina.
Comandos
En general grbl asume que todos los caracteres enviados son código G y los examinará e intentará ejecutar tan pronto sea posible. Sin embargo, grbl dispone de dos sistemas de comandos separados del funcionamiento normal del código G. Estos comandos sirven para ver estado de la máquina y poder configurarla.
Los comandos empiezan por el símbolo $. Si después del dolar viene un número significará que estamos tratando con los parámetros de la máquina que veremos mas adelante.
Si el comando es seguido de un carácter es un comando especial. Veremos a continuación estos comandos.
Comandos en tiempo real
Los comandos en tiempo real son comandos que se ejecutarán de manera inmediata. son comandos cortos de un solo caracter y se ejecuta en decenas de milisegundo, no se almacenan en ningún búfer puesto que se ejecutan inmediatemante y no son considerados parte de protocolo.
Estos comandos son los asociados a los pines de control de la placa Arduino: reset, resume, hold, etc.
Existen varios, que se explican detenidamente en la documentación del proyecto.
Parámetros GRBL
Cuando conectemos la controladora podremos enviar el comando $$ y grbl no enviarla por la consola una lista con los parámetros de la máquina. Esta lista esta grabada en la EEPROM del Arduino, así que aunque apages la maquina estos parámetro permanceran.
La lista se compone de varias líneas que tienen el siguiente formato:
$x=val
Siendo x el número de parámetro y val el valor actual de dicho parámetro. En versiones anteriores de grbl, también se mostraba que era dicho parámetro, pero para ahorrar memoria quitaron estos mensajes. Algunos programas son capaces de capturar dicha información y añaden lo que es para identificar mejor el parámetro.
He aquí un ejemplo con los parámetros por defecto:
$0=10 $1=25 $2=0 $3=0 $4=0 $5=0 $6=0 $10=1 $11=0.010 $12=0.002 $13=0 $20=0 $21=0 $22=1 $23=0 $24=25.000 $25=500.000 $26=250 $27=1.000 $30=1000. $31=0. $32=0 $100=250.000 $101=250.000 $102=250.000 $110=500.000 $111=500.000 $112=500.000 $120=10.000 $121=10.000 $122=10.000 $130=200.000 $131=200.000 $132=200.000
Si queremos modificar algún parámetro deberemos enviar el comando $, con el número de parámetro y el valor que queremos que tenga. Por ejemplo:
$0=25
Si el grabado del parámetro se ha hecho correctamente grbl responderá con un 'ok' y podremos comprobarlo enviando de nuevo el comando $$.
Listado de parámetros más importantes