Página principal
Arduino
CNC con piezas de DVD recicladas
Programas GRBL, Inkscape,
Gcodetools, UniversalGcodeSender
Parte 4
En la primera parte de este montaje había
realizado un CNC con un lenguaje propio. PARTE1
En la segunda parte de montaje, realizo una sencilla interface
gráfica con Gambas (Visual Basic para linux). PARTE2
En la tercera parte mostré como utilizar el CNC con un programa
comercial llamado Benbox. PARTE3
En esta cuarta entrega de está serie de artículos sobre CNC
(plotters), explico como utilizar el programa Inkscape para
crear ficheros con extensión ngc que pueden ser impresos con
un programa bastante extendido llamado GRBL.
El programa mas popular a nivel general para manejar maquinas CNC es
GRBL.
https://github.com/grbl/grbl
Este programa se encuentra en el arduino, y sirve para interpretar
las ordenes en lenguaje GCODE.
Maneja los distintos motores paso a paso de la maquina CNC,
pulsadores de fin de carrera si existe, y otros dispositivos..
https://reprap.org/wiki/G-code/es
Los comandos mas usados son:
G-Codes
- G0 - Rapid Motion
- G1 - Coordinated Motion
- G2 - Arc - Clockwise
- G3 - Arc - Counter Clockwise
- G4 - Dwell
- G10 - Create Coordinate System Offset from the Absolute one
- G17 - Select XY plane (default)
- G18 - Select XZ plane (not implemented)
- G19 - Select YX plane (not implemented)
- G20 - Inches as units
- G21 - Millimeters as units
- G28 - Home given Axes to maximum
- G30 - Go Home via Intermediate Point (not implemented)
- G31 - Single probe (not implemented)
- G32 - Probe area (not implemented)
- G53 - Set absolute coordinate system
- G54-G59 - Use coordinate system from G10 P0-5
- G90 - Absolute Positioning
- G91 - Relative Positioning
- G92 - Define current position on axes
- G94 - Feed rate mode (not implemented)
- G97 - Spindle speed rate
- G161 - Home negative
- G162 - Home positive
G-Codes pueden tener argumentos, algunos de los mas usados son:
- X absolute position
- Y absolute position
- Z absolute position
- A position (rotary around X)
- B position (rotary around Y)
- C position (rotary around Z)
- U Relative axis parallel to X
- V Relative axis parallel to Y
- W Relative axis parallel to Z
- M code (another "action" register or Machine code(*)) (otherwise referred to as a "Miscellaneous" function")
- F feed rate
- S spindle speed
- N line number
- R Arc radius or optional word passed to a subprogram/canned cycle
- P Dwell time or optional word passed to a subprogram/canned cycle
- T Tool selection
- I Arc data X axis
- J Arc data Y axis.
- K Arc data Z axis, or optional word passed to a subprogram/canned cycle
- D Cutter diameter/radius offset
- H Tool length offset
Ejemplo:
G1 X5 Y-5 Z6 F3300.0 Mueve el lápiz o taladro <x,y,z>=<5,-5,6> con una velocidad de 3300.0)
G21 (unidades en mm)
G90 (colocar la posición actual como absoluta)
G92 X0 Y0 Z0 (la posición actual se coloca como xyz) <x,y,z>=<0,0,0>)
El programa GRBL está diseñado para maquinas CNC (3 ejes XYZ), pero
en nuestro caso es un servo, por lo cual debemos modificar el
programa.
Lo primero es descargar el fichero fuente de https://github.com/grbl/grbl
y sustituir el spindle_control.c por otro, en
ficheros de programa se encuentra ya sustituido.
La información la saque de: https://www.instructables.com/id/How-to-Control-a-Servo-Using-GRBL/
Ahora los comandos utilizados para pintar son:
M03 S700 baja el lapiz.
M03 S1024 sube el lapiz.
También tenemos que retocar parte del código.
En primer lugar quiero cambiar la velocidad del puerto serie, esto
es optativo, pero me aseguro la comunicación.
Editamos el fichero config_h y modificamos el
BAUD_RATE , cambiamos a:
// Serial baud rate
#define BAUD_RATE 9600
Como yo tengo arduino nano, debo cambiar la configuración del
programador en el fichero Makefile.
#Para arduino NANO
PROGRAMMER = -c stk500v1 -P /dev/ttyUSB0 -b 57600 -p
atmega328p
Lo que viene ahora
es para los que tengan una placa como la mía un poco
particular, tiene los pins cambiados, lo normal es que
no tengan que hacer esto.
En el fichero cpu_map_atmega328p.h
cambiar la configuración de los pins.
/* ORIGINAL
#define
STEP_DDR DDRD
#define
STEP_PORT PORTD
#define
X_STEP_BIT 2 // Uno
Digital Pin 2
#define
Y_STEP_BIT 3 // Uno
Digital Pin 3
#define
Z_STEP_BIT 4 // Uno
Digital Pin 4
*/
//SETA43
#define
STEP_DDR DDRD
#define
STEP_PORT PORTD
#define X_STEP_BIT
5
#define Y_STEP_BIT
6
#define Z_STEP_BIT
7
/* ORIGINAL
#define
DIRECTION_DDR DDRD
#define DIRECTION_PORT
PORTD
#define X_DIRECTION_BIT
5 // Uno Digital Pin 5
#define Y_DIRECTION_BIT
6 // Uno Digital Pin 6
#define Z_DIRECTION_BIT
7 // Uno Digital Pin 7
*/
//SETA43
#define
DIRECTION_DDR DDRD
#define DIRECTION_PORT
PORTD
#define X_DIRECTION_BIT 2
#define Y_DIRECTION_BIT 3
#define Z_DIRECTION_BIT 4
|
Ya solo nos que compilar el programa GRBL con:
make.
Cargamos el programa en el arduino con: make flash.
Ya con cualquier terminal serie podemos ver y cambiar la
configuración del GRBL.
Yo suelo utilizar CuteCom o gtkterm , pero también
sirve el terminal de arduino.
Para ver la configuración del GRBL que se almacena en la EEPROM del
arduino debemos teclear la orden :$$
La configuración que tengo cambiada para mi es:
OK pwn spine ___SERVO____
Grbl 0.9j ['$' for help]
$0=10 (step pulse, usec)
$1=25 (step idle delay, msec)
$2=0 (step port invert mask:00000000)
$3=0 (dir port invert mask:00000000)
$4=0 (step enable invert, bool)
$5=0 (limit pins invert, bool)
$6=0 (probe pin invert, bool)
$10=3 (status report mask:00000011)
$11=0.010 (junction deviation, mm)
$12=0.002 (arc tolerance, mm)
$13=0 (report inches, bool)
$20=0 (soft limits, bool)
$21=0 (hard limits, bool)
$22=0 (homing cycle, bool)
$23=0 (homing dir invert mask:00000000)
$24=25.000 (homing feed, mm/min)
$25=500.000 (homing seek, mm/min)
$26=250 (homing debounce, msec)
$27=1.000 (homing pull-off, mm)
$100=5.200 (x, step/mm)
$101=3.200 (y, step/mm)
$102=250.000 (z, step/mm)
$110=2000.000 (x max rate, mm/min)
$111=2000.000 (y max rate, mm/min)
$112=2000.000 (z max rate, mm/min)
$120=300.000 (x accel, mm/sec^2)
$121=300.000 (y accel, mm/sec^2)
$122=300.000 (z accel, mm/sec^2)
$130=200.000 (x max travel, mm)
$131=200.000 (y max travel, mm)
$132=200.000 (z max travel, mm)
ok
El principal cambio que debemos hacer para adaptar nuestro plotter
es (x, step/mm) y (y, step/mm).
Como el trayecto a recorrer (Eje X) es de 50 mm y se necesita 260
pasos, y para el eje Y se necesita 160 pasos (el mio es un caso
particular al tener diferente tipo de pasos 260x160) el cálculo es
el siguiente:
Eje X 260/50=5.2
Eje Y 160/50=3.2
Cambiamos la configuración con las ordenes.
$100=5.2
$101=3.2
Las demás configuraciones debemos cambiarlas dependiendo el tipo de
motor paso a paso que tengamos.
Normalmente funciona sin tocar nada mas, pero cambiando algún que
otro parámetro veremos como aumenta la velocidad de pintado.
Ya podemos mandar ordenes a la placa.
Como en mi CNC (plotter) no tiene interruptores de fin de carrera,
tengo que ajustar el CNC a la posición inicial X=0 y Y=0.
G0 X0 Y0
Ahora manualmente coloco el CNC al punto 0,0 .
Tenemos todo preparado para recibir ordenes con el formato Gcode.
Para crear los gráficos utilizamos el programa Inkscape , y
la extensión Gcodetools para generar el código Gcode.
Nuestra superficie de pintado es de 50mmx50mm por lo que empezamos
cambiando las propiedades del documento.
En el menú extensiones->
GcodeTools->Biblioteca de herramientas,
seleccionamos graffiti.
|
En el menú extensiones->
GcodeTools->Puntos de orentación,
seleccionamos aplicar.
|
Editamos el diámetro a 1, la velocidad (feed) 4000, velocidad de
bajada del lapiz (penetration feed) 1000.
Editamos las ordenes de pintado. M3 S700 para pintar y M3 S1024 para
dejar de pintar. La orden Sxxx es el ángulo del servo.
Alineamos el punto de orientación para que coincida 0,0 a la parte
inferior izquiedad, y el punto 100 al punto 100 de la rejilla.
Probamos a dibujar una línea y unas letras de trazado simple,
extensiones-> Generar(Render)->Hershey Text.
Si usamos texto normal con fuentes normales deberemos pasarlas a
trayectos. Trayecto-> Objeto a trayecto.
YA solo nos queda generar el código Gcode, extensiones->
GcodeTools->Trayecto a Gcode.
Al pulsar sobre aplicar en trayecto aGcode nos mostrará un aviso de
que no existe ningún objeto seleccionado, y que generará todos los
trayectos que existen.
Después de haber generado el código Gcode, debemos retocar un poco
el fichero generado.
Quitando al final del fichero M2 y M5.
Ya tenemos el fichero en formato Gcode, ahora nos toca mandarlo al
CNC, y esto lo hacemos con el programa Universal Gcode
Sender.
Cargamos el fichero con el nombre ejemplo.ngc y lo
visualizamos.
Ya solo nos queda pulsar el boton Send y ver como imprime el
CNC (plotter)
Resultado de la impresión.
Otras pruebas de impresión.
PROGRAMAS
VIDEO DE FUNCIONAMIENTO
Todo el montaje y programación está realizado bajo Linux y con la
distribución DEBIAN 9.
Saludos.
Juan Galaz
Bibliografía:
PARTE1
PARTE2
PARTE3
https://github.com/cnc-club/gcodetools
https://github.com/grbl/grbl
https://reprap.org/wiki/G-code/es
https://en.wikipedia.org/wiki/G-code
http://gcode.ws/
http://replicat.org/gcodes
http://diwo.bq.com/cnc-gcode-controller-instalacion-y-uso/
https://github.com/grbl/grbl/wiki/Configuring-Grbl-v0.9
https://github.com/grbl/grbl/wiki/Using-Grbl
https://www.staticboards.es/blog/dominar-motor-paso-a-paso-con-grbl/
http://www.holdme.cn/thread-1566-1-1.html
https://mega.nz/#!u8RnBDRa!G39BvWg0dSnv0Iwr49dDxI_rFS3fQuSBxM0wBUSxZcQ
https://www.instructables.com/id/Configurando-La-Grabadora-Laser-Benbox-DIY/#CTDIJIHITCH84HX
http://www.electronoobs.com/eng_impresoras_eleksmaker_2.php
https://www.doovi.com/video/how-to-make-homework-writing-machine-at-home/sUdAwUOaPX0
https://www.luisllamas.es/motores-paso-paso-arduino-driver-a4988-drv8825/
https://es.aliexpress.com/item/3DV4-CNC-Shield-V4-engraving-machine-Nano-3-0-with-USB-A4988-Reprap-Stepper-Drivers-for/32809568484.html
http://wiki.keyestudio.com/index.php/Ks0096_keyestudio_CNC_Kit_/_CNC_Shield_V4.0_%2B_Nano_3.0%2B3pcs_a4988_Driver_/_GRBL_Compatible
http://osoyoo.com/2017/04/07/arduino-nano-cnc-shield-v4-0a4988/