> For the complete documentation index, see [llms.txt](https://marlin.3dwork.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://marlin.3dwork.io/marlin/configuracion-marlin/nivelacion/mallado-de-cama-inteligente-prusaslicer.md).

# Mallado de cama inteligente en Marlin

Una de las funciones de Klipper que más nos gusta es el mallado de cama inteligente: sondea solo la zona donde va a ir la pieza, no toda la cama. Esto reduce el tiempo de inicio, mejora la precisión de la primera capa y evita que el sensor trate de medir zonas que quedan fuera de la impresión.

Buena noticia: en Marlin también es posible, aunque con algunas condiciones.

## Requisito de firmware: Bilineal obligatorio

{% hint style="danger" %}
**Este sistema solo funciona con `AUTO_BED_LEVELING_BILINEAR` activado en el firmware.**

UBL (Unified Bed Leveling) **no es compatible** con el mallado adaptativo por área de impresión. Si tu impresora usa UBL, consulta la sección al final de esta guía para una alternativa.
{% endhint %}

El comando `G29` de Bilineal en Marlin acepta los parámetros `L`, `R`, `F`, `B` para definir el área de sondeo:

| Parámetro | Significado                        |
| --------- | ---------------------------------- |
| `L`       | Límite izquierdo (Left, eje X min) |
| `R`       | Límite derecho (Right, eje X max)  |
| `F`       | Límite frontal (Front, eje Y min)  |
| `B`       | Límite trasero (Back, eje Y max)   |
| `V<0-4>`  | Nivel de verbosidad (0-4)          |

Ejemplo manual desde terminal:

```gcode
G29 L50 R150 F50 B150 V4
; Sondea únicamente entre X50-X150, Y50-Y150
```

La densidad de puntos sigue siendo la configurada en `GRID_MAX_POINTS_X/Y` del firmware — no se puede cambiar en tiempo de ejecución con Bilineal estándar.

## Implementación por laminador

{% tabs %}
{% tab title="OrcaSlicer" %}
OrcaSlicer tiene soporte nativo para mallado adaptativo desde la versión 2.0. Es la implementación más limpia y no requiere scripts manuales.

{% hint style="success" %}
Disponible en **OrcaSlicer 2.0 o superior** (versión estable). La versión actual es la 2.3.x.
{% endhint %}

#### Configuración en Machine Settings

Ve a **Machine Settings → Machine G-code** y en el Start G-code reemplaza el `G29` habitual por:

```gcode
; Mallado adaptativo Marlin — OrcaSlicer
; (Marlin bilineal no permite especificar densidad de puntos, solo el área)
G29 L{adaptive_bed_mesh_min[0]} R{adaptive_bed_mesh_max[0]} F{adaptive_bed_mesh_min[1]} B{adaptive_bed_mesh_max[1]} V4
```

#### Variables disponibles (placeholders de OrcaSlicer para Marlin)

| Variable                     | Descripción                                                                |
| ---------------------------- | -------------------------------------------------------------------------- |
| `{adaptive_bed_mesh_min[0]}` | Coordenada X mínima del área adaptativa                                    |
| `{adaptive_bed_mesh_min[1]}` | Coordenada Y mínima del área adaptativa                                    |
| `{adaptive_bed_mesh_max[0]}` | Coordenada X máxima del área adaptativa                                    |
| `{adaptive_bed_mesh_max[1]}` | Coordenada Y máxima del área adaptativa                                    |
| `{bed_mesh_probe_count[0]}`  | Número de puntos de sondeo en X (no soportado en Marlin bilineal estándar) |
| `{bed_mesh_probe_count[1]}`  | Número de puntos de sondeo en Y (no soportado en Marlin bilineal estándar) |

{% hint style="info" %}
A diferencia de Klipper, **Marlin Bilineal no permite cambiar el número de puntos de sondeo en tiempo de ejecución**. Por eso en el G-code para Marlin se omiten los parámetros `X`/`Y` de conteo de puntos y solo se define el área.
{% endhint %}

#### Opciones de control en OrcaSlicer

En **Machine Settings → Bed leveling**, OrcaSlicer ofrece tres parámetros clave:

**Bed mesh min** (default: -99999, -99999) Define el límite inferior del área de sondeo permitida. Importante si tu sensor no puede alcanzar el borde completo de la cama (offset XY del sensor). Ajústalo a los valores reales de tu impresora, por ejemplo `20, 20`.

**Bed mesh max** (default: 99999, 99999) Define el límite superior. Ejemplo para una cama de 235×235: `215, 215`.

**Probe point distance** (default: 50 mm) Distancia entre puntos de sondeo. Con este valor OrcaSlicer calcula cuántos puntos caben en el área adaptativa. Aunque Marlin Bilineal ignora esta densidad, mantener un valor razonable ayuda a que el cálculo del área sea coherente.

**Mesh margin** (default: 0) Margen adicional alrededor del área de impresión. Con 0 el área es exactamente la de la pieza. Puedes subir a 5-10 mm para mayor seguridad en bordes.

#### Ejemplo completo de Start G-code con OrcaSlicer + Marlin Bilineal

```gcode
G90                                          ; coordenadas absolutas
M83                                          ; extrusor en modo relativo
M140 S{bed_temperature_initial_layer_single} ; temperatura cama
M104 S150                                    ; preheat nozzle (sin fundir filamento)
M190 S{bed_temperature_initial_layer_single} ; esperar cama
M109 S150                                    ; esperar nozzle a 150°C
G28                                          ; homing completo
M420 S0                                      ; desactivar mallado previo
G29 L{adaptive_bed_mesh_min[0]} R{adaptive_bed_mesh_max[0]} F{adaptive_bed_mesh_min[1]} B{adaptive_bed_mesh_max[1]} V4
M104 S{nozzle_temperature_initial_layer}     ; temperatura impresión nozzle
M109 S{nozzle_temperature_initial_layer}     ; esperar nozzle
G92 E0                                       ; reset extrusor
```

{% hint style="warning" %}
Calienta la cama **antes** de sondear. Los materiales se dilatan con el calor: sondear en frío da una malla incorrecta para imprimir en caliente.
{% endhint %}
{% endtab %}

{% tab title="PrusaSlicer / SuperSlicer" %}
PrusaSlicer y SuperSlicer permiten usar **placeholders y scripting con variables locales** en el Start G-code. Esto nos permite calcular el área de sondeo directamente a partir del bounding box de la pieza.

{% hint style="success" %}
Este script funciona en **PrusaSlicer 2.5+** y **SuperSlicer**. Para otros laminadores similares (BambuStudio, etc.) consulta la lista de placeholders de cada uno.

Referencias útiles:

* [PrusaSlicer — Lista de placeholders](https://help.prusa3d.com/es/article/lista-de-placeholders_205643)
* [SuperSlicer — Variables y macros](https://github.com/supermerill/SuperSlicer/wiki/Macro-&-Variable-list)
* [Bambu Studio — Placeholder list](https://wiki.bambulab.com/en/software/bambu-studio/placeholder-list)
  {% endhint %}

#### Script completo

Incluye el cálculo automático del área, precalentado, homing, mallado y calentado para impresión. Reemplaza o integra en tu Start G-code actual:

```gcode
; === Cálculo del área de sondeo ===
{
local probexmin = (max(print_bed_min[0], first_layer_print_min[0] - 20));
local probexmax = (min(print_bed_max[0], first_layer_print_max[0] + 20));
local probeymin = (max(print_bed_min[1], first_layer_print_min[1] - 20));
local probeymax = (min(print_bed_max[1], first_layer_print_max[1] + 20));
}

; === Configuración general ===
G90                                     ; coordenadas absolutas
M83                                     ; extrusor relativo

; === Precalentado para sondeo ===
M104 S150                               ; nozzle a 150°C (caliente sin fundir filamento)
M140 S[first_layer_bed_temperature]     ; temperatura cama
M109 S150                               ; esperar nozzle
M190 S[first_layer_bed_temperature]     ; esperar cama

; === Preparación ===
M302 S140                               ; reducir límite cold extrusion (para retracción)
G1 E-2 F2400                            ; retracción en frío
M302 S170                               ; restaurar límite
G28                                     ; homing completo

; === Mallado adaptativo ===
G29 L{probexmin} R{probexmax} F{probeymin} B{probeymax} V4

; === Calentado para impresión ===
G90
G1 X10 Y10 Z15 F3000                    ; mover a posición de parking
M104 S[first_layer_temperature]         ; temperatura nozzle impresión
M109 S[first_layer_temperature]         ; esperar nozzle
G92 E0                                  ; reset extrusor
; (añade aquí tu línea de purga o activa brim para evitar stringing)
```

#### Cómo funciona el cálculo

**Sección de cálculo de variables:**

El bloque `{ }` se evalúa en el laminador antes de generar el G-code. No llega a la impresora: solo produce los valores numéricos que luego se insertan en el `G29`.

| Variable local | Descripción                                                                       |
| -------------- | --------------------------------------------------------------------------------- |
| `probexmin`    | X mínima: borde izquierdo de la pieza menos 20 mm de margen, sin salir de la cama |
| `probexmax`    | X máxima: borde derecho de la pieza más 20 mm de margen, sin salir de la cama     |
| `probeymin`    | Y mínima: borde frontal de la pieza menos 20 mm de margen                         |
| `probeymax`    | Y máxima: borde trasero de la pieza más 20 mm de margen                           |

El `20` es el margen en mm entre el área de impresión y el área de sondeo. Puedes ajustarlo a gusto (10-25 mm es lo habitual).

**Placeholders de PrusaSlicer utilizados:**

| Placeholder                     | Valor                                                           |
| ------------------------------- | --------------------------------------------------------------- |
| `first_layer_print_min[0]`      | X mínima del bounding box de la pieza                           |
| `first_layer_print_max[0]`      | X máxima del bounding box de la pieza                           |
| `first_layer_print_min[1]`      | Y mínima del bounding box de la pieza                           |
| `first_layer_print_max[1]`      | Y máxima del bounding box de la pieza                           |
| `print_bed_min[0/1]`            | Coordenadas mínimas de la cama configurada                      |
| `print_bed_max[0/1]`            | Coordenadas máximas de la cama configurada                      |
| `[first_layer_bed_temperature]` | Temperatura de cama primera capa (entre corchetes = formato PS) |
| `[first_layer_temperature]`     | Temperatura nozzle primera capa                                 |

{% hint style="warning" %}
**Limitaciones importantes:**

* Este script **no cambia la densidad de puntos** de sondeo — solo limita el área. La densidad sigue siendo la del firmware (`GRID_MAX_POINTS_X/Y`).
* Si el parámetro `L/R/F/B` no está soportado en tu versión de Marlin, el `G29` ignorará los límites y sondeará toda la cama.
* **En impresiones que ocupan toda la cama**, los límites calculados coinciden con los de la cama y el resultado es equivalente a un G29 normal. En ese caso, el offset XY del sensor puede hacer que el comando intente sondear fuera de los límites físicos — ajusta bien tus `print_bed_min/max` en el perfil de impresora.
  {% endhint %}

#### Verificación

Para comprobar que el G-code generado es correcto, exporta el G-code de una pieza pequeña centrada en la cama y busca la línea `G29`. Los valores `L`, `R`, `F`, `B` deben corresponder al área de la pieza ±20 mm.
{% endtab %}

{% tab title="Bambu Studio" %}
Bambu Studio tiene su propio sistema de placeholders, compatible con la sintaxis `{variable}`. Aunque está pensado para impresoras Bambu Lab, puede adaptarse a impresoras genéricas Marlin añadidas como perfiles personalizados.

{% hint style="info" %}
Bambu Studio soporta un subconjunto de los placeholders de OrcaSlicer (están basados en el mismo código). La variable `{adaptive_bed_mesh_min}` y `{adaptive_bed_mesh_max}` **puede no estar disponible** en todas las versiones para impresoras genéricas.

Para impresoras Bambu Lab (que usan firmware propio, no Marlin), el mallado adaptativo se gestiona automáticamente por el firmware, sin necesidad de G-code personalizado.
{% endhint %}

Para impresoras genéricas con Marlin en Bambu Studio, el enfoque más fiable es usar los placeholders de área de impresión directamente:

```gcode
; Mallado adaptativo aproximado para Marlin en Bambu Studio
G28
G29 L{first_layer_print_min[0]} R{first_layer_print_max[0]} F{first_layer_print_min[1]} B{first_layer_print_max[1]} V4
```

Consulta la [lista completa de placeholders de Bambu Studio](https://wiki.bambulab.com/en/software/bambu-studio/placeholder-list) para confirmar las variables disponibles en tu versión.
{% endtab %}

{% tab title="Cura" %}
Cura **no soporta scripts con variables locales ni cálculos matemáticos** en el Start G-code. Los placeholders disponibles (como `{mesh_min_x}`, `{mesh_max_x}`) solo representan el bounding box del modelo, sin permitir operaciones como sumar el margen o limitar a los bordes de la cama.

**Opciones para Cura:**

1. **Plugin "Adaptive Bed Mesh"**: Existen plugins de terceros para Cura que añaden esta funcionalidad. Busca en el Cura Marketplace.
2. **Post-processing script**: Puedes usar un script Python de post-procesado (Cura → Extensions → Post Processing) que modifique el `G29` después de laminar, aunque requiere más configuración.
3. **Usar OrcaSlicer en su lugar**: Si tu objetivo principal es el mallado adaptativo, OrcaSlicer es la opción más directa y con mejor soporte para Marlin.
   {% endtab %}
   {% endtabs %}

## Alternativa para UBL: cargar malla guardada

Si tu firmware usa **UBL (Unified Bed Leveling)**, no puedes hacer mallado adaptativo por área en tiempo real de la misma forma. La estrategia recomendada es:

1. **Crea una malla de alta resolución una vez** (desde terminal o LCD):

```gcode
G28          ; home
G29 P1       ; sondeo automático completo (fase 1)
G29 P3       ; relleno matemático de zonas no alcanzables (fase 3)
G29 F10.0    ; fade height a 10 mm
G29 S1       ; guardar malla en slot 1
G29 A        ; activar UBL
M500         ; guardar en EEPROM
```

2. **En el Start G-code del laminador**, carga la malla guardada y aplica una corrección de plano rápida (3 puntos):

```gcode
G28          ; home
G29 L1       ; cargar malla del slot 1
G29 J        ; ajuste de plano rápido (3 puntos — no sondea toda la cama)
G29 F10.0    ; fade height
```

`G29 J` es la clave: sondea solo 3 puntos para detectar si la cama ha rotado o inclinado, y aplica esa corrección sobre la malla guardada. Resultado: precisión de un sondeo completo con la velocidad de 3 puntos.

{% hint style="success" %}
Este método UBL con `G29 J` es muy eficiente para impresoras que tienen camas grandes y tardan varios minutos en sondar. Combina lo mejor de los dos mundos: malla detallada + inicio rápido.
{% endhint %}

## Fade Height — compensación gradual

Independientemente del método, es recomendable activar el **Fade Height** (`ENABLE_LEVELING_FADE_HEIGHT` en el firmware):

```gcode
M420 S1 Z10  ; activar mallado con fade height de 10 mm
```

El Fade Height hace que la compensación del mallado se aplique progresivamente entre la cama y la altura configurada (10 mm habitual), y a partir de ahí el movimiento es completamente plano. Sin esto, la compensación se aplica en toda la altura de la pieza, lo que puede generar artefactos en piezas altas.

## Con esto ya tienes tu mallado adaptativo funcionando en Marlin

Recuerda: **Bilineal para mallado adaptativo por área**, **UBL para mallas guardadas con corrección rápida de plano**. Cada método tiene su caso de uso y ambos mejoran significativamente la calidad de la primera capa respecto a un `G29` simple.
