# Sensor nivelación

{% hint style="info" %}
**English**: Use your browser's built-in translation — Chrome and Edge detect the language automatically and offer to translate the page.
{% endhint %}

Un sensor de nivelación es uno de los mejores upgrades que podemos hacer a nuestra impresora 3D que simplificará el proceso de nivelación y mejorará la calidad de nuestras primeras capas las cuales suelen ser de las más críticas.

Aunque la instalación y configuración de un sensor de nivelación, en este ejemplo un [**BLTouch**](#anadiendo-un-sensor-bltouch-en-klipper) o [**inductivo**](#anadiendo-un-sensor-inductivo-en-klipper), no es extremadamente complicada si que va a requerir de ciertos cambios a nivel de cableado, montaje, configuración de firmware y calibración.

## Tipos de sensores — ¿Cuál elegir?

En los últimos años la oferta de sensores ha crecido enormemente. Desde los clásicos BLTouch hasta los nuevos sensores de corrientes de Foucault que escanean la cama en segundos. Esta tabla te ayuda a orientarte:

| Sensor                           | Tipo de detección         | Precisión | Velocidad mallado | Funciona en vidrio | Z-Offset auto | Precio aprox.  |
| -------------------------------- | ------------------------- | --------- | ----------------- | ------------------ | ------------- | -------------- |
| BLTouch / CRTouch                | Pin mecánico              | ★★★★☆     | ★★☆☆☆             | Sí                 | No            | \~15-30 €      |
| Inductivo / PINDAv2              | Campo magnético           | ★★★☆☆     | ★★★☆☆             | No (solo metal)    | No            | \~5-15 €       |
| BIQU MicroProbe                  | Pin mecánico              | ★★★★☆     | ★★☆☆☆             | Sí                 | No            | \~15-20 €      |
| BTT Eddy / Beacon / Cartographer | Corrientes Eddy (scanner) | ★★★★★     | ★★★★★             | No (solo metal)    | Parcial¹      | \~25-45 €      |
| Voron TAP / sonda boquilla       | Nozzle directo            | ★★★★★     | ★★★☆☆             | Sí                 | Sí            | \~5-15 € (DIY) |

¹ Beacon Contact y Cartographer Survey Touch pueden hacer tap del nozzle para calibrar el Z-Offset automáticamente combinando ambos mundos.

{% hint style="success" %}
**¿Qué elijo?**

* **Empezando con Klipper o impresora de escritorio**: BLTouch o CRTouch — son fáciles, están muy documentados y funcionan con casi todo.
* **Voron, impresora de alta velocidad o quieres el mallado más rápido posible**: BTT Eddy, Beacon o Cartographer — escanean 400 puntos en menos de 20 segundos.
* **Cambias el nozzle con frecuencia o quieres olvidarte del Z-Offset para siempre**: Voron TAP o sonda por boquilla.
  {% endhint %}

{% tabs %}
{% tab title="BlTouch" %}

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/1P9DPmOjQRZ3lBzocD1q/image.png" alt=""><figcaption></figcaption></figure>

Un BlTouch es un sensor de nivelación que tiene un sensor de efecto Hall, determina la proximidad basándose en campos magnéticos, además incluye una bobina que permite un control del pin de sondeo y en su instalación en la máquina hemos de asegurarnos que el pin (recogido) se encuentre entre 2.3 y 4.3 mm de la punta del nozzle.

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/kV4wzqC4E9oAu1SbBWZh/telegram-cloud-photo-size-4-5940708853438069620-x.jpg" alt=""><figcaption></figcaption></figure>

En algunos modelos o fabricantes podemos encontrar que sustituyen el sensor hall por uno óptico.

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/mQEoUmW8GKPxv13Bs9z6/telegram-cloud-photo-size-4-6030764215872107933-y.jpg" alt=""><figcaption></figcaption></figure>

Para configurar nuestro sensor [**BLTouch conectado**](https://klipper.3dwork.io/klipper/empezamos/broken-reference) a nuestra electrónica de la impresora seguiremos los siguientes pasos:

* Abriremos nuestro printer.cfg, lo ideal es hacerlo desde la UI que usemos normalmente ya sea Mainsail o Fluidd
* Añadiremos una sección nueva llamada **\[bltouch]** siempre por encima de la sección de SAVE\_CONFIG donde se guardan todos los valores de ajuste de los diferentes asistentes como PID, mallado, etc...\
  A continuación puedes ver un ejemplo:

```django
[bltouch]
sensor_pin: ^bltouch_sensor_pin
control_pin: bltouch_control_pin
speed: 7
pin_move_time: 0.675

pin_up_reports_not_triggered: True
pin_up_touch_mode_reports_triggered: True
x_offset: -28
y_offset: -13

samples: 3
sample_retract_dist: 10
samples_result: median
samples_tolerance: 0.02
samples_tolerance_retries: 5
```

{% hint style="info" %}
En la sección \[bltouch] podemos encontrar ([**más información detallada en la documentación de Klipper**](https://www.klipper3d.org/Config_Reference.html#bltouch)):

* **sensor\_pin**: donde indicaremos el pin de la parte endstop de nuestro sensor
* **control\_pin**: en este caso indicaremos el pin del servo
* **speed**: la velocidad del eje Z al realizar el sondeo
* **pin\_*****move*****\_time**: el tiempo de espera para realizar un despliegue o recogida del pin de sondeo
* **samples**: el número de veces que queremos que se sondeen cada punto, en inductivos es aconsejable dependiendo del tipo de sensor realizar más de un sondeo
* **sample\_retract\_dist**: en el caso que usemos multi-probing (multiples sondeos por punto) indicara la distancia de retracción de Z para estos sondeos y deberemos ajustar esta para que nuestro sensor cambie de estado antes de realizar el siguiente sondeo
* **samples\_result**: tipo de media de lectura de valores en multi-probing
* **samples\_tolerance\_retries** *: indicaremos cuantos reintentos queremos realizar en un sondeo en el caso que su desviación sea superior al valor en **samples\_tolerances***
* **x y offsets**: son los offsets del sensor con respecto a nuestro nozzle

<img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/Z2LjF3hx1HGBFQMcPLRU/image.png" alt="" data-size="original"><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/p7Hhn7KsENEk93n05dcK/image.png" alt="" data-size="original">

<img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/yg4AmgExi5X8FYNxZYKZ/image.png" alt="" data-size="original">
{% endhint %}

* Deberemos añadir nuestra sección `[bed_mesh]` y ajustarla para nuestra máquina, tenéis [información aquí](https://klipper.3dwork.io/klipper/empezamos/malla-nivelacion-de-cama-klipper).
* También es más que aconsejable añadir la sección `[safe_z_home]` para ubicar el sensor en una posición segura para realizar el proceso de homing... tenéis más [información aquí](#safe-z-homing).
* La última parte a modificar será **\[stepper\_z]** que ya debería de existir, en este caso tendremos que asegurarnos que el **endstop\_pin** es **endstop\_pin: probe:z\_virtual\_endstop**

```django
[stepper_z]
...
endstop_pin: probe:z_virtual_endstop
...
```

* Usaremos la opción SAVE para guardar los cambios en nuestra configuración

#### Dónde conseguir el BLTouch / CRTouch

{% tabs %}
{% tab title="BLTouch (AntClabs original)" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/32777786433.html>" %}
{% endtab %}

{% tab title="CRTouch (Creality)" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/1005003129968663.html>" %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Si utilizas los links de compra, el precio del producto será el mismo que si accedes de manera habitual, pero a 3DWork le quedará una pequeña comisión. Algo que nos ayudará a soportar el proyecto y continuar generando contenido.
{% endhint %}

#### Comprobaciones previas Bltouch

Una vez que tenemos toda la configuración añadida deberemos de verificar que todo funciona correctamente antes de realizar ningún home.

* **Al encender la impresora el BLTouch debería de hacer el proceso de self-test. Este proceso despliega y recoge el pin varias veces y el sensor queda en color rojo.**\
  En el caso que el led se quede parpadeando o el pin no llegue a desplegar/recoger deberías de revisar en detalle el cableado y configuración.

{% hint style="info" %}
Antes de nada, su sensor se queda parpadeando en rojo al iniciar la máquina? que puede causar este error...

**Si nuestro BLTouch parpadea rápidamente en rojo (mismo tiempo encendido y apagado...50%) significa que nuestro sensor está en fallo, indicando un fallo durante el proceso de self-test... como por ejemplo un problema de cableado, configuración, obstrucción o fallo servo del pin, etc...**

**Por otro lado, un patrón de parpadeo más lento (más tiempo de encendido que apagado...80%) es un signo que puedes tener un problema de cableado incorrecto o dañado en 5v o GND.**

* **BLTouch parpadeando rápido con patrón 50% on/off,** indica un fallo durante el self-test... os sugerimos algunas cosas a revisar:
  * El pin se queda obstruido o no se mueve con normalidad, puede ser por diferentes razones como un incorrecto ajuste de altura del pin central, dañada la parte servo o por factores externos como suciedad
  * El sensor se encontraba muy cerca de la cama y no permitió el correcto despliegue del pin golpeando esta antes de poder activar su señal de check
  * Velocidad de homing en Z muy lenta o rápida
  * Problemas con la configuración de tu firmware
  * Tu sensor está dañado
* **BLTouch parpadeando lentamente con patrón 80% on/off**, indica un fallo en la alimentación del sensor:
  * Lo más normal suele ser tener invertidos los cables de alimentación 5v y GND
  * Cableado dañado o problemas de contacto en este
* BLTouch con el led rojo encendido sin ningún patron de parpadeo, indica que nuestro sensor está funcionando normalmente.

**Tenéis más información de estos errores en el** [**manual del BLTouch**](https://www.antclabs.com/bltouch-v3)**.**
{% endhint %}

{% hint style="warning" %}
En el caso de usar BLTouch clones tenemos que jugar con los valores pin\_*up de igual forma que puede que no funcionen muy bien con la macro QUERY\_*&#x50;ROBE.

**Si al realizar el QUERY\_PROBE nos encontramos con el error "BLTouch failed to verify sensor state" será necesario ajustar pin\_up\_touch\_mode\_reports\_triggered a False.**

Si **al realizar los tests de prueba del pin para su despliegue o recogida no funciona bien es posible que necesitemos pin\_up\_reports\_not\_triggered a False**, normalmente el pin no funciona y el estado cambio de open a triggered cuando no debiera.
{% endhint %}

{% hint style="warning" %}
Los fiales de carrera o endstops usan un pin de entrada input normalmente. Este tipo de pines pueden ser del tipo pull-up o pull-down.

Aunque normalmente la mayoría de nuestras impresoras usan pull-up dependiendo de nuestra electrónica o endstops para estos pines deberemos de indicar si es **pull-up ^** o **pull-down \~**.

**Es importante el orden de valores** \[^\~] \[!] pin\_name

**En ocasiones no definir esto de forma correcta puede inplicar que todo este bien pero el estado del endstop no cambie correctamente al estar este activado o no.**
{% endhint %}

* Ejecutaremos el comando **BLTOUCH\_DEBUG COMMAND=pin\_down** desde el terminal. **Este comando despliega el pin del sensor y el led rojo debería apagarse.**\
  En el caso que el led se quede parpadeando o el pin no llegue a desplegar/recoger deberías de revisar en detalle el cableado y configuración.
* Ejecutaremos el comando **BLTOUCH\_DEBUG COMMAND=pin\_up** desde el terminal. **Este comando recogerá el pin del sensor y el led debería de quedar en rojo.**\
  En el caso que el led se quede parpadeando o el pin no llegue a desplegar/recoger deberías de revisar en detalle el cableado y configuración.
* Una vez verificada la parte servo de nuestro sensor comprobaremos la parte endstop lanzando el siguiente comando que desplegará el pin **BLTOUCH\_DEBUG COMMAND=pin\_down**
* Seguidamente ejecutaremos el comando **BLTOUCH\_DEBUG COMMAND=touch\_mode**
* Para comprobar el estado del endstop lanzaremos **QUERY\_PROBE** que debería retornarnos **probe:open**
* Manualmente subiremos el pin de nuestro sensor y volveremos a lanzar **QUERY\_PROBE** que debería retornarnos **probe:TRIGGERED**
* Si todo ha funcionado correctamente nuestro sensor parece bien instalado!!! lanzaremos el comando **BLTOUCH\_DEBUG COMMAND=pin\_up**
* Ahora vamos a comprobar un homing lanzando el comando **G28, idealmente te aconsejaría mover el eje Z a la mitad de su recorrido antes**
* Tan pronto como se inicie el proceso de homing para el eje Z se debería desplegar el pin y comenzar el movimiento hacia nuestra cama, para prevenir cualquier fallo os aconsejamos que de forma manual hagáis que el pin se active lo cual debería de parar el movimiento de homing simulando que se hizo correctamente.
* Si todo ha ido según lo esperado lanzaremos, esta vez sin intervención manual, un homing con **G28** de nuevo

Parece que todo esta correcto así que os sugerimos continuar hacia el [**ajuste del Z-Offset y nivelación de cama**](https://klipper.3dwork.io/klipper/empezamos/nivelacion-cama-manual).
{% endtab %}

{% tab title="Inductivo" %}

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/SvTQMOvgIJ95sdmcAKeJ/image.png" alt=""><figcaption><p>Esquema pines sensor PINDAv2 (compatible, 3 pines, con SuperPinda)</p></figcaption></figure>

Para configurar nuestro sensor [inductivo](https://klipper.3dwork.io/klipper/empezamos/broken-reference) conectado a nuestra eléctronica seguiremos los siguientes pasos

* Abriremos nuestro printer.cfg, lo ideal es hacerlo desde la UI que usemos normalmente ya sea Mainsail o Fluidd
* Añadiremos una sección nueva llamada **\[probe]** siempre por encima de la sección de SAVE\_CONFIG donde se guardan todos los valores de ajuste de los diferentes asistentes como PID, mallado, etc...\
  A continuación puedes ver un ejemplo:

```django
[probe]
pin: ^!probe_pin 
x_offset: -29.8
y_offset: -13.5
speed: 5
lift_speed: 5.0

samples: 3
sample_retract_dist: 2
samples_result: median
samples_tolerance: 0.02
samples_tolerance_retries: 5
```

{% hint style="info" %}
En la sección \[probe] podemos encontrar ([**más información detallada en la documentación de Klipper**](https://www.klipper3d.org/Config_Reference.html#probe))::

* **pin**: donde indicaremos el pin de señal de la parte endstop de nuestro sensor
  * ^ del ejemplo indica que nuestro pin de la electrónica es pull-up, en ocasiones si vemos que el estado de nuestro sensor cambia de estado pero no vuelve a cambiar puede ser por no estar correctamente definido como **pull-up ^** o **pull-down \~**
  * **! indica que la lógica de la señal del sensor se invierta** y se usa para ajustar que el estado del endstop sea OPEN sin activar y TRIGGERED en estado activado
  * **Es importante el orden de valores** \[^\~] \[!] pin\_name
* **x e y\_offset**: son los offsets del sensor con respecto a nuestro nozzle

<img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/JgeDNWpmxQ1n76HEXjmR/image.png" alt="" data-size="original"><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/Ygm6cho7yp4mZ47LK7d7/image.png" alt="" data-size="original">
{% endhint %}

* **speed**: la velocidad del eje Z al realizar el sondeo
* **lift\_speed**: la velocidad a usar en multi-probing
* **samples**: el número de veces que queremos que se sondeen cada punto, en inductivos es aconsejable dependiendo del tipo de sensor realizar más de un sondeo
* **sample\_retract\_dist**: en el caso que usemos multi-probing (multiples sondeos por punto) indicara la distancia de retracción de Z para estos sondeos y deberemos ajustar esta para que nuestro sensor cambie de estado antes de realizar el siguiente sondeo
* **samples\_result**: tipo de media de lectura de valores en multi-probing
* **samples\_tolerance\_retries** *: indicaremos cuantos reintentos queremos realizar en un sondeo en el caso que su desviación sea superior al valor en **samples\_tolerances***

{% hint style="warning" %}
Los fiales de carrera o endstops usan un pin de entrada input normalmente. Este tipo de pines pueden ser del tipo pull-up o pull-down.

Aunque normalmente la mayoría de nuestras impresoras usan pull-up dependiendo de nuestra electrónica o endstops para estos pines deberemos de indicar si es **pull-up ^** o **pull-down \~**.

**Es importante el orden de valores** \[^\~] \[!] pin\_name

**En ocasiones no definir esto de forma correcta puede inplicar que todo este bien pero el estado del endstop no cambie correctamente al estar este activado o no.**
{% endhint %}

*
* Deberemos añadir nuestra sección `[bed_mesh]` y ajustarla para nuestra máquina, tenéis [información aquí](https://klipper.3dwork.io/klipper/empezamos/malla-nivelacion-de-cama-klipper).
* También es más que aconsejable añadir la sección `[safe_z_home]` para ubicar el sensor en una posición segura para realizar el proceso de homing... tenéis más [información aquí](#safe-z-homing).
* Dependiendo del tipo de sensor puede ser necesario definir nuestro position\_min en stepper\_z para que permita llegar a la distanci ZOffset que necesite
* La última parte a modificar será **\[stepper\_z]** que ya debería de existir, en este caso tendremos que asegurarnos que el **endstop\_pin** es **endstop\_pin: probe:z\_virtual\_endstop**

```django
[stepper_z]
...
endstop_pin: probe:z_virtual_endstop
...
```

* Usaremos la opción SAVE para guardar los cambios en nuestra configuración

#### Dónde conseguir un sensor inductivo

{% tabs %}
{% tab title="Sensor inductivo PINDAv2" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/32919682669.html>" %}
{% endtab %}

{% tab title="Sensor inductivo genérico 3D printer" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/1005004378719628.html>" %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Si utilizas los links de compra, el precio del producto será el mismo que si accedes de manera habitual, pero a 3DWork le quedará una pequeña comisión. Algo que nos ayudará a soportar el proyecto y continuar generando contenido.
{% endhint %}

#### Comprobaciones previas inductivos/capacitativos

Una vez que tenemos toda la configuración añadida deberemos de verificar que todo funciona correctamente antes de realizar ningún home.

* Nos aseguraremos que el sensor no esté activado, normalmente dispone de un led que indica el estado de dección, y lanzaremos el comando en la consola **`QUERY_PROBE`** que deberia retornar el estado **`probe:open`**
* Activaremos de forma manual el sensor aproximando un objeto metálico para que el sensor se active, lanzaremos el comando **`QUERY_PROBE`** de nuevo y debería darnos **`probe:TRIGGERED`**

**¿Que pasa si no nos funciona según lo indicado?**

* En el caso que la respuesta obtenida sea la inversa usaremos el modificador !, o lo quitaremos en la definición del pin en la sección probe tal como vimos anteriormente
* En el caso que veamos que no cambia el estado:
  * verificaremos que el sensor esta cableado correctamente
  * que la definición de la configuración de pines del probe es la correcta con respecto a donde esté conectado
  * podremos intentar cambiar entre pull-up pull-down en la definción del pin tal como os comentamos anteriormente
    {% endtab %}

{% tab title="BIQU MicroProbe (Stowable)" %}
Este BIQU MicroProbe es un sensor similar a los tradicionales Bltouch con algunos aspectos interesantes a tener en cuenta.

En cuanto a sus características:

* Tamaño reducido por lo que es fácil integrar en cualquier cabezal
* Peso reducido que va a evitar vibraciones extras a la hora de imprimir
* Instalación sencilla y similar a un Bltouch
* Buena precisión y fiabilidad
* Podemos reemplazar el pin en caso de que se dañe
* Compatible con un amplio rango de impresoras/electrónicas
* Precio

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/oDjaPy6r1LccmslypJmF/image.png" alt=""><figcaption><p>Diagrama de rol de conexiones.</p></figcaption></figure>

Tenéis información detallada en la guía específica de este sensor:

{% content-ref url="sensor-nivelacion/biqu-microprobe" %}
[biqu-microprobe](https://klipper.3dwork.io/klipper/empezamos/sensor-nivelacion/biqu-microprobe)
{% endcontent-ref %}
{% endtab %}

{% tab title="BTT Eddy (Scanner)" %}
El BTT Eddy es un sensor de nivelación por escaneo de la superficie, este tipo de sensores pueden escanear tu cama en unos pocos segundos con una alta precisión.

<figure><img src="https://276162026-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH6gCE2fgkkpOScJ72TP7%2Fuploads%2FYPjuA24PkQhBLT9YKGEj%2Fimage.png?alt=media&#x26;token=46c75662-6061-4d33-8b65-1a26e57b57ca" alt="" width="153"><figcaption></figcaption></figure>

Entre sus ventajas podemos destacar:

* **nivelación de alta velocidad**, completa un nivelado de cama en unos pocos segundos (alrededor de 20s para una cama de tamaño medio)
* **alta precisión**, con lecturas de 0.0005 mm de precisión
* **tamaño compacto y bajo peso**, con sus 6g y su pequeño tamaño es integrable en casi cualquier cabezal de impresión no afectando en el aumento de masa que pueda afectar las inercias y vibraciones durante nuestras impresiones. Especialmente pensado para su instalación en cabezales Voron
* **compensación de temperatura**, integra la función de compensación de temperatura de Klipper para una precisión perfecta

Dado los pasos extra y cambios para ajustar este sensor en Klipper contamos una guía espcífica para el:

#### Dónde conseguir el BTT Eddy

{% tabs %}
{% tab title="BTT Eddy USB / Coil" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/1005006855438646.html>" %}
{% endtab %}

{% tab title="BTT Eddy Duo" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/1005006344907714.html>" %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Si utilizas los links de compra, el precio del producto será el mismo que si accedes de manera habitual, pero a 3DWork le quedará una pequeña comisión. Algo que nos ayudará a soportar el proyecto y continuar generando contenido.
{% endhint %}

[bigtreetech-eddy](https://klipper.3dwork.io/klipper/empezamos/sensor-nivelacion/bigtreetech-eddy "mention")
{% endtab %}

{% tab title="Beacon / Cartographer (Scanner)" %}
Los sensores de tipo scanner basados en corrientes de Foucault son actualmente los más avanzados disponibles para Klipper. **Beacon** y **Cartographer** son los más populares en la comunidad Voron. Ambos usan el mismo principio físico (el chip LDC1612 mide la resonancia de una bobina LC sobre la superficie metálica de la cama), pero cada uno tiene su propio plugin y proceso de calibración.

Entre sus ventajas:

* **Escaneo ultrarrápido**: un mallado de 20×20 puntos en menos de 20 segundos sin parar en cada punto
* **Alta precisión**: resolución de hasta 0.0005 mm
* **ADXL345 integrado** (Cartographer V3/V4, Beacon RevH): input shaper sin hardware adicional
* **Modo Contact** (Beacon Contact / Cartographer Survey Touch): el sensor puede tocar el nozzle para calibrar el Z-Offset automáticamente
* **Peso ultra reducido** (\~4-6 g): sin impacto en las inercias del cabezal

{% hint style="warning" %}
Estos sensores **solo funcionan sobre superficies metálicas**. No funcionan sobre vidrio, PEI liso o cualquier material no conductor. La mayoría de camas magnéticas PEI sobre acero funcionan perfectamente.
{% endhint %}

#### Instalación del plugin

Tanto Beacon como Cartographer requieren instalar su propio plugin de Klipper independiente. Sigue la guía oficial de instalación del fabricante antes de configurar el `printer.cfg`:

* [Documentación oficial Beacon](https://docs.beacon3d.com)
* [Documentación oficial Cartographer](https://docs.cartographer3d.com)

#### Configuración básica en `printer.cfg`

Los bloques mínimos que debes tener en tu configuración son:

```ini
# mcu del sensor (serial o canbus_uuid según tu conexión)
[mcu beacon]          # o [mcu cartographer]
serial: /dev/serial/by-id/usb-Beacon_...
# canbus_uuid: XXXXXXXXXXXXXXXX

# Sección del sensor (sustituye [beacon] por [cartographer] según corresponda)
[beacon]
mcu: beacon
x_offset: 0          # Offset XY respecto al nozzle (mide el tuyo)
y_offset: 0
speed: 5
lift_speed: 5
```

```ini
[stepper_z]
endstop_pin: probe:z_virtual_endstop
homing_retract_dist: 0   # ← OBLIGATORIO con sensores scanner
```

```ini
[safe_z_home]
home_xy_position: 150, 150   # Centro de tu cama
z_hop: 3

[bed_mesh]
zero_reference_position: 150, 150   # El mismo punto que home_xy_position
speed: 300
horizontal_move_z: 3
mesh_min: 10, 10
mesh_max: 290, 290
probe_count: 20, 20
mesh_pps: 0, 0    # Con scanners no necesitas interpolación adicional
```

{% hint style="danger" %}
**`homing_retract_dist: 0`** es **obligatorio** con sensores scanner. Si lo dejas con el valor por defecto (5 mm), obtendrás errores o resultados inconsistentes en el homing de Z.
{% endhint %}

{% hint style="info" %}
**`zero_reference_position`** indica a Klipper qué punto del mallado usar como referencia Z=0. Debe coincidir con la posición de homing (centro de la cama). Sin este parámetro, el Z-Offset puede variar entre impresiones de forma imprevisible.
{% endhint %}
{% endtab %}

{% tab title="Sonda por boquilla (TAP)" %}
La sonda por boquilla elimina el concepto de Z-Offset: como el nozzle es la propia sonda, el sistema sabe exactamente dónde está la punta con respecto a la cama. Esta tecnología está popularizada por el **Voron TAP**, y también la usan **Bambu Lab** y **Prusa MK4** en sus sistemas.

**Ventajas:**

* **Z-Offset automático**: cambias el nozzle y no necesitas recalibrar nada
* **Funciona en cualquier superficie**: vidrio, PEI, aluminio, acero, lo que sea
* **Offset XY = 0**: el punto de sondeo es exactamente donde imprime, sin cálculos
* **Muy preciso**: señal directa, sin tolerancias mecánicas de un pin externo

**Desventajas:**

* El nozzle debe estar **perfectamente limpio** antes de sondear — cualquier blob de filamento endurecido desplaza la lectura
* Instalación más compleja: carril de deslizamiento, imanes, sensor óptico o Hall
* Requiere imprimir a temperatura de impresión durante el sondeo (para que el filamento sea blando)

#### Configuración en Klipper (Voron TAP)

El TAP se configura como un `[probe]` estándar, con offset XY = 0:

```ini
[probe]
pin: ^toolhead:PROBE_PIN   # Adapta al pin de tu electrónica
x_offset: 0
y_offset: 0
speed: 5
lift_speed: 10
samples: 3
sample_retract_dist: 3
samples_result: median
samples_tolerance: 0.006
samples_tolerance_retries: 3
```

```ini
[stepper_z]
endstop_pin: probe:z_virtual_endstop

[safe_z_home]
home_xy_position: 150, 150   # Centro de tu cama
z_hop: 10

[bed_mesh]
zero_reference_position: 150, 150   # Centro de tu cama
```

{% hint style="warning" %}
Antes de sondear con TAP, asegúrate de que el nozzle está a temperatura de impresión y **limpio**. Un nozzle con restos de filamento endurecido puede dar lecturas erróneas de hasta 0.2–0.5 mm.
{% endhint %}

Para el montaje físico y más detalles, consulta la [documentación oficial de Voron Design](https://vorondesign.com/voron_tap).
{% endtab %}
{% endtabs %}

<details>

<summary>Conectando nuestro BlTouch directamente a nuestra Raspberry Pi</summary>

En algunas electrónicas antiguas con poca disponibilidad de pines expuestos o compatibles podemos encontrarnos con que añadir un sensor BlTouch es complicado o imposible. En este caso, y si nuestro host es una Raspberry Pi, podremos aprovechar su GPIO para instalar nuestro tan útil sensor de nivelación.

* El primer paso es asegurarnos que nuestra Raspberry puede ser usada por Klipper como MCU [**siguiendo este procedimiento**](https://klipper.3dwork.io/klipper/mejoras/raspberry-como-segunda-mcu). Al final si todo ha ido correctamente dispondremos en nuestro printer.cfg con una sección para nuestra rpi como MCU:

<pre class="language-django" data-title="printer.cfg"><code class="lang-django"><strong>[mcu rpi]
</strong>serial: /tmp/klipper_host_mcu
</code></pre>

* El siguiente paso será adaptar el cableado al siguiente esquema (es necesario disponer de conectores Dupont o similares para adaptar estas conexiones) os aconsejamos tener a mano el [esquema GPIO](https://pinout.xyz/):
  * blanco -> GPIO0
  * negro -> GND justo al lado del GPIO0
  * amarillo -> GPIO27
  * marrón -> GND
  * rojo -> 3.3v (**ojo, algunos sensores requieren 5v**)

![](https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/CK84ucmIAaziJE3DGuBa/image.png)

* Una vez todo conectado, volveremos a nuestro printer.cfg para crear/ajustar nuestra sección \[bltouch]:

```
[bltouch]
sensor_pin: ^rpi:gpio0
#   Pin connected to the BLTouch sensor pin. Most BLTouch devices
#   require a pullup on the sensor pin (prefix the pin name with "^").
#   This parameter must be provided.
control_pin: rpi:gpio27
#   Pin connected to the BLTouch control pin. This parameter must be
#   provided.
z_offset: 0.2
#pin_up_touch_mode_reports_triggered: False
#probe_with_touch_mode: True 
```

* el resto de pasos deberían de ser iguales

</details>

{% hint style="danger" %}
**IMPORTANTE!!!**

**normalmente cuando activamos un sensor de nivelación este marca nuestra coordenada 0 de Z por encima de la altura física, esta diferencia la encontraremos con el proceso de** [**ajuste del z-offset**](#ajuste-del-z-offset-usando-papel-o-galga) **explicado más abajo.**

**Para evitar&#x20;**<mark style="color:red;">**errores de movimientos fuera de rango**</mark>**&#x20;en el proceso de z-offset u otras nivelaciones hemos de ajustar el position\_min de nuestro stepper\_z a un valor adecuado y con cierto margen para que nos permita esos movimientos.**

```django
[stepper_z]
...
position_min: -5
...
```

{% endhint %}

## Safe Z Homing

Una configuración común para todos los sensores de nivelación suele ser el safe\_z\_home. Esta configuración nos ayuda a definir unas coordenadas seguras para que nuestro sensor pueda hacer el homing correctamente. Normalmente lo haremos en el centro de nuestra área de impresión.

<figure><img src="https://276162026-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH6gCE2fgkkpOScJ72TP7%2Fuploads%2FsPTXda6s9l17LdwoWmtC%2Fimage.png?alt=media&#x26;token=a491ac62-1466-460e-9eba-1d1543fceae5" alt=""><figcaption></figcaption></figure>

Dentro de nuestro **`printer.cfg` crearemos**, si no la tenemos ya, la s**ección `[`**`safe_z_home`**`]`** a continuación os vamos a mostrar un ejemplo:

```
[safe_z_home]
home_xy_position: 125, 125
z_hop: 10
z_hop_speed: 25
speed: 20
```

{% hint style="info" %}
En la sección **\[safe\_z\_home]** podemos encontrar:

* **home\_xy\_position**: el cual indica la **coordenada donde nuestro eje Z realizará el proceso de homing**. Por seguridad esta coordenada **se aconsaja que sea el centro de la nuestra cama**.\
  Recuerda que las coordenadas en Klipper siempre usan la refencia del nozzle por lo que si quieres dejar tu sensor en el centro de tu cama deberás de calcular esas coordenadas teniendo en cuenta los offsets de tu sensor.\
  En el caso que nuestro sensor tenga estos offsets X-20Y20 y una cama de 235x235mm la coordenada seria...\
  X= (235mm/2)+20 (tamaño total de X dividido entre 2 para encontrar el centro y sumamos el offset de nuestro sensor en X al ser este un valor negativo)=X97\
  Y= (235mm/2)-20 (tamaño total de Y dividido entre 2 para encontrar el centro y, en este caso, restamos el offset de nuestro sensor en Y al ser un valor positivo)=Y147
* **speed**: la **velocidad a la que se moverán los ejes XY a la coordenada indicada**
* **z\_hop**: la **distancia que se alzará el eje Z** antes de realizar el proceso de homing
  {% endhint %}

Podéis encontrar la documentación oficial de **Klipper sobre el Safe Z Home**:

{% embed url="<https://www.klipper3d.org/Config_Reference.html?h=pixel#safe_z_home>" %}

## Test de precisión

Una vez tengamos correctamente configurado nuestro sensor de nivelación es aconsejable realizar un test de precisión.

Realizamos el proceso de home para que nuestro cabezal de impresión quede en el medio de nuestra cama y desde el terminal lanzamos la macro PROBE\_ACCURACY

```bash
Recv: // probe accuracy: at X:0.000 Y:0.000 Z:10.000
Recv: // and read 10 times with speed of 5 mm/s
Recv: // probe at -0.003,0.005 is z=2.506948
Recv: // probe at -0.003,0.005 is z=2.519448
Recv: // probe at -0.003,0.005 is z=2.519448
Recv: // probe at -0.003,0.005 is z=2.506948
Recv: // probe at -0.003,0.005 is z=2.519448
Recv: // probe at -0.003,0.005 is z=2.519448
Recv: // probe at -0.003,0.005 is z=2.506948
Recv: // probe at -0.003,0.005 is z=2.506948
Recv: // probe at -0.003,0.005 is z=2.519448
Recv: // probe at -0.003,0.005 is z=2.506948
Recv: // probe accuracy results: maximum 2.519448, minimum 2.506948, range 0.012500, average 2.513198, median 2.513198, standard deviation 0.006250

```

{% hint style="warning" %}
El resultado ideal sería que el valor máximo y mínimo fueran idénticos. En la realidad pueden variar de un paso 0.005mm o rotation\_distance/(full\_steps\_per\_rotation\*microsteps). En el ejemplo anterior el paso de Z es de 0.0125mm.

En el caso que nuestra mediana sea superior a 0.025mm deberiamos de revisar y ajustar nuestra configuración o sensor. Usaremos la macro [PROBE\_ACCURACY](https://www.klipper3d.org/G-Codes.html#probe_accuracy) para testear los diferentes parámetros y ver como afectan a la precisión.
{% endhint %}

Una vez encontrados los valores óptimos se aconseja realizar el proceso de [**Z-Offset y el mallado de la cama que podeis encontrar en esta guía**](https://klipper.3dwork.io/klipper/empezamos/malla-nivelacion-de-cama-klipper).

## Ajuste del Z-Offset (usando papel o galga)

{% hint style="warning" %}
**Pasos previos!!!**

* Es necesario haber [**realizado un PID**](https://klipper.3dwork.io/klipper/empezamos/pid) de nuestro hotend y cama previo a la realización de estos pasos.

* Realizar un pre-calentado de cama y hotend en la temperatura que normalmente imprimais durante unos 5-15m

* Tener realizado la prueba del punto anterior de nivelación de la cama ya sea manual o asistida con sensor

* Disponer de un folio o galga de 0.1
  {% endhint %}

* Realizaremos un homing:
  * en el caso que tengamos una máquina con 2 o 3 motores independientes en Z realizaremos primero un ***Z\_TILT\_ADJUST*** (nivelación del gantry) y a continuación un ***G28*** (homing de todos los ejes)
  * en el caso que tengamos una máquina con 4 motores independientes en Z realizaremos primero un ***QUAD\_GANTRY\_LEVEL*** (nivelación del gantry) y a continuación un ***G28*** (homing de todos los ejes)
  * si tu máquina no concuerda con ninguno de los casos anteriores realiza directamente un G28 (homing de todos los ejes)

* Moveremos nuestro hotend al centro de la cama si no tenemos activo el safe\_homing

* Limpiaremos cualquier malla de nivelación de nuestra cama con un ***BED\_MESH\_CLEAR***

* Dependiendo del final de carrera que usemos en nuestra máquina:
  * si tenemos un final de carrera mecánico usaremos ***Z\_ENDSTOP\_CALIBRATE***... por ejemplo máquinas como las Voron V0, Trident, V2.x o BLV
  * si usamos nuestro sensor de nivelación como final de carrera usaremos ***PROBE\_CALIBRATE***

* Mediante comandos iremos bajando lentamente el nozzle hacia la cama usando **TESTZ Z=-1** hasta que estemos cerca para en ese momento realizar movimientos más pequeños usando **TESTZ Z=-.01** o incluso menos hasta que nuestro nozzle roce con el papel. Podemos alternar el **TESTZ** con valores positivos/negativos y mayores/menores hasta que tengamos nivelado a nuestro gusto en ese momento lanzaremos un ***ACCEPT*** y un ***SAVE\_CONFIG*** para guardar la configuración.

{% hint style="danger" %}
**En el caso que usemos una configuración modular en la que nuestro z*****offset no se encuentre directamente en nuestro printer.cfg puede dar errores al hacer el SAVE\_CONFIG.***

***En estos casos puedes añadir, solamente la primera vez seria necesario, la sección bltouch y el valor de z\_offset después de SAVE\_CONFIG:***

\#\*# <---------------------- SAVE\_CONFIG ---------------------->

\#\*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.

***En el caso de un sensor bltouch***

\#\*#

\#\*# \[bltouch]

\#\*# z\_offset = 0.685

\#\*#

**En el caso de un probe normal**

\#\*#

\#\*# \[probe]

\#\*# z\_offset = 0.320

\#\*#
{% endhint %}

{% hint style="danger" %}
**Os recordamos que Klipper usa valores positivos para su ZOffset para aquellos que vengáis de Marlin.**
{% endhint %}

{% hint style="info" %}
Klipper normalmente asume que este proceso se realizó en frío, en nuestro caso al hacerlo en caliente normalmente se aconseja realizar un TEST Z=-0.1 o -0.5 antes de guardar los cambios.

De todas formas normalmente es acabar realizando este test con un test de calibración de primeras capas y el [**ajuste fino de la altura en Z o babystepping**](#undefined).
{% endhint %}

* Ahora que ya tenemos nuestro Z-Offset ajustado lo ideal seria hacer una malla de nuestra cama si disponemos de sensor

{% hint style="info" %}
Si disponemos de una pantalla nativa de nuestra impresora configurada o tenemos KlipperScreen podremos tener un asistente para el proceso.

<img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/MrKaU6I4Js3itCnKMfDA/telegram-cloud-photo-size-4-5787361130648287521-x.jpg" alt="" data-size="original">
{% endhint %}

### Ajuste fino del Z-Offset

Es muy probable que después del proceso anterior no acaben de quedar nuestras primeras capas en ese caso lo ideal es realizar un ajuste fino de nuestro Z-Offset durante una impresión de test.

#### Usando nues UI (Mainsail/Fluidd)

Dentro de nuestro interfaz Mainsail/Fluidd, normalmente en la sección toolhead, usaremos los controles de babystepping para ajustar en tiempo real la altura de primera capa a nuestro gusto.

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/4Mkw59thEkg9CTFdImlp/image.png" alt=""><figcaption></figcaption></figure>

#### Usando una pantalla

Dentro del menu Tune podremos encontrar los controles para ajustarlo.

#### Guardando el nuevo valor de Z-Offset

Ahora que ya tenemos el ajuste fino del Z-Offset deberemos guardarlo en nuestro printer.cfg:

* En el caso que usemos un endstop físico para ajustar el valor ***position\_endstop** lanzaremos el comando **Z\_OFFSET\_ENDSTOP** seguido de **SAVE\_CONFIG***... **ojo que estor reiniciará tu impresora!!!**
* En el caso que usemos un sensor como final de carrera en Z y para ajustar el valor ***z\_offset** lanzaremos el comando **Z\_OFFSET\_APPLY\_PROBE*** seguido de ***SAVE\_CONFIG***... **ojo que estor reiniciará tu impresora!!!**

## **Compensación en caso de eje torcido**

En ocasiones nos podemos encontrar que después de ajustar y nivelar nuestra cama de forma manual, tener unas lecturas precisas del sensor o incluso realizar multiprobing para mejorar las lecturas... el resultado no es el correcto.

<figure><img src="https://276162026-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH6gCE2fgkkpOScJ72TP7%2Fuploads%2F3I1OJd5iGqL9WuArQBU3%2Fimage.png?alt=media&#x26;token=2915b574-eb8c-4926-b7c7-dd850a0e2157" alt=""><figcaption></figcaption></figure>

**Nuestro eje X/Y puede estar torzido,** una situación que no es extraña en muchas ocasiones es que nuestro eje X esté torcido y dado que normalmente los sensores de nivelación se colocan alejados del eje y con respecto al nozzle (que este si que suele estar bastante más cercano al eje, el ángulo puede llegar a provocar problemas serios a la hora de realizar nuestro mallado.\
![](https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/LllKfoMdav0Jiw3jA9zL/telegram-cloud-photo-size-4-5798463668353088688-y.jpg)\
En el anterior dibujo podéis ver como puede impactar a la fiabilidad de las lecturas del sensor el tener este tipo de problemas en el que observamos que en determinadas áreas de nuestra área de impresión no podemos obtener unas correcciones buenas acabando en unas malas primeras capas.\
Aunque os vamos a explicar las opciones disponibles en Klipper para minimizar/compensar estos fallos mecánicos es **siempre aconsejable que antes intentemos arreglar el problema mecanicamente intentando ajustar nuestro chasis y cinemática lo máximo posible**.

{% hint style="warning" %}
Klipper y su compensación de eje torcido no es compatible con todos los tipos de sensores de nivelación.
{% endhint %}

Para activar la compensación de ejes tocidos, a partir de ahora `axis_twist_compensation` realizaremos los siguientes pasos:

* Activaremos `[`[`axis_twist_compensation`](https://www.klipper3d.org/Config_Reference.html#axis_twist_compensation)`]` en nuestro printer.cfg para habilitar el módulo de compensación e idealmente ajustar sus opciones de ser necesario.
* Desde la consola lanzaremos la macro de sistema `AXIS_TWIST_COMPENSATION_CALIBRATE` que lanzará un asistente para medir el Z Offset en diferentes puntos de nuestra cama, inicialmente utiliza 3 puntos pero podemos realizar más añadiendo el parámetro `SAMPLE_COUNT=` y el número de puntos al lanzar la macro anterior
* Realizaremos el proceso de [ajuste del Z Offset ](#ajuste-del-z-offset-usando-papel-o-galga)normal explicado en puntos anteriores
* Realizaremos los ajustes de nivelado manual asistido por sensor o [screws\_tilt\_adjust](https://klipper.3dwork.io/klipper/empezamos/nivelacion-cama-manual), [z-tilt](https://klipper.3dwork.io/klipper/empezamos/nivelacion-gantry-z-tilt) en el caso que los tengamos habilitados para asegurarnos que tenemos todo ajustado correctamente
* Haremos un home de todos los ejes y haremos un [mallado de nuestra cama](https://klipper.3dwork.io/klipper/empezamos/malla-nivelacion-de-cama-klipper)
* Realizaremos un test de impresión de primeras capas y haremos los [ajustes finos de Z Offset](#ajuste-fino-del-z-offset) durante este.

{% hint style="info" %}
Si necesitas más información sobre las configuraciones del módulo axis\_twist\_compensation puedes encontrarlas en la [documentación oficial de Klipper](https://www.klipper3d.org/Config_Reference.html#axis_twist_compensation).

Para los comandos relacionados con axis\_twist\_compensation puedes encontrarlos también en la [documentación oficial de Klipper](https://www.klipper3d.org/G-Codes.html#axis_twist_compensation).
{% endhint %}
