Hasta ahora, nuestros robots se movían “más o menos” hacia donde queríamos. Si un robot de ruedas patina un poco, no pasa nada. Pero si queremos que una máquina dibuje un plano o un circuito impreso, el error no es una opción.
Bienvenidos al mundo del CNC (Computer Numerical Control).
En este proyecto vamos a construir un Plotter XY: una máquina que mueve un bolígrafo en dos ejes (X e Y) para dibujar cualquier vector que diseñemos en el ordenador.
Este proyecto es la base para construir posteriormente impresoras 3D, cortadoras láser o fresadoras CNC. La lógica de control (G-Code) es exactamente la misma.
Motores paso a paso y lazo abierto
Para lograr precisión, abandonamos los motores DC y los servos continuos. Pasamos a los Motores Paso a Paso (Steppers).
Un Stepper no gira libremente. Su rotación está dividida en pasos discretos (habitualmente 200 pasos por vuelta, es decir, 1.8º por paso). Esto nos permite mover el eje exactamente lo que queramos sin necesitar sensores de posición.
Si le decimos “avanza 100 pasos”, sabemos que ha girado 180º exactos.
Esto se llama Control en Lazo Abierto. Confiamos ciegamente en que el motor no ha perdido pasos. Por eso, si forzamos la máquina y un motor se “traba”, todo el dibujo posterior saldrá desplazado.
G-code y GRBL
Aquí ocurre un cambio de paradigma. No vamos a escribir un sketch de Arduino desde cero que diga digitalWrite(motor, HIGH). Eso sería reinventar la rueda y sería muy ineficiente.
Usaremos Grbl 1.1, un firmware de código abierto para control CNC que puede ejecutarse en un Arduino Uno y actúa como intérprete de G-code.
- Nosotros enviamos:
G1 X10 Y20 F100(Vete a la coordenada 10,20 a velocidad 100). - GRBL traduce: Calcula aceleraciones, frenadas y envía miles de pulsos eléctricos precisos a los motores para realizar ese movimiento suavemente.
Componentes
- [1x|blue] Arduino Uno | Cerebro del plotter
- [1x|orange] CNC Shield v3 | Placa que se pincha sobre Arduino
- [2x|red] Drivers A4988 o DRV8825 | Control de motores paso a paso
- [2x|green] Motores Paso a Paso NEMA 17 | Ejes X e Y
- [1x|purple] Micro Servo SG90 | Eje Z (subir/bajar lápiz)
- [1x|red] Fuente de alimentación 12V 2A | Para motores {externa}
Podemos hacer este proyecto reciclando viejas lectoras de DVD (que tienen mecanismos de pasos pequeñitos) o con componentes estándar de impresión 3D. Recomendamos lo segundo por facilidad.
Esquema de conexión
La CNC Shield hace que conectar esto sea como un LEGO.
Drivers de los ejes
Los drivers A4988 o DRV8825 se insertan en los zócalos X e Y de la CNC Shield. Fijaos bien en la orientación del pin EN, porque un driver colocado al revés puede quemarse al alimentar la placa.
[ { “from”: “Driver A4988 eje X”, “to”: “Zócalo X CNC Shield”, “color”: “orange”, “note”: “Respetar orientación EN” }, { “from”: “Driver A4988 eje Y”, “to”: “Zócalo Y CNC Shield”, “color”: “orange”, “note”: “Respetar orientación EN” }, { “from”: “Jumpers microstepping X/Y”, “to”: “CNC Shield”, “color”: “gray”, “note”: “Configuran pasos por vuelta” } ]
Motores paso a paso
Los NEMA 17 se conectan a las salidas de cuatro hilos de cada eje. Si un eje gira al revés, normalmente basta con invertir una bobina o ajustar la configuración de GRBL.
[ { “from”: “Motor NEMA 17 eje X”, “to”: “Salida motor X”, “color”: “green” }, { “from”: “Motor NEMA 17 eje Y”, “to”: “Salida motor Y”, “color”: “green” } ]
Servo del lápiz
El Grbl oficial no controla directamente un servo como eje Z. Necesitas una variante específica para plotter; usa el pin y los comandos que documente exactamente esa variante, porque en Grbl 1.1 el pin D11 se usa normalmente para la salida PWM de spindle y cambia la asignación del límite Z.
[ { “from”: “Servo señal”, “to”: “Pin definido por la variante GRBL”, “color”: “purple”, “note”: “No asumir D11 sin comprobar documentación” }, { “from”: “Servo VCC”, “to”: “5V regulados”, “color”: “red” }, { “from”: “Servo GND”, “to”: “GND común”, “color”: “black” } ]
Alimentación
La alimentación de motores entra por la bornera de la CNC Shield. Ajusta también la corriente límite de los drivers antes de exigirles trabajo de verdad.
[ { “from”: “Fuente 12V (+)”, “to”: “Bornera VMOT +”, “color”: “red” }, { “from”: “Fuente 12V (-)”, “to”: “Bornera GND”, “color”: “black” }, { “from”: “Arduino Uno”, “to”: “CNC Shield”, “color”: “blue”, “note”: “La shield va pinchada encima” } ]
Flujo de software
Aquí el proceso es distinto a un “upload” normal. Tenemos tres pasos:
Firmware
Instala Grbl 1.1 si el lápiz se acciona mediante una salida compatible con spindle, o elige una variante mantenida para servo. No mezcles instrucciones de forks distintos: comprueba su versión, mapa de pines, rango del servo y comandos admitidos antes de cablear.
Después abre el ejemplo de carga indicado por el repositorio elegido y súbelo a la placa.
Tras cargarlo, la placa se comportará como una controladora CNC mientras conserve ese firmware.
Diseño y generación de trayectorias
Necesitamos generar el G-code. Puedes dibujar el vector en Inkscape y exportarlo con una extensión compatible, o usar otra herramienta CAM que genere código admitido por tu firmware.
- Dibujas tu vector (texto, logo…).
- Lo conviertes a trayecto.
- Guardas el archivo
.gcodeo.nc.
El archivo resultante se ve así si lo abres con el bloc de notas:
G21 (Unidades en mm)
G90 (Coordenadas absolutas)
M3 S90 (Activar salida; el efecto depende de la variante)
G1 X10 Y10 F1000 (Mover diagonal)
M5 (Desactivar salida)
Emisor de G-code
Necesitamos un programa en el PC que envíe ese archivo línea por línea al Arduino. Recomendamos Universal G-Code Sender (UGS) o CNCjs. Conectas el Arduino al USB, abres el puerto en UGS y verás el estado de la máquina.
Calibración de pasos por milímetro
Esta es la parte matemática crucial. GRBL necesita saber: “Para moverme 1 mm, ¿cuántos pulsos (pasos) debo enviar?”.
La fórmula es:
- PasosPorVuelta: 200 (en motores estándar de 1.8º).
- Microstepping: Configurado por los jumpers bajo el driver (normalmente 1/16).
- Transmisión: Si usas correa GT2 estándar, suelen ser 2mm de paso y poleas de 20 dientes -> 40mm por vuelta.
En la consola de UGS, enviamos el comando para configurar el eje X:
$100=80 (Configura X a 80 pasos/mm).
Prueba de un eje sin GRBL
Si quieres probar un motor sin instalar GRBL, puedes usar la librería AccelStepper:
#include <AccelStepper.h>
// Definición para un driver tipo A4988 (Interface 1)
// Pines de la CNC Shield para el Eje X
const int xStep = 2;
const int xDir = 5;
AccelStepper stepperX(AccelStepper::DRIVER, xStep, xDir);
void setup() {
// Velocidad máxima y aceleración
stepperX.setMaxSpeed(1000);
stepperX.setAcceleration(500);
// Decimos que queremos ir a la posición 2000 pasos
stepperX.moveTo(2000);
}
void loop() {
// En el loop debemos llamar a run() lo más rápido posible
// Él decidirá si toca dar un paso en este instante o no
if (stepperX.distanceToGo() == 0) {
// Si llegó, vuelve al inicio
stepperX.moveTo(-stepperX.currentPosition());
}
stepperX.run();
}
Este código solo comprueba que el motor gira. Para dibujar, usa GRBL u otro firmware que coordine los ejes, gestione aceleraciones e interprete G-code.
Siguientes pasos
Una vez que tu plotter dibuje a lápiz:
- Cortadora de Vinilo: Sustituye el lápiz por una cuchilla de corte de arrastre y podrás hacer pegatinas.
- Finales de carrera: Añade homing para establecer un origen repetible y límites de recorrido.
- Más precisión: Mide el dibujo real, corrige los pasos por milímetro y reduce holguras antes de aumentar el tamaño de la máquina.
El CNC es una disciplina que requiere paciencia, pero ver a tu máquina dibujar sola tu nombre con caligrafía perfecta es hipnótico.