Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
CONSULTA Mesh Level
#1
Hola, tengo una duda con la generación del mapa de la cama a ver si me podéis ayudar a entenderlo. Estoy viendo que hay dos maneras de crear un mapa de la cama:

Con posición absoluta y con posición relativa

Si lo hago con posición relativa, solo para los seis primeros puntos y añadiendo 0.1 a cada punto el mapa que aparece es este:

Recv: Mesh Bed Leveling OFF
Recv: 5x5 mesh. Z offset: 0.00000
Recv: Measured points:
Recv:         0                   1               2             3              4
Recv:  0 +0.10000 +0.20000 +0.30000 +0.40000 +0.50000
Recv:  1 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  2 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  3 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  4 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:
Recv: X:215.00 Y:60.00 Z:0.50 E:0.00 Count X:17200 Y:4800 Z:200

Cada punto está condicionado por la posición en la que deja Z el punto anterior

Si lo hago con posición absoluta, y añadiendo 0.1 a cada punto el mapa que aparece es este:

Send: G29 S0
Recv: Mesh Bed Leveling OFF
Recv: 5x5 mesh. Z offset: 0.00000
Recv: Measured points:
Recv:         0                   1               2              3              4
Recv:  0 +0.10000 +0.10000 +0.10000 +0.10000 +0.10000
Recv:  1 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  2 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  3 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  4 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:
Recv: X:215.00 Y:60.00 Z:0.10 E:0.00 Count X:17200 Y:4800 Z:40
Recv: ok

Cada posición tiene un valor en Z independiente del anterior.

¿cómo interpreta el firmware esta información al recibir el gcode? Es decir, en el primer caso, al llegar al 2º punto sube Z 0.2 y al llegar al tercero lo sube a 0.3? en el 2º caso se mantiene en 0.1 constante?

Si llega un gcode de primera capa que pone Z = 0.2 de altura y llega al segundo punto ¿en el primer caso imprimie a 0.4 y en el segundo a 0.3?

Creo que tengo un buen lío montado en la cabeza...

Muchas gracias por la ayuda!!!!
Citar
#2
Hola, lo primero decir que el firmware no ajusta la altura de Z cuando llega la impresión a los puntos medidos, sino que utiliza esas medidas para calcular un plano (3P, LINEAR) o una malla (BILINEAR, MBL) que le indica como tiene que variar la altura del eje Z durante la impresión (en más o en menos), respecto a la que tiene referenciada como punto 0 de ese eje.
Es decir, el firmware fija el origen de Z en el homing y en cada cambio de capa, sube la altura que le indica el comando gcode del archivo, pero durante la impresión de esa capa va ajustando, en función de la zona por la que pasa, la altura del eje Z según le marque el plano o malla del autolevel.
MBL solo es una forma simplificada de hacer un autolevel BILINEAR sin sensor: realizamos las medidas a mano y después el firmware las utiliza como si estuviese definido ese tipo de autolevel.
En este método, hay dos formas de realizar las mediciones: mediante el envío de comandos gcode o mediante la pantalla (definiendo en el firmware el parámetro LCD_BED_LEVELING).
En cada caso, se trata de ir ajustando de forma manual la altura del eje Z, en cada punto de la rejilla definida, a un valor constante (normalmente, el valor del espesor de la hoja de papel) y lo que el firmware almacena cuando le indicamos que guarde un punto, es la posición en que se encuentra en ese momento el eje Z, que será un valor negativo (si está por debajo de Z=0) o positivo (si está por encima), por lo que no entiendo lo que indicas con que hay dos formas de hacerlo, una absoluta y otra relativa: cada punto tiene una medida propia independiente de todos los demás y por eso se ajusta de forma separada cada uno de ellos.
De todas formas, no te preocupes de como maneja de forma interna los datos el firmware, lo único que tienes que hacer es activar el MBL, definir los puntos de la rejilla y el margen respecto al borde de la cama (si no quieres los que vienen por defecto), realizar las medidas lo más precisas posible (por uno u otro método), guardarlas en la EEPROM (para no tener que volver a hacerlas cada vez que enciendas la impresora) y antes de comenzar la impresión, activar el autolevel (con un M420 S1 después del G28 en el script de inicio del programa de corte, por ejemplo).
Citar
#3
Hola Simemart, menuda turra te estoy dando este finde ehh? Muchas gracias por tu ayuda de nuevo.

Las dos formas las descubrí porque después de hacer el  mapa y hacer una prueba de impresión de un  cuadrado en cada uno de los 25 puntos ví que aún había algunos que no estaban finos, al ir a cada punto vía gcode y modificarlos con M421 I0 J0 Q-0.05 por ejemplo me pareció (esto no lo tengo claro) que afectaba al resto de los puntos.

Buscando me dí cuenta que al final la impresora lo que hace es un:

G29 S1 <- Para iniciar la malla

Si en cada uno de los puntos haces G91 antes de meter el G1 Z<offset> entonces te sale la malla 1 que he mandado antes.
Si dejas la distancia como G90 antes de meter el G1 entonces te sale la malla 2.

Cita:Es decir, el firmware fija el origen de Z en el homing y en cada cambio de capa, sube la altura que le indica el comando gcode del archivo, pero durante la impresión de esa capa va ajustando, en función de la zona por la que pasa, la altura del eje Z según le marque el plano o malla del autolevel.

Claro, pero imagina que llega al punto [0,1]  y la impresión no se pega bien. En la malla 1tiene un valor de 0.2 porque trae acumulado el valor anterior 0.1 y su propio valor 0.1 Si yo modifico este valor de la malla a piñon con M421 I1 J0 Q-0.05 (Al valor actual le suma el offset) estaré cambiando el valor sobre el que se han calculado el resto de puntos hasta el 25 y por tanto es normal que el resto de la malla se pueda ir a freir esparragos ¿no?

Pero si lo hago con la malla 2, cada valor tiene su ajuste (0.1 para el primero y 0.1 para el segundo). Si cambio en este caso el primer punto, el segundo sigue estando bien porque no tenía en cuenta el acumulado del primero

¿tiene sentido? O me estoy montando una bola de nieve de pm....

De nuevo muchas gracias por echarme una mano!!

Si sigo pensando en ello, la bola sigue creciendo porque entiendo que no será lo mismo  que llegue al punto 1, corrija a 0.1, llegue al punto 2, corrija a 0.2 que sería el primer mapa a que lo haga con el segundo, que haría 0.1 para el primero y 0.1 para el 2º

Entiendo que en el primer caso tendrá que ir restando acumulados y en el segundo no pero eso se pone en algún sitio?

La impresión como tal se hace con posición absoluta G90, así que no sé si tiene más sentido generar el mapa como en el segundo en vez de como en el primero...
Citar
#4
Siento decirte que lo que dices no tiene ningún sentido y no tiene nada que ver con el funcionamiento del autolevel: ni hay que cambiar el tipo de posicionamiento (que por otra parte no tiene ninguna influencia en él), ni el procedimiento para indicar el valor de la medida en cada punto es el que indicas (¿G1 Z<offset>?).
Quizá lo mejor es que veas la explicación del MBL que tiene Marlin en su página oficial y si tienes dudas las comentamos.
Citar
#5
jajjaa, a ver si consigo explicarme. Según la web:


  1. Use G29 S0 to get the current status and mesh. If there’s an existing mesh, you can send M420 S1 to use it.
  2. Use G29 S1 to move to the first point for Z adjustment.
  3. Adjust Z so a piece of paper can just pass under the nozzle.
  4. G29 S2 to save the Z value and move to the next point.
  5. Repeat steps 3-4 until completed.
  6. Use  M500  to save the mesh to EEPROM, if desired.
El punto 3 se puede hacer con el comando G1 Z0.02 si quieres subir el Z 0.02 o G1 Z-0.02 si quieres bajarlo

Si tu haces el proceso completo al final te sale un mapa, por ejemplo este (solo he ajustado los 5 primeros puntos):

Recv: Mesh Bed Leveling OFF
Recv: 5x5 mesh. Z offset: 0.00000
Recv: Measured points:
Recv:         0                   1               2             3              4
Recv:  0 +0.10000 +0.20000 +0.30000 +0.40000 +0.50000
Recv:  1 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  2 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  3 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:  4 +0.00000 +0.00000 +0.00000 +0.00000 +0.00000
Recv:
Recv: X:215.00 Y:60.00 Z:0.50 E:0.00 Count X:17200 Y:4800 Z:200

En este proceso, cada punto tiene en cuenta el punto anterior porque el posicionamiento lo ha hecho de forma relativa.

Mi primera pregunta es: Imagina que el punto 2 de la primera fila no ha quedado fino del todo y quieres ajustar solo ese punto con G29 S3 (Manually modify a single point), como la posición es relativa el punto 3 y el punto 4 tambien habrá que ajustarlos para que tengan en cuenta el ajuste del punto 3 ¿no? Si no, la distancia de los puntos 3 y 4 estará mal ajustada.

Mi segunda duda es: Al hacer el proceso, yo puedo antes de empezar poner la posición en absoluta con G90. Si lo hago el mapa lo refleja, como se ve en el segundo mapa del primer post. Ahí si ajusto un punto, el resto deberían estar bien pero ¿como sabe que tipo de mapa he generado?

Entiendo que al hacer una impresión, la posición es absoluta, es decir, al empezar a imprimir el gcode hace G90. A medida que llega al primer punto ajusta según el mapa, si el mapa es absoluto cada valor es independiente. Si el mapa es relativo cada valor debe tener en cuenta el anterior para hacer el ajuste ¿no?

No sé si consigo explicarme...de todas maneras, gracias por intentar ayudarme Gran sonrisa
Citar
#6
Tienes razón en lo del G1, no me daba cuenta que haciéndolo mediante comandos gcode, lo lógico es realizar los movimientos del eje Z también mediante comandos, pero en cuanto a todo lo demás que expones estás equivocado.
Esa suposición que haces de que cada punto tiene en cuenta el anterior no es correcta: cuando le indicas que se mueva a otro punto para medirlo, por supuesto mantiene la posición del eje Z que tenía en el anterior pero, una vez ajustes el punto (para eso se hace este proceso), lo que se guarda es la posición de Z en ese momento y no le influye en nada la que hayas guardado para los otros puntos anteriores.
Los movimientos del eje Z los puedes hacer con posicionamiento absoluto o relativo, pero eso solo influye en los valores que tienes que poner en el comando G1: no tiene influencia en absoluto sobre las medidas que se guardan para el autolevel.
Dicho lo anterior, respondo a tus preguntas:

1ª- No. Como he dicho, los puntos son valores independientes y cuando modificas uno de ellos, los valores almacenados de los otros puntos no varían.
Lo que porsupuesto sí varía es la malla, puesto que ahora uno de los puntos tiene otro valor y en los cálculos donde intervenga ese punto, se obtendrán valores diferentes para la malla.
No sé si lo estarás interpretando así, pero la malla no es lo que tú llamas mapa. Lo que sale al enviar el comando G29 S0, es la matríz de alturas de los puntos de la rejilla que se encuentra en la memoria RAM (si es que hay una) y que será utilizada para calcular la malla del autolevel, siempre que este se encuentre activo al comenzar la impresión.

2ª- No hay mapas absolutos o relativos. Supongo que tu confusión surge de que no comprendes bien el concepto de tipo de posicionamiento y en que se diferencian los dos que existen: no es que obtengas dos mapas distintos, lo que sucede es que estás posicionando el eje Z de dos formas distintas, que es algo muy diferente.
En el posicionamiento absoluto, los valores que se indican en el comando G1 después de la Z son posiciones en el eje; en posicionamiento relativo, son distancias en el eje.
Entiendo que lo que envías en los dos casos es un G1 Z0.1, pero si estás en posicionamiento absoluto solo se mueve el eje cuando estás en el primer punto (para ir de Z=0 a Z=0.1), para los siguientes no sucede nada porque ya estás en Z=0.1 y le estás diciendo que vaya a Z=0.1, por lo que todos los puntos los grabas con valor +0.1, que es la distancia al punto Z=0 en cada uno de ellos.
Si lo haces en posicionamiento relativo, le estás diciendo que avance 0.1 mm cada vez que envías el comando, por lo que en cada punto guardas el valor del anterior (pues partes de su misma posición de Z) más esos 0.1 mm y por eso los valores guardados se van incrementando.
En este último caso, también podrías conseguir lo mismo en posicionamiento absoluto: solo tienes que indicar para cada punto G1 Z0.1, G1 Z0.2, G1 Z0.3, G1 Z0.4 y G1 Z0.5 y la malla que calculará el autolevel será la misma que cuando lo hiciste en posicionamiento relativo, pues los valores grabados serán los mismos.

Normalmente, los programas de corte utilizan posicionamiento absoluto, pero como he dicho antes, eso solo influye en como va a interpretar el firmware los valores de las órdenes de movimiento, si como coordenadas en los ejes o como distancias a recorrer. Por lo demás, el resultado de todos los procesos sería exactamente el mismo, se utilice uno u otro posicionamiento, por supuesto indicando en los comandos los valores apropiados para cada uno.
Repito, no hay mapas (ni absolutos ni relativos) en el autolevel, sino un plano o una malla, calculados ambos en base a los valores de diferencia de altura almacenados para cada punto de la rejilla.
Citar
#7
Cita:Esa suposición que haces de que cada punto tiene en cuenta el anterior no es correcta: cuando le indicas que se mueva a otro punto para medirlo, por supuesto mantiene la posición del eje Z que tenía en el anterior pero, una vez ajustes el punto (para eso se hace este proceso), lo que se guarda es la posición de Z en ese momento y no le influye en nada la que hayas guardado para los otros puntos anteriores.

Perfecto, como bien dices si esta suposición no es correcta, entonces todo lo demás que me he montado no es correcto.

Cita:No sé si lo estarás interpretando así, pero la malla no es lo que tú llamas mapa. Lo que sale al enviar el comando G29 S0, es la matríz de alturas de los puntos de la rejilla que se encuentra en la memoria RAM (si es que hay una) y que será utilizada para calcular la malla del autolevel

Creo que mi confusión viene de asumir que G29 S0 me da la malla, el tema de relativo o absoluto sí que lo entiendo pero si esa matriz es el input para un cálculo posterior, ese es el paso que me falta.

Supongo que ese cálculo estará por el código de Marlin en algún sitio, pero me fío plenamente de tí Sonrisa

Muchas gracias por la ayuda!!!
Citar
#8
Como es lógico, está funcionalidad se encuentra programada en el código de Marlin y se puede investigar si se tienen conocimientos de programación en C++.
Todo el código que realiza el MBL, está incluído en dos archivos denominados mesh_bed_leveling.h y mesh_bed_leveling.cpp que, dependiendo de la versión de Marlin, se encuentran en la ruta Marlin-1.1.x\Marlin o en Marlin-2.0.x\Marlin\src\feature\bedlevel\mbl.
En concreto, en el archivo mesh_bed_leveling.cpp se encuentran las funciones que lo desarrollan. Por ejemplo, los valores de las mediciones de los distintos puntos de la rejilla, se almacenan en una matriz denominada z_values, que se carga al definir los valores o en el arranque de Marlin si están guardados en la EEPROM.
El funcionamiento del autolevel es muy sencillo: cuando está activado y antes de realizar un movimiento, se calcula la diferencia de alturas entre los puntos de inicio y final de la línea, realizandose una variación continua de la posición del eje Z de forma sincronizada con el movimiento. Pero ojo, sin cambiar el valor de la posición del eje Z, que en teoría es el mismo para los dos puntos, pues se encuentran en la misma capa.
Es decir, el movimiento del autolevel se realiza en segundo plano de forma transparente y no tiene ninguna interacción con el código que se está ejecutando durante la impresión ni con el usuario (solo se aprecia que el eje Z se mueve ligéramente arriba y abajo mientras se imprime).
Para calcular la diferencia de altura entre el punto inicial y final del movimiento, se utilizan los valores almacenados para cada punto de la rejilla: en el caso del MBL, los medimos nosotros de forma manual y en ABL, lo hace el propio firmware mediante el sensor.
Cada tres puntos de la rejilla forman una zona triangular, se comprueba en que zona cae cada uno de los dos puntos y se calcula su altura real en base a los valores almacenados para los tres puntos que delimitan la zona en la que están incluídos: la diferencia entre esas dos alturas calculadas, será lo que tiene que subir o bajar el eje Z durante el movimiento.
La forma de hacer ese cálculo, depende del tipo de autolevel que esté definido.
Citar
#9
Simmemart, no llegue a contestar tu último post. Gracias por indicarme los ficheros donde se puede ver el uso, no tengo problemas con C/C++ así que cuando me decida a meterme en el firmware como tal lo tendré en cuenta. Por ahora con tu experiencia me es más que suficiente y debo decir que, gracias a tu ayuda con el tema del PID y del mesh leveling mis primeras capas han mejorado sensiblemente. Vamos que ahora mismo se quedan agarradas a la cama y llevo unas cuantas impresiones muy exitosas.

Seguiré por aquí para ver si puedo aportar algo Sonrisa

Un saludo
Citar
#10
Me alegro que te sirviesen mis respuestas.
Saludos.
Citar