> 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.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://marlin.3dwork.io/marlin/configuracion-marlin/nivelacion/mallado-de-cama-inteligente-prusaslicer.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
