# Sensores de filamento

Una impresión de 12 horas que se queda sin filamento a mitad de camino es frustrante y costosa. Un sensor de filamento **pausa automáticamente la impresión** cuando detecta falta de filamento o problemas de flujo, permitiéndote cambiar material sin perder la pieza.

El sensor vigila el filamento continuamente: detecta si no hay material, pausa de forma limpia, te avisa para cambiar, y reanuda exactamente donde se quedó.

{% hint style="info" %}
**¿No sabes cuál sensor elegir?** Mira la tabla de abajo y busca tu rango de presupuesto, o ve directamente a la sección [¿Cuál elijo?](#cual-elijo).
{% endhint %}

***

## 📊 Comparativa Rápida de Sensores

| Sensor              | Tipo       | Detección             | Costo  | Precisión  | Mantenimiento | Comprar                                                                                                                                    |
| ------------------- | ---------- | --------------------- | ------ | ---------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Pulsador/Óptico** | Switch     | Ausencia              | 5-15€  | Baja       | Ninguno       | [AliExpress](https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/w/wholesale-3d-printer-filament-sensor.html) |
| **Dyze Orthus**     | Movimiento | Ausencia + Atascos    | 80€+   | Muy Alta   | Bajo          | [Dyze.ca](https://www.dyze.ca/pages/products/orthus-filament-sensor)                                                                       |
| **BTT SFS v2.0**    | Hybrid     | Ausencia + Movimiento | 25-35€ | Alta       | Bajo          | [AliExpress](https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/w/wholesale-BTT-smart-filament-sensor.html)  |
| **BTT SFS v1.0**    | Movimiento | Ausencia + Movimiento | 15-25€ | Media      | Rodamientos   | [AliExpress](https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/w/wholesale-BTT-SFS-v1.html)                 |
| **Orbiter Sensor**  | Integrado  | Ausencia + Botones    | 30€\*  | Alta       | Bajo          | [AliExpress](https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/w/wholesale-orbiter-filament-sensor.html)    |
| **Genérico Motion** | Movimiento | Ausencia              | 10-20€ | Baja-Media | Bajo          | [AliExpress](https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/w/wholesale-filament-motion-sensor.html)     |

{% hint style="info" %}
**Nota sobre Orbiter:** El precio de 30€ es SOLO el sensor. El extrusor Orbiter completo cuesta 80-100€, pero ya incluye el sensor integrado.

**Links de AliExpress:** Son búsquedas con nuestro ID de afiliado. Cambia modelo/marca dentro de AliExpress si prefieres otro proveedor.
{% endhint %}

***

## ¿Cuál elijo?

{% tabs %}
{% tab title="< 20€" %}
**Sensor óptico/pulsador genérico.**

Funciona. No detecta atascos, solo si hay o no hay filamento — pero para la mayoría de usuarios domésticos es suficiente. Si lo rompes, compras otro por 5€.

→ Lee la sección **Pulsador/Óptico** más abajo.
{% endtab %}

{% tab title="20-40€" %}
**BTT SFS v2.0, sin dudar.**

Detecta ausencia Y atascos, sin rodamientos, sin mantenimiento. La mejor relación calidad-precio del mercado ahora mismo.

→ Lee la sección **BTT SFS v2.0** más abajo.
{% endtab %}

{% tab title="> 60€" %}
**Dyze Orthus, si imprimes 24/7 o en granja.**

Encoder óptico de precisión, sin partes móviles, calibración muy fina. Para uso profesional donde no te puedes permitir un fallo.

→ Lee la sección **Dyze Orthus** más abajo.
{% endtab %}

{% tab title="Tienes Orbiter" %}
**Usa el sensor integrado, no compres nada más.**

Si ya tienes un extrusor Orbiter, el sensor viene incluido y está optimizado para esa plataforma.

→ Lee la sección **Orbiter** más abajo.
{% endtab %}
{% endtabs %}

***

## Configuración por Sensor

{% tabs %}
{% tab title="Pulsador/Óptico" %}
Sensores básicos que **detectan si hay filamento o no**. No miden movimiento ni detectan atascos — solo presencia/ausencia. Para la mayoría de usuarios de impresión doméstica es más que suficiente.

Hay dos variantes:

* **Mecánico (pulsador):** una palanca que el filamento presiona al pasar
* **Óptico:** un LED + fotoreceptor que detecta si el filamento corta el haz

Son funcionalmente idénticos. El óptico aguanta mejor en máquinas con mucha vibración.

<figure><img src="/files/3xDci8CwDvCAkyQkBggi" alt=""><figcaption><p>Sensor de pulsador típico - 3 cables (V, S, GND)</p></figcaption></figure>

### Instalación Física

{% stepper %}
{% step %}

#### Elige la ubicación

* **Bowden:** coloca el sensor antes del tubo (entre extrusor y entrada del tubo Bowden)
* **Direct Drive:** monta entre el bloque del extrusor y la entrada de filamento — necesitas unos \~40×30mm de espacio libre
  {% endstep %}

{% step %}

#### Conecta los 3 cables

| Cable         | Destino                                               |
| ------------- | ----------------------------------------------------- |
| **GND**       | GND mainboard                                         |
| **V**         | 5V (o 3.3V — consulta la especificación de tu sensor) |
| **SEÑAL**     | Pin endstop libre (PA4, etc.)                         |
| {% endstep %} |                                                       |

{% step %}

#### Verifica mecánicamente

Pasa filamento manualmente y comprueba que presiona la palanca o corta el haz. Si no hay reacción física, la configuración no servirá de nada.
{% endstep %}
{% endstepper %}

### Configuración en Klipper

```ini
[filament_switch_sensor filament_runout]
switch_pin: PA4                    # Ajusta según tu mainboard
pause_on_runout: True
runout_gcode:
    M118 Sin filamento!
    M600                           # Macro de cambio de filamento
insert_gcode:
    M118 Filamento insertado
    LOAD_FILAMENT
event_delay: 3.0
pause_delay: 0.1

[respond]
# Necesario para M118
```

**Parámetros clave:**

| Parámetro         | Qué hace                                                                        |
| ----------------- | ------------------------------------------------------------------------------- |
| `switch_pin`      | Pin donde va la señal del sensor                                                |
| `pause_on_runout` | `True` = pausa automática al detectar problema                                  |
| `event_delay`     | Espera (segundos) antes de reaccionar — sube este valor si hay falsos positivos |
| `pause_delay`     | Espera antes de ejecutar el `runout_gcode`                                      |

### Pros y Contras

**✅ Lo bueno**

* Muy barato (5-15€) — compra varios de reserva
* Sin mantenimiento
* Compatible con cualquier mainboard
* Fácil de diagnosticar: funciona o no funciona

**❌ Lo malo**

* No detecta atascos
* No detecta flujo lento
* Falsos positivos si el Bowden es muy largo
* Requiere que el filamento presione físicamente bien

### Troubleshooting

<details>

<summary>Sensor no detecta cambios</summary>

1. Invierte la lógica del pin: cambia `switch_pin: PA4` por `switch_pin: !PA4`
2. Comprueba la conexión física (¿el cable SEÑAL está en el pin correcto?)
3. Verifica que el filamento presiona completamente la palanca

</details>

<details>

<summary>Falsos positivos frecuentes</summary>

1. Sube `event_delay` a 5-10 segundos
2. Asegúrate de que el bracket no vibra durante la impresión
3. Monta el sensor en un soporte más rígido

</details>

<details>

<summary>Se activa pero no pausa la impresión</summary>

1. Verifica que `[pause_resume]` está definido en tu `printer.cfg`
2. Comprueba que la macro `M600` existe

</details>

### Test Final

{% stepper %}
{% step %}

#### Test estático

Fluidd/Mainsail → **Miscellaneous** → **Filament Sensors**. Presiona y retira filamento manualmente. ¿El estado cambia? → Sensor OK ✅
{% endstep %}

{% step %}

#### Test en impresión real

Inicia una impresión. A los 20-30 minutos, extrae el filamento manualmente. ¿La máquina pausa en menos de 3 segundos? → Configuración correcta ✅
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Dyze Orthus" %}
Sensor profesional de movimiento. Encoder óptico que detecta cada **0.5mm de desplazamiento**, sin partes móviles, sin mantenimiento. La opción para granjas de impresión o producción 24/7.

**Lo que lo diferencia de los demás:**

* Detecta atascos antes de que arruinen la pieza
* Sensibilidad ajustable por tipo de filamento
* "Instala y olvídate durante años"

{% hint style="warning" %}
**¿Vale la pena para uso doméstico?** Solo si imprimes muy frecuentemente y no te puedes permitir fallos. Para impresión casual, el BTT SFS v2.0 hace el mismo trabajo por mucho menos.
{% endhint %}

<figure><img src="/files/00HIAonJC7TzJX66nCau" alt=""><figcaption><p>Dyze Orthus - Sensor profesional de movimiento</p></figcaption></figure>

### Tabla de Calibración

El parámetro `detection_length` depende del diámetro del filamento, la posición del selector y la sensibilidad que quieras.

<figure><img src="/files/yzYKiphMDIDbjpEweVjc" alt=""><figcaption><p>Tabla oficial Dyze - valores de detection_length según configuración</p></figcaption></figure>

{% hint style="info" %}
**Regla práctica:** Usa el valor de la tabla + 2-3mm para reducir falsos positivos durante los primeros días. Afinas después.
{% endhint %}

### Instalación Física

{% stepper %}
{% step %}

#### Ubica el sensor

Después del drive del extrusor, con el filamento perpendicular al sensor. Espacio necesario: 40×20×30mm. No aprietes demasiado — es un sensor óptico delicado.
{% endstep %}

{% step %}

#### Conecta los 3 cables

| Cable         | Color        | Destino           |
| ------------- | ------------ | ----------------- |
| GND           | Negro        | GND mainboard     |
| 5V            | Rojo         | 5V mainboard      |
| Señal         | Blanco/Verde | Pin endstop libre |
| {% endstep %} |              |                   |

{% step %}

#### Verifica el LED

Debe estar en **verde fijo** tras conectar. Si está rojo o apagado, hay un problema de alimentación — no sigas hasta resolverlo.
{% endstep %}
{% endstepper %}

### Configuración en Klipper

```ini
[filament_motion_sensor orthus]
detection_length: 10               # Ajusta según tabla + margen
extruder: extruder
switch_pin: PA4
pause_on_runout: True
runout_gcode:
    M118 Filamento agotado (Orthus)
    M600
insert_gcode:
    M118 Filamento cargado
    LOAD_FILAMENT
event_delay: 3.0
pause_delay: 0.01                  # Muy bajo: el sensor es preciso

[respond]
```

### Indicadores LED

| LED                  | Significado                                |
| -------------------- | ------------------------------------------ |
| 🟢 Verde fijo        | Alimentado y listo                         |
| 🟢 Verde parpadeante | Filamento en movimiento (detección activa) |
| 🔴 Rojo              | Sin alimentación o error                   |

### Calibración Paso a Paso

{% stepper %}
{% step %}

#### Confirma el LED verde

Sin LED verde no tiene sentido continuar. Si está rojo, revisa la alimentación y el cableado antes de tocar nada en Klipper.
{% endstep %}

{% step %}

#### Test manual de movimiento

Mueve filamento 10mm hacia adelante. El LED debe parpadear. Si no parpadea, el problema está en el pin de señal en la configuración.
{% endstep %}

{% step %}

#### Ajusta detection\_length

* Muchos falsos positivos → **sube** el valor (+2mm cada vez)
* No detecta nunca → **baja** el valor (-2mm) o revisa el cableado
* Objetivo: que detecte al mover entre 5 y 10mm
  {% endstep %}

{% step %}

#### Test en impresión real

Inicia impresión. A los 5 minutos, extrae el filamento manualmente. ¿Pausa en menos de 2 segundos? ✅. ¿Tarda más o no pausa? → Sube `detection_length` 2mm y repite.
{% endstep %}
{% endstepper %}

### Pros y Contras

**✅ Lo bueno**

* Ultra-preciso (cada 0.5mm)
* Sin partes móviles
* Sin mantenimiento
* Compatible con cualquier filamento

**❌ Lo malo**

* Precio elevado (80€+)
* Requiere calibración inicial
* Sobredimensionado para uso doméstico
  {% endtab %}

{% tab title="BTT SFS v2.0" %}
El sensor más recomendado para uso general. Combina dos sensores en uno: un switch que detecta si hay filamento, y un encoder que detecta si está fluyendo. Si uno falla, el otro te cubre.

Sin rodamientos, sin mantenimiento, precio razonable. **Si no sabes qué sensor comprar, compra este.**

<figure><img src="/files/6940TkjVYpWG6JaSWfqX" alt=""><figcaption><p>BTT SFS v2.0 - Compacto y versátil</p></figcaption></figure>

### Instalación Física

{% stepper %}
{% step %}

#### Ubica el sensor

Después del drive del extrusor, con el filamento fluyendo perpendicularmente. Dimensiones: 45×25×25mm. No aprietes demasiado los tornillos.
{% endstep %}

{% step %}

#### Conecta los cables (4-6 según modelo)

| Cable            | Destino                                 |
| ---------------- | --------------------------------------- |
| GND              | GND mainboard                           |
| 5V               | 5V mainboard                            |
| SWITCH\_PIN      | Pin endstop (PA4, etc.)                 |
| ENCODER\_PIN     | Otro pin endstop disponible (PA5, etc.) |
| {% endstep %}    |                                         |
| {% endstepper %} |                                         |

{% hint style="info" %}
**Truco:** Si puedes, usa un bracket de hot-swap. Facilita el reemplazo sin desmontar todo el extrusor.
{% endhint %}

### Configuración (Dual Sensor)

```ini
# SENSOR SWITCH (detección de ausencia de filamento)
[filament_switch_sensor SFS_switch]
switch_pin: gpio18               # Ajusta según tu mainboard
pause_on_runout: False           # Lo controlamos con macros
runout_gcode:
    M118 Switch: Sin filamento
insert_gcode:
    M118 Switch: Filamento insertado

# SENSOR ENCODER (detección de movimiento y atascos)
[filament_motion_sensor SFS_encoder]
switch_pin: gpio17
detection_length: 2.88           # Mínimo recomendado por BTT
extruder: extruder
pause_on_runout: False
runout_gcode:
    M118 Encoder: Atasco detectado
insert_gcode:
    M118 Encoder: Flujo normal

[respond]
```

{% hint style="warning" %}
**`pause_on_runout: False`** es intencional en ambos sensores. Las macros de abajo controlan cuándo pausar realmente. Con `True` en los dos puede haber conflictos y pausas duplicadas.
{% endhint %}

**Parámetros críticos:**

* **`detection_length: 2.88mm`** = mínimo del sensor. Si hay falsos positivos, sube +1mm (hasta \~5mm como máximo).
* **`pause_on_runout: False`** = la pausa la gestiona la macro `FILAMENT_CHECK`.

### Macros de Control

```ini
# Deshabilitar en boot (evita falsos positivos durante precalentamiento)
[delayed_gcode SFS_BOOTDISABLE]
initial_duration: 1
gcode:
    SET_FILAMENT_SENSOR SENSOR=SFS_switch ENABLE=0
    SET_FILAMENT_SENSOR SENSOR=SFS_encoder ENABLE=0

# Activar antes de imprimir (llamar desde START_PRINT)
[gcode_macro SFS_ENABLE]
description: Activar sensores antes de impresión
gcode:
    M117 Activando sensores de filamento
    G92 E0
    SET_FILAMENT_SENSOR SENSOR=SFS_switch ENABLE=1
    SET_FILAMENT_SENSOR SENSOR=SFS_encoder ENABLE=1

# Desactivar al terminar (llamar desde END_PRINT)
[gcode_macro SFS_DISABLE]
description: Desactivar sensores al terminar
gcode:
    M117 Desactivando sensores
    G92 E0
    SET_FILAMENT_SENSOR SENSOR=SFS_switch ENABLE=0
    SET_FILAMENT_SENSOR SENSOR=SFS_encoder ENABLE=0

# Pausa solo si ambos sensores confirman problema (más fiable)
[gcode_macro FILAMENT_CHECK]
gcode:
    {% set sensor_switch = printer["filament_switch_sensor SFS_switch"] %}
    {% set sensor_encoder = printer["filament_motion_sensor SFS_encoder"] %}
    
    {% if sensor_switch.filament_detected == False %}
        PAUSE
        M118 ¡Filamento agotado!
        M600
    {% elif sensor_encoder.filament_detected == False %}
        PAUSE
        M118 ¡Atasco o problema de flujo!
    {% endif %}
```

### Integración en el Laminador

Añade esto al **G-code de inicio** en Cura, PrusaSlicer o el que uses:

```gcode
; Calentamiento
M104 S{material_print_temperature}
M140 S{material_bed_temperature}

; Espera a temperatura
M109 S{material_print_temperature}
M190 S{material_bed_temperature}

; Activar sensores AQUÍ (nozzle ya caliente)
SFS_ENABLE

; Macro de inicio
START_PRINT
```

### v2.0 vs v1.0

**v2.0 — esta versión**

* Sin rodamientos
* Sin mantenimiento
* Más compacto
* 25-35€
* ✅ **Cómprala**

**v1.0 — versión anterior**

* Con rodamientos (lubricar cada 6 meses)
* Más grande
* 15-25€
* Solo si el presupuesto es muy ajustado

### Troubleshooting

<details>

<summary>Ambos sensores reportan false sin razón</summary>

1. Verifica que llegan 5V al sensor (mide con multímetro si es necesario)
2. Comprueba el cableado GPIO pin a pin
3. Ejecuta `FIRMWARE_RESTART`

</details>

<details>

<summary>Solo el switch funciona, el encoder no</summary>

1. Verifica que el filamento pasa correctamente por el canal del encoder
2. Sube `detection_length` a 5mm
3. Comprueba que no hay suciedad o pelos dentro del encoder

</details>

<details>

<summary>Falsos positivos continuos</summary>

1. Sube `event_delay` a 5 segundos
2. Revisa que el filamento está bien alineado en el sensor
3. Comprueba que el soporte está rígido y no vibra

</details>

### Test Final

{% stepper %}
{% step %}

#### Test de switches

Fluidd/Mainsail → **Miscellaneous** → **Filament Sensors**. Presiona y retira filamento. ¿Cambian `SFS_switch` y `SFS_encoder`? ✅
{% endstep %}

{% step %}

#### Test del encoder

Mueve filamento lentamente (micro-movimientos de 2-3mm). El estado del encoder debe fluctuar. Si no cambia, revisa el cableado del encoder específicamente.
{% endstep %}

{% step %}

#### Test en impresión

Inicia impresión. A los 20 minutos, extrae filamento manualmente. ¿Pausa en menos de 3 segundos? ✅. Si no pausa, verifica que `SFS_ENABLE` está en tu `START_PRINT`.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="BTT SFS v1.0" %}
La versión anterior del SFS. Mismo principio que el v2.0 pero con rodamientos que necesitan lubricación periódica. Si puedes, coge el v2.0 — por 10€ más te ahorras el mantenimiento.

<figure><img src="/files/A2DDmNBlKB7R1qV0Eozo" alt=""><figcaption><p>BTT SFS v1.0 - Con rodamientos (requiere lubricado)</p></figcaption></figure>

{% hint style="warning" %}
**La diferencia clave con el v2.0:** el v1.0 necesita `switch_pin: ^PA9` (nota el `^`). Sin el `^` de pull-up, el sensor no funciona. Es el error más común en esta versión.
{% endhint %}

### Instalación Física

{% stepper %}
{% step %}

#### Ubica el sensor

Después del drive del extrusor. Dimensiones: \~50×30×30mm (más grande que el v2.0). No aprietes demasiado los tornillos sobre los rodamientos.
{% endstep %}

{% step %}

#### Conecta los 3 cables

| Cable         | Destino                              |
| ------------- | ------------------------------------ |
| GND           | GND mainboard                        |
| 5V            | 5V mainboard                         |
| SEÑAL         | Pin endstop **con pull-up** (`^PA9`) |
| {% endstep %} |                                      |

{% step %}

#### Ten aceite a mano

El v1.0 necesita lubricación cada 3-6 meses. Anota la fecha de instalación para no olvidarlo.
{% endstep %}
{% endstepper %}

### Configuración

```ini
[filament_motion_sensor BTT_Smart]
detection_length: 7              # Empieza con 7mm (más alto que el v2.0)
extruder: extruder
switch_pin: ^PA9                 # ^ = pull-up (CRÍTICO en v1.0)
pause_on_runout: True
runout_gcode:
    M118 Filamento agotado
    M600
insert_gcode:
    M118 Filamento cargado
    LOAD_FILAMENT
event_delay: 3.0
pause_delay: 0.01

[respond]
```

**Diferencias clave respecto al v2.0:**

* `detection_length: 7mm` (vs 2.88mm en v2.0 — los rodamientos necesitan más margen)
* `switch_pin: ^PA9` — el `^` activa pull-up, es imprescindible
  * Sin `^`: el sensor nunca detecta nada
  * Si aun así no funciona: prueba sin `^` (algunos modelos lo tienen incorporado)

### Mantenimiento de Rodamientos

{% stepper %}
{% step %}

#### Cada 3-6 meses

Extrae el cartucho del sensor, aplica 1-2 gotas de aceite ligero (aceite de máquina de coser o 3-en-1), gira manualmente 10-20 veces, y vuelve a instalar.
{% endstep %}

{% step %}

#### Señales de que toca mantenimiento antes de plazo

* El sensor "pega" o se mueve con resistencia
* Detección inconsistente (a veces detecta, a veces no)
* Ruido anormal al pasar filamento

Si ves alguna de estas señales, lubrica aunque no hayan pasado 6 meses.
{% endstep %}
{% endstepper %}

### Macros

```ini
[delayed_gcode SFS_BOOTDISABLE]
initial_duration: 1
gcode:
    SET_FILAMENT_SENSOR SENSOR=BTT_Smart ENABLE=0

[gcode_macro SFS_ENABLE]
description: Activar sensor antes de impresión
gcode:
    M117 SFS ENABLED
    G92 E0
    SET_FILAMENT_SENSOR SENSOR=BTT_Smart ENABLE=1

[gcode_macro SFS_DISABLE]
description: Desactivar sensor después de impresión
gcode:
    M117 SFS DISABLED
    G92 E0
    SET_FILAMENT_SENSOR SENSOR=BTT_Smart ENABLE=0
```

### Pros y Contras

**✅ Lo bueno**

* Más barato que el v2.0 (15-25€)
* Misma capacidad de detección de atascos
* Fácil de encontrar

**❌ Lo malo**

* Rodamientos requieren lubricación periódica
* Más grande y aparatoso
* El pull-up `^` es un punto de fallo frecuente si lo olvidas

### Test Final

{% stepper %}
{% step %}

#### Verifica el pull-up

En Fluidd/Mainsail el estado debe cambiar al mover filamento. Si siempre está "disconnected" o "false", prueba añadir o quitar el `^` del pin.
{% endstep %}

{% step %}

#### Test manual

Mueve filamento lentamente \~10mm. Observa si `filament_detected` cambia en la interfaz web.
{% endstep %}

{% step %}

#### Test en impresión

Inicia impresión. Extrae filamento manualmente. ¿Pausa en menos de 3 segundos? ✅. Si no: sube `detection_length` a 8-10mm y repite.
{% endstep %}

{% step %}

#### Planifica el mantenimiento

Anota la fecha de hoy en el calendario. En 6 meses, lubrica los rodamientos. Es el único mantenimiento que necesita este sensor.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Orbiter" %}
Sensor integrado en los extrusores **Orbiter v1, v1.5 y v2**. Si ya tienes uno, el sensor viene incluido — solo hace falta cablearlo y configurarlo.

Tiene dos ventajas únicas respecto a otros sensores: **botones físicos** para carga/descarga de emergencia y un **LED de estado** visible en todo momento.

<figure><img src="/files/TxZBw0YfKvhSrCP7JIuR" alt=""><figcaption><p>Orbiter con sensor integrado - LED indicador de estado</p></figcaption></figure>

### LED Indicador

| Color      | Significado                            |
| ---------- | -------------------------------------- |
| 🟢 Verde   | Filamento cargado, listo para imprimir |
| 🟠 Naranja | Botón de descarga presionado           |
| 🔴 Rojo    | Sin filamento detectado                |

### Cableado (4 cables)

| Cable           | Color       | Destino                    |
| --------------- | ----------- | -------------------------- |
| GND             | 🔵 Azul     | GND mainboard              |
| Alimentación    | 🔴 Rojo     | 3.3V (o 5V con adaptación) |
| Señal filamento | 🟢 Verde    | Puerto servo o endstop     |
| Botón descarga  | 🟡 Amarillo | Otro pin endstop           |

**Pines de ejemplo para Octopus:**

| Función          | Puerto        | Pin |
| ---------------- | ------------- | --- |
| GND (Azul)       | Servo GND     | —   |
| 3.3V/5V (Rojo)   | Servo 5V      | —   |
| Sensor (Verde)   | Servo señal   | PA2 |
| Botón (Amarillo) | Endstop señal | PA0 |

### Instalación

{% stepper %}
{% step %}

#### Descarga la configuración oficial

```
https://orbiterprojects.com/download/filamentsensor/OrbiterSensor.cfg
```

{% endstep %}

{% step %}

#### Edita OrbiterSensor.cfg con tus pines

```ini
[gcode_button sensor_fs]
pin: PA2          # VERDE → pin de señal del filamento

[gcode_button sensor_fu]
pin: PA0          # AMARILLO → pin del botón de descarga
```

{% endstep %}

{% step %}

#### Añade a printer.cfg

```ini
[include OrbiterSensor.cfg]

[extruder]
min_extrude_temp: 180   # Necesario para que el sensor funcione correctamente
...
```

{% endstep %}
{% endstepper %}

{% hint style="warning" %}
**Orbiter v2.2:** Las señales están invertidas. Añade `!` delante de cada pin:

```ini
pin: !PA2      # Verde
pin: !PA0      # Amarillo
```

{% endhint %}

### Macros Incluidas en OrbiterSensor.cfg

El archivo ya incluye todo lo necesario:

* **`LOAD_FILAMENT`** — carga automática al insertar filamento
* **`UNLOAD_FILAMENT`** — descarga automática al pulsar el botón
* Los **botones físicos** ejecutan estas macros directamente, sin pasar por la interfaz web

### Macros Adicionales (Opcionales)

```ini
# Pausa personalizada al detectar falta de filamento
[gcode_macro PAUSE_FILAMENT_MISSING]
gcode:
    PAUSE
    M118 Filamento agotado - Presiona botón descarga para cambiar

# Reanudar después de cambio con tiempo de estabilización
[gcode_macro RESUME_AFTER_FILAMENT]
gcode:
    G4 P10000          # Espera 10 segundos antes de reanudar
    RESUME
```

### Pros y Contras

**✅ Lo bueno**

* Integrado = menos cables que gestionar
* Botones físicos = no necesitas la pantalla para emergencias
* LED visible = sabes el estado de un vistazo
* Compatible con Orbiter v1, v1.5 y v2

**❌ Lo malo**

* Solo funciona con extrusores Orbiter
* El extrusor completo cuesta 80-100€
* Configuración algo más compleja que un sensor genérico

### Test Final

{% stepper %}
{% step %}

#### Test del LED

Conecta con filamento cargado. ¿LED verde? ✅. Retira el filamento. ¿LED rojo? ✅. Si los colores no corresponden, revisa el cableado del cable verde.
{% endstep %}

{% step %}

#### Test de botones

Presiona el botón de descarga (cable amarillo). ¿Ejecuta `UNLOAD_FILAMENT`? ✅. Presiona el botón de carga. ¿Ejecuta `LOAD_FILAMENT`? ✅.
{% endstep %}

{% step %}

#### Test en impresión

Con LED verde, inicia impresión. A mitad, presiona el botón de descarga. ¿Pausa automáticamente? ✅. ¿Se descarga el filamento? ✅.
{% endstep %}

{% step %}

#### Test de recuperación completa

Inserta filamento nuevo. ¿El LED cambia a verde? ✅. Ejecuta `RESUME` desde la interfaz. ¿Continúa la impresión desde donde se quedó? ✅.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

***

## 🔍 Troubleshooting Avanzado

### Diagnóstico Rápido

Antes de tocar nada en la configuración, comprueba el estado visual en la interfaz:

{% stepper %}
{% step %}

#### Abre Fluidd o Mainsail

Ve a **Miscellaneous** → **Filament Sensors**.
{% endstep %}

{% step %}

#### Observa el estado en tiempo real

Inserta y retira filamento manualmente. El estado debe cambiar entre `true` y `false`. Si no cambia, hay un problema físico o de configuración.
{% endstep %}

{% step %}

#### Consulta por consola si necesitas más detalle

```gcode
QUERY_FILAMENT_SENSOR

# Resultado esperado:
# SFS_switch: filament_detected=true
# SFS_encoder: filament_detected=true
```

{% endstep %}
{% endstepper %}

### Problemas Frecuentes

<details>

<summary>❌ "Filament sensor not found"</summary>

El nombre del sensor en el comando no coincide con el de `printer.cfg`.

```ini
# Si el sensor se llama "mi_sensor" en la configuración:
QUERY_FILAMENT_SENSOR SENSOR=mi_sensor    # ✅ Correcto
QUERY_FILAMENT_SENSOR SENSOR=SFS_switch   # ❌ Error (nombre incorrecto)
```

</details>

<details>

<summary>❌ Estado siempre "filament_detected = false" sin razón</summary>

En orden de probabilidad:

1. Invierte la lógica del pin: `switch_pin: !PA4`
2. Verifica la alimentación (¿llega tensión al sensor?)
3. Comprueba que el GND está bien conectado
4. Ejecuta `FIRMWARE_RESTART`

</details>

<details>

<summary>❌ El estado no cambia al insertar o retirar filamento</summary>

1. Verifica que el pin en `printer.cfg` es el correcto
2. Prueba combinaciones: `PA4` → `!PA4` → `^PA4` → `^!PA4`
3. Comprueba el montaje mecánico: ¿el sensor presiona bien el filamento?
4. Si el filamento es muy fino o grueso, puede no activar el sensor

</details>

<details>

<summary>❌ Falsos positivos cada 2-3 minutos</summary>

1. Sube `event_delay` a 10 segundos
2. El sensor probablemente vibra con la máquina — monta un bracket más rígido
3. Comprueba que el filamento no roza el sensor lateralmente
4. Añade amortiguación (goma fina) entre el sensor y el chasis

</details>

<details>

<summary>❌ Detecta al inicio pero después deja de responder</summary>

El pin necesita pull-up. Añade `^` antes del valor:

```ini
switch_pin: ^PA4    # El ^ activa el pull-up interno
```

</details>

***

## 📈 Mejores Prácticas

### Timing: Cuándo Activar y Desactivar

**El error más común** es tener los sensores activos durante el precalentamiento. El filamento frío, los micro-movimientos del extrusor y los cambios de temperatura generan falsos positivos que paran la impresión antes de que empiece.

La solución es simple: deshabilita en boot, habilita solo cuando el nozzle ya está caliente.

{% stepper %}
{% step %}

#### Deshabilita en boot

```ini
[delayed_gcode SFS_BOOTDISABLE]
initial_duration: 1
gcode:
    SET_FILAMENT_SENSOR SENSOR=SFS_switch ENABLE=0
    SET_FILAMENT_SENSOR SENSOR=SFS_encoder ENABLE=0
```

{% endstep %}

{% step %}

#### Activa en START\_PRINT, después del calentamiento

```ini
[gcode_macro START_PRINT]
gcode:
    # ... precalentamiento ...
    M109 S{material_print_temperature}   # Espera temperatura nozzle
    M190 S{material_bed_temperature}     # Espera temperatura cama
    
    SFS_ENABLE    # ← Aquí: nozzle ya caliente, listo para imprimir
    
    # ... resto de tu START_PRINT ...
```

{% endstep %}

{% step %}

#### Desactiva en END\_PRINT

```ini
[gcode_macro END_PRINT]
gcode:
    # ... limpieza final ...
    SFS_DISABLE
```

{% endstep %}
{% endstepper %}

### Integración con M600 (Cambio de Filamento)

M600 coordina la pausa limpia: retrae filamento, espera a que insertes el nuevo, y reanuda desde exactamente el mismo punto. Sin ella, una pausa simple deja el nozzle en medio de la pieza.

```ini
[gcode_macro M600]
description: Cambio de filamento
gcode:
    PAUSE                           # Pausa la impresión
    M117 Cambio de filamento...
    UNLOAD_FILAMENT                 # Descarga el filamento actual
    M118 Inserta nuevo filamento y ejecuta RESUME

[gcode_macro RESUME]
rename_existing: RESUME_ORIGINAL
gcode:
    {% if printer.pause_resume.is_paused %}
        LOAD_FILAMENT              # Carga el nuevo filamento
        G92 E0
        RESUME_ORIGINAL            # Reanuda la impresión
    {% endif %}
```

### Referencia de Parámetros

#### [`filament_switch_sensor`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor) — Pulsador/Óptico

Detecta **presencia/ausencia** de filamento. Sin capacidad de detectar atascos.

| Parámetro                                                                                   | Default | Rango típico    | Para qué sirve                                                                   |
| ------------------------------------------------------------------------------------------- | ------- | --------------- | -------------------------------------------------------------------------------- |
| [`switch_pin`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor)      | —       | Pin (ej. `PA4`) | Pin de señal. Obligatorio. Usa `!PA4` para invertir lógica, `^PA4` para pull-up  |
| [`pause_on_runout`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor) | `True`  | True / False    | Pausa automáticamente al detectar falta de filamento                             |
| [`runout_gcode`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor)    | —       | gcode           | Comandos ejecutados al detectar falta de filamento (ej. `M600`)                  |
| [`insert_gcode`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor)    | —       | gcode           | Comandos ejecutados al reinsertar filamento                                      |
| [`event_delay`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor)     | —       | 0.5 – 10s       | Espera antes de procesar el evento. Súbelo si hay falsos positivos por vibración |
| [`pause_delay`](https://www.klipper3d.org/Config_Reference.html#filament_switch_sensor)     | —       | 0.01 – 1s       | Tiempo entre detectar el problema y ejecutar la pausa                            |

***

#### [`filament_motion_sensor`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor) — BTT SFS, Dyze Orthus, Genérico Motion

Detecta **movimiento real del filamento**. Cubre ausencia + atascos + flujo lento.

| Parámetro                                                                                    | Default | Rango típico    | Para qué sirve                                                                                                                                                                                |
| -------------------------------------------------------------------------------------------- | ------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`switch_pin`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)       | —       | Pin (ej. `PA4`) | Pin de señal. Obligatorio. Usa `!` para invertir lógica, `^` para pull-up                                                                                                                     |
| [`detection_length`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor) | `7.0mm` | 2.88 – 15mm     | Distancia mínima de filamento que debe moverse para registrar cambio. **El parámetro más importante de este tipo de sensor** — demasiado bajo = falsos positivos, demasiado alto = no detecta |
| [`extruder`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)         | —       | nombre          | Nombre del extrusor asociado (normalmente `extruder`). Obligatorio                                                                                                                            |
| [`pause_on_runout`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)  | `True`  | True / False    | Pausa automáticamente al detectar problema de flujo                                                                                                                                           |
| [`runout_gcode`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)     | —       | gcode           | Comandos ejecutados al detectar atasco o falta de filamento                                                                                                                                   |
| [`insert_gcode`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)     | —       | gcode           | Comandos ejecutados cuando el flujo se reanuda                                                                                                                                                |
| [`event_delay`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)      | —       | 0.5 – 10s       | Espera antes de procesar el evento. Crítico en sensores de movimiento — demasiado bajo dispara falsas alarmas                                                                                 |
| [`pause_delay`](https://www.klipper3d.org/Config_Reference.html#filament_motion_sensor)      | —       | 0.01 – 1s       | Tiempo entre detectar el problema y ejecutar la pausa                                                                                                                                         |

{% hint style="info" %}
**Diferencia clave entre los dos tipos:** `filament_switch_sensor` no tiene `detection_length` ni `extruder` porque no mide movimiento — solo sabe si el filamento está o no está. `filament_motion_sensor` necesita saber de qué extrusor viene el movimiento para calcular correctamente la distancia.
{% endhint %}

**Latencia total estimada:** 1 – 3 segundos desde el problema hasta la máquina pausada (suma de `event_delay` + `pause_delay` + tiempo de reacción del firmware).

***

## 🎯 Consejos y Advertencias

{% tabs %}
{% tab title="¿Qué sensor compro?" %}

* **< 20€:** Sensor pulsador/óptico genérico — funciona, sin florituras
* **20-40€:** BTT SFS v2.0 — la mejor opción para la mayoría
* **> 60€:** Dyze Orthus — solo para granjas o producción intensiva
* **Tienes Orbiter:** Usa el integrado, no compres nada más
  {% endtab %}

{% tab title="Error del precalentamiento" %}
**Síntomas:**

* La impresora pausa justo antes de empezar a imprimir
* Ves `filament_detected: false` sin razón durante el calentamiento

**Causa:** el sensor estaba activo mientras el nozzle calentaba.

**Solución:**

1. Añade `[delayed_gcode SFS_BOOTDISABLE]` para desactivar en boot
2. Llama a `SFS_ENABLE` solo **después** de `M109`
3. Llama a `SFS_DISABLE` en `END_PRINT`
   {% endtab %}

{% tab title="Vibración y montaje" %}
**Síntomas:** falsos positivos cada 2-3 minutos, especialmente en impresoras rápidas o con camas volantes (bedslinger).

**Soluciones en orden:**

1. `event_delay: 10` — espera más antes de reaccionar
2. Bracket muy rígido — evita el plástico flexible para montar el sensor
3. Amortigua el punto de montaje con goma o espuma fina
4. Alinea bien el filamento — no debe rozar lateralmente el sensor
   {% endtab %}

{% tab title="Óptico vs Mecánico" %}
**Mecánico (pulsador)**

* Más barato
* Aguanta mejor las vibraciones
* La palanca se puede desgastar con el tiempo

**Óptico**

* Sin desgaste mecánico
* Mejor para filamentos abrasivos (fibra de carbono, etc.)
* Puede acumular polvo — limpia el receptor cada meses
  {% endtab %}

{% tab title="Mantenimiento" %}

| Sensor          | Qué necesita            | Cada cuánto    |
| --------------- | ----------------------- | -------------- |
| BTT SFS v2.0    | Nada                    | —              |
| BTT SFS v1.0    | Lubrica rodamientos     | Cada 3-6 meses |
| Pulsador/óptico | Revisa presión mecánica | Cada 3-6 meses |
| Dyze Orthus     | Revisa cableado         | Cada año       |

**Señales de que algo va mal:** detección inconsistente de repente, más falsos positivos que antes, ruido anormal al pasar filamento.
{% endtab %}

{% tab title="El test definitivo" %}
**Antes de dormir mientras imprime:**

{% stepper %}
{% step %}

#### Imprime una pieza de prueba (\~1 hora)

{% endstep %}

{% step %}

#### A mitad de impresión, extrae el filamento manualmente

{% endstep %}

{% step %}

#### Evalúa el resultado

* ¿La máquina pausó en menos de 3 segundos? ✅ Confiable
* ¿Siguió imprimiendo sin pausar? ❌ Revisa configuración
  {% endstep %}

{% step %}

#### Repite 3 veces

Si falla una vez de tres, no lo des por bueno. Revisa timing y parámetros antes de fiarte para impresiones largas sin supervisión.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

***

## 🆘 Referencias

* **Documentación Klipper oficial:** <https://www.klipper3d.org/G-Codes#query\\_filament\\_sensor>
* **BTT SFS v2.0 GitHub:** <https://github.com/bigtreetech/smart-filament-sensor>
* **Dyze Orthus:** <https://www.dyze.ca/pages/products/orthus-filament-sensor>
* **Orbiter sensor:** <https://orbiterprojects.com/orbiter-filament-sensor/>

***

**Última actualización:** 2026-05-22 **Autor:** HAL (Technical Writer - 3Dwork.io)

{% hint style="success" %}
Con un sensor bien configurado y el test definitivo superado 3 veces, tus impresiones largas están aseguradas. Nunca más perderás una pieza por falta de filamento.
{% endhint %}


---

# 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://klipper.3dwork.io/klipper/mejoras/sensores-de-filamento.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.
