> 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/sensor-de-filamentos.md).

# Sensor de filamentos

Un sensor de filamentos puede salvarte más de una impresión larga. Existen dos tipos principales:

* **Sensor de presencia** (microswitch u óptico): detecta si hay o no hay filamento. Para y ejecuta M600 cuando el filamento se acaba.
* **Sensor de movimiento/encoder** (BTT SFS, trianglelab SFS): detecta si el filamento se mueve. Detecta tanto el fin de filamento como los atascos en caliente.

| Tipo                 | Detección                     | Ejemplo                      | Nivel    |
| -------------------- | ----------------------------- | ---------------------------- | -------- |
| Microswitch simple   | Presencia/ausencia            | Final de carrera reutilizado | Básico   |
| Sensor óptico        | Presencia/ausencia            | Genérico con LED indicador   | Básico   |
| Encoder / movimiento | Movimiento real del filamento | BTT SFS v1.0/v2.0            | Avanzado |

{% hint style="info" %}
Si ya tienes configurado Sensorless/stallGuard, probablemente tengas finales de carrera libres que puedes usar como sensor de presencia sin coste adicional. En Thingiverse hay varios adaptadores para montarlos en el extrusor.
{% endhint %}

## Algunos sensores de referencia

{% tabs %}
{% tab title="AliExpress" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/32829808063.html>" %}

{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/32977839193.html>" %}

{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/4000269547406.html>" %}
{% endtab %}

{% tab title="Amazon" %}
{% embed url="<https://amzn.to/3e3GKyJ>" %}

{% embed url="<https://amzn.to/3e5D93u>" %}
{% endtab %}
{% endtabs %}

## Instalación del sensor

Dependiendo del tipo de sensor tendrás 2 o 3 conexiones: **V** (voltaje), **S** (señal) y **G** (negativo/GND).

![Conector BTT Smart Filament Sensor](/files/-M_P_p9Fk2DIWxbdFnZl)

### Conectando el sensor a la placa electrónica

Es la opción recomendada: el sensor estará controlado directamente por Marlin, lo que permite más funciones y mejor integración con hosts como OctoPrint.

{% hint style="danger" %}
Verifica siempre el **orden de pines** tanto en el sensor como en la placa. Un error de pineado puede dañar el sensor o la placa.
{% endhint %}

{% tabs %}
{% tab title="SKR / BTT" %}

| Electrónica            | Localización E0-STOP                  | Pineado   |
| ---------------------- | ------------------------------------- | --------- |
| BTT SKR 1.4 / Turbo    | Dispone de E0-STOP                    | V / G / S |
| BTT SKR 1.3            | Usar endstop X+ (predefinido en pins) | V / G / S |
| BTT SKR PRO            | Dispone de E0-STOP                    | V / G / S |
| BTT SKR E3 DIP         | Dispone de E0-STOP                    | G / S / V |
| BTT SKR Mini E3 v1.2   | E0-STOP sin voltaje — usar PT-DET     | S / G / V |
| BTT SKR Mini E3 v2/v3  | Dispone de E0-STOP                    | S / G / V |
| BTT SKR E3 Turbo / RRF | Dispone de E0-STOP                    | S / G / V |
| BTT Octopus v1.x       | Dispone de E0-STOP                    | S / G / V |
| BTT Manta M8P          | Dispone de conector dedicado          | S / G / V |
| {% endtab %}           |                                       |           |
| {% endtabs %}          |                                       |           |

### Conectando el sensor a la pantalla TFT

Si tu pantalla TFT soporta sensor de filamentos, puedes conectarlo sin tocar Marlin. La desventaja es que solo funciona cuando usas la TFT para gestionar la impresión.

**Siempre que sea posible, conecta el sensor directamente a la placa electrónica.**

Si usas TFT con sensor en la electrónica, habilita estas opciones en `configuration_adv.h`:

```cpp
#define EMERGENCY_PARSER
#define SERIAL_FLOAT_PRECISION 4
#define HOST_ACTION_COMMANDS
#define HOST_PROMPT_SUPPORT
#define FILAMENT_LOAD_UNLOAD_GCODES
```

| TFT             | Conector | Pineado   |
| --------------- | -------- | --------- |
| BTT TFT35 v3    | FIL-DET  | S / G / V |
| BTT TFT35 v2    | DLJC     | V / G / S |
| BTT TFT35 E3 v3 | FIL-DET  | S / G / V |

## Cambios en Marlin

### Activar el sensor de filamentos

```cpp
// configuration.h
#define FILAMENT_RUNOUT_SENSOR
```

{% hint style="info" %}
Algunas placas tienen el pin del sensor predefinido (E0-STOP, FIL-DET). Para el resto, puedes añadir o cambiar el pin manualmente en el archivo de pins de tu placa:

```cpp
// Ejemplo para SKR 1.4 / Turbo
#define FIL_RUNOUT_PIN  P1_26  // E0DET
#define FIL_RUNOUT_PIN2 P1_25  // E1DET (segundo extrusor)
```

{% endhint %}

| Electrónica      | Archivo pins                          | Pin definido                   |
| ---------------- | ------------------------------------- | ------------------------------ |
| SKR v1.4 / Turbo | `lpc1768/pins_BTT_SKR_V1_4.h`         | `FIL_RUNOUT_PIN P1_26` (E0DET) |
| SKR v1.3         | `lpc1768/pins_BTT_SKR_V1_3.h`         | `FIL_RUNOUT_PIN P1_28`         |
| SKR Mini E3 v2   | `stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h` | `FIL_RUNOUT_PIN PC15`          |

### Sensor BTT SFS (detección de movimiento)

Si tienes el BTT Smart Filament Sensor (v1.0 o v2.0), activa la detección de atascos en `configuration_adv.h`:

{% tabs %}
{% tab title="BTT SFS v1.0" %}

```cpp
// /Marlin/configuration_adv.h
#define FILAMENT_MOTION_SENSOR
#define FILAMENT_RUNOUT_DISTANCE_MM 7   // 7mm recomendado por el fabricante
```

![Ejemplo de conexión BTT SFS v1.0](/files/mHDrpaDmqXnamCjuHL1x)
{% endtab %}

{% tab title="BTT SFS v2.0" %}

```cpp
// /Marlin/configuration_adv.h
#define FILAMENT_MOTION_SENSOR
#define FILAMENT_RUNOUT_DISTANCE_MM 3   // 3mm recomendado por el fabricante
```

![Ejemplo de conexión BTT SFS v2.0](/files/j2CicCmybuaVAHlvinj6)
{% endtab %}
{% endtabs %}

{% hint style="info" %}
En caso de falsos positivos, incrementa `FILAMENT_RUNOUT_DISTANCE_MM` progresivamente hasta eliminarlos. Con Sensorless/stallGuard activo, es recomendable doblar o desactivar el pin DIAG del driver para evitar interferencias.
{% endhint %}

### Lógica del sensor (PULLUP / PULLDOWN)

Algunos finales de carrera requieren ajustar la lógica:

```cpp
// Usar solo UNO de estos dos:
#define FIL_RUNOUT_PULLUP    // para sensores NC (normalmente cerrado)
//#define FIL_RUNOUT_PULLDOWN  // para sensores NO (normalmente abierto)
```

Si el sensor detecta fin de filamento cuando hay filamento (o al revés), invierte la lógica:

```cpp
#define FIL_RUNOUT_STATE HIGH  // o LOW — probar cuál corresponde a "filamento presente"
```

### Parking y M600 (asistente de cambio de filamento)

Necesario para que el sensor pause la impresión y mueva el cabezal a una posición segura:

```cpp
// configuration.h
#define NOZZLE_PARK_FEATURE

// configuration_adv.h
#define ADVANCED_PAUSE_FEATURE

// configuration.h — gcode que se ejecuta al detectar fin de filamento
#define FILAMENT_RUNOUT_SCRIPT "M600"
```

{% hint style="warning" %}
`ADVANCED_PAUSE_FEATURE` requiere una pantalla LCD con menús Marlin clásicos **o** tener habilitado `EMERGENCY_PARSER` (para pantallas TFT serial o hosts como OctoPrint).
{% endhint %}

## Verificar que funciona

Conecta via Pronterface u OctoPrint y envía:

```gcode
M119   ; muestra el estado del sensor
```

Con filamento: debe aparecer `TRIGGERED`. Sin filamento: `OPEN`. Si es al revés, ajusta `FIL_RUNOUT_STATE` o `FIL_RUNOUT_INVERTING`.

## Activar / desactivar el sensor

```gcode
M412        ; consultar estado actual
M412 S1     ; activar sensor
M412 S0     ; desactivar sensor temporalmente
M500        ; guardar estado en EEPROM
```

También puedes definir el estado por defecto en el firmware:

```cpp
#define FIL_RUNOUT_ENABLED_DEFAULT true   // activo desde el arranque
```

## Ajustar el comportamiento de M600

El comando `M600` (pausa y cambio de filamento) tiene varios parámetros ajustables en `configuration_adv.h`:

| Parámetro                            | Descripción                                                                 |
| ------------------------------------ | --------------------------------------------------------------------------- |
| `FILAMENT_CHANGE_UNLOAD_LENGTH`      | mm de filamento a retraer al quitar. Debe ser menor que `EXTRUDE_MAXLENGTH` |
| `FILAMENT_CHANGE_SLOW_LOAD_LENGTH`   | mm de carga inicial lenta                                                   |
| `FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE` | velocidad de carga inicial (mm/min)                                         |
| `FILAMENT_CHANGE_FAST_LOAD_LENGTH`   | mm de carga rápida hasta el nozzle                                          |
| `FILAMENT_CHANGE_FAST_LOAD_FEEDRATE` | velocidad de carga rápida (mm/min)                                          |
