Plotter de pluma controlado por Raspberry Pi con GRBL
Construye una máquina de dibujo de dos ejes que convierte arte SVG en tinta sobre papel, con un Pi que prepara y envía el G-code.
Un plotter de pluma es una máquina CNC que dibuja en vez de cortar. Un Arduino Uno con GRBL mueve dos motores paso a paso con aceleración suave, un servo pequeño levanta la pluma y el Pi usa vpype para optimizar los trazos SVG y enviarlos por USB.
Los drivers de los motores se calientan: agrega un ventilador o disipadores y nunca desconectes un motor con el shield encendido. Mantén los dedos lejos de correas y poleas mientras se mueve.
Pasos de la misión
Arma el marco
Imprime o compra un pórtico XY; las correas y varillas lisas dan líneas más limpias que las varillas roscadas. Monta el portaplumas en una bisagra que un servo pueda levantar.
Graba GRBL
Carga GRBL en el Uno R3 desde el Arduino IDE, o una variante de GRBL que mueva un servo de pluma con M3/M5 si no usas motor en Z.
Conecta y ajusta la corriente
Coloca los drivers A4988 en el CNC shield, conecta los motores a X y Y y ajusta el límite de corriente de cada driver con un multímetro.
Configura GRBL
Ajusta los pasos por mm ($100, $101), las velocidades máximas y la aceleración; luego dibuja un cuadrado de prueba y mídelo.
Prepara el arte
En el Pi corre pip install vpype vpype-gcode y convierte un SVG con un perfil que defina tus comandos de subir y bajar la pluma.
Envía y dibuja
Corre el script de envío con el archivo .gcode y mira cómo dibuja el plotter.
Código
python3 -m venv ~/plot && source ~/plot/bin/activate
pip install vpype vpype-gcode pyserial
# 'myplotter' is a profile you define in ~/.vpype.toml with your pen up/down codes
vpype read drawing.svg linemerge linesort gwrite --profile myplotter drawing.gcode# stream.py — send G-code to GRBL line by line, waiting for 'ok'
import serial, sys, time
port = serial.Serial('/dev/ttyUSB0', 115200) # genuine Unos often show as /dev/ttyACM0
port.write(b"\r\n\r\n"); time.sleep(2); port.reset_input_buffer()
for raw in open(sys.argv[1]):
line = raw.split(';')[0].strip()
if not line:
continue
port.write((line + '\n').encode())
reply = port.readline().decode().strip()
if reply != 'ok':
print(f"{line!r} -> {reply}")
print('Done')Code comments are in English, like most libraries and docs — a good habit for makers.
Preguntas
¿Por qué el Uno R3 y no el Uno R4 WiFi?
El GRBL clásico está escrito para el chip ATmega328P del Uno R3. El R4 usa otro procesador, así que GRBL no corre en él.