jueves, 7 de enero de 2016

Introducción a código O (subrutinas) y descripción de algunos componentes hal.

Ver el anterior tutorial para poder comprender mejor Configurar archivo .ini y .hal (PID) para usar librería MAX31855 con gmoccapy_lcd7.

Este tutorial se enfoca en como utilizar código O para poder usar en una impresora 3D y se describe como usar algunos componentes para utilizarlos en el archivo .hal.

Se recomienda leer esta información O Code para poder entender lo que se explicará en este tutorial.

El código de Machinekit alojado en github contiene subrutinas hechas para poder controlar diferentes acciones de una impresora 3D, este código O esta implementado con un postprocesador para usarse con el programa slic3r.

En el siguiente link G-code Impresora 3D se encuentran códigos G y M para usar con una impresora 3D.

En el siguiente link G-code RepRap se encuentra la información de como usar los códigos G y M. 

g22.ngc y g23.ngc son subrutinas especiales que sirven para usar la impresora 3d sin tener las posiciones del extrusor, para poder crear los objetos calcula por medio de varios componentes la altura y ancho de las capas a insertar y también calcula el grosor del filamento para poder indicar cuanto filamento debe extruir. Para saber como funciona recomiendo revisar los archivos del siguiente link velocidad-extrusión es una configuración compleja de realizar.

g28.ngc se utiliza para poder mover los ejes al punto de referencia inicial (origen) con una impresora 3D.

o<g28> sub
#500=0; home x
#501=0; home y
#502=0; home z
#503=0; home a
#504=38; probe selection io index
#505=38; probe enable io index
o100 if [EXISTS[#<x>] or EXISTS[#<y>] or EXISTS[#<z>] or EXISTS[#<a>]]
    o110 if [EXISTS[#<x>]]
        #500=1;
    o110 endif
    o111 if [EXISTS[#<y>]]
        #501=1;
    o111 endif
    o112 if [EXISTS[#<z>]]
        #502=1;
    o112 endif
    o113 if [EXISTS[#<a>]]
        #503=1
    o113 endif
o100 else
    #500=1; home x
    #501=1; home y
    #502=1; home z
    #503=1; home a
o100 endif
; M65 P#505; disable probe sensor if it was enabled
o101 if [#500 EQ 1]
    G0 X0
    ; M68 E#504 Q1; select probe
    ; M64 P#505; enable probe sensor
    ; G38.2 X-100.0 F100; probe X axis
    ; M65 P#505; disable probe sensor
o101 endif
o102 if [#501 EQ 1]
    G0 Y0
    ; M68 E#504 Q2; select probe
    ; M64 P#505; enable probe sensor
    ; G38.2 Y-100.0 F100; probe Y axis
    ; M65 P#505; disable probe sensor
o102 endif
o103 if [#502 EQ 1]
    G0 Z0
    ; M68 E#504 Q3; select probe
    ; M64 P#505; enable probe sensor
    ; G38.2 Z-10.0 F100; probe Z axis
    ; M65 P#505; disable probe sensor
o103 endif
o104 if [#503 EQ 1]
    o114 if [#<_ini[FDM]VELOCITY_EXTRUSION_ENABLE> EQ 0]    
        G92 A0; set extruder axis to 0
    o114 endif
o104 endif
o<g28> end sub 

Este código se creo para tener compatibilidad con RepRap flavor GCode, lo que hace es usar G28 para mover los ejes al punto de referencia inicial (home). Se pueden mover todos los ejes a la vez solo ejecutando g28 o ir refrenciando los que se deseen.

Ejemplo:

G28 X30 Y0 -> lo que hace es ignorar el valor de X30 y ponerlo como X0, Y0 seguiría en lo mismo. Por lo que como resultado final quedaría G28 X0 Y0 y solo los ejes X e Y se moverían a cero, el eje de A y Z se omitirán y quedarán en en la posición actual.

Nota: El código M y G que esta con ";" al inicio no se ejecuta (esta comentado), se lo puede usar en el caso de tener finales de carrera, donde la posición de cada eje indica el máximo de recorrido de no encontrar el sensor genera un error y se detiene todo el proceso. Para poder usar con finales de carrera es necesario activar "HOME_IGNORE_LIMITS = NO" en el archivo .ini para recorrer los ejes hasta topar el final de carrera. Con eso ya se puede descomentar los ejes que se requieran usar con finales de carrera y poner una posición de recorrido de acuerdo a la máquina.

Para que funcione esta subrutina es necesario tener esto en el archivo .ini.
[FDM]
VELOCITY_EXTRUSION_ENABLE = 1

g29.ngc

o<g29> sub
o100 if [EXISTS[#<_ini[PROBE]HBP_TEMP>]]
    M190 S#<_ini[PROBE]HBP_TEMP>
o100 endif
#501=38; probe selection io index
#502=0; probe enable io index
M65 P#502; disable probe sensor if it was enabled
M68 E#501 Q0; select probe
G10 L2 P1 Z0.0; reset z offset
G0 Z#<_ini[PROBE]START_Z>
G43 H#<_ini[PROBE]TOOL_NR>
G0 X#<_ini[P0]X> Y#<_ini[P0]Y>
M64 P#502; enable probe sensor
G38.2 Z#<_ini[AXIS_2]MIN_LIMIT> F#<_ini[PROBE]SEARCH_VEL>; probe Z axis
M65 P#502; disable probe sensor
G10 L20 P1 Z0.0; set Z offset
G49
G0 X#<_ini[P0]X> Y#<_ini[P0]Y> Z#<_ini[PROBE]END_Z>
o<g29> end sub

La subrutina g29 sirve para probar la altura de la cama caliente en tres o más puntos para poder realizar una impresión 3d de acuerdo al nivel de altura tomado en cada punto de la cama caliente. Por el momento solo la comprobación en un punto es soportada.

Se necesita esto en el archivo .ini para que funcione.

[PROBE]
COUNT = 1
SEARCH_VEL = 10.0
TOOL_NR = 100
START_Z = 0.0
END_Z = 1.0
#HBP_TEMP = 50.0

[P0]
X = 0.0
Y = 0.0

tool.tbl

T0 P0 ; Extruder 0
T1 P1 ; Extruder 1
T2 P2 ; Extruder 2
T3 P3 ; Extruder 3
T100 P100 X+35.000000 Z+0.900000 ; probe head
 
Lo primero que hace es indicar si la variable "HBP_TEMP" existe, el valor de esta variable indica la temperatura a la que se va a calentar la cama. Si existe espera a que se caliente.

M65 se deshabilita el sensor para poder comenzar con la prueba de calibración de nivel.
M68 escoge la señal analoga a probar (E=38) y recibe un valor de cero (Q=0)
G10 con L2 indica que se requiere guardar el valor de Z=0 en el código G54, ya que P=1. Por lo tanto el eje Z regresa a la posición 0.
G0 Z#<_ini[PROBE]START_Z> verifica si Z esta en la posición guardada en la variable START_Z, sino se mueve a la posición que este designada.
G43 H#<_ini[PROBE]TOOL_NR> con G43 se indica  la compensación de la herramienta, con el valor de H se le indica que escoga los valores del archivo tool.tbl. Al ser TOOL_NR=100, se ecoge la herramienta T100 con los valores de X+35 y Z+0.9 (estos valores estan configurados en el archivo .ini usando mm).
G0 X#<_ini[P0]X> Y#<_ini[P0]Y> mueve los ejes X e Y a las posiciones designadas en [PO].
M64 habilita el sensor.
G38.2 Z#<_ini[AXIS_2]MIN_LIMIT> F#<_ini[PROBE]SEARCH_VEL> Una vez que esta habilitada la señal del sensor, G38.2 buscará si ha hecho contacto con la cama caliente siendo el punto máximo que se moverá el valor minimo asignado en la configuración del eje Z en el archivo .ini (son los límites de movimento). Con la variable SEARCH_VEL se le da la velocidad con la que se quiere mover el eje, en este caso  SEARCH_VEL=10 (se coloca velocidades bajas para poder recibir la señal del sensor, de lo contrario la señal del sensor podría activarse luego de haber sobrepasado el punto de contacto).
M65 desactiva de nuevo la señal una vez que se ha hecho contacto con la cama caliente.
G10 L20 se determina la compensación de la herramienta, en este caso Z=0 no hay compensación y esto se guarda en el código G54, ya que P=1.
G49 activa la compensación de la herramienta.
G0 X#<_ini[P0]X> Y#<_ini[P0]Y> Z#<_ini[PROBE]END_Z> Por último se mueve a los ejes X e Y  a cero y se le da a Z un offset de 1.0 mm.

Ejemplo:

G29

Nota: se puede cambiar los valores de X e Y en [PO] para realizar la prueba en varios puntos de la cama caliente.

g29_1.ngc y g29_1.ngc son similares a g9, en g29.1 se determina la compensación de la cabezera del extrusor, insertando manualmente las coordenadas de X,Y y Z. En g29.2 se realiza la compensación de la herramienta insertando X,Y y Z solo insertando el valor de Z, para luego comparar con los valores de la herramienta determinados en tool.tbl.

Ejemplo:

G29.1 X30 Y20 Z0.5
G29.2 Z0.0

g30.ngc es exactamente lo mismo a g29.ngc ya que verifica la altura de la  cabezera del extrusor en un punto de forma automática.

Ejemplo:

G30 X10 Y0

Códigos Auxiliares M

Como usar M68 con el archivo .hal.

Para poder controlar la temperatura es necesario usar el componente de pid, para mas información revisar el siguiente link PID.

Para poder medir la temperatura se conecta lo siguiente. Donde Extruder0 es la variable asignada al componente hal_temp_max31855.

net e0.temp.meas    <= Extruder0.Temp.meas
net e0.temp.meas    => pid.0.feedback

Indica como mandar la temperatura al componente pid para poder comenzar a calentar los extrusores. La variable motion.analog-out-02 sirve para guardar el valor de temperatura enviado en el código M68. Para luego almacenarlo en la variable e0.temp.set.

sets e0.temp.set  0
net e0.temp.set motion.analog-out-02    => pid.0.command 

Con el valor almacenado en e0.temp.set, se envia a la variable hal creada en el componente hal_temp_max31855 para poder comparar la temperatura asignada con la temperatura medida por la termocupla. Si la temperatura medida por la termocupla llega a ser mayor que la asignada, se activa la señal de motion.digital-in-02 finalizando el proceso de espera para calentar el extrusor.  Ver código M109.

net e0.temp.set => Extruder0.Temp.set
net Temp.done motion.digital-in-02 <= Extruder0.Temp.set.done
 
Con el valor almacenado en pid.0.command se obtiene el valor de pid.0.out que es la temperatura asiganda, en el limit1.0.in se guarda el valor de temperatura asigando y con limit1.0.out se genera la señal pwm que calentará el fusor del extrusor.

net e0.heater  <= pid.0.output
net e0.heater  => limit1.0.in
net e0.heaterl <= limit1.0.out
net e0.heaterl => hpg.pwmgen.00.out.02.value
 
Si no se configura los valores de pid por defecto se inicializa con los siguientes valores.

pin in float Pgain = 1.0 "Proportional gain";
pin in float Igain = 0.0 "Integral gain";
pin in float Dgain = 0.0 "Derivative gain";
pin in float bias = 0.0 "Constant offset on output";
pin in float FF0 = 0.0 "Zeroth order Feedforward gain";
pin in float FF1 = 0.0 "First order Feedforward gain";
pin in float FF2 = 0.0 "Second order Feedforward gain";
pin in float deadband = 0.0 "Amount of error that will be ignored";
pin in float maxerror = 0.0 "Limit on error";
pin in float maxerrorI = 0.0 "Limit on error integrator";
pin in float maxerrorD = 0.0 "Limit on error differentiator";
pin in float maxcmdD = 0.0 "Limit on command differentiator";
pin in float maxcmdDD = 0.0 "Limit on command 2nd derivative";
pin in float maxoutput = 0.0 "Limit on output value";
pin in bit index_enable = false "Index enable";
pin in bit error_previous_target = false "Error previous target";

Señales PWM

# P9.26 gpio0_14 Extrusor 1
setp hpg.pwmgen.00.out.01.pin       0x2E
setp hpg.pwmgen.00.out.01.enable    1
setp hpg.pwmgen.00.out.01.value     0.0

# J9.16 gpio1_19 Bed
#setp hpg.pwmgen.00.out.00.pin       0x53
#setp hpg.pwmgen.00.out.00.enable    1
#setp hpg.pwmgen.00.out.00.value     0.0

# P9.15 gpio1_16 Extrusor 0
setp hpg.pwmgen.00.out.02.pin       0x50
setp hpg.pwmgen.00.out.02.enable    1
setp hpg.pwmgen.00.out.02.value     0.0

# P9.16 gpio1_19 Fan
setp hpg.pwmgen.00.out.03.pin       0x4C
setp hpg.pwmgen.00.out.03.enable    1
setp hpg.pwmgen.00.out.03.value     0.0 

m104.ngc

o<m104> sub
#500=2; extruder io start index
#501=0; not synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=1
    o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
    #502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
    M67 E#502 Q#<P>
o102 else
    M68 E#502 Q#<P>
o102 endif
o<m104> end sub
 
La subrutina m104 sirve para poder calentar los extrusores con un valor de temperatura asigando.

#500=2 indica que se va a usar M68 con motion.analog-out-02
#501=0 inidica que se va a usar M68 de forma inmediata (no hay sincronización).
#502=#500 se guarda la variable 500 en 502, con esta variable podemos escoger otros motion.analog-out-xx.
Si existe la variable i y equivale a 1 #501=1 se realiza un proceso de forma no sincronizada.

Ejemplo:

M014 I1 P200 -> La temperatura se calienta de forma sincronizada hasta 200 grados celsius.

Si existe la variable t, se puede controlar más extrusores ya que la variable #500 canbiará de acuerdo al número en t asignado.

Ejemplo:

M104 P200 T1 -> El extrusor a calentar será el que este con motion.analog-out-03, ya que se suma el valor de t con el de #502.

Por último siempre se calienta de forma no sincronizada (inmediata).

m106.ngc

Activa los ventiladores.

o<m106> sub
#500=12; fan io start index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=0
    o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
    #502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
    M67 E#502 Q#<P>
o102 else
    M68 E#502 Q#<P>
o102 endif
o<m106> end sub

La subrutina m106 sirve para poder controlar los ventiladores de la impresora 3D de forma sincronizada. Se utiliza el mismo procedimiento, explicado anteriormente. Se debe cambiar el GPIO a usarse como pwm en el archivo .hal y realizar las conexiones necesarias.

sets e0.fan.set  0
net e0.fan.set motion.analog-out-12    => hpg.pwmgen.00.out.03.value

Ejemplo:

M106 P127

Donde P asigna la velocidad (0-255)

M106 P127 t1

ver ejemplo M104

m107.ngc 

Desactiva los ventiladores


o<m107> sub
#500=12; fan io start index
#501=0; not synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=1
    o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
    #502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
    M67 E#502 Q0
o102 else
    M68 E#502 Q0
o102 endif
o<m107> end sub

Controla los ventiladores de forma no sincronizada. Se utiliza el mismo procedimiento, explicado anteriormente.

Ejemplo:

M107 P0

Donde P asigna la velocidad (0-255) -> en este caso con P0 se detiene el ventilador.

Esto es lo mismo que M106 pero al crear en el código G en Slic3r sin el postprocesador de machinekit se puede obtener errores si no existe M107.

M106 P127 T1 I1

ver ejemplo M104

m109.ngc

o<m109> sub
#500=2; extruder io start index
#502=#500
o100 if [EXISTS[#<t>]]
    #502=[#<t>+#500]
o100 endif
M68 E#502 Q#<P>
M66 P#502 L3 Q1000
o<m109> end sub
 
Esta subrutina sirve para poder calentar el fusor del extrusor y hasta que no sea igual o mayor a la temperatura asignada, se pausará el proceso por 1000 segundos.

M66 Con m66 se comprueba una señal digital, existen 4 tipos. El valor de P indica que se va a usar motion.input-out-xx con L elegimos el tipo de señal, en este caso es WAIT_MODE_HIGH y con Q se escoge el tiempo de espera en segundos.

Nota: Para que se llegue a enviar la temperatura asignada a la variable  Extruder0.Temp.set del archivo hal_temp_max31855 se debe realizar un tiempo de espera pequeño de lo contrario no se enviará nada a la variable. Con G4 P5 se espera 5 segundos. Esto no afecta en nada ya qe hasta mientras los extrusores se seguirán calentando.

o<m109> sub
#500=2; extruder io start index
#502=#500
o100 if [EXISTS[#<t>]]
    #502=[#<t>+#500]
o100 endif
M68 E#502 Q#<P>
G4 P5
M66 P#502 L3 Q1000
o<m109> end sub

Ejemplo:

M109 P185

Donde P determina la temperatura Q#<P>.

M109 P127 T1

ver ejemplo M104
m140.ngc

o<m140> sub
#501=0; not synchronized
#502=0; hbp index
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=1
    o110 endif
o100 endif
o101 if [#501 EQ 1]
    M67 E#502 Q#<P>
o101 else
    M68 E#502 Q#<P>
o101 endif
o<m140> end sub 

La subrutina m140 envia la temperatura a la cama caliente de forma inmediata.

Ejemplo:

M140 P55

Donde P asigna la temperatura Q#<P>.

M140 P127 I1

ver ejemplo M104

m141.ngc

o<m141> sub
#501=0; not synchronized
#502=1; hbc index
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=0
    o110 endif
o100 endif
o101 if [#501 EQ 1]
    M67 E#502 Q#<P>
o101 else
    M68 E#502 Q#<P>
o101 endif
o<m141> end sub 

Se usa en impresoras 3d con cámara cerrada, tiene la misma función que M140.

Ejemplo:

M141 P30

Donde P asigna la temperatura Q#<P>.

M141 P127 I1

ver ejemplo M104

m190.ngc

o<m190> sub
#502=0; hbp index
M68 E#502 Q#<P>
M66 P#502 L3 Q1000
o<m190> end sub

Espera a que la cama se caliente para seguir con el proceso.

Ejemplo:

M190 P60

Donde P asigna la temperatura Q#<P>.

M190 P127

ver ejemplo M109

Nota: No existe la variable T ya que solo se usa una cama caliente.

m191.ngc

o<m191> sub
#502=1; hbc index
M68 E#502 Q#<P>
M66 P#502 L3 Q1000
o<m191> end sub

Se usa en impresoras 3d con cámara cerrada, tiene la misma función que M190.

Ejemplo:

M191 P50

Donde P asigna la temperatura Q#<P>.

M191 P127

ver ejemplo M109

Nota: No existe la variable T ya que solo se usa una cámara cerrada.
m200.ngc

o<m200> sub
#500=44 ; filament diameter index
M68 E#500 Q#<D>
o<m200> endsub
 
Determina el diámetro del filamento, ideal para ser usado con g22 y g23.

Ejemplo:

M200 D1.75.

m207.ngc

o<m207> sub
#500=47 ; retract length index
#501=48 ; retract velocity index
M68 E#500 Q#<P>
M68 E#501 Q#<Q>
o<m207> endsub

Utilizado para determinar la longitud y velocidad de extrusión sin tener código G para el extrusor. Ver g22 y g23.

Ejemplo:

M207 P0.5 Q10.0

Donde P determina la longitud en mm y Q la velocidad en mm/s.

m221.ngc

o<m221> sub
#500=49 ; extrude scale index
M68 E#500 Q#<P>
o<m221> endsub

Determina la escala con la que se quiere obtener la salida (extrusión).

Ejemplo:

M221 P0.96

P indica la escala de salida en porcentaje, en este caso 96%.

m226.ngc

o<M226> sub
    M1
o<M226> end sub

Pausa el programa.

Ejemplo:

M226

m280.ngc

o<m280> sub
#500=22; servo io start index
#501=0; not synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=1
    o110 endif
o100 endif
o101 if [EXISTS[#<t>]]
    #502=[#<t>+#500]
o101 endif
o102 if [#501 EQ 1]
    M67 E#502 Q#<P>
o102 else
    M68 E#502 Q#<P>
o102 endif
o<m280> end sub

Sirve para controlar la posición del motor.

Ejemplo:

M280 T0 P1500

Donde T selecciona el motor a usar y P indica el ángulo o microsegundos.

m300.ngc

o<m300> sub
#500=39; buzzer frequency index
#501=40; buzzer duration index
#502=2; buzzer trigger index
#503=0; not synchronized
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #503=0
    o110 endif
o100 endif
o101 if [#503 EQ 1]
    o111 if [EXISTS[#<q>]]
        M67 E#500 Q#<q>; frequency
    o111 endif
    M67 E[#500+1] Q#<P>; duration
    o113 if [#[#502+100] EQ 1]; trigger beep
        M63 P#502
        #[#502+100]=0
    o113 else
        M62 P#502
        #[#502+100]=1
    o113 endif
o101 else
    o121 if [EXISTS[#<q>]]
        M68 E#500 Q#<q>; frequency
    o121 endif
    M68 E[#500+1] Q#<P>; duration
    o123 if [#[#502+100] EQ 1]; trigger beep
        M65 P#502
        #[#502+100]=0
    o123 else
        M64 P#502
        #[#502+100]=1
    o123 endif
o101 endif
o<m300> end sub

Emite una señal sonora.

Ejemplo:

M300 Q300 P1000

Donde Q es la frecuencia y P es la duración en milisegundos

m400.ngc

o<m400> sub
    G4 P0
o<m400> end sub

Espera que los movimientos que se están realizando finalicen.

Ejemplo:

M400

si se usa G4 P10

P es el tiempo de espera en segundos.

m420.ngc

o<m420> sub
#500=26; light io start index
#501=0; not synchronized
#502=#500
o104 if [EXISTS[#<t>]]
    #502=[#<t>*4+#500]
o104 endif
#503=[#502+1]
#504=[#502+2]
#505=[#502+3]
o100 if [EXISTS[#<r>]]
    o110 if [#501 EQ 1]
        M67 E#502 Q#<r>
    o110 else
        M68 E#502 Q#<r>
    o110 endif
o100 endif
o101 if [EXISTS[#<e>]]
    o111 if [#501 EQ 1]
        M67 E#503 Q#<e>
    o111 else
        M68 E#503 Q#<e>
    o111 endif
o101 endif
o102 if [EXISTS[#<d>]]
    o112 if [#501 EQ 1]
        M67 E#504 Q#<d>
    o112 else
        M68 E#504 Q#<d>
    o112 endif
o102 endif
o103 if [EXISTS[#<p>]]
    o113 if [#501 EQ 1]
        M67 E#505 Q#<p>
    o113 else
        M68 E#505 Q#<p>
    o113 endif
o103 endif
o<m420> end sub

Controla los colores RGBW con PWM.

M420 T<LED index (0-2)> R<Red PWM (0-1)> E<Green PWM (0-1)> D<Blue PWM (0-1)> P<White PWM (0-1)>

Ejemplo:

M420 R1.0 E1.0 D1.0 P1.0
 
m700.ngc

o<m700> sub
#500=41; filament area index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=0
    o110 endif
o100 endif
o101 if [#501 EQ 1]
    M67 E#502 Q#<P>
o101 else
    M68 E#502 Q#<P>
o101 endif
o<m700> end sub

Cálcula la sección de área del filamento, se usa con g22 y g23.

Ejemplo:

M700 P0.061

P determina el valor que se va a calcular con la función de velocidad de extrusión.

m701.ngc

o<m701> sub
#500=42; line width index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=0
    o110 endif
o100 endif
o101 if [#501 EQ 1]
    M67 E#502 Q#<P>
o101 else
    M68 E#502 Q#<P>
o101 endif
o<m701> end sub

Determina el ancho de línea a calcular.

Ejemplo:

M701 P0.2

P determina el valor del ancho que se puede usar con  la altura de línea para calcular la sección de cruce. Forma parte de la función velocidad de extrusión.

m701.ngc

o<m701> sub
#500=43; line height index
#501=1; synchronized
#502=#500
o100 if [EXISTS[#<i>]]
    o110 if [#<i> EQ 1]
        #501=0
    o110 endif
o100 endif
o101 if [#501 EQ 1]
    M67 E#502 Q#<P>
o101 else
    M68 E#502 Q#<P>
o101 endif
o<m701> end sub

Determina la altura de línea a calcular.

Ejemplo:

M702 P0.15

P determina el valor de la altura que se puede usar con  el ancho de línea para calcular la sección de cruce. Forma parte de la función velocidad de extrusión.

m710.ngc

o<m710> sub
#500=45; jog velocity index
#501=46; jog length index
#502=12; jog trigger index
#503=13; jog continuous index
#504=14; jog direction index
o100 if [EXISTS[#<q>]]
    o110 if [#<q> LT 0]
        M68 E#500 Q[#<q> * -1]; inverse velocity
        M64 P#504
    o110 else
        M68 E#500 Q#<q>; velocity
        M65 P#504
    o110 endif
o100 endif
o101 if [EXISTS[#<p>]]
    M68 E#501 Q#<p>; length
o101 endif
o102 if [EXISTS[#<e>]]
    o112 if [#<e> EQ 1]; trigger continuous
        M64 P#503
    o112 else
        M65 P#503
    o112 endif
o102 else
    M64 P#502
o102 endif
o<m710> end sub

Determina cuanto filamento se va a extraer.

Ejemplo:

M710 P10.0 Q2.0

Donde P indica la longitud en mm y Q  la velocidad en mm/s.

Con esto finaliza la explicación de códigos G y M usados en las impresoras 3d.

Para poder configurar los códigos explicados se debe incluir lo siguiente en el archivo .ini.

[RS274NGC]
# Machinekit fdm subroutines path
SUBROUTINE_PATH = /usr/share/linuxcnc/ncfiles/remap-subroutines/fdm
# alternatively you can copy the subroutines a local subroutines folder
# SUBROUTINE_PATH = subroutines

# remapping Machinekit FDM GCodes
REMAP=G22 modalgroup=1 ngc=g22
REMAP=G23 modalgroup=1 ngc=g23
REMAP=G28 modalgroup=1 argspec=xyza ngc=g28
REMAP=G29 modalgroup=1 ngc=g29
REMAP=G29.1 modalgroup=1 argspec=xyz ngc=g29_1
REMAP=G29.2 modalgroup=1 argspec=xyz ngc=g29_2
REMAP=G30 modalgroup=1 argspec=pxy ngc=g30
REMAP=M104 modalgroup=10 argspec=iPt ngc=m104
REMAP=M106 modalgroup=10 argspec=iPt ngc=m106
REMAP=M107 modalgroup=10 argspec=it ngc=m107
REMAP=M109 modalgroup=10 argspec=tP ngc=m109
REMAP=M140 modalgroup=10 argspec=iP ngc=m140
REMAP=M141 modalgroup=10 argspec=iP ngc=m141
REMAP=M190 modalgroup=10 argspec=P ngc=m190
REMAP=M191 modalgroup=10 argspec=P ngc=m191
REMAP=M200 modalgroup=10 argspec=D ngc=m200
REMAP=M207 modalgroup=10 argspec=PQ ngc=m207
REMAP=M221 modalgroup=10 argspec=P ngc=m221
REMAP=M226 modalgroup=10 ngc=m226
REMAP=M280 modalgroup=10 argspec=itP ngc=m280
REMAP=M300 modalgroup=10 argspec=iqP ngc=m300
REMAP=M400 modalgroup=10 ngc=m400
REMAP=M420 modalgroup=10 argspec=itredp ngc=m420
REMAP=M700 modalgroup=10 argspec=iP ngc=m700
REMAP=M701 modalgroup=10 argspec=iP ngc=m701
REMAP=M702 modalgroup=10 argspec=iP ngc=m702
REMAP=M710 modalgroup=10 argspec=epq ngc=m710
# enable ini parameter passing
FEATURES = 4

[FILTER]
PROGRAM_EXTENSION = .gcode RepRap Flavour GCode
gcode = gcode-to-ngc

El path puede ser cambiado a la carpeta donde se quiera guardar los códigos G y M.

Toda esta información fue extraida del siguiente link Machinekit-configs, en ese link se indican diferentes configuraciones para varias máquinas. Incluso como configurar la impresora 3d reemplazando el archivo .hal por un archivo python .py.

Componentes Machinekit

Abs
Abs s32
And2
Andn
At pid
Bin2gray
Biquad
Bitslice
Bitwise
Bldc hall3
Blend
Clarke2
Clarke3
Clarkeinv
Comp
Constant
Ddt
Deadzone
Debounce
Div2
Edge
Estop latch
Feedcomp
Flipflop
Gantry
Gearchange
Gray2bin
Hbridge
Hypot
Idb
Ilowpass
Integ
Invert
Io muxn
Joyhandle
Knob2float
Latencybins
Led dim
Lgantry
Limit1
Limit2
Limit3
Lincurve
Lowpass
Lut5
Lutn
Maj3
Match8
Minmax
Mult2
Multiclick
Multiswitch
Mux16
Mux2
Mux4
Mux8
Muxn
Muxn u32
Near
Neg
Not
Offset
Oneshot
Or2
Orient
Orn
Out to io
Pid
Reset
Safety latch
Sample hold
Scale
Select8
Selectn
Sphereprobe
Stats
Sum2
Thc
Thcud
Threadtest
Time
Timedelay
Toggle
Toggle2nist
Tristate bit
Tristate float
Updown
Wcomp
Wcompn
Weighted sum
Xor2

Para entender como usar estos componentes se debe revisar el siguiente link Machinekit Documentation. En la parte izquierda se encuentra el índice, desplazando la barra se encuentra la información de todos los componentes.

Existe componentes muy útiles como el THC para controlar la altura de la antorcha de una plasma, PID, AT_PID para encontrar los valores PID de forma automática, DDT para derivar un valor, útil para encontrar velocidad y aceleración a partir de la distancia y muchos más que se irán usando en nuevos tutoriales.

Se va dar un ejemplo de como usar el componente wcomp, ya que con este se va controlar los límites máximos y mínimos de la temperatura.

En el archivo .hal se debe añadir los componentes que se quiera usar.

Cargando el componente wcomp para usar en los dos extrusores.

loadrt wcomp count=2
loadrt pid count=2

Conectando la señal de wcomp al comando pid feedback para obtener el valor que esta midiendo.

net e0.temp.meas    <= Extruder0.Temp.meas
net e0.temp.meas    => pid.0.feedback => wcomp.0.in

Ahora se establece los límtes máximo y mínimo para controlar que no sobrepase la temperatura, importante para extrusores de plástico. En mi caso uso extrusores de aluminio asi que no hay ningún problema con trabajar con temperaturas altas, con le que he asignado un límite máximo de 300 grados celsius.

setp wcomp.0.min 0
setp wcomp.0.max 300 # Maximum temperature limit

Si el valor se mantiene dentro de los límites de temperatura, wcomp.0.out tendrá el valor de 1 con lo que mantendrá activada la función PID.

net enable.pid.extrusor0 pid.0.enable <= wcomp.0.out


Conclusiones: Existen varios códigos G y M que se pueden usar directamente con linuxcnc, principalmente con la GUI gmoccapy que por medio de botones se puede hacer lo mismo que las subrutinas descritas en la parte superior.

Los componentes Hal ahorran mucho el proceso de estar programando para funciones especificas de una máquina y al estar distribuidos en varios permite usar cada código en lo que se necesite.
En el caso del componente hal_temp_max31855 se le añadido una comparación directa que determina si la temperatura medida es igual o mayor a la asignada para continuar con el código G. Pero esto se puede realizar con el componente hal wcomp como se ha explicado en la parte superior. En mi caso la dejaré así y usaré los límites de temperatura con el termistor de la cama caliente.

El siguiente tutorial va ha ser de como usar el componente at_pid, donde se explicará como llegar a configurar de forma correcta la temperatura una vez obtenido los valores PID de forma automática.

No hay comentarios.:

Publicar un comentario