# 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](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-M_Kfi4QEZri0sH1cchE%2F-M_P_p9Fk2DIWxbdFnZl%2Fimage.png?alt=media\&token=52d31c4c-33bf-476b-84a0-e30e149ba70c)

### 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](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FTkBo1FOWD8DAaK3GqAs3%2Fimage.png?alt=media\&token=264d78b0-df90-42f3-b4ab-bd94351fef40)
{% 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](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F4OeiKtuueoWgrtrV7Bq1%2Fimage.png?alt=media\&token=3da711d9-2042-4e8e-b973-aaed9854b1eb)
{% 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)                                          |


---

# Agent Instructions: 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:

```
GET https://marlin.3dwork.io/marlin/configuracion-marlin/sensor-de-filamentos.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
