# 3DWork.io - Marlin

{% hint style="info" %}
El contenido de estas guías es gracias a la experiencia obtenida ayudando a compañeros de los diferentes grupos de nuestras redes sociales así como información o guías que creemos interesantes para nuestro hobby.

⚠️ **No nos hacemos responsables de cualquier daño que se pueda ocasionar en vuestras impresoras al aplicar cualquier sugerencia/solución a un problema/necesidad expuesto en las guías. Cada uno es responsable de sus máquinas.**

⚠️ **Si en algún punto hemos usado contenido de terceros y no hacemos referencia directa no es nuestra intención hacer nuestro el trabajo de otros si no que simplemente se nos ha olvidado hacerlo.**
{% endhint %}

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><strong>MARLIN</strong> - Guías de compilación, configuración y resolución de problemas de este firmware 3D.</td><td></td><td></td><td><a href="https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/broken-reference/README.md">https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/broken-reference/README.md</a></td><td><a href="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FPL4lLJk39gdXsRJcwAXg%2FMarlin_Logo.png?alt=media&amp;token=212e903a-4c03-44a5-8712-b4afb8bc6ee4">Marlin_Logo.png</a></td></tr><tr><td><strong>OCTOPRINT</strong> - El complemento perfecto para tu MARLIN para expandir sus funcionalidades y control remoto de tus máquinas</td><td></td><td></td><td></td><td><a href="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F0V3R1zmHSd7HxOtbgoPY%2Foctoprint-logo-text-mens-premium-t-shirt.jpg?alt=media&amp;token=8c19e60c-08ab-41e0-a6fe-ab2e33d5b670">octoprint-logo-text-mens-premium-t-shirt.jpg</a></td></tr></tbody></table>


# Marlin - Guía Compilación

Guía completa de compilación e instalación de firmware Marlin: desde la descarga de fuentes y preconfigurados hasta la compilación con VSCode + PlatformIO, con Auto Build Marlin y binarios precompilad

{% 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 %}

Pásate por nuestro [**grupo en español de Telegram sobre Marlin**](https://t.me/marlin_es) para cualquier duda relacionada con el, también si quieres acceder a un grupo general tienes nuestro [**grupo Telegram 3Dwork en español**](https://t.me/trastornados) e [**inglés**](https://t.me/The3DWorkChannel).

Os recordamos que tienes mas guias de ayuda en **nuestro bot de Telegram** [**@ThreeDWorkHelpBot**](https://t.me/ThreeDWorkHelpBot)

## Prepara tu propio Marlin para poder personalizarlo

Con esta guía os vamos a facilitar los pasos para poder generar vuestro propio Marlin base para impresoras comerciales o que Marlin disponga de vuestro preconfigurado... aunque podéis usarlo bajando la última version estable desde el repositorio de Marlin y personalizarlo a mano aunque normalmente es aconsejable partir de un preconfigurado de una máquina similar.

Tenemos varias opciones para obtener o generar nuestro firmware Marlin:

* [**Firmware precompilado oficial — MarlinBuilds**](#firmware-precompilado-oficial-marlinbuilds): el propio equipo de Marlin publica binarios compilados para más de 80 marcas basados en sus preconfigurados oficiales. La opción más rápida si tu máquina está entre las soportadas.
* [**Usando nuestro Auto Builder Marlin usando fuentes y pre-configurados de Marlin**](#procedimiento-automatico-3dwork-usando-fuentes-y-pre-configuraciones-de-marlin), en este caso el soporte a las máquinas que generamos el firmware es limitado... revisa si la tuya está incluida.
* [**Usando directamente las fuentes y pre-configurados de Marlin desde su Github**](#procedimiento-manual-usando-fuentes-y-pre-configuraciones-de-marlin), el método más flexible; también aplica si tu fabricante dispone de un fork personalizado

### Algunos consejos antes de comenzar

* Si vas a actualizar una impresora y no tienes los ficheros de Marlin originales y has hecho cambios en la configuración de la pantalla <mark style="color:green;">**te aconsejamos hacer un M503 desde un cliente de terminal como Pronterface y guardarte la información que devuelve ya que son los valores de la EEPROM muy útiles a ajustar en tu nuevo firmware**</mark>
* **Recuerda que es aconsejable después de subir el firmware cargar los valores de fábrica de la EEPROM, esto lo puedes hacer por terminal con un M502 y seguido un M500 o desde la pantalla en modo Marlin en Configuración/Restaurar y seguido Configuración/Salvar EEPROM... además del M503 con el que podrás listar los valores de tu EEPROM para asegurarte que son correctos.**

{% hint style="info" %}
Entender como Marlin utiliza su RAM y/o EEPROM de la electrónica de tu impresora para guardar ciertas configuraciones puede llegar a ser algo confuso al inicio y si no lo hacemos correctamente puede ocasionar problemas al perder ciertos ajustes al reiniciar nuestra máquina.

**Marlin utiliza** lo que llamamos **EEPROM**, **que puede estar en un chip de memoria dedicado o integrada en una zona reservada por Marlin en la propia ROM de la electrónica**... siendo estas las más aconsejables/comunes también contamos con la opción de guardar nuestra EEPROM en la SD de nuestra electrónica donde crea un eeprom.dat (depende de la versión de Marlin este nombre puede variar).

En esta **EEPROM Marlin guarda valores de configuración que suelen ser ajustables por el usuario**, esto permite un ajuste más sencillo sin requerir tener que ajustar estos valores en las fuentes de Marlin, compilar y aplicar el nuevo firmware a nuestra máquina.

**Al arrancar Marlin lo que hace es cargar los valores guardados en la EEPROM (memoria no volátil) a la RAM (que es una memoria volátil) para poderlos usar, consultar y ajustar durante nuestras impresiones, al apagar la máquina esta RAM se borra para realizar el proceso de carga de valores de la EEPROM al arrancar de nuevo Marlin.**

A continuación os explicaremos algunos gcodes que vamos a disponer para gestionar esta EEPROM, cuando la tengamos activa activando [*EEPROM\_SETTINGS*](https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.1.x/Marlin/Configuration.h#L2261), y como usarlos en cada caso:

* **M500 (Save Settings)**\
  El gcode [**M500 (Save Settings)**](https://marlinfw.org/docs/gcode/M500.html) guarda la configuración que tangamos activa en nuestra RAM a la EEPROM para que los cambios realizados no se pierdan al apagar la máquina.\
  También podemos lanzar este comando desde la pantalla modo emulación Marlin con **Store Settings** o en pantállas táctiles suelen contar con opciones para realizar el proceso también.\
  ![marlin m500](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_411,h_88/https://www.3dprintgorilla.com/wp-content/uploads/marlin-m500.png)

* **M501 (Restore Settings)**\
  El gcode [**M501 (Restore Settings)**](https://marlinfw.org/docs/gcode/M501.html) carga los valores de nuestra EEPROM sobre nuestra RAM, básicamente realiza el proceso contrario que **M500**. Normalmente el uso normal del M501 es para deshacer ajustes realizados en nuestra RAM y que no fueron aplicados a nuestra EEPROM.\
  También desde la pantalla modo emulación Marlin disponemos de la opción **Load Settings** con la que ejecutaremos el M501.\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FNtiFahGKKzKMQ6y1NsUC%2Fimage.png?alt=media\&token=c71f2617-9c1e-4d84-936e-0e400b842e16)

* **M502 (Factory Reset)**\
  Con [**M502 (Factory Reset)**](https://marlinfw.org/docs/gcode/M502.html) cargaremos las configuraciones incluídas en el firmware, no en la EEPROM, en nuestra RAM asegurándonos que volvemos a los valores originales de nuestro firmware.\
  Suele ser aconsejable realizar un M502, seguido de un M500, cada vez que apliquemos una nueva versión de firmware a nuestra máquina ya que de esta forma cargamos los valores del nuevo firmware reseteando cualquier resto de configuraciones que tuviéramos del anterior en nuestra EEPROM. Es importante decir que en últimas versiones de Marlin, en el caso de detectar cambios significativos en la estructura de la EEPROM con respecto a nuevo firmware, ya nos va a sugerir por pantalla que realicemos este Reset de la EEPROM.![marlin m502](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_468,h_60/https://www.3dprintgorilla.com/wp-content/uploads/marlin-m502.png)

* **M503 (Report Settings)**\
  El gcode [**M503 (Report Settings)**](https://marlinfw.org/docs/gcode/M503.html) nos va a permitir mostrar los valores de nuestra RAM por la consola serial (Pronterface por ejemplo) lo cual es algo extremadamente útil para verificar que valores está usando nuestra máquina verdaderamente.\
  En versiones actuales de Marlin contamos con una función llamada [CONFIGURATION\_EMBEDDING](https://github.com/MarlinFirmware/Marlin/blob/b1f45b384b2e472219ca055050ebd2182eea045d/Marlin/Configuration_adv.h#L1726) que nos permitirá añadir el parámetro C a nuestro M503 y que nos deje un fichero zip en nuestra SD, siempre que sea posible, con los valores de nuestra RAM en formato texto.\
  ![marlin m503](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_566,h_355/https://www.3dprintgorilla.com/wp-content/uploads/marlin-m503.png)

* **M504 (Validate EEPROM)**\
  Por último contamos con [**M504 (Validate EEPROM)**](https://marlinfw.org/docs/gcode/M504.html) que nos va a vaidar que el formato/estructura de EEPROM es correcta para la versión de nuestro firmware, dado que en el caso que no lo fuera nuestra firmware podría no arrancar correctamente en determinadas circunstancias.\
  ![marlin m504](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_167,h_46/https://www.3dprintgorilla.com/wp-content/uploads/marlin-m504.png)
  {% endhint %}

* Las placas actuales se genera un firmware.bin que se pone en la SD, en estos casos si el proceso de actualización se hizo de forma correcta este fichero queda renombrado a .CUR. Así que para comprobar si el proceso fué de forma correcta extrae la SD después de realizar el proceso de actualización y comprueba desde tu ordenador que el .BIN cambió a .CUR

* Otras placas, normalmente antiguas de 8b, se "quema" directamente el nuevo firmware en la placa con lo que es necesario tenerlas conectadas por USB. En algunos casos puede dar problemas al programarla por USB por lo que puedes ir a la ubicación donde dejó el binario compilado... en estos casos es un fichero .hex normalmente... y subirlo desde otras herramientas especificas para tu impresora, los slicers/fileteadores como PrusaSlicer o Cura pueden realizar este paso de forma bastante sencilla también

## Firmware precompilado oficial — MarlinBuilds

El equipo de Marlin publica desde 2024 binarios precompilados para la gran mayoría de impresoras comerciales en el repositorio oficial **MarlinBuilds**. Estos binarios se generan directamente a partir de los preconfigurados del repositorio Configurations, garantizando que coinciden 100% con la configuración oficial de cada máquina.

{% hint style="success" %}
Si tu impresora está entre las soportadas, **esta es la opción más rápida**: descarga el binario, cópialo en la SD y listo. No necesitas compilar nada.
{% endhint %}

**Repositorio oficial:**

{% embed url="<https://github.com/MarlinFirmware/MarlinBuilds>" %}

### ¿Qué máquinas están soportadas?

Más de 80 marcas y cientos de modelos, entre ellos:

* **Creality**: Ender-3, Ender-3 Pro, Ender-3 V2, Ender-3 S1, CR-10, CR-10 V2/V3, CR-6 SE...
* **Prusa**: i3 MK2/MK3, Mini
* **Elegoo**: Neptune series
* **Artillery**: Sidewinder X1/X2, Genius Pro
* **Sovol**, **Tevo**, **Geeetech**, **Two Trees**, **Qidi**, **Kingroon** y muchas más

Para encontrar tu máquina navega por la carpeta `builds/` → carpeta de tu marca → carpeta de tu modelo → descarga el `.bin` o `.hex` apropiado para tu electrónica.

{% hint style="warning" %}
Los binarios de MarlinBuilds están generados con los **preconfigurados sin modificar** de Marlin. Si has hecho modificaciones en tu máquina (sensor ABL diferente, driver distinto, etc.) necesitarás compilar tu propio firmware con esos cambios.
{% endhint %}

### ¿Cómo identificar el binario correcto?

Dentro de la carpeta de cada modelo encontrarás subcarpetas con variantes según la electrónica o los sensores instalados. Ejemplo para una Ender-3 V2:

```
builds/Creality/Ender-3 V2/
├── CrealityV422/         → placa stock Creality 4.2.2
├── CrealityV427/         → placa stock Creality 4.2.7
├── CrealityV427-BLTouch/ → placa 4.2.7 + BLTouch
└── ...
```

Descarga el `.bin` de la carpeta que se ajuste a tu configuración, cópialo en la SD y aplícalo igual que cualquier otro firmware Marlin.

***

### Procedimiento automático 3Dwork usando fuentes y pre-configuraciones de Marlin

Hemos desarrollado una automatización que compila de forma automática el firmware Marlin para más de **100 fabricantes** y **421 combinaciones** de impresoras y electrónicas, usando las fuentes y preconfigurados oficiales de Marlin.

{% hint style="success" %}
Puedes consultar el listado completo de máquinas soportadas, con enlace de descarga directo para cada combinación, en nuestro documento de estado de compilación:

[**BUILD\_STATUS — Listado completo de firmwares compilados por 3Dwork**](https://github.com/3dwork-io/marlin_auto_builder_3dwork/blob/master/BUILD_STATUS.md)

Los firmwares están disponibles en dos idiomas: **inglés (EN)** y **español (ES)**. En el documento encontraréis un enlace de descarga independiente para cada versión e idioma.
{% endhint %}

Si estáis interesados en que añadamos más máquinas podéis contactar por nuestro [**grupo Telegram 3Dwork en español**](https://t.me/trastornados) e [**inglés**](https://t.me/The3DWorkChannel).

{% hint style="info" %}
En las siguientes pestañas podéis encontrar el listado de marcas y modelos soportados:

* **Modelo**, podréis ver el modelo de impresora y la electrónica usada
* **Firmware**, un link a la descarga del firmware compilado
* **Config**, un link a los ficheros de configuración usados para generar el firmware que podéis utilizar para personalizarlos vosotros mismos y generar vuestros propio firmware
* **default\_env**, el default\_env a poner en el fichero platformio.ini
  {% endhint %}

{% hint style="danger" %} <mark style="color:red;">**IMPORTANTE!!!**</mark>

Los firmwares compilados a continuación están hechos en base a las fuentes y pre-configurados de Marlin oficial.

<mark style="color:red;">**En cualquier caso no nos hacemos responsables de ningún problema relacionados con los mismos, es tu responsabilidad usarlos y aplicarlos.**</mark>
{% endhint %}

{% embed url="<https://gist.github.com/alienboyxp/07b5a603f9becbe484182f8c5dc25b52>" fullWidth="true" %}

### Procedimiento manual usando fuentes y pre-configuraciones de Marlin

* Desde tu navegador favorito ves al GitHub oficial de Marlin: <https://github.com/MarlinFirmware/Marlin>

{% hint style="success" %}
Si queréis conocer las novedades, contenido o problemas corregidos de las diferentes versiones de Marlin lo podéis hacer desde el siguiente link:

<https://github.com/MarlinFirmware/Marlin/releases>
{% endhint %}

* Una vez en la página descarga el código de Marlin de la siguiente forma:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MYQ5AfTk3UijHesJo2E%2F-MYdE0nsnUpMAxYuDlfw%2Fimage.png?alt=media\&token=abf6d7f7-d21a-42a2-a38b-54aa4ddbd8d0)

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MYQ5AfTk3UijHesJo2E%2F-MYdESmXI3b_s_rQOaFn%2Fimage.png?alt=media\&token=19a676e4-7256-4d0c-a0b1-132c83803dff)

{% hint style="info" %}
También puedes ir directamente a la página de descargas de Marlin:

<https://marlinfw.org/meta/download/>

Es importante conocer las diferentes versiones disponibles (a abril 2026):

{% hint style="success" %}
**Recomendación**: usa siempre la versión **release estable** (actualmente 2.1.2.7) y sus preconfigurados de la rama `release-2.1.2.7` del repositorio Configurations. Los preconfigurados deben coincidir con la versión de Marlin.
{% endhint %}
{% endhint %}

| Versión          | Tipo                                                        | Descripción                                                                     |
| ---------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
| **2.1.2.7**      | <mark style="color:green;">**Release estable**</mark>       | Versión estable actual recomendada para producción                              |
| **2.1.x**        | <mark style="color:orange;">**Release con hotfixes**</mark> | Rama 2.1 con correcciones sobre la estable; puede tener daños colaterales       |
| **2.1.3-b3**     | <mark style="color:blue;">**Beta pública**</mark>           | Actualización mayor en pruebas públicas; **no usar en producción**              |
| **bugfix-2.1.x** | <mark style="color:red;">**Bugfix de desarrollo**</mark>    | Para testear correcciones puntuales; evitar salvo que corrija un fallo concreto |

* El siguiente paso, si tenemos una impresora comercial, descargaremos los pre-configurados de configuración desde <https://github.com/MarlinFirmware/Configurations> y siguiendo el mismo proceso que el explicado en el punto anterior

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MYQ5AfTk3UijHesJo2E%2F-MYdEsuCQfMcATh4hoB0%2Fimage.png?alt=media\&token=13a98a4b-f859-4854-9127-1432e5aa9226)

> **IMPORTANTE!!!** Recuerda bajar la version de preconfiguraciones que concuerde con la versión de Marlin descargada con **release** en su nombre. Como referencia existen las siguientes ramas en los preconfigurados:\
> \- **release** : son las versiones que se usan con las versiones estables de Marlin que compiles\
> \- **bugfix** : en el caso que uses un Marlin bugfix, normalmente no aconsejable, deberás usar los preconfigurados de esta rama\
> \- **import** : esta rama no es aconsejable ya que están integrados cambios que no estan ligados con versiones de Marlin directamente y pueden contener configuraciones erroneas o problemáticas

Ahora y dispones de los archivos de Marlin en tu ordenador deberemos de descomprimirlos.

> **Importante!!!**\
> **Idealmente no dejar la carpeta con tu Marlin dentro de muchas carpetas anidadas ni con símbolos o acentos en los nombres de las mismas ya que pueden provocar errores en la compilación.**

#### Combinaremos Marlin estable con el preconfigurado de nuestra máquina

* Abrimos el explorador de archivos de Windows y accedemos a la carpeta donde hemos descargado y descomprimido el repositorio de Marlin .
* Una vez ahí, abriremos otro explorador de ficheros con el contenido del repositorio de pre-configuraciones
* Encontraremos dos ficheros de pre-configuración de Marlin para nuestra impresora, en la imagen de ejemplo usaremos una Ender 3 con las pre-configuraciones para una placa SKR MINI v2 (la carpeta a buscar sería lo indicado en el cuadro azul de la siguiente captura):

![](https://telegra.ph/file/cd0495eb5684364f721f5.png)

* Copiamos los archivos del interior de la carpeta de nuestro pre-configurado (cuadro rojo de la captura anterior y los pegaremos (substituyendo los existentes) en la carpeta «...\Marlin» donde dejamos descomprimido el repositorio de Marlin

Con esto ya tenemos nuestro Marlin listo para compilar!!!

## Instalación de software necesario para la edición y compilación de Marlin

El siguiente paso es instalar el software necesario, para ello descargue e instale los siguientes programas:

* **Python**: <https://www.python.org/downloads/> ***también puedes descargarlo desde la Store de Apps de Windows, que en algunos casos realiza una instalación más correcta***

{% hint style="info" %}
Durante la instalación asegúrate de seleccionar la casilla "**Add Python x.x to PATH"**
{% endhint %}

* **Git**: <https://git-scm.com/>
* **Visual Studio Code**: <https://code.visualstudio.com/> — A pesar de que parezca que Python y Git no se usan directamente, son requerimientos de Visual Studio Code para este tutorial.

{% hint style="info" %}
Algo muy importante: deja marcada la casilla «**Agregar a PATH**» en el cuadro de diálogo de **Tareas Adicionales** durante la instalación de Git y Python.
{% endhint %}

* Una vez instalados, debemos instalar dos extensiones en Visual Studio Code:

### Extensiones imprescindibles para VSCode

**1. PlatformIO** — el compilador

* Presiona el icono de extensiones del menú izquierdo (cuadros)
* Busca «PlatformIO»
* Pulsa instalar

![](https://wiki.eurek.org/wp-content/uploads/2019/12/image-18-1024x769.png)

**2. Auto Build Marlin** — compila con un solo clic

La extensión oficial del equipo de Marlin para VSCode. Detecta automáticamente la placa (`MOTHERBOARD`) definida en tu `Configuration.h` y muestra los entornos disponibles para compilar. Ya no necesitas editar `platformio.ini` manualmente para cambiar el `default_envs`.

* Busca «Auto Build Marlin» en el marketplace de extensiones de VSCode
* Instala la extensión de **MarlinFirmware**

{% embed url="<https://marketplace.visualstudio.com/items?itemName=MarlinFirmware.auto-build>" %}

{% hint style="info" %}
**Novedades de Auto Build Marlin:**

* **Configuration Editor (alpha)**: editor visual para `Configuration.h` y `Configuration_adv.h`. Haz click derecho sobre cualquiera de los dos ficheros y elige **Open With… → Config Editor** para buscar y activar opciones sin tocar el código directamente.
* **Detección automática de entornos**: muestra solo los entornos compatibles con tu `MOTHERBOARD`.
* Botones directos: **Build**, **Upload**, **Clean**, **Debug** desde el panel lateral.
  {% endhint %}

{% hint style="info" %}
**Posibles soluciones a problemas en la instalación de la extensión Platformio:**

* **Instala Python antes**, tal como se sugiere en esta guía, desde su web o la App Store de Windows
* **Ejecuta VSC como administrador**, al menos durante la instalación de las extensiones necesarias, así evitaras que en determinadas configuraciones de Windows ciertas acciones esten restringidas o bloqueadas
* Ves a "**Aplicaciones y características**" en caso de Windows, eligiremos la opción de "**Alias de ejecución de aplicaciones**" **desactivando el instalador de aplicaciones python.exe y python3.exe.** Una vez realizado este paso reiniciaremos VSC y volveremos a intentar la instalación.
* **Asegúrate que tú antivirus/firewall no está bloqueando** el proceso de VSC/instalación Platformio ya que partes del proceso requieren descargar módulos desde Internet.
* Si no ha funcionado... empieza de cero y en el orden correcto de instalación:
  * **Desinsta completamente VSC** y cualquier otro componente relacionado que instalaste
  * **Lanzar un limpiador de registro** como [CCleaner](https://www.ccleaner.com/es-es/ccleaner/download), [PrivaZer](https://privazer.com/en/version-difference.php) o similar, eliminando cualquier referencia a aplicaciones que no sean necesarias
  * **Borrar cualquier directorio que quede** relacionado con estas tareas de compilado de Marlin
  * **Instalar todo de cero** siguiendo los pasos de la guía de esta guía
    {% endhint %}

![Ejemplo de error en la instalación de Platformio](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MdT6AFcht1w2AHbbkc3%2F-MdT6VR65zOyYXCNXRdT%2Fimage.png?alt=media\&token=430697e0-ce08-4ca0-9821-15f376ab2420)

{% hint style="info" %}
Comprobaciones para verificar que Python esta correctamente instalado (**depende de version de Python instalada y de sistema operativo**) ya que es una parte fundamental tanto de la instalación de Platformio y para que funcione:

* Ejecutar desde una linea de comandos (tecla **Windows + R -> `cmd.exe`**`)`
  * **echo %PATH%** - esto deberia retornar un listado de directorios donde uno de ellos debería de ser el de Python y hay que asegurarse que apunte a la versión compatible con nuestra versión de Platformio... ejemplo, el path muestra una version 2.5 y nuestro Platformio necesita Python 3.6+
  * **echo %PYTHONPATH%** - al igual que el anterior deberia retornar el path de Python
  * python --version - en el caso que este correcto lo anterior debería retornar la version de nuestro Python instalado
  * **pip --version** - pip es un instalador de paquetes de Python y también puede ser necesario para algunas acciones
    {% endhint %}

{% hint style="info" %}
**Lista de alternativas si no es posible hacer funcionar VSC+Platformio**:

* [Usar Sublime en lugar de VSC](https://marlinfw.org/docs/basics/install_platformio_sublime.html)
* [Usar cualquier editor de textos y lanzar Platformio desde linea de comandos](https://marlinfw.org/docs/basics/install_platformio_cli.html)
* [Usar Atom en lugar de VSC](https://marlinfw.org/docs/basics/install_platformio_atom.html)
  {% endhint %}

## Compilando nuestro Marlin

Una vez tenemos nuestro Marlin a nivel de ficheros y el software necesario instalado correctamente toca compilarlo para poder generar el fichero a usar en nuestras impresoras:

* Una vez realizado este paso, **abrimos Visual Studio Code**, presionamos sobre el **icono con dos documentos del menú izquierdo**, y a continuación sobre le botón azul de **«Agregar carpeta»**

![](https://wiki.eurek.org/wp-content/uploads/2019/12/image-20.png)

* Buscamos la **ubicación donde tenemos nuestro repositorio Marlin** y presionamos **Agregar**:

![](https://wiki.eurek.org/wp-content/uploads/2019/12/image-22.png)

{% hint style="info" %}
Os aconsejamos no tener la carpeta con vuestras fuentes de Marlin en muchos directorios anidados ya que esto puede provocar algunos problemas.

Lo ideal es tenerlo en la raíz de cualquiera de vuestras unidades, ej. C:/Marlin
{% endhint %}

* En Visual Studio Code, **seleccionamos el archivo plaformio.ini** del área de trabajo de Marlin que acabamos de añadir.
* **Editamos la fila de «default\_envs» y sustituimos » megaatmega2560 » por el adecuado para nuestra placa/impresora**, haciendo scroll en este documento encontraras diversas placas, encuentra la tuya y substituye «megaatmega2560» por tu placa en caso de que sea necesario

![](https://wiki.eurek.org/wp-content/uploads/2019/12/image-23-1024x770.png)

{% hint style="info" %}
Otro truco para encontrar cual es nuestro default\_envs si solo conocemos la placa que tenemos que poder en MOTHERBOARD dentro de /Marlin/configuration.h es ir al fichero pins de Marlin (Marlin/Marlin/src/pins/[**pins.h**](https://github.com/MarlinFirmware/Marlin/blob/2.1.x/Marlin/src/pins/pins.h)) donde buscaremos por nuestro MOTHERBOARD y en la parte final de la linea encontraremos esa información:

<img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FWPQnoNreVfKvO50fQb6B%2Fimage.png?alt=media&amp;token=b32b2cc0-a7b2-4f80-80b1-7a3fc35a0873" alt="" data-size="line">

En la captura anterior podéis ver un ejemplo para una SKR MINI V3 donde:

1. encontraréis los **valores a poner en vuestro platformio.ini** en ocasiones podéis encontrar varios, normalmente usar el primero
2. **hace referencia a la carpeta donde se encuentra el fichero pins de nuestra electrónica** en el caso que tengamos que averiguar el ID de un pin o cambiar el rol a alguno
   {% endhint %}

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FWPQnoNreVfKvO50fQb6B%2Fimage.png?alt=media&amp;token=b32b2cc0-a7b2-4f80-80b1-7a3fc35a0873" alt=""><figcaption></figcaption></figure>

* A continuación si queremos hacer cambios en la configuración básica de nuestra impresora, ya sea por que le hemos hecho una modificación o para mejorar algún ajuste, desplegamos la carpeta Marlin y nos aparecerán los dos archivos de configuración. Podeis encontrar información de opciones básicas de Marlin en el siguiente [**link**](https://marlinfw.org/docs/configuration/configuration.html) de su documentación o explicado de una forma más "sencilla" en [**nuestra guía de Marlin**](https://3dwork.io/configurar-marlin-2-0-x-desde-cero/).

![](https://wiki.eurek.org/wp-content/uploads/2019/12/image-24.png)

### Cambiar el idioma del firmware

Marlin soporta más de 30 idiomas para los menús de la pantalla LCD. El idioma se configura en `Marlin/Configuration.h` mediante la directiva `LCD_LANGUAGE` antes de compilar.

#### Configurar el idioma principal

Busca esta línea en `Configuration.h` y cambia el código de idioma:

```cpp
#define LCD_LANGUAGE es
```

Códigos de idioma más usados:

| Código  | Idioma               |
| ------- | -------------------- |
| `en`    | Inglés (por defecto) |
| `es`    | Español              |
| `de`    | Alemán               |
| `fr`    | Francés              |
| `it`    | Italiano             |
| `pt`    | Portugués            |
| `pt_br` | Portugués (Brasil)   |
| `ru`    | Ruso                 |
| `pl`    | Polaco               |

Consulta la lista completa en la [documentación oficial de LCD Language](https://marlinfw.org/docs/development/lcd_language.html).

{% hint style="info" %}
**Pantallas de caracteres HD44780** (las LCD azules/verdes más comunes): para que se muestren correctamente los caracteres acentuados del español (á, é, ó, ú, ñ…) es necesario también definir el charset adecuado:

```cpp
#define DISPLAY_CHARSET_HD44780 WESTERN
```

Los valores disponibles son `JAPANESE` (más común en pantallas asiáticas), `WESTERN` (acentos europeos) y `CYRILLIC` (cirílico/ruso). Si no sabes cuál tiene tu pantalla, compila con `LCD_LANGUAGE test` para identificarlo.
{% endhint %}

#### Habilitar varios idiomas simultáneos (pantallas gráficas)

En pantallas gráficas con suficiente memoria (128×64 DOGLCD, pantallas táctiles TFT con emulación Marlin) es posible compilar el firmware con **varios idiomas y cambiar entre ellos en caliente** sin recompilar, mediante el comando G-code `M414`.

Para activarlo, define los idiomas adicionales en `Configuration.h`:

```cpp
#define LCD_LANGUAGE   es   // idioma principal — español
#define LCD_LANGUAGE_2 en   // segundo idioma — inglés
#define LCD_LANGUAGE_3 de   // tercer idioma — alemán (opcional)
```

Una vez instalado el firmware, cambia de idioma desde la consola serie o desde un script de inicio:

```gcode
M414 S0   ; idioma 1 → español  (LCD_LANGUAGE)
M414 S1   ; idioma 2 → inglés   (LCD_LANGUAGE_2)
M414 S2   ; idioma 3 → alemán   (LCD_LANGUAGE_3)
```

{% hint style="warning" %}
La función multi-idioma **no está disponible en pantallas de caracteres HD44780** (LCD básicas de 20×4 o 16×2) por limitaciones de memoria del controlador. Funciona principalmente con pantallas gráficas 128×64 (RepRapDiscount Full Graphic, DOGLCD) y pantallas TFT con modo emulación Marlin activado.

Si tu pantalla no soporta múltiples idiomas, simplemente define solo `LCD_LANGUAGE` con el idioma deseado y recompila.
{% endhint %}

* Una vez realizados los ajustes deseados, compilamos de una de estas dos formas:
  * **Con Auto Build Marlin** (recomendado): haz clic en el icono ABM de la barra lateral → panel Auto Build → botón **Build**. Detectará automáticamente tu placa y el entorno correcto.
  * **Con PlatformIO directamente**: botón de compilar (check ✓) en la barra azul inferior izquierda de VSCode.

![](https://wiki.eurek.org/wp-content/uploads/2019/12/image-25.png)

{% hint style="info" %}
Para errores del tipo "IncludePath"/ faltas de librerias se aconseja borrar la cache:

* borrar la carpeta **.pio**
* borrar la carpeta **.vscode**
* hacer **click en el icono de papelera (Clean)** de la barra azul de Platformio
* Del menú de Platformio lanzar un **Rebuild IntelliSense Index o el icono de basura de la barra inferior azul del VSC**

Si no funciona lo ideal es desinstalar y reinstalar las extensiones C++ y Platformio
{% endhint %}

* Cuando ya esté compilado el código, vamos a **la carpeta: «...\Marlin\\.pio\build\xxxx» donde encostraremos un fichero llamado «firmware.bin» o similar dependiendo de las características que necesite nuestra electrónica**.

{% hint style="warning" %}
En el caso de ejemplo se describe el proceso para una placa de 32b en las cuales es suficiente copiar el fichero generado en la tarjeta SD de nuestra impresora.

Para impresoras más antiguas el fichero generado suele ser un .hex el cual con la impresora conectada por USB podemos directamente subir desde VSC o usar PrusaSlicer o Cura para actualizar nuestra impresora.

Recuerda que es posible que VSC no lo haga directamente en el caso que no instales los drivers de tu placa y sea capaz de detectar correctamente el COM que se crea o tengas por ejemplo Cura abierto
{% endhint %}

* Copiamos este fichero en una tarjeta SD vacía en el directorio raíz o seguiremos el proceso adecuado para nuestra electrónica.
* Extraemos la SD del ordenador
* Apagamos la impresora (Desconectamos el USB y la alimentación si están ambos conectados)
* Esperamos unos 30 segundos
* Colocamos la tarjeta SD con el nuevo Firmware
* Encendemos la Impresora, tras unos segundos, veremos como esta instalando el nuevo firmware, poco después, y se iniciara con nuestro nuevo Marlin instalado.

## Actualizando nuestro Marlin a una nueva versión

Muchos usuarios ven muy complicado el proceso de actualización de la versión última cocinada por ellos a una nueva, a continuación os damos algunos consejos de como realizar el proceso para que sea más sencillo.

* Descargar la nueva versión de Marlin, tal como os indicabamos [aquí](#procedimiento-manual-usando-marlin-ultima-version-estable) descargaremos la nueva versión de Marlin ya sea desde el [**enlace release de su documentación**](https://marlinfw.org/meta/download/) o desde su [**Github**](https://github.com/MarlinFirmware/Marlin/).

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FrffdBUbLeWs7bre2Q6gB%2Fimage.png?alt=media&amp;token=1e60fc0d-e8dd-4b5a-88b9-9a058f1567d3" alt=""><figcaption><p>Descargar Marlin desde documentación</p></figcaption></figure>

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FzigAGeydoF8K13THDOsR%2Fimage.png?alt=media&amp;token=be9b2da0-cbed-4d80-be1f-09cf90f73806" alt=""><figcaption><p>Descargar Marlin desde su Github, es importante seleccionar la rama adecuada en la esquina superior izquierda.</p></figcaption></figure>

* Una vez descargado y descomprimido añadiremos esa carpeta a nuestro proyecto en VSC junto con la antigua versión

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FOJ73XffSUHSxVDcgmRSJ%2Fimage.png?alt=media&amp;token=45a1e568-2ca1-446c-9eb8-07dca119aedd" alt=""><figcaption></figcaption></figure>

* Ahora que tenemos ambos directorios en nuestro proyecto tan solo tendremos que usar la herramienta de comparacion que lleva incluida VSC para comparar los ficheros de configuración de Marlin
  * **platformio.ini**, es el fichero donde básicamente encontraremos el **env** de nuestra electrónica
  * **Marlin/configuration.h**, fichero donde normalmente habilitaremos las funciones y configuración de la impresora/electrónica/extensiones
  * **Marlin/configuration\_adv.h**, similar al anterior pero donde encontraremos ciertas funciones avanzadas
* Para comparar dos ficheros y desde el panel lateral donde se muestra la estructura de ficheros y carpetas de nuestro proyecto (Explorer) sobre el fichero a comparar de nuestra antigua versión pulsaremos **Select for Compare** del menú que aparece al hacer click derecho sobre el

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FsQsJII4bfGqBfOavzwtj%2Fimage.png?alt=media&amp;token=d9d94a03-e0b8-44a8-aa06-5fe4b4cf45f1" alt=""><figcaption></figcaption></figure>

* A continuación haremos lo mismo pero con el fichero de nuestra nueva versión pero en este caso seleccionaremos la opción **Compare with Selected** y nos aparecerá una nueva pantalla con la comparación entre ellos
  * En la parte superior marcada en la captura siguiente veremos el nombre y carpeta de los ficheros a comparar
  * En la parte central vemos como marca los cambios, en el primer bloque indica en rojo las partes que no incluye el destino (rojo), el central donde indica cambios en ambos sitios y la que normalmente usaremos para detectar ajustes (rojo/verde) y la parte inferior (verde) donde encontrarás lo que se encuentra en el nuevo y no en el antiguo

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FdtPPoIg8vfQ2ycpo5b5I%2Fimage.png?alt=media&amp;token=f9dc67a7-f11a-4d92-b040-2fdee57e0171" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

* podéis invertir el orden de selección de ficheros si el código de colores os es más amigable

* os aconsejamos que siempre se añadan comentarios, con // al final de las lineas que modifiqueis ya que os sera mas sencillo identificar cambios

* en ocasiones puede que funciones cambien de sitio o nombre asi como el formato de valores, aqui tan solo es fijarse y leer los comentarios del propio codigo
  {% endhint %}

* Una vez ajustados todos los cambios solamente toca [**cargar el nuevo proyecto en Platformio**](#compilando-nuestro-marlin) como os explicamos al inicio de la guia y [**compilar**](#compilando-nuestro-marlin) ajustando cualquier error que nos aparezca ya que normalmente los errores suelen ser bastante descriptivos.

## Opciones imprescindibles conocer en Marlin

{% embed url="<https://3dwork.io/configurar-marlin-2-0-x-desde-cero/>" %}


# Marlin - Gcodes Básicos

Los G-codes son el lenguaje que habla tu impresora. Conocer los más importantes te da control total sobre cada aspecto de la máquina.

G-code es el lenguaje de programación CNC que usa tu impresora para comunicarse: movimientos, temperaturas, ventiladores, calibración y mucho más se controlan con estos comandos.

Puedes enviarlos desde Pronterface, OctoPrint, la pantalla LCD o incluirlos en los scripts de inicio/fin de tu laminador.

{% hint style="info" %}
**Referencia completa oficial**: [marlinfw.org/meta/gcode](https://marlinfw.org/meta/gcode/) — aquí tienes los más utilizados en el día a día.
{% endhint %}

## Sintaxis básica

Cada línea es un comando. La estructura es:

```
[Letra][Número] [Parámetros] ; comentario opcional
```

Ejemplos:

```gcode
G1 X90 Y50 Z0.5 F3000 E1  ; mover a X90 Y50 Z0.5 extruindo 1mm
M104 S200                  ; temperatura extrusor a 200°C sin esperar
M109 S200                  ; temperatura extrusor a 200°C esperando
```

## Movimiento

### G0 / G1 — Movimiento lineal

`G0` es movimiento rápido (sin extrusión), `G1` es movimiento con extrusión.

```gcode
G0 X50 Y50 F6000           ; mover a X50 Y50 a 6000mm/min (sin extruir)
G1 X90 Y50 Z0.5 F3000 E1   ; mover extruindo 1mm de filamento
```

| Parámetro | Descripción                          |
| --------- | ------------------------------------ |
| `X Y Z`   | Coordenadas destino (mm)             |
| `F`       | Velocidad (feedrate) en mm/min       |
| `E`       | Cantidad de filamento a extruir (mm) |

### G2 / G3 — Movimiento en arco

Movimiento circular en sentido horario (G2) o antihorario (G3). Útil con ARC\_SUPPORT habilitado.

```gcode
G2 X10 Y10 I5 J5           ; arco horario
G3 X10 Y10 I5 J5           ; arco antihorario
```

### G4 — Pausa (Dwell)

Pausa la ejecución durante un tiempo definido.

```gcode
G4 S2    ; pausar 2 segundos
G4 P500  ; pausar 500 milisegundos
```

### G28 — Homing (Auto-home)

Lleva los ejes a su posición de origen activando los finales de carrera.

```gcode
G28       ; home todos los ejes
G28 X Y   ; home solo X e Y
G28 Z     ; home solo Z
```

### G29 — Nivelación automática de cama

Ejecuta el proceso de nivelación según el sistema configurado (Bilinear, UBL, etc.).

```gcode
G29       ; nivelación estándar
G29 P1    ; UBL: fase 1 (generar malla)
G29 S1    ; UBL: cargar malla 1 desde EEPROM
```

### G92 — Establecer posición actual

Define las coordenadas actuales sin mover los ejes. Muy útil para el eje E.

```gcode
G92 E0    ; resetear contador de extrusión a 0
G92 X0 Y0 ; definir posición actual como X0 Y0
```

## Temperatura

### M104 / M109 — Temperatura extrusor

`M104` establece la temperatura sin esperar. `M109` espera a que se alcance.

```gcode
M104 S200        ; calentar extrusor a 200°C (sin esperar)
M109 S200        ; calentar extrusor a 200°C (esperar)
M104 T1 S200     ; temperatura extrusor 2 (impresoras multi-extrusor)
```

### M140 / M190 — Temperatura cama

`M140` establece la temperatura sin esperar. `M190` espera.

```gcode
M140 S60         ; calentar cama a 60°C (sin esperar)
M190 S60         ; calentar cama a 60°C (esperar)
```

### M106 / M107 — Control de ventiladores

```gcode
M106 S255        ; ventilador de capa al 100%
M106 S128        ; ventilador de capa al 50%
M107             ; apagar ventilador de capa
M106 P1 S255     ; ventilador índice 1 al 100%
```

### M155 — Reporte de temperatura automático

```gcode
M155 S2          ; reportar temperaturas cada 2 segundos
M155 S0          ; detener reportes automáticos
```

## Extrusión

### M82 / M83 — Modo absoluto / relativo de extrusión

```gcode
M82    ; modo absoluto para el extrusor (por defecto en Marlin)
M83    ; modo relativo para el extrusor
```

### M600 — Cambio de filamento

Ejecuta el asistente de cambio de filamento (requiere `ADVANCED_PAUSE_FEATURE`).

```gcode
M600           ; cambio de filamento con valores por defecto
M600 E-50      ; retracción de 50mm antes de aparcar
M600 X10 Y10   ; aparcar en X10 Y10 durante el cambio
```

{% hint style="info" %}
M600 es el gcode estándar que insertan los laminadores para cambios de color/filamento en capas específicas. Es compatible con OctoPrint y la mayoría de hosts.
{% endhint %}

## Calibración

### M92 — Pasos por mm

Define los pasos del motor por cada mm de movimiento. Es la calibración de E-steps del extrusor y XYZ.

```gcode
M92 E415        ; calibrar extrusor a 415 pasos/mm
M92 X80 Y80     ; calibrar X e Y a 80 pasos/mm
M503            ; verificar que los cambios están aplicados
M500            ; guardar en EEPROM
```

### M201 / M203 / M204 / M205 — Aceleraciones y velocidades

```gcode
M201 X500 Y500 Z100 E5000    ; aceleración máxima por eje (mm/s²)
M203 X200 Y200 Z10 E50       ; velocidad máxima por eje (mm/s)
M204 P500 R1000 T500         ; aceleraciones: Print / Retract / Travel
M205 X8 Y8 Z0.4 E5           ; jerk (cambios bruscos de velocidad)
```

### M301 — Ajuste PID extrusor

```gcode
M301 P22.2 I1.08 D114        ; ajustar valores PID del extrusor
M303 E0 S200 C8              ; autotuning PID (8 ciclos a 200°C)
```

### M851 — Offset Z-probe (Z offset)

```gcode
M851 Z-1.80    ; ajustar Z offset a -1.80mm
M503           ; verificar el valor actual
M500           ; guardar en EEPROM
```

### M412 — Sensor de filamentos

```gcode
M412           ; consultar estado del sensor
M412 S1        ; activar sensor de filamentos
M412 S0        ; desactivar sensor de filamentos
```

### M900 — Linear Advance

Ajusta el factor K de Linear Advance (requiere `LIN_ADVANCE`).

```gcode
M900 K0.2      ; activar Linear Advance con K=0.2
M900 K0        ; desactivar Linear Advance
```

### M593 — Input Shaper (Marlin 2.1.3+)

Disponible a partir de Marlin 2.1.3 con `INPUT_SHAPING_X/Y` habilitado.

```gcode
M593 X F45.0 D0.1   ; configurar Input Shaper eje X: 45Hz, damping 0.1
M593 Y F38.0 D0.1   ; configurar Input Shaper eje Y: 38Hz, damping 0.1
M593               ; mostrar configuración actual
```

### M306 — Model Predictive Temperature Control (MPC)

Alternativa al PID, disponible en Marlin 2.1+ con `MPCTEMP`.

```gcode
M306 T          ; autotuning de MPC para extrusor activo
M306 A          ; autotuning MPC de forma asíncrona (mientras imprime)
```

## EEPROM

La EEPROM guarda la configuración para que persista tras apagar la impresora.

| Gcode  | Acción                                                    |
| ------ | --------------------------------------------------------- |
| `M500` | Guardar configuración actual en EEPROM                    |
| `M501` | Cargar configuración desde EEPROM                         |
| `M502` | Resetear configuración a valores por defecto del firmware |
| `M503` | Mostrar configuración actual en terminal                  |

```gcode
M503   ; ver toda la configuración actual (útil para diagnóstico)
M500   ; guardar cambios
```

## Información y diagnóstico

### M115 — Información del firmware

```gcode
M115   ; muestra versión de Marlin, capabilities, etc.
```

### M119 — Estado de los finales de carrera

```gcode
M119   ; muestra si cada endstop está TRIGGERED u OPEN
```

### M503 — Informe de configuración

```gcode
M503   ; muestra toda la configuración activa: pasos/mm, PID, offsets, etc.
```

## Utilidades y pantalla

### M117 — Mensaje en pantalla

```gcode
M117 Cargando filamento...   ; muestra un mensaje en la pantalla LCD
```

### M300 — Pitido (Beep)

```gcode
M300 S440 P200   ; pitido a 440Hz durante 200ms
```

### M150 — Control de LEDs Neopixel

```gcode
M150 R255 U0 B0          ; LED rojo
M150 R0 U255 B0          ; LED verde
M150 R255 U255 B255      ; LED blanco
M150 P128                ; brillo al 50%
M150 R0 U0 B0 P0         ; apagar LEDs
```

## Scripts de ejemplo para el laminador

### Gcode de inicio típico

```gcode
G28                ; home todos los ejes
G29                ; nivelación automática
G92 E0             ; resetear extrusor
G1 Z5 F3000        ; subir Z a 5mm
M117 Imprimiendo   ; mensaje en pantalla
```

### Gcode de fin típico

```gcode
M104 S0            ; apagar extrusor
M140 S0            ; apagar cama
G92 E0             ; resetear extrusor
G1 E-5 F300        ; retracción final
G28 X Y            ; home X e Y
M84                ; apagar motores
M117 Listo!        ; mensaje en pantalla
```

## Resumen rápido

| Categoría      | Gcodes clave           |
| -------------- | ---------------------- |
| Movimiento     | G0, G1, G28, G29, G92  |
| Temperatura    | M104, M109, M140, M190 |
| Ventiladores   | M106, M107             |
| Pasos/mm       | M92                    |
| EEPROM         | M500, M501, M502, M503 |
| PID            | M301, M303             |
| Linear Advance | M900                   |
| Input Shaper   | M593                   |
| Filamento      | M600, M412             |
| LEDs           | M150                   |
| Diagnóstico    | M115, M119, M503       |


# Configuracion Marlin

{% 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 %}


# Puesta en Marcha Inicial

Guía completa de primeros pasos al implementar Marlin en tu impresora 3D, desde la instalación del firmware hasta las primeras impresiones.

Bienvenido a la guía de primeros pasos con Marlin. Aquí aprenderás cómo preparar tu impresora desde cero, cargar el firmware, conectarte y realizar los ajustes básicos necesarios para imprimir con seguridad y calidad.

{% hint style="info" %}
Esta guía asume que ya tienes Marlin compilado para tu placa controladora. Si necesitas compilar Marlin por primera vez, consulta la [Guía de Compilación de Marlin](/marlin/marlin-guia-compilacion).
{% endhint %}

## Resumen del Proceso

Estos son los pasos que seguiremos en orden:

{% stepper %}
{% step %}

### 1. Carga del Firmware

Cargar el binario compilado en tu placa controladora
{% endstep %}

{% step %}

### 2. Conexión Inicial

Establecer conexión con la impresora (Pronterface, pantalla LCD u OctoPrint)
{% endstep %}

{% step %}

### 3. Verificación de Endstops

Comprobar que los sensores de fin de carrera funcionan correctamente
{% endstep %}

{% step %}

### 4. Verificación de Motores

Confirmar que los motores responden correctamente
{% endstep %}

{% step %}

### 5. Verificación de Sensores

Comprobar temperatura hotend, cama y otros sensores
{% endstep %}

{% step %}

### 6. Calibración Básica

Ajustar Z-offset, E-steps y temperatura
{% endstep %}

{% step %}

### 7. Primeras Pruebas

Primeros movimientos y pruebas de impresión
{% endstep %}
{% endstepper %}

***

## 1. Carga del Firmware

### Requisitos Previos

Antes de cargar el firmware, asegúrate de tener:

* **Placa controladora compatible** (Arduino Mega, RAMPS, BigTreeTech SKR, MKS, Creality, etc.)
* **Marlin compilado** (`.hex` o `.bin` según tu placa)
* **Cable USB** o **acceso a tarjeta SD** (según tu placa)
* **Software de carga** (varía según la placa)

{% hint style="warning" %}
**Desconecta la impresora de la corriente eléctrica antes de instalar o actualizar la placa controladora.**
{% endhint %}

### Proceso de Carga

{% tabs %}
{% tab title="Arduino Mega (RAMPS, MKS Gen)" %}

1. **Conecta** la placa Arduino al ordenador por USB
2. **Abre Arduino IDE** y selecciona:
   * **Board**: Arduino Mega 2560
   * **Port**: El puerto COM que aparezca
3. **Carga el firmware**: `Sketch → Upload`
4. Espera a que aparezca "Upload complete"

```
Sketch uses 258048 bytes (100%) of program storage space.
Global variables use 8204 bytes (100%) of dynamic memory.
Upload complete.
```

{% hint style="success" %}
Si ves este mensaje, la carga fue exitosa.
{% endhint %}
{% endtab %}

{% tab title="BigTreeTech SKR, Creality v4.x (STM32) — RECOMENDADO" %}
**Método recomendado: Tarjeta SD (funciona en todos los casos)**

1. **Copia el archivo `.bin` compilado** a una **tarjeta microSD formateada en FAT32**
2. **Inserta la tarjeta en la placa**
3. **Reinicia la impresora** (desconecta y vuelve a conectar la corriente)
4. **El firmware se cargará automáticamente** (puedes ver un LED parpadeando)
5. **Espera 30-60 segundos** a que finalice
6. **Reinicia nuevamente** para aplicar completamente

{% hint style="info" %}
Este es el método más fiable y no requiere herramientas especiales.
{% endhint %}
{% endtab %}

{% tab title="Creality (CR-10, Ender 3, etc.)" %}
Las placas Creality usan bootloaders propietarios. El método varía según el modelo:

**Ender 3 / CR-10 v1 (8-bit):**

* Usa Arduino IDE (como Arduino Mega)

**Ender 3 v2 / CR-6 (STM32):**

* Tarjeta SD (método recomendado)
* Manual USB si es necesario

**K1 / K1 Max:**

* No compatible con Marlin (usan Klipper)

Consulta el manual de tu impresora para confirmación.
{% endtab %}

{% tab title="Anycubic, Anet, Otras" %}
**Anycubic i3 Mega / Mega X:**

* Copia el `.hex` a tarjeta SD con nombre específico (ej: `FIRMWARE.hex`)
* Inserta en la impresora
* El nombre del archivo cambiará cuando termine

**Anet A8 / A6:**

* Usa Arduino IDE con Board "Anet V1.0"

**Recomendación**: Consulta el [manual oficial de Marlin](/marlin/marlin-guia-compilacion) o el fabricante.
{% endtab %}
{% endtabs %}

### Verificación de Carga

Tras cargar el firmware, deberías ver:

1. **LEDs de la placa** parpadeando o brillando
2. **Pantalla LCD** (si la tienes) mostrando el menú Marlin
3. **Sin mensajes de error** de conexión

***

## 2. Conexión Inicial

Tienes varias opciones para conectarte y controlar tu impresora. Elige la que mejor se adapte a tu setup:

### Opción A: Pantalla LCD / Interface de Marlin

Si tu impresora tiene **pantalla LCD inteligente** que se conecta por serial (RXD/TXD), puedes usarla directamente sin ordenador.

**Ventaja**: Control total sin necesidad de host externo. **Desventaja**: Pantalla más pequeña, menos información.

### Opción B: Pronterface (Recomendado para Empezar)

Pronterface es una aplicación de escritorio simple y directa. Hay una guía detallada en el space: [Pronterface](/marlin/troubleshooting-marlin/pronterface)

**Pasos rápidos:**

1. **Descarga Pronterface** desde [pronterface.com](https://www.pronterface.com/)
2. **Conecta la placa USB** a tu ordenador
3. **Abre Pronterface**
4. Selecciona el **puerto COM** (el que aparezca en el dropdown)
5. Configura **velocidad en baudios: 250000**
6. Haz clic en **Connect**

{% hint style="info" %}
Si no aparece puerto COM:

* Instala drivers USB (FTDI, CH340, etc. según tu placa)
* En Linux/Mac usa: `ls /dev/ttyUSB*` o `ls /dev/ttyACM*`
  {% endhint %}

### Opción C: OctoPrint (Avanzado)

OctoPrint requiere una **Raspberry Pi** u otro host (ordenador, NAS, etc.) permanentemente encendido.

**Ventaja**: Control remoto, mejoras con plugins **Desventaja**: Requiere hardware adicional, más complejo de configurar

Hay guías de instalación en la sección [OctoPrint](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/octoprint/README.md) si deseas explorarlo después.

**Para empezar, usa Pronterface.** Es simple y no requiere hardware adicional.

***

## 3. Verificación de Endstops

Los **endstops** son sensores que detectan los límites de los ejes. Marlin los debe detectar correctamente antes de poder mover nada.

### Comprobar Estado de Endstops

En Pronterface (u otro interface), envía este comando:

```
M119
```

Deberías ver algo como:

```
x_min: open  y_min: open  z_min: open
```

Todos deben estar en estado **`open`** (abiertos/sin pulsar) inicialmente.

### Probar Cada Endstop

Presiona **manualmente cada endstop** mientras envías `M119` de nuevo:

```
x_min: TRIGGERED  (cuando presionas el X)
y_min: TRIGGERED  (cuando presionas el Y)
z_min: TRIGGERED  (cuando presionas el Z)
```

{% hint style="danger" %}
**Si algún endstop NO cambia de estado**:

* Revisa la conexión del sensor en la placa
* Verifica que el sensor no esté defectuoso
* Comprueba que está configurado en `configuration.h`

Consulta: [Reparar pin sensor temperatura](/marlin/troubleshooting-marlin/reparar-pin-sensor-temperatura) para diagnóstico más detallado.
{% endhint %}

***

## 4. Verificación de Motores

Una vez que los endstops funcionan, prueba que los motores responden correctamente.

### Desde Pantalla Marlin (Recomendado)

Si tu impresora tiene **pantalla LCD**, es la forma más segura de probar motores:

{% stepper %}
{% step %}

### Accede al Menú de Movimiento

En la pantalla Marlin:

1. Presiona el botón **MENU** (botón central, esquina inferior derecha)
2. Selecciona **Prepare** → **Move Axis** (o **Mover Eje**)
3. Selecciona el eje que deseas probar (**X**, **Y** o **Z**)
   {% endstep %}

{% step %}

### Mueve el Motor

En el menú de movimiento:

* **Presiona UP/DOWN** para cambiar la distancia a mover (10mm, 1mm, 0.1mm, etc.)
* **Presiona el botón central (OK)** para mover el eje

{% hint style="danger" %}
**IMPORTANTE antes de mover Z**: asegúrate de que la cama está **bajada lo suficiente** para que la boquilla no golpee. Si es la primera vez, baja la cama manualmente primero.
{% endhint %}
{% endstep %}

{% step %}

### Observa el Movimiento

* ¿Se mueve el motor suavemente?
* ¿Hace ruido extraño (chirridos, crujidos)?
* ¿Se mueve en la dirección correcta?

Si algo falla, detén inmediatamente y revisa las conexiones.
{% endstep %}
{% endstepper %}

**Para ver exactamente cómo se vería en tu pantalla LCD, mira este video:**

{% embed url="<https://www.youtube.com/watch?v=8mdIYlbM6CM>" %}

**Flujo de navegación del menú:**

```
┌─────────────────────────────────┐
│ PANTALLA INICIO                 │
│ ┌─────────────────────────────┐ │
│ │ Marlin 2.1.2                │ │
│ │ T: 23.5°C / 0°C             │ │
│ │ B: 22.0°C / 0°C             │ │
│ │ Status: Ready               │ │
│ └─────────────────────────────┘ │
│ Presiona MENU                   │
└────────────┬────────────────────┘
             │
             ▼
┌─────────────────────────────────┐
│ MENÚ PRINCIPAL                  │
│ ┌─────────────────────────────┐ │
│ │ > Prepare       (← Seleccionado)│
│ │   Print                     │ │
│ │   Control                   │ │
│ │   Info                      │ │
│ └─────────────────────────────┘ │
│ Presiona OK                     │
└────────────┬────────────────────┘
             │
             ▼
┌─────────────────────────────────┐
│ PREPARE MENU                    │
│ ┌─────────────────────────────┐ │
│ │ > Move Axis     (← Seleccionado)│
│ │   Preheat PLA               │ │
│ │   Preheat PETG              │ │
│ │   Cool Down                 │ │
│ └─────────────────────────────┘ │
│ Presiona OK para entrar         │
└────────────┬────────────────────┘
             │
             ▼
┌─────────────────────────────────┐
│ MOVE AXIS MENU                  │
│ ┌─────────────────────────────┐ │
│ │ > Move X        (← Seleccionado)│
│ │   Move Y                    │ │
│ │   Move Z                    │ │
│ │   Move E                    │ │
│ └─────────────────────────────┘ │
│ Usa UP/DOWN para cambiar distancia│
│ Presiona OK para mover          │
└─────────────────────────────────┘
```

**Cómo usar el menú:**

1. Usa **UP/DOWN** para navegar entre opciones
2. Presiona **OK** para entrar/seleccionar
3. En "Move Axis", usa **UP/DOWN** para cambiar distancia (10mm → 1mm → 0.1mm)
4. Presiona **OK** para ejecutar el movimiento
5. Presiona **BACK** para salir del menú

### Desde Pronterface o Terminal

Si no tienes pantalla, usa **Pronterface**. Aquí puedes ver la interfaz en detalle:

{% embed url="<https://www.youtube.com/watch?v=txj41rRdQ7s>" %}

**Pasos en Pronterface:**

1. Busca la sección **"Control"** en la interfaz
2. Encontrarás campos para **Move X**, **Move Y**, **Move Z**
3. Ingresa una distancia (ej: 10) y presiona el botón correspondiente

**Mover X 10mm:**

```
G1 X10 F1500
```

**Mover Y 10mm:**

```
G1 Y10 F1500
```

**Mover Z 5mm (hacia arriba):**

```
G1 Z5 F300
```

**Volver a origen (todos los ejes deben estar hastiado los endstops):**

```
G28
```

{% hint style="info" %}
**F1500** es la velocidad (mm/min). Para Z es más lenta (F300) porque es crítica.
{% endhint %}

***

## 5. Verificación de Sensores (Temperaturas)

Marlin debe detectar correctamente los sensores de temperatura. Pruébalos sin calor primero, después con un secador de pelo.

### Desde Pantalla Marlin

**Pantalla de inicio mostrando temperaturas:**

```
┌─────────────────────────┐
│  Marlin 2.1.2           │
│ T: 23.5°C / 0°C         │
│ B: 22.0°C / 0°C         │
│ Status: Ready           │
│                         │
│ [Menú] [Imprimir]       │
└─────────────────────────┘

Leyenda:
T = Temperatura Hotend (actual/objetivo)
B = Temperatura Cama (actual/objetivo)
23.5°C = Temperatura actual
/0°C = Temperatura objetivo (0=apagado)
```

**Ver temperaturas en tiempo real:**

1. En la **pantalla de inicio**, ya ves las temperaturas actuales constantemente actualizadas
2. Si presionas **MENU** → **Control** → **Temperature**, verás un gráfico histórico de las variaciones de temperatura

**Para ver cómo se ve en una pantalla real:**

{% embed url="<https://www.youtube.com/watch?v=8mdIYlbM6CM>" %}

Más información: [Documentación oficial: LCD Menu](https://marlinfw.org/docs/features/lcd_menu.html)

**Prueba de Temperatura:**

{% stepper %}
{% step %}

### Capta la temperatura inicial

Anota la temperatura que muestra (ej: 23.5°C hotend, 22°C cama)
{% endstep %}

{% step %}

### Aplica calor con un secador de pelo

* Coloca un **secador de pelo en aire tibio** (no caliente)
* Apunta al **nozzle** durante 5-10 segundos
* Observa la **pantalla Marlin**

La temperatura debe **subir gradualmente** (hacia 30-35°C)
{% endstep %}

{% step %}

### Retira el secador

La temperatura debe **bajar gradualmente** de nuevo

Si **NO sube ni baja**, el sensor está defectuoso o mal conectado.
{% endstep %}

{% step %}

### Repite para la cama

Aplica calor al **cristal/cama** y verifica que **B** cambia
{% endstep %}
{% endstepper %}

### Desde Pronterface o Terminal

**Ver estado actual en Pronterface:**

* Busca la sección **"Temperature"** en la interfaz
* Verás campos etiquetados como **"T"** (hotend) y **"B"** (cama)
* Los números se actualizan en tiempo real

**Ver estado actual por terminal:**

```
M105
```

Resultado esperado:

```
ok T:23.5 /0 B:22 /0
```

* **T:23.5**: Temperatura actual hotend
* **/0**: Temperatura objetivo hotend (0 = apagado)
* **B:22**: Temperatura actual cama
* **/0**: Temperatura objetivo cama

**Aplicar calor con secador de pelo:**

1. Ejecuta `M105` varias veces mientras aplicas calor con el secador
2. La temperatura **T** debe subir gradualmente (23 → 28 → 32 → etc.)
3. Cuando retires el calor, debe bajar gradualmente

**Ejemplo de prueba real:**

```
M105
ok T:23.5 /0 B:22 /0

(Aplica calor con secador durante 10 segundos)

M105
ok T:28.2 /0 B:22 /0

M105
ok T:32.5 /0 B:22 /0

(Retira el calor)

M105
ok T:28.1 /0 B:22 /0    ← Bajando gradualmente
```

**Para ver Pronterface en funcionamiento:**

{% embed url="<https://www.youtube.com/watch?v=txj41rRdQ7s>" %}

{% hint style="danger" %}
**Si la temperatura NO cambia**: el termistor está desconectado o mal configurado. Revisa la conexión y el tipo de termistor en `configuration.h`.
{% endhint %}

***

## 6. Calibración Básica

### Z-Offset (Solo si tienes Sensor de Nivelación)

{% hint style="warning" %}
**IMPORTANTE**: El Z-offset **SOLO se usa si tienes un sensor de nivelación** (BLTouch, inductivo, capacitivo, etc.).

**Si NO tienes sensor**, la nivelación es **tradicional**: ajusta manualmente la **cama con las tuercas** (a veces, si los endstops son fijos, ajusta el endstop Z).

Consulta: [Asistente Z-Offset \[Marlin\]](/marlin/configuracion-marlin/nivelacion/asistente-z-offset-marlin) para guía detallada.
{% endhint %}

El **Z-offset** determina la distancia entre la boquilla y la cama cuando Z=0. **Solo relevante si tienes sensor.**

**Procedimiento:**

{% stepper %}
{% step %}

### Calienta la impresora

```
M104 S200
M140 S60
M109 S200
M190 S60
```

Espera a que alcance temperatura.
{% endstep %}

{% step %}

### Haz home

```
G28
```

{% endstep %}

{% step %}

### Ve a Z=0

```
G1 Z0
```

{% endstep %}

{% step %}

### Ajusta manualmente

Coloca un papel bajo la boquilla y ajusta hasta que rozar levemente. Anota el valor de Z que muestra.
{% endstep %}

{% step %}

### Calcula y actualiza

Ese valor es tu **Z-offset**. Actualiza `configuration.h`:

```cpp
#define NOZZLE_TO_PROBE_OFFSET { 0, 0, -0.5 }
                                          ^
                                    Tu Z-offset
```

{% endstep %}
{% endstepper %}

**Para procedimiento más detallado con herramientas de calibración automática**, consulta: [Asistente Z-Offset \[Marlin\]](/marlin/configuracion-marlin/nivelacion/asistente-z-offset-marlin)

***

### E-Steps (Calibración de Extrusión)

Los **E-steps** determinan cuánto filamento se extruye por cada paso del motor. Es una de las calibraciones más importantes para obtener buenas impresiones.

**Consulta la guía completa de calibración**: [Calibración 3D → 2. Pasos Extrusor](https://labs.3dwork.io/guias-impresion-3d/calibracion_3d#id-2.-pasos-extrusor)

**Resumen rápido:**

{% stepper %}
{% step %}

### Calienta a temperatura de filamento

```
M104 S200
M109 S200
```

{% endstep %}

{% step %}

### Marca el filamento

Haz una marca a **120mm** desde la entrada del extrusor
{% endstep %}

{% step %}

### Extruye 100mm

```
G1 E100 F300
```

{% endstep %}

{% step %}

### Mide la distancia real

¿Cuántos mm se movió realmente el filamento?

Ejemplo: de 120mm a 20mm = 100mm (correcto)
{% endstep %}

{% step %}

### Calcula nuevos E-steps

```
E-steps nuevos = E-steps actual × (100 / distancia real)

Ejemplo:
- E-steps actual: 93
- Distancia real: 98mm
- E-steps nuevos = 93 × (100/98) = 94.9 ≈ 95
```

{% endstep %}

{% step %}

### Actualiza configuration.h

```cpp
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 95 }
                                                      ^
                                                 Nuevo valor
```

Recompila y carga el firmware.
{% endstep %}
{% endstepper %}

Para calibración más precisa y métodos avanzados, consulta la [Guía de Calibración 3D](https://labs.3dwork.io/guias-impresion-3d/calibracion_3d#id-2.-pasos-extrusor).

***

## 7. Test de Movimiento Básico

### Desde Pantalla Marlin

**Lo que ves en la pantalla LCD:**

```
┌─────────────────────────┐
│   > Prepare             │
│     Move Axis           │
│     Preheat PLA         │
│     Cool Down           │
│                         │
│ [Presiona OK →]         │
└─────────────────────────┘
```

Luego al seleccionar "Move Axis":

```
┌─────────────────────────┐
│   Move Axis             │
│   > Move X              │
│     Move Y              │
│     Move Z              │
│     Move E              │
│                         │
│ [Presiona OK →]         │
└─────────────────────────┘
```

**Mover ejes individuales:**

{% stepper %}
{% step %}

### Accede a Move Axis

1. **MENU** → **Prepare** → **Move Axis**
2. Selecciona el eje (**X**, **Y**, **Z** o **E**)
3. Cambia la distancia (10mm, 1mm, etc.)
4. Presiona **OK** para ejecutar el movimiento

**Referencia visual**: Mira este vídeo para ver exactamente cómo se vería en tu pantalla:

{% embed url="<https://www.youtube.com/watch?v=8mdIYlbM6CM>" %}

También consulta la [documentación oficial de Marlin](https://marlinfw.org/docs/features/lcd_menu.html).
{% endstep %}

{% step %}

### Observa cada eje

* **X**: ¿Se mueve hacia la izquierda/derecha suavemente?
* **Y**: ¿Se mueve hacia adelante/atrás suavemente?
* **Z**: ¿Se mueve hacia arriba/abajo sin tropezar?
* **E**: ¿Gira el extrusor suavemente?

{% hint style="danger" %}
Si **Z hace ruido extraño** o **Z se atasca**, detén inmediatamente. Verifica que no hay objetos bloqueando.
{% endhint %}
{% endstep %}

{% step %}

### Repite varios movimientos

Mueve cada eje varias veces para estar seguro de que funciona consistentemente.
{% endstep %}
{% endstepper %}

### Desde Pronterface o Terminal

Para usar Pronterface y realizar movimientos, consulta este video:

{% embed url="<https://www.youtube.com/watch?v=txj41rRdQ7s>" %}

**Movimiento X:**

```
G1 X10 F1500
G1 X20 F1500  (mueve a 20mm total)
G1 X0 F1500   (vuelve a origen)
```

**Movimiento Y:**

```
G1 Y10 F1500
G1 Y20 F1500
G1 Y0 F1500
```

**Movimiento Z (más lento):**

```
G1 Z5 F300    (sube 5mm)
G1 Z10 F300   (sube otros 5mm)
G1 Z0 F300    (vuelve a z=0)
```

**Movimiento Extrusor (sin carga):**

```
G1 E5 F300    (extruye 5mm)
G1 E-5 F300   (retrae 5mm)
```

**Homing completo (vuelve a los endstops):**

```
G28
```

***

## 8. Nivelación de Cama

### Con Sensor de Nivelación

Si tienes **BLTouch**, **inductivo**, **capacitivo** u otro sensor:

```
G29
```

Marlin sondea automáticamente varios puntos y crea un mapa. Toma 30-60 segundos.

**Guías específicas por tipo de sensor:**

* [BLTouch / 3DTouch / CRTouch / MicroProbe](/marlin/configuracion-marlin/nivelacion/bltouch-3dtouch)
* [PINDAv2 / Inductivos](/marlin/configuracion-marlin/nivelacion/pindav2)
* [Sensorless Homing](/marlin/configuracion-marlin/nivelacion/sensorless-homing-en-marlin)

### Sin Sensor (Nivelación Manual Tradicional)

Ajusta **manualmente la cama** con las tuercas en cada esquina:

1. **Haz home**: `G28`
2. **Ve a esquina frontal izquierda**: `G1 X10 Y10 Z0`
3. **Coloca un papel bajo la boquilla**
4. **Ajusta la tuerca de altura hasta rozar levemente**
5. **Repite para cada esquina**

**Guía completa**: [Nivelación Manual MESH](/marlin/configuracion-marlin/nivelacion/nivelado-manual-mesh)

***

## 9. Primeras Pruebas

**Precalienta:**

```
M104 S200
M140 S60
M109 S200
M190 S60
```

**Carga un archivo G-code simple** (cubo pequeño 20×20×10 mm)

**Inicia la impresión** desde Pronterface o pantalla

**Observa la primera capa:**

* ¿Línea fina y uniforme?
* ¿Filamento sin tirones?
* ¿Boquilla correctamente ajustada?

Si no es perfecta, **ajusta Z-offset y reinicia**.

***


# Ajuste de límites de impresión

Configurar correctamente nuestro Marlin para que el nozzle se mueva correctamente por la zona de impresión es muy importante.

En ocasiones, ya sea por montar algún mod en nuestra máquina o simplemente porque queremos poner un Marlin cocinado por nosotros para sustituir al de fábrica de nuestra máquina que tiene limitado la superficie de impresión, nos interesa ajustar nuestra configuración para aprovechar al máxima el área de impresión útil de nuestra máquina.

En un mundo ideal, como la siguiente imagen, nuestra configuración de Marlin, o el ajuste físico de los finales de carrera, nos van a permitir que nuestro nozzle se mueva libremente y sin problemas por toda la superficie de impresión:

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FbT9aKlO0zvviNly91Dde%2Ftelegram-cloud-photo-size-4-5850399413623699099-y.jpg?alt=media&amp;token=36e098b2-accb-4aa8-9789-232fed16e2f8" alt=""><figcaption></figcaption></figure>

Esta sería su configuración en Marlin:

```cpp
// @section geometry

// The size of the printable area
#define X_BED_SIZE 235
#define Y_BED_SIZE 235

// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 250
```

Por otro lado, y comentábamos al inicio, nos podemos encontrar con que nuestra máquina no pueda llegar correctamente a todo el área de impresión y que ajustando físicamente nuestros finales de carrera no podamos ajustarlos:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FUgJ3iuJ4O6DGTc1R7E6w%2Ftelegram-cloud-photo-size-4-5850399413623699100-y.jpg?alt=media\&token=77fc8f48-ecf2-40b9-9f70-78d03c63c6f3) ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FNokfBaqlI1kkX8GCpVuF%2Ftelegram-cloud-photo-size-4-5850399413623699104-y.jpg?alt=media\&token=3892cfda-dc68-422c-a92e-018357d73844)

## Ajustes en el área de impresión

Con respecto a este segundo caso os vamos a intentar ayudar a ajustar correctamente el área útil de impresión en vuestro firmware.

{% hint style="info" %}
Para realizar los ajustes explicados a continuación es necesario disponer:

* Una pantalla LCD en modo emulación Marlin, los menús nativos de Marlin vamos
* Una conexión mediante un terminal serial como Pronterface, Octoprint o algunas pantallas TFT táctiles que disponen de esta opción
* Nuestras fuentes de Marlin para compilar nuestra configuración
  {% endhint %}

{% tabs %}
{% tab title="Homing en MIN" %}
Hacer homing en MIN, normalmente la esquina inferior izquierda de nuestra cama, suele ser lo más común.

**Homing XY el nozzle queda fuera de la cama**

Imaginando el caso anterior en el que nuestro nozzle **al hacer homing el nozzle queda fuera del área de impresión** y que no podemos ajustar mecánicamente los finales de carrera para compensarlo.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FUgJ3iuJ4O6DGTc1R7E6w%2Ftelegram-cloud-photo-size-4-5850399413623699100-y.jpg?alt=media&amp;token=77fc8f48-ecf2-40b9-9f70-78d03c63c6f3" alt=""><figcaption></figcaption></figure>

* Es importante asegurarnos que en nuestro firmware actual nuestro `X_MIN_POS` e `Y_MIN_POS` están a 0... podremos mirar esto lanzando un comando M503 que nos devuelve la configuración de nuestra máquina o ajustando mediante M206 los offsets de X e Y a 0 `M206 X0 Y0`
* También hemos de asegurarnos que tenemos nuestro `X_BED_SIZE` e `Y_BED_SIZE` con el tamaño correcto de nuestra cama, en este caso no es posible ajustarlo mediante pantalla o gcode con lo que solamente podemos hacerlo en las fuentes de nuestro Marlin, compilar y subirlo a nuestra electrónica

Ejemplo:

```cpp
// @section geometry

// The size of the printable area
#define X_BED_SIZE 235
#define Y_BED_SIZE 235

// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 250
```

* Desde nuestro cliente terminal, Pronterface por ejemplo, lanzaremos el comando `G28 X Y` para que haga el homing de nuestros ejes X e Y solamente... una vez finalizado en nuestra pantalla de la impresora o Pronterface debería marcar las coordenadas X0Y0
* Dado que, para este caso, nuestro nozzle ha quedado fuera de nuestra área de impresión utilizaremos los controles de movimiento por pantalla de la impresora o de nuestro Pronterface para ir moviendo los ejes X e Y hasta que veamos que la punta de este queda perfectamente alineada con el inicio de nuestra cama.\
  Nos anotaremos los valores de coordenadas para ese punto, en nuestro ejemplo X5 Y5
* Ahora que ya sabemos cuales son los offsets de nuestro homing procederemos a configurarlos, disponemos de dos formas:
  * Ajustando `X_MIN_POS` e `Y_MIN_POS` en nuestras fuentes de Marlin, compilar y subir a nuestra electrónica

    ```cpp
    // @section geometry

    // The size of the printable area
    #define X_BED_SIZE 235
    #define Y_BED_SIZE 235

    // Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
    #define X_MIN_POS -5
    #define Y_MIN_POS -5
    #define Z_MIN_POS 0
    #define X_MAX_POS X_BED_SIZE
    #define Y_MAX_POS Y_BED_SIZE
    #define Z_MAX_POS 250
    ```
  * Mediante el comando M206 enviando los valores y guardando en EEPROM (M500) para no perderlos al reiniciar.\
    Os aconsejamos esta forma solamente de forma temporal ya que lo ideal es hacer el paso anterior.
* Una vez aplicados los cambios volveremos a hacer un `G28 X Y` y en nuestras coordenadas al finalizar el proceso veremos X-5 Y-5.\
  Si movemos manualmente por pantalla/Pronterface nuestros ejes a X0 Y0 debería de quedar nuestro nozzle alineado con el inicio de nuestra cama.

**Homing XY el nozzle queda dentro de la cama**

Imaginando el caso anterior en el que nuestro nozzle **al hacer homing el nozzle queda dentro del área de impresión** y que no podemos ajustar mecánicamente los finales de carrera para compensarlo.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FNokfBaqlI1kkX8GCpVuF%2Ftelegram-cloud-photo-size-4-5850399413623699104-y.jpg?alt=media&amp;token=3892cfda-dc68-422c-a92e-018357d73844" alt=""><figcaption></figcaption></figure>

Desafortunadamente en este caso solamente podemos seguir al siguiente punto para encontrar nuestro nuevo tamaño de cama ajustando `X_BED_SIZE` e `Y_BED_SIZE`

**Encontrando nuestros valores MAX**

Por último nos tocará encontrar el valor MAX, `X_BED_SIZE` e `Y_BED_SIZE`, en cada uno de los casos anteriores. Para ello:

* Desde nuestro cliente terminal, Pronterface por ejemplo, lanzaremos el comando `G28 X Y` para que haga el homing de nuestros ejes X e Y solamente... una vez finalizado en nuestra pantalla de la impresora o Pronterface debería marcar las coordenadas X0Y0
* Para poder movernos libremente sin restricciones desde nuestro cliente terminal lanzaremos el comando `M211 S0` que desactiva los SOFTWARE ENDSTOPS\ <mark style="color:orange;">**Proceder con precaución!!! al no tener límites podemos hacer que nuestra máquina pueda chocar contra los límites físicos de su cinemática y tener daños.**</mark>
* Utilizaremos los controles de movimiento por pantalla de la impresora o de nuestro Pronterface para ir moviendo los ejes X e Y hasta que veamos que la punta de este queda perfectamente alineada con el final de nuestra cama.\
  Nos anotaremos los valores de coordenadas para ese punto:
  * En el ejemplo primero, donde nuestro homing quedaba fuera de la cama, y dado que no hemos tenido limitacion a llegar al final de nuestra área de impresión X235 Y235
  * Para el segundo ejemplo, donde nuestro homing quedaba dentro de la cama de 260x260 (XY), y dado que tampoco hemos tenido limitacion a llegar al final del área de impresión X255 Y255
  * Se puede dar un tercer caso y es que, por limitaciones en nuestra cinemática, no podemos llegar al área máxima de nuestra cama por lo que anotaremos el valor más alto que podamos llegar de forma segura sin chocar nuestros ejes.
* Con esos valores ajustaremos nuestro `X_BED_SIZE` e `Y_BED_SIZE` en nuestras fuentes de Marlin, compilaremos y subiremos el firmware a nuestra electrónica.\
  El siguiente código sería para el ejemplo en el que nuestro nozzle queda dentro de nuestra cama:

```cpp
// @section geometry

// The size of the printable area
#define X_BED_SIZE 255
#define Y_BED_SIZE 255

// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 250
```

{% endtab %}

{% tab title="Homing en MAX" %}

{% endtab %}
{% endtabs %}

## Centrado del área de impresión

En ocasiones, cuando tenemos que hacer los ajustes antes comentados, lo más normal es que nuestras impresiones no queden totalmente en la superficie de la cama porque hemos podido perder área de impresión.

En ese caso has de decidir si priorizar entre área de impresión útil o perder parte de esta para que tus impresiones queden centradas.

Normalmente en este último caso deberemos de jugar con `X_BED_SIZE` e `Y_BED_SIZE` o `X_MIN_POS` e `Y_MIN_POS` para compensar las desviaciones de nuestra máquina.

## Ajustes laminador

Dado que probablemente, en el caso de que nuestra área de impresión cambie, deberemos ajustar correctamente nuestro perfil del laminador al nuevo tamaño para evitar sustos.

## Uso de clips o fijadores de superficies de cama

Aunque ya no suele ser tan normal, es posible que contemos con clips para sujetar un cristal utilizado como superficie de impresión.

En esta guía se ha pensado para calcular el área de impresión máxima, dado que es la forma más versátil para poder si es necesario usar cristal (con clips), flejes o cualquier otra superficie.

En el caso de que usemos clips hemos de tener en cuenta en nuestro laminador el configurar un área o margen de seguridad en sus correspondientes opciones, todos los laminadores actualmente cuentan con ello.

Crearemos varios perfiles de máquina con más o menos márgenes de seguridad dependiendo de la superficie de impresión que empleemos. De esta forma no tendremos que tocar configuración de firmware.


# Nivelación/Homing

{% 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 %}


# Bltouch/3DTouch/CRTouch/MicroProbe

Tener instalado un sensor de Nivelación nos permite asegurar unas primeras capas perfectas sin tener que estar ajustando manualmente nuestra mecánica.

En este caso usaremos un sensor por contacto con servo o comúnmente conocido como Bltouch, que es un sensor con mucha precisión y polivalente ya que puede trabajar en cualquier superficie.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fq95wjmQ96w3Eg1jISLHq%2Ftelegram-cloud-photo-size-4-5940708853438069620-x.jpg?alt=media&amp;token=2d22c2c2-7584-4fe1-a19f-354575c83dcd" alt=""><figcaption><p>Esquema de funcionamiento interno de un sensor estilo BlTouch</p></figcaption></figure>

Su funcionamiento es muy sencillo, básicamente consta de un solenoide que gracias al imán que lleva en la punta de sondeo permite recoger o desplegarlo. En las diferentes generaciones de sensores o marcas podemos encontrar que la detección de sondeo se realiza mediante un sensor hall (campos magnéticos) o uno óptico... cada uno tiene sus ventajas e inconvenientes en cualquier caso ambos dan una excelente precisión.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FGk99A8Mrb7XWxqZWazhp%2Ftelegram-cloud-photo-size-4-6030764215872107933-y.jpg?alt=media&amp;token=be48ccab-d5e9-41cd-8a51-516062cd3291" alt=""><figcaption><p>Comparativa entre rango de precisión de un sensor vs cabello humano o una altura normal de capa impresa 3D</p></figcaption></figure>

Para más información visita <https://3dwork.io/configurar-bltouch-en-marlin/>

Podéis encontrar como ejemplo el sensor original de AntcLabs y un clónico 3DTouch:

{% 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/32777786433.html>" %}

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

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

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

## Esquemas de conexión

{% hint style="danger" %}
**Es importante asegurarte que el pineado es correcto, depende de la versión o modelo del sensor el orden de los pines o los colores del cable pueden variar!!!**

**No nos hacemos responsables de ningún problema de conexionado, es vuestra responsabilidad aseguraos que el orden del cableado es correcto en cada caso.**

**Los siguientes ejemplos se muestran como ejemplos**
{% endhint %}

{% tabs %}
{% tab title="SKR Octopus" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-Mji20tSHp-yc4wQmPnO%2F-Mjo0IoetnZq5DtTYCy4%2Fimage.png?alt=media\&token=996116b9-81ba-4a89-a1a6-76a6e62acef5)
{% endtab %}

{% tab title="SKR 2" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-Mhrbw50xnjN9E3_Sx2J%2F-MhrkgQ8ZAH5JKbW52OA%2Fimage.png?alt=media\&token=55aaf326-efe0-4496-81d4-54c430e67906)
{% endtab %}

{% tab title="SKR 1.4" %}
Este esquema depende de la versión de Marlin cargada en la impresora, normalmente a partir de la 2.0.7.x se puede usar el puerto dedicado PROBE en la placa si no se deberá utilizar el puerto Z-STOP.

![](https://telegra.ph/file/6c54297e6e5edb52cb861.png)

![](https://lh5.googleusercontent.com/ekyD_A5GbpEMf9xCeeoebOtgNanm5zvrwrMZyJYSCHq4RxghXi49hJC7_tOMDOGmTqSbALRevT1swCRy3Xp5pc9Y79_-CSnkT9Rxzyg1fTn0YnmYa2iMZpLDmrfXxGXwOkQxRsTr)
{% endtab %}

{% tab title="SKR 1.3" %}
![](https://lh6.googleusercontent.com/gq2Q81SUbJyT3lt4qXUBBEhxZjzNPtsXGwE0qJj_9yoIqHkgHH0ImEA_o6wWXGKAcUQ6xew4qvwOW7f23GZF6sJK2LaogIHi6p2ucBBBu_81MvbzGCAifsZelTiXuQNnTMjQw2AY)
{% endtab %}

{% tab title="SKR MIN E3 V3 " %}
**BLtouch**

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fox7yQj5NTXwjFRNv07Jk%2Fimage.png?alt=media&amp;token=eb5d4985-9197-4710-a082-4c6810d14fd4" alt=""><figcaption></figcaption></figure>

**CRTouch**

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fx7E1WfIp6gEiARqUbw30%2Fimage.png?alt=media&amp;token=c6b61412-e749-408f-8b54-b8ea59373a2b" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="SKR MINI E3 V2" %}
![](https://lh5.googleusercontent.com/S7MWMIPbTX8GcGJmKNy4ZU1vzPm_ToYfc99FVobYYgBq_6hgrw07CXVuYJ2UL4jKCezvOZrHvjTc_3aV3YH0xvM6l5UK5Y5a7z6cvfIba8WZIu5LxpQlGVJMp8Lc4P7H3m21jIGo)
{% endtab %}

{% tab title="SKR MINI E3 1.2" %}
Usando el conector dedicado al PROBE, ojo depende de version de Marlin o configuraciones especiales.

![Usando el conector dedicado al PROBE, ojo depende de version de Marlin o configuraciones especiales.](https://lh6.googleusercontent.com/cSevTzP07fQJSNtLIncS2m5-sTJSQoV_-I4M6lehwNUhw0QbX7ebOTCbGZZ248XVKEWJhlvEb9Oq0RBoKobiES8UmkZYpWX5mSISs97zjz_50prJ20aG9iOU7m9kZv2tjtlewviO)

![Usando el conector Z- , ojo depende de version de Marlin o configuraciones especiales.](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MWca1ixT71DGBJFUdfa%2F-MWd4_O24u3rhMJTyA76%2Fimage.png?alt=media\&token=ad4c00a7-dc92-4740-be6e-f6e6ea6ac2df)
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="FYSETC SPIDER" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FcuxTQ3EwxAtkT4rF0H8c%2Fimage.png?alt=media\&token=57791c29-7240-4c17-b70d-c0028181e997)

{% hint style="info" %}
**En el caso de disponer de una Spider v1.1 esta cuenta con un conector específico para el Bltouch/3Dtouch**
{% endhint %}

{% hint style="warning" %}
**Es importante colocar el jumper rojo en la posición de 5v para alimentar correctamente nuestro sensor.**
{% endhint %}
{% endtab %}

{% tab title="FYSETC S6" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-Ma8ZemWkFZwRtJiuD_2%2F-Ma8gynHBfBOlDxl_Xm7%2Fimage.png?alt=media\&token=2c1c8aa5-8a34-4d7e-b2fb-7e7d695f3807)
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Creality" %}
Creality tiene un amplio catálogo de máquinas y electrónicas que montan en ellas:

* En el caso de electrónicas antiguas montadas sobre Ender 3/Pro, Ender 5 o CR-X no disponen de conectores y se usa un adaptador que extrae algunos pines del conector EXP

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FRiQUNImrW790gAFMKUjn%2Fimage.png?alt=media&amp;token=db268863-b124-40fd-85d6-e6c86e4c6abb" alt=""><figcaption></figcaption></figure>

* Electrónicas más actuales (4.2.x) ya disponen de un conector destinados al uso del sensor, normalmente Ender 3 V2 y Ender 5 Pro aunque algunas de las anteriores pueden llevar también estas electrónicas.

{% hint style="info" %}
En estas electrónicas podemos utilizar dos métodos para la conexión de la parte endstop del sensor:

* utilizando el conector PROBE específico, este es el caso aconsejable
* utilizando el conector ZMIN, en este caso es importante asegurarnos que cogemos el firmware oficial correcto o al configurarlo por nosotros mimos asegurarnos que usamos `#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN`

Dependiendo del método de conexión y como veremos mas adelante deberemos coger el firmware oficial correcto para que coincida con la conexión o asegurarnos que especificamos correctamente en las opciones de nuestro Marlin donde se conectó el sensor.
{% endhint %}

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F2f0bS7w6V3lUPX3jHbdw%2Fimage.png?alt=media&amp;token=6dba24c6-2ddf-4a40-baeb-4efbbd3144c2" alt=""><figcaption></figcaption></figure>

* También algunos modelos que cuentan con una placa intermedia de conexiones en el hotend como las CR-10 V2 y V3 disponen de un conector pre-cableado

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FF00YoDeqGNyPeUrEyMcH%2Fimage.png?alt=media&amp;token=3c05cb65-4ff2-496c-ab42-1826ed17c756" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Artillery X1/Genius" %}
**Importante actualizar el firmware a la última versión o uno custom y actualizar el firmware del TFT** que tenga soporte, este es muy aconsejable <https://github.com/wgcv/RAWR-TFT-Firmware-Artillery3D>.

También puedes ver el siguiente video del proceso

{% embed url="<https://youtu.be/QY0BPCdgkr4>" %}

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FLkKp9xnUmThlhKfdZiNB%2Fimage.png?alt=media\&token=27d92af7-6fbf-4bf1-934f-bfc45963c9e9)
{% endtab %}

{% tab title="SUNLU S8" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FzE3QUoX9CKvWdDFehE70%2Fimage.png?alt=media\&token=cde4a0c0-a4d8-456f-86b0-7aefdc8bf7f4)
{% endtab %}
{% endtabs %}

También os añadimos esquemas de pines para los modelos de BLTouch y clones más extendidos:

{% tabs %}
{% tab title="BLTouch - Antlabs" %}

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F54dO9NHFHSC7septBup1%2Fimage.png?alt=media&amp;token=5a45cfce-9c58-4db1-ac37-d3261bae887f" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="CRTouch - Creality" %}

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F2eoNsUFoOUkabR4ZwGPb%2Fimage.png?alt=media&amp;token=aaf68ade-b31b-4454-a07b-d768f90d6cab" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F2xz4DPD4b8y1G21dNMxm%2Fimage.png?alt=media&amp;token=7e24f1e7-3287-4d38-87de-8961a58142ee" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FR25ZnTGNZXLmDucHvcU8%2Fimage.png?alt=media&amp;token=463da7a5-9126-4889-95f8-ecebf31de438" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="BIQU Microprobe" %}
{% hint style="warning" %}
**Aunque este sensor tiene una forma similar a un BLTouch su funcionamiento es ligeramente diferente!!!**
{% endhint %}

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FoyF92A0XGz2HlVIwUaWw%2Fimage.png?alt=media&amp;token=0b442bb3-2650-4301-910b-ade3dd7a6276" alt=""><figcaption></figcaption></figure>

Ejemplo de configuración para una eléctronica SKR3:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FLHZiZaKuVmdTQvfLDTs2%2Fimage.png?alt=media\&token=2c6dc993-2041-4b87-9a9c-5631e75b32b6)

{% code title="MARLIN" %}

```cpp
// Definiremos el tipo de sensor como
#defome FIX_MOUNTED_PROBE
// Definiremos el pin para la parte endstop
#define Z_MIN_PROBE_PIN PC13 // ejemplo de pin para una SKR3
// Definiremos que nuestro probe necesita activación usando el pin servo
#define PROBE_ENABLE_DISABLE
...
#define PROBE_ENABLE_PIN PE5 // ejemplo de pin para una SKR3
// Definiremos sus offsets normalmente
#define NOZZLE_TO_PROBE_OFFSET {0,0,0} // ajustaremos las coordenadas de nuestro probe
// Definiremos el estado y tipo por defecto de señal endstop
#define Z_MIN_PROBE_ENDSTOP_INVERTING false
#define ENDSTOPPULLUP_ZMIN_PROBE

```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
En el caso que uséis **Klipper** como firmware para vuestra impresora podéis acceder a esta [**guía específica**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md).
{% endhint %}

## **Cambios en Marlin**

**Dependiendo de como conectemos nuestro sensor de nivelación a nuestra placa** podemos optar por **dos tipos de configuración en Marlin**:

* En el caso que el **sensor de nivelación** de cama se encuentre **en el conector del final de carreras Z-MIN/Z-STOP** dependiendo de la placa:

{% code title="Marlin/configuration.h" %}

```cpp
#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
```

{% endcode %}

* En el caso que nuestra placa disponga de un **conector especial PROBE para sensores de nivelación** y dependiendo de la versión de Marlin usada (normalmente 2.0.7.x ya soporta la mayoría de placas actuales)

{% code title="Marlin/configuration.h" %}

```cpp
#define USE_PROBE_FOR_Z_HOMING
```

{% endcode %}

{% hint style="warning" %}
Si nuestro **fichero pin** de nuestra placa **no contempla la definición del PROBE\_PIN** deberemos definirla aqui (XXX sera el pin usado):

{% code title="Marlin/configuration.h" %}

```cpp
#define Z_MIN_PROBE_PIN XXX
```

{% endcode %}
{% endhint %}

![Ejemplo para una SKR 1.4 usando el pin PROBE para Marlin 2.0.5.3 o superior](https://telegra.ph/file/d2448300145e90cb4943c.png)

* Indicamos el tipo de sensor de nivelación\
  **`#define BLTOUCH`**

{% code title="Marlin/configuration.h" %}

```cpp
#define BLTOUCH
```

{% endcode %}

### Valores offsets PROBE dependiendo de ubicación del mismo

Una parte muy importante del proceso de instalación de un sensor de este tipo es ajustar los valores de offset del sensor.

Los offsets del sensor, en X e Y, es la distancia entre la punta de nuestro nozzle y la punta del pin de nuestro sensor... en las siguientes capturas podréis verlo de una forma visual.

![Que son los offsets en X e Y](https://lh6.googleusercontent.com/2pICfeL85Bf_94PrItyrp_2dNxat8Q72dytc1EBN1C1E28yD6L-7Zm5Gf3Rqnf1Cw9tTPwhQwIwRNwRdfEREayv3JCDIX7rRt-iBy1TjLkoYApA9GRefn9rr7_pnfQ0za2IheZdA)

Dependiendo de la ubicación del sensor estos valores han de indicarse como un valor positivo o negativo... en la siguiente imagen, sacada del fichero de configuración de Marlin, puede aclararnos como identificar si es uno u otro.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FVG5qqMgE4RjDQCXCpD7u%2Fimage.png?alt=media&amp;token=0cc5a0d9-7f4e-4a3a-bd93-44b0634c1ee2" alt=""><figcaption></figcaption></figure>

Entendiendo del diagrama anterior que FRONT es el frontal de nuestra impresora y N nuestro sensor tomaremos los numeros 1 2 3 4 como posibles ubicaciones de nuestro sensor y dependiendo de ello usaremos de Example en cada caso para obtener si el valor es positivo y negativo para X dependiendo del valor de right/left y en el caso de Y lo mismo pero con back/front.

Por ejemplo si nuestro sensor se encuentra en 3 usaremos la distancia offset con valor positivo (right+) para X y negativo (front-) para Y.

Otro aspecto importante a la hora de instalar el sensor es la colocacion de altura en el eja Z, en el siguiente esquema tenéis un ejemplo:

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FVW50wBO4kHZRifpBAX03%2Ftelegram-cloud-photo-size-4-5931643212563332188-x.jpg?alt=media&amp;token=ef29110f-528e-4157-9b81-590c7dffa3e1" alt=""><figcaption></figcaption></figure>

Con el pin recogido del sensor ha de quedar entre 2.3-4.3mm del nozzle en su vertical, para que al desplegar el pin durante el sondeo (6.6mm) nos aseguremos que este se activa correctamente antes de chocar el nozzle con la cama.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MfiPHF9EDNrTR4_ftJd%2F-MflwKmS9XEaE9Zy15Ta%2Fimage.png?alt=media\&token=1de446e0-54e4-4a46-9f16-c88cbd16c77b)

Por último y en referencia al offset de Z o Z-Offset es la distancia entre que el sensor se activa durante el proceso de sondeo y la punta del nozzle como podéis ver en la siguiente imágen... en todo caso no hay que preocuparse en esta fase del proceso ya que esta medida/ajuste la realizaremos más adelante en la sección de [ajuste de Z-Offset](#ajuste-z-offset).

![Que es el offset en Z](https://lh5.googleusercontent.com/yEia6h8u7jPBSNZcz3pTZ-gnSzN0y2ZXjYT6giDQI2btWuixphnl2bFLBOWnfJ_zPvZxlsMJeAc0FIw5ks9IZkDfsdnrbiWVVNE_0oB36WjFwTVSY0WWj_F6fkg7ZYMECAR1j7rP)

* Ajustamos los offsets (localización del sensor de nivelación con respecto a la punta del nozzle) del sensor de nivelación\
  **`#define NOZZLE_TO_PROBE_OFFSET…`**

{% code title="Marlin/configuration.h" %}

```cpp
 * Some examples:
 *   #define NOZZLE_TO_PROBE_OFFSET { 10, 10, -1 }   // Example "1"
 *   #define NOZZLE_TO_PROBE_OFFSET {-10,  5, -1 }   // Example "2"
 *   #define NOZZLE_TO_PROBE_OFFSET {  5, -5, -1 }   // Example "3"
 *   #define NOZZLE_TO_PROBE_OFFSET {-15,-10, -1 }   // Example "4"
 *
 *     +-- BACK ---+
 *     |    [+]    |
 *   L |        1  | R <-- Example "1" (right+,  back+)
 *   E |  2        | I <-- Example "2" ( left-,  back+)
 *   F |[-]  N  [+]| G <-- Nozzle
 *   T |       3   | H <-- Example "3" (right+, front-)
 *     | 4         | T <-- Example "4" ( left-, front-)
 *     |    [-]    |
 *     O-- FRONT --+
 */
#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 }
```

{% endcode %}

{% hint style="warning" %}
Es muy importante una vez subidos los cambios veríficar que los offsets esten correctamente cargados en la EEPROM. Esto lo podemos verificar usando el comando **M503** desde Pronterface/Octoprint o desde la propia pantalla (segun version y opciones habilitadas en Marlin) en Configuración/Avanzado/Probe Offsets. \\

En el caso que no estén cargados correctamente esros valores podemos refrescar los datos desde Pronterface/Octoprint usando **M502** **M500** o desde la pantalla de la impresora **Configuración Reset Load Save Eeprom**.

Si deseamos **cambiarlos sin tener que compilar Marlin podemos desde Pronterface/Octoprint** usar el comando **M851** y despues un **M500** (guardarlos en EEPROM) y un **M503** para verificar que se guardaron correctamente. Por ejemplo para un desfase X de -1.7 e Y -1.3 de nuestro PROBE usariamos el siguiente comando.

```gcode
M851 X-1.70 Y-1.30
```

{% endhint %}

* En el caso de tener cama de cristal con grapas/clips ajustamos el margen de seguridad para que el sensor no toque con las grapas/clips\
  **`#define MIN_PROBE_EDGE 20 // En este caso decimos 20mm de seguridad`**\
  Para versiones 2.0.6 de Marlin o superiores:\
  **`#define PROBING_MARGIN 20 // En este caso decimos 20mm de seguridad`**

{% hint style="info" %}
**Márgenes en el área de sondeo:**

A la hora de realizar el sondeo de nuestra cama Marlin calcula los puntos en base al tamaño de nuestra cama y a los offsets del sensor. Por eso es crítico/importante que tanto los offsets de la cama sean correctos (nuestro X0Y0 coincidan con el inicio de la cama y XmaxYmax con el final de esta) como los del sensor.

En cualquier caso en ocasiones nos interesa disponer de más o menos márgenes para la zona de sondeado... por ejemplo si nuestro sensor dispone de un punto de sondeado grueso que pueda quedar fuera de márgenes o si disponemos de clips para sujetar nuestra superficie de impresión. En estos casos contamos con dos valores que nos pueden interesar conocer y en que afectan exactamente:

* PROBING\_MARGIN : este valor aplica un margen sobre los valores calculados del área de nuestra cama + los offsets del sensor. En la práctica, que si ponemos a 0 sondeará justo en los limites de nuestra cama pudiendo ser un riesgo.

* MESH\_INSET: al igual que el anterior aplica un margen pero en este caso sería un margen extra al área calculado sobre PROBING\_MARGING.\
  Por ejemplo si configuramos un PROBING\_MARGING de 10 (mm) solamente e imaginando que no tenemos offsets en nuestro sensor (algo poco probable pero lo usamos para que se entienda el concepto de forma más sencilla) el primer punto de sondeo será sobre X10Y10.\
  Si además de PROBE\_MARGIN usamos MESH\_INSET con un valor de 5 (mm) el primer punto de sondeo será X15Y15.
  {% endhint %}

* Para una mayor resolución en las medidas del sensor podemos habilitar que realice diferentes medidas en un mismo punto\
  **`#define MULTIPLE_PROBING 3 // Realizar tres medidas en cada punto`**

* Para poder encontrar el Z-offset que necesitaremos más adelante y para el cual tenemos varios métodos es interesante poder bajar nuestro eje Z por debajo de su límite. Para ello podemos comentar la siguiente línea de Marlin:

  **`// #define MIN_SOFTWARE_ENDSTOP_Z // Permite mover el nozzle por debajo de 0 en Z`**

{% hint style="danger" %}
**Aconsejamos realizar este cambio solamente si eres un usuario avanzado ya que puede ser peligroso no deshabilitar los limites de la máquina.**

**Es preferible usar el proceso de Z-Offset desde el** [**Wizard**](#ajuste-del-z-offset-wizard) **o desde** [**Pronterface**](#ajuste-del-z-offset-pronterface).
{% endhint %}

* Para sensores tipo BlTouch es necesario invertir el funcionamiento de final de carrera\
  **`#define Z_MIN_PROBE_ENDSTOP_INVERTING false`**

{% hint style="info" %}
Este valor para **`Z_MIN_PROBE_ENDSTOP_INVERTING puede variar dependiendo de que versión de Marlin usemos y dependiendo de la configuración puede tener que tener su valor sincronizado con el de Z_MIN_PROBE_INVERTING en ambos casos el SanityCheck de Marlin nos avisará de este ajuste al compilar.`**
{% endhint %}

* Por seguridad y teniendo en cuenta la localización del sensor es aconsejable que el homing en Z se realice en el medio de la cama\
  **`#define Z_SAFE_HOMING`**
* Es importante habilitar esta linea dado que un G28 desactiva el autonivelado, de esta forma no lo hará\
  **`#define RESTORE_LEVELING_AFTER_G28`**
* Podemos habilitar el comando G26 que nos permite lanzar un test de nivelación directamente sin necesidad de generar ninguno desde nuestro slicer, algo muy útil para un test rápido. Dentro de las opciones del G26 podrás ajustar los parámetros básicos de impresión **`#define G26_MESH_VALIDATION.`**\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FfS0fSqnjtzR5GSdwkFih%2Fimage.png?alt=media\&token=9833535c-a59d-4cc9-92ba-bcc8039b4a71)\
  **En el siguiente** [**link de la documentación de Marlin sobre G26**](https://marlinfw.org/docs/gcode/G026.html) **podéis encontrar como añadir parámetros al lanzar el gcode G26 para ajustar el test o podéis hacerlo desde las fuentes para poner la configuración por defecto:**

{% code title="Marlin/configuration.h" %}

```cpp
  /**
   * Enable the G26 Mesh Validation Pattern tool.
   */
  #define G26_MESH_VALIDATION
  #if ENABLED(G26_MESH_VALIDATION)
    #define MESH_TEST_NOZZLE_SIZE    0.4  // (mm) Diameter of primary nozzle.
    #define MESH_TEST_LAYER_HEIGHT   0.2  // (mm) Default layer height for G26.
    #define MESH_TEST_HOTEND_TEMP  205    // (°C) Default nozzle temperature for G26.
    #define MESH_TEST_BED_TEMP      60    // (°C) Default bed temperature for G26.
    #define G26_XY_FEEDRATE         20    // (mm/s) Feedrate for G26 XY moves.
    #define G26_XY_FEEDRATE_TRAVEL 100    // (mm/s) Feedrate for G26 XY travel moves.
    #define G26_RETRACT_MULTIPLIER   1.0  // G26 Q (retraction) used by default between mesh test elements.
  #endif

#endif
```

{% endcode %}

* Es muy útil y necesario habilitar las opciones de nivelación en el LCD\
  **`#define LCD_BED_LEVELING`**

{% hint style="warning" %}
***LCD\_BED\_LEVELING*** no es compatible con pantallas que no usan modo Marlin, en el caso que de error de compilación se deberá de deshabilitar.
{% endhint %}

* **Seleccionar el método de nivelado a usar**, **descomentar solamente una de las líneas solamente**:

{% code title="Marlin/configuration.h" %}

```cpp
//#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR
#define AUTO_BED_LEVELING_BILINEAR // Sistema de nivelacion simple
//#define AUTO_BED_LEVELING_UBL // Sistema nivelacion mas avanzado
//#define MESH_BED_LEVELING
```

{% endcode %}

{% hint style="info" %}
**UBL es el sistema de nivelación más avanzado y aconsejable de Marlin**, en especial y creemos que de uso obligatorio para camas con un tamaño superior a 235x235.

Dado que el proceso de configuración y ajuste requiere de algunos pasos extras podéis encontrar una [**guía específica UBL aquí**](/marlin/configuracion-marlin/nivelacion/nivelado-ubl-unified-bed-leveling).
{% endhint %}

{% hint style="success" %}
En esta guía y dado que el objetivo es la configuración del sensor y el tipo de nivelado va a depender de las necesidades de cada uno usaremos BILINEAR como ejemplo para simplificar el proceso.

Aunque recordamos de nuevo que usar UBL es siempre aconsejable por sus ventajas.
{% endhint %}

* Tal como hemos comentado, y para simplificar esta guía vamos a utilizar el mallado BILINEAR como ejemplo... podemos ajustar el tamaño de nuestra malla ajustando GRID\_MAX\_POINTS donde podremos indicar los puntos de sondeo por eje... el número de puntos totales será el resultado de multiplicar ambos valores:

```cpp
#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)

  // Set the number of grid points per dimension.
  #define GRID_MAX_POINTS_X 3
  #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
```

{% hint style="info" %}
Dependiendo del estado de vuestra cama es más o menos aconsejable añadir más o menos puntos, en todo caso y por nuestras preferencias entendiendo el uso en una máquina con una cama bien mecanizada:

* camas > 220x220 utilizar al menos 3 puntos por eje

* camas = > 220x220 utilizar al menos 5 puntos por eje

* camas = > 300x300 utilizar al menos 7 puntos por eje
  {% endhint %}

* Otro valor interesante es el de ajustar hasta que punto de la impresión se realizarán las correcciones, por defecto Marlin aplica estas correcciones en los primeros 10mm pero dependiendo de las necesidades se puede ajustar asegurando que habilitamos

{% code title="Marlin/configuration.h" %}

```cpp
#define ENABLE_LEVELING_FADE_HEIGHT
```

{% endcode %}

![](https://lh3.googleusercontent.com/4gh4NwC0kjGEfpy7iiS9xGEaw8IMMe2kt8OvGRVn5lwH0JM-rWEmFnHI6kY7jUSbpfo4S7trK9iK14NM6DRTs1ysMwH1e5r3G--kzj4V2KMiCUnUKCzArgT5J0-uQpLoOcNQBdP2)

![](https://lh6.googleusercontent.com/k9AzQIyVbu4dEixRRkGHPK8oXlUlGAeaGC9VFd4Fv1tUQCS2Zb2g_Pv0n59xujlY1gp6OVjyjJM7DX9rtSJhmdP7dsvES1l9cZtH9WCgEFo9iiWWEdlNmWrm-VwPTAx9OQy0XUdB)

* **Habilitar el homing por eje**, muy útil para ver que cada eje funciona correctamente en el proceso de homing

{% code title="Marlin/configuration.h" %}

```cpp
#define INDIVIDUAL_AXIS_HOMING_MENU
```

{% endcode %}

### Activar asistentes de nivelación de cama manual asistido por el sensor

Otro cambio muy interesante e útil es la activación del nivelado mediante sensor/probe en el asistente de nivelación de cama de 4 esquinas que nos ayudará a dejar nuestra cama de una forma sencilla y fiable lo más recta posible.

Actualmente diponemos de dos tipos de asistentes que pueden ser más adecuados o no dependiendo de nuestra impresora y sensor.

**Nivelado de cama usando la activación del sensor**, en este caso nuestro sensor toma la lectura de uno de las esquinas y la usa como referencia para ajustar el resto de esquinas... en este caso movera a cada una de las esquinas y moveremos manualmente las ruedas hasta que active el sensor y de por buena la nivelación de ese punto.

* Para versiones de Marlin anteriores a la 2.0.9.x:

{% code title="./Marlin/configuration.h" %}

```cpp
#define LEVEL_BED_CORNERS
...
#define LEVEL_CORNERS_INSET_LFRB { 45, 45, 45, 45 }
...
#define LEVEL_CORNERS_USE_PROBE
```

{% endcode %}

* Para versiones de Marlin posteriores a la 2.0.9.x

{% code title="./Marlin/configuration.h" %}

```cpp
#define LCD_BED_TRAMMING
...
#define BED_TRAMMING_INSET_LFRB { 45, 45, 45, 45 }
...
#define BED_TRAMMING_USE_PROBE
```

{% endcode %}

{% hint style="warning" %}
Es **necesario ajustar las coordenadas donde se realizará el test** de las 4 esquinas para que al compilar no genere un error.\
Primero **revisaremos el valor que tenemos en los offsets de nuestro sensor/probe**, tomamos el siguiente como ejemplo:

```cpp
#define NOZZLE_TO_PROBE_OFFSET { 35, 5, -0.799 } 
```

A continuación **cogiendo como referencia el valor absoluto mayor en los offsets del sensor/probe para los ejes X e Y de la anterior linea le sumaremos 5**, en nuestro caso 35+5=40 y colocaremos ese valor en la siguiente linea:

```cpp
#define LEVEL_CORNERS_INSET_LFRB { 40, 40, 40, 40 } -> Marlin > 2.0.9.x
```

```cpp
#define BED_TRAMMING_INSET_LFRB { 40, 40, 40, 40 } -> Marlin < 2.0.9.z
```

Esto es una sugerencia de cálculo rápido y válido para el cálculo para las 4 esquinas con sensor aunque dependiendo de la máquina puede variar, es importante entender que ese punto que elijamos para las 4 esquinas el sensor de nivelación quede dentro de la cama ya que las coordenadas hacen referencia a la punta del nozzle
{% endhint %}

**Nivelado de cama usando las lecturas del sensor**, en este caso nuestro sensor toma la lectura de uno de las esquinas y la usa como referencia para ajustar el resto de esquinas... a diferencia del anterior en este caso el asistente pasa por las diferentes esquinas y podemos realizar lecturas de ese punto y vamos ajustando a mano hasta ajustar al valor más ajustado que podamos.

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define ASSISTED_TRAMMING
...
#define TRAMMING_POINT_XY { {  20, 20 }, { 180,  20 }, { 180, 180 }, { 20, 180 } }
...
#define REPORT_TRAMMING_MM
...
#define ASSISTED_TRAMMING_WIZARD
```

{% endcode %}

{% hint style="warning" %}
Al igual que con LEVEL\_CORNERS\_INSET\_LFRB deberemos ajustar las coordenadas de TRAMMING\_POINT\_XY correctamente para nuestra impresora.\
Las coordenadas son las físicas de nuestros tornillos de ajuste pero teniendo en cuenta nuestro offset del sensor así que tendremos que ajustar en el caso que al aplicar esos offsets quede fuera la coordenada de nuestra área de impresión.\
Tenéis, **como referenci**a, una calculadora [aquí](https://docs.google.com/spreadsheets/d/13HRMthbNTPspwKwkEIWNmPAaOoeO86hTfnx7uR3Jrwc/edit?usp=sharing) que podéis encontrar más abajo.
{% endhint %}

{% embed url="<https://docs.google.com/spreadsheets/d/13HRMthbNTPspwKwkEIWNmPAaOoeO86hTfnx7uR3Jrwc/edit?usp=sharing>" %}

{% hint style="info" %}
Asistente de Tramming o nivelado de cama manual asistido por sensor:

Desde Marlin 2.0.6 disponemos del asistente para nivelado manual de cama asistido por nuestro sensor de nivelación. Este asistente toma medidas de nuestra cama y nos devuelve la corrección a aplicar sobre las ruedas de nivelación para un ajuste óptimo.

Al activarlo dispondremos de una nueva opción en nuestra pantalla para lanzar el asistente pero... y si no disponemos de una pantalla o esta no es compatible?

Podremos mediante Pronterface, u otro cliente terminal como Octoprint, lanzar el comando `G35` que realizará el proceso y nos mostrará por consola los ajustes a realizar:

<img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F6BeqzmsYjn0oxgR7iC0A%2Fimage.png?alt=media&amp;token=c10057a1-6471-40f3-86ee-5cf0ce8fdbf1" alt="" data-size="original">

Es importante que al lanzar el comando indiquemos el parámetro S que añadiendo el valor de la métrica de nuestro tornillo (3 para M3, 4 para M4 y 5 para M5) seguido del sentido de la rosca (0 sentido horario CW, 1 sentido anti-horario CCW).

<https://marlinfw.org/docs/gcode/G035.html> para más información
{% endhint %}

### **Otros cambios en configuration\_adv.h**

* Es aconsejable aumentar el tiempo de respuesta para evitar problemas de comunicaciones en sensores clones especialmente, para sensores originales revisa la documentación del fabricante:\
  **`#define BLTOUCH_DELAY 500`**
* Otra funcion interesante a activar para prevenir problemas de comunicación en el caso de cables no apantallados o muy largos es forzar el modo SW que permite el enviar pulsos más largos mejorando ruido en las señales\
  **`#define BLTOUCH_FORCE_SW_MODE`**
* Es aconsejable activar reintentos en el proceso de generacion de malla G29 para prevenir problemas durante el proceso (**esta función puede no ser compatible con todos los sistemas de nivelación como por ejemplo UBL**)\
  **`# define G29_RETRY_AND_RECOVER`**

### **Activar Babystepping**

Esta funcionalidad es muy útil para un ajuste fino durante la impresión de la altura del eje Z\
En configuration\_adv:

{% code title="Marlin/configuration\_adv.h" %}

```cpp
#define BABYSTEPPING
...
#define DOUBLECLICK_FOR_Z_BABYSTEPPING
...
#define BABYSTEP_DISPLAY_TOTAL
```

{% endcode %}

## **Comprobaciones previas y resolución de problemas**

Es más que aconsejable que antes de intentar cualquier movimiento con nuestra máquina realicemos unas comprobaciones previas para asegurarnos que todo funciona correctamente y no llevarnos algún susto o dañar nuestra máquina.

{% 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 %}

* **Comprobación del sensor**:
  * **Revisar la parte SERVO**, la parte servo funciona con el grupo de tres cables (rojo/amarillo/negro). Para comprobar si funciona correctamente lo aconsejable es desde la pantalla ir a Configuración donde encontraremos un menu para gestionar el bltouch.\
    Tambien se puede hacer esta parte con gcode desde un terminal:

{% code title="Pronterface/Terminal" %}

```gcode
M280 P0 S10 ; despliega el pin
M280 P0 S90 ; recoge el pin
M280 P0 S120 ; Autotest – despliega y recoge el pin hasta que ponemos el dedo o lanzamos el comando posterior
M280 P0 S160 ; Elimina estado ALARMA
```

{% endcode %}

{% hint style="success" %}
En este caso, si nos falla la parte SERVO, tenemos que comprobar que podamos desplegar y recoger el pin manualmente.\
Si manualmente funciona pero no funciona lanzando los comandos deberemos revisar el cableado o en el caso de placas antiguas la definición del SERVO en Marlin.\
También se puede dar el caso de que nuestro pin del sensor no mantenga el imán en buenas condiciones y sea necesario imantarlo de nuevo. Tienes un video del proceso mas abajo.
{% endhint %}

* **Comprobación de la parte ENDSTOP**, la parte endstop funciona como cualquier endstop y esta gestionado por el par de cables negro y blanco que normalmente colocamos en el puerto PROBE o Z-STOP/Z-MIN de la placa.\
  Dependiendo de las versiones de Marlin debera colocarse en uno o en otro si esta soportada la placa o no completamente.\
  Para comprobar que funcione correctamente y tal como hicimos en el paso anterior mediante el menu o comandos desplegamos y recogemos el pin y comprobamos con M119 que el enstop cambia de TRIGERED (pin recogido) a OPEN (pin desplegado) correctamente.

{% hint style="success" %}
En el caso que la parte servo funcione correctamente y el estado del ENDSTOP no sea el correcto, normalmente el pin vuelve a recogerse automáticamente al detectar el sistema que no detecto ese cambio de estado, deberemos fijarnos principalmente en dos cosas:

* orden correcto del cableado de la parte endstop en nuestra electrónica, te recuerdo que tiene polaridad y el pin GND y SGN tienen que ir donde toca

* incorrecta configuración de nuestro firmware si hemos indicado que use ZMIN o PROBE como pin de señal endstop y colo camos el cableado donde no taca. En este caso podemos ajustar el firmware o el cableado según sea oportuno.
  {% endhint %}

* **Activar Modo Debug nivelado**\
  El modo debug para el nivelado se tiene que activar solo en caso de problemas con el proceso de nivelación si no es el caso puedes obviar este punto.\
  *Cambios en Marlin (configuration.h):*\
  `#define DEBUG_LEVELING_FEATURE // Permite obtener información detallada en caso de problemas`\
  *Comandos gcode para habilitar/deshabilitar el modo Debug:*\
  M111 S38 ; LEVELING, ERRORS, INFO\
  M111 S0 ; Disable debug

* **Activar Test de precisión**\
  Permite habilitar un menú dentro del LCD para realizar tests de repetitibilidad y mostrar el rango de precisión del sensor:\
  \#define Z\_MIN\_PROBE\_REPEATABILITY\_TEST

* **Verificar ajuste del pin para errores aleatorios en lecturas**\
  Se pueden dar dos casos que el pin este demasiado junto al servo que imanta el mismo y evite que caiga o que el imán del pin no tenga la suficiente tracción por el estado de su imán para que el servo lo pueda imantar y retraer.\
  En estos casos mediante el tornillo central podremos ajustar ambos problemas en la medida de lo posible.\
  Por otro lado en el caso que el pin este totalmente sin iman puedes extraerlo y dejarlo 24h junto con otro imán para que recupere sus propiedades... en caso que ninguna de estas soluciones funcione puedes solicitar un repuesto del pin o del propio sensor.\
  Puedes ver el siguiente video donde puedes ver como es el proceso

{% embed url="<https://youtu.be/wq5QmN-MIJA>" %}

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FpbF4UKladfsVSlaxwfS2%2Fimage.png?alt=media&amp;token=e5848981-553e-4add-b6dc-db4f22c0e7da" alt=""><figcaption><p>Ejemplo para un Bltouch v3.x de Antclabs</p></figcaption></figure>

* **Nuestro eje X se encuentra 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://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FvHDTffIWEZPpa0Px9Djz%2Ftelegram-cloud-photo-size-4-5798463668353088688-y.jpg?alt=media\&token=7652dfc7-85cd-4f1d-8a64-6c754dd82aa7)\
  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.\
  En Marlin contamos con **X\_AXIS\_TWIST\_COMPENSATION (M423)** con el cual podremos compensar estas desviaciones para que no afecten a nuestro sondeo de cama con el sensor.\
  Una vez activada en nuestro Marlin esta función podremos lanzar el asistente para el ajuste el cual os aconsejamos usar una galga metálica en lugar de un trozo de papel ya que va a ser más fiable el proceso.

## **Ajuste Z-Offset**

El z-offset es la distancia entre que se activa el endstop del sensor y la punta del nozzle + margen de seguridad (tal como hacemos con el test del papel al nivelar manualmente).

Para encontrar y ajustar nuestro z-offset tenemos diferentes procedimientos que podemos seguir, a continuación os explicamos los más comunes.

**En todo caso os sugerimos por simplicidad y siempre que vuestro firmware lo soporte o podamos activarlo usar el Wizard de Z-Offset de Marlin.**

### **Ajuste del Z-Offset - WIZARD**

Desde la version 2.0.7.2 Marlin incluye un nuevo asistente para encontrar el valor Z Offset de una forma sencilla. Para activarlo iremos a configuration\_adv y habilitaremos:

**`#define PROBE_OFFSET_WIZARD`**

Con esto dispondremos de un nuevo menu en Configuración/Avanzado/Probe Offsets

{% embed url="<https://www.youtube.com/watch?v=2gRfU26aTDs>" %}

### **Ajuste del Z-Offset - LCD**

* Realizaremos un Auto Home

![](https://lh4.googleusercontent.com/O3_2XDPXKbzpRQQqKDeGKUMzsofDmuDehM0nLqk8-ZGGHqT60aZUAjyVo_kxb89AnmyN5iTYRvd1otIS10OsUpSRmJm-2ChpUUZhRhMTh0XJb-bLyM4E6r1giNzPXfmRlm8IANzV)

* Para verificar que todos los valores anteriores de offset son correctos nos fijaremos que el home se realiza en el centro de la cama con el sensor de nivelado en el centro de la misma.

{% hint style="info" %}
En el caso que no quede perfectamente centrado:

* verifica que los offsets de tu sensor configurados en\*\*`NOZZLE_TO_PROBE_OFFSET`\*\*

  estan correctamente cargados en la **EEPROM** tal como indicamos en la modificación de Marlin para esa variable
* confirma que tus coordenadas **X0Y0** coincidan exactamente con el **inicio de la cama** y **Xmax Ymax** coinciden exactamente con el **final de la cama**
* asegurate que **no has modificado** las formulas de la función **SAFE\_HOMING** que por defecto usa el tamaño de tu cama en cada eje /2
  {% endhint %}

![](https://lh6.googleusercontent.com/2JGxz5P78FqGo0iFFUs09BtgyXgWUhlHh-yVS5Werzzsga1U8mGHuNii8xA3K6SI6f66JJXhpaxM1HuhHRSs-kgqC8WYD3qCa8MX-sX9lLJvx59Z0W1I4iYUo09AHEE0ePTk1iPi)

* Ajustaremos la temperatura del nozzle y cama a las temperaturas normales de impresion y volvemos a realizar un autohome

![](https://lh6.googleusercontent.com/cpq_A4DJ58YLK0bjNoCQqLzuZFwdDUv0wIaM8DkcPUvpFtXNsc42bEYZeU42D_eW1w7W7j0dbPP2q6nShjMeUafBB7WTN4eOQX87hlciqNpect2GVIzTuGS3Nm6Kojn9ZvtQvPVe)

* Vamos al menu de movimiento para el eje Z y seleccionamos movimientos de 0.1mm y bajamos hasta el punto donde mediante un folio notemos que roza suavemente con la punta del nozzle

![](https://lh5.googleusercontent.com/_6u57CffxMb1k9DU-TdoSJsafRxGGQCt9CQB0je6ymHWTz2__NeT0Cjm2XGXbcdM0Cu2KUIcNnIhhy6hmd3rLtof05dOPdsZWgLWztT21Ru0PjL_GzO3dCB74duEBwoy5nV4FrRd)

![](https://lh5.googleusercontent.com/d_xsDJvaS3W9VKBll-iRDd2QYy-4YeEAFcxmM5Vu2FqxgdiVK1WwzOGzg0fzDVWIK5l9tXD9GKAeqqE6t_sgclat5YY7HBfha0AAZjhRoSfKBXl0BBWtCRUZ5gMkpXHTu9wu2CW9)

* En el punto donde encontremos que el folio y la punta del nozzle estan correctos anotaremos el valor que aparece en pantalla para el eje Z el cual debería de ser negativo para sensores bltouch, este valor lo ajustaremos en el menú Z Offset del LCD dentro de Configuracion y dentro de este mismo menu guardaremos en EEPROM y es ideal apuntar este valor en nuestro fichero configuration.h en el #define NOZZLE\_TO\_PROBE\_OFFSET

![](https://lh5.googleusercontent.com/Cf6SH2dZ4-8IncQ9q6kk_Pl7leRcDP_nXEzFcmGCUvr6BSM4YCJyRcoVJBwqAUJG8g3JwhBenfxuUnSzLBR0VdBfGnAfoLRidNboPx6zeBaWMMxEZGomhwUWx7cWk33qXsaOwgWn)

* Realizaremos un test de nivelado (G29) desde la pantalla en Movimiento/Nivelado de Cama/Nivelar Cama

![](https://lh4.googleusercontent.com/4FMD5yyOPAUhdvUyJAho_0LO0UZvDz-8jda1ESop5iwyoMV8PUf0N7G_3gNqxok_dPE16mh12mKZ1ZoP7In7CsHzeNvL51v1FPZHj2QleACDE56gwFMjvT8wH4kp_dPYrBGjNfYS)

![](https://lh4.googleusercontent.com/AU5QmIzuQlype4oIRqcelIsCY9FevslqDZJaPbPmJLU_hZoJeude1epUiMTpx2-L2NNUrsyz7sjPehvXMOT90POW4lVAnJFXebxBQFxsXQoGq0nym-6jISIOYcSohFSEfSplSAFJ)

### **Ajuste del Z-Offset - Pronterface**

En ocasiones puede que nuestra pantalla de la impresora no funcione o no disponga de funciones para mostrar el asistente/wizard o que no sea cómodo realizar el proceso anterior.

Para estos casos podemos desde un cliente terminal como [**Pronterface**](/marlin/troubleshooting-marlin/pronterface):

* **Calentaremos cama y fusor a las temperaturas de impresión habitual**, idealmente dejar que se estabilicen esas temperaturas durante unos minutos.
* **Ajustaremos el z-offset a 0** mediante el comando `M851` y seguidamente **guardaremos en EEPROM** con `M500`:

```gcode
M851 Z0    ; Set z-offset to 0
M500       ; Save to EEPROM
```

* **Realizaremos un homing** usando el comando `G28`
* Mediante los controles de movimiento en **Pronterface ajustaremos el eje Z hasta que se encuentre en la coordenada Z0**, recuerda ajustar la escala de movimientos al menos a 1mm.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FrzVcrsTqkOkAxgsRYV2F%2Fimage.png?alt=media\&token=88e72ae9-8e14-4619-9566-278705520d53)

* **Marlin cuenta con protecciones llamadas software endstops**, que previenen que podamos mover los motores en coordenadas fuera de rango, las cuales **deberemos deshabilitar para poder movernos a coordenadas negativas**. Enviando el comando `M211 S0` deshabilitaremos los software endstops.
* Volveremos a los controles de movimiento en Pronterface, importante ajustar la escala en 0.1, y con un folio o una galga (0.1) bajar el eje Z hasta que la boquilla roce.
* Una vez tengamos la coordenada deseada de Z revisaremos nuestra pantalla o Pronterface para obtener ese número. Por ejemplo en nuestro caso hemos obtenido un valor de -1.48mm con lo que usaremos los siguientes comandos para aplicar ese valor como z-offset, habilitaremos los software endstops y por último guardaremos EEPROM:

```gcode
M851 Z-1.48 ; Apply z-offset values
M211 S1     ; Enable software endstops
M500        ; Save to EEPROM
```

* Es aconsejable, para evitar perder este valor en futuros cambios, ajustar el z-offset en tus fuentes de Marlin en :

{% code title="Marlin/configuration.h" lineNumbers="true" %}

```cpp
#define NOZZLE_TO_PROBE_OFFSET
```

{% endcode %}

## Script de inicio (Comandos GCODE)

Deberás añadir la función de autonivelación al principio de cada impresión. Eso se hace muy fácilmente configurándose en tu Slicer favorito (Repetier, Simplify3D, Cura, etc.). Simplemente es añadir el comando G29 para nivelar vuestro cabezal antes de cada impresión.

Os dejo un ejemplo de mi script de inicio en cada impresión usando BILINEAR como sistema de nivelación:

```gcode
G28          ; Efectuar HOME en todos los ejes
G29          ; Comando de nivelar cabezal
```

En todo caso os aconsejamos revisar la [**Guia de Calibración Inicial**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md) ya que contiene un script de inicio completo con todas las opciones completas.

## Visualizar nuestra malla de nivelación

Como ya os hemos explicado la instalación de un sensor de nivelación nos va a permitir realizar mediciones del estado de nuestra plataforma de impresión para identificar desviaciones y así durante la impresión, normalmente de primeras capas, compensar estas desviaciones para tener esas primeras capas perfectas.

Estas mediciones se llaman "malla de nivelación" (mesh en inglés) y básicamente contiene las medidas del sensor en diferentes puntos de nuestra plataforma de impresión.

### Porqué es importante visualizar esta malla de nivelación?

* nos va a permitir identificar si nuestra cama esta correctamente nivelada, mediante los tornillos de ajuste manual que suelen llevar
* identificar problemas en nuestra superficie para compensarlos con un mallado de nivelación más efectivo con más puntos de test o [nivelado adaptativo/inteligente](/marlin/configuracion-marlin/nivelacion/mallado-de-cama-inteligente-prusaslicer)

### Como obtener nuestra malla de nivelación?

Tenemos diferentes opciones para obtener nuestra malla:

* M503, si hemos realizado una nivelación (G29) y guardado en la EEPROM esta mediante este gcode M503 lanzado desde un cliente serial como un ordenador ([Pronterface](/marlin/troubleshooting-marlin/pronterface)) o host ([Octoprint](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md)) conectado a nuestra impresora:

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FHUkoYQJjxKhPoImKMRKB%2Fimage.png?alt=media&amp;token=da248c6b-b763-4b6e-807c-ec69d9c102cf" alt=""><figcaption><p>Ejemplo de M503 y la información de nuestra malla de nivelación</p></figcaption></figure>

* G29 T, este comando nos va a devolver también nuestra malla de nivelación pero en este caso de una forma más legible. Normalmente el punto \[0,0] es el primer punto de nuestra malla que sería en la parte frontal izquierda de nuestra cama, por otro lado cada fila representa el eje Y (del frontal hacia la parte trasera) y cada columna representa el eje X (de izquierda a derecha).

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FxWUGbUF7RtVZUw3c7UmV%2Fimage.png?alt=media&amp;token=18ff68e1-2e0e-4119-8a9a-61160c54ee3f" alt=""><figcaption><p>Ejemplo de G29 T</p></figcaption></figure>

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F46sioUsm5ybU2UNsP53Y%2Fimage.png?alt=media&amp;token=10cf5a99-cce0-4b10-b109-c1e807647dda" alt=""><figcaption></figcaption></figure>

### Visualizar nuestra malla

En este caso podemos visualizar nuestra malla de formas diferentes:

* Analizando el M503 o G29 T, os aconsejamos este último por simplicidad.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FDNA4BVhgXAhzv5tUAyTA%2Fimage.png?alt=media&amp;token=1d9bb678-4a56-45d9-96f8-7e21602d8503" alt=""><figcaption></figcaption></figure>

* Usando un visualizador online, como el del compañero ChillRain que podéis acceder desde [aquí](https://i.chillrain.com/index.php/3d-printer-auto-bed-leveling-mesh-visualizer/), donde básicamente copiaremos el resultado del G29T:\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FdvwdKig4fOprUkFdQUAG%2Fimage.png?alt=media\&token=9914b23a-0b11-4096-961c-2d886236e364)\
  Y podremos obtener una imagen 3D de los datos:\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FK1cJIjENAT7HOYeOmVNJ%2Fimage.png?alt=media\&token=4e43f1ba-d2a9-49ff-ba49-2ab1d4059373)
* [Octoprint](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md), si utilizamos un host como Octoprint tenemos plugins como Bed Visualizar que ejecutará los gcode necesarios y nos creará la visualización 3D:\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FzIbvLtyThH8Gd45XWBOp%2Fimage.png?alt=media\&token=6dfab3da-3918-4233-8238-b6b1a4340da1)


# PINDAv2/Inductivos

Tener instalado un sensor de Nivelación nos permite asegurar unas primeras capas perfectas sin tener que estar ajustando manualmente nuestra mecánica.

En este caso usaremos un PINDAv2 que es un sensor que incluye un thermistor que nos permite compensar uno de los puntos débiles de este tipo de dispositivos, la precisión en las lecturas con temperatura.

Otro hándicap es el rango de detección ya que normalmente no son capaces de detectar a través de bases de cristal muy gruesas.

Por el contrario una de sus grandes ventajas es que dado que no disponen de partes móviles como sensores estilo Bltouch son mucho más robustos y menos dados a tener fallos por uso intensivo.

Os recordamos que tienes mas guias de ayuda en nuestro bot de Telegram [@ThreeDWorkHelpBot](https://t.me/ThreeDWorkHelpBot)

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

{% 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/32919682669.html>" %}
{% endtab %}
{% endtabs %}

## Esquemas de conexión

Este tipo de sensores dada su simplicidad se conectan de forma normal en el conector Z- en sustitución del final de carrera. De todas formas y para alguna de las placas que disponemos puede ser aconsejable conectarlas en una ubicación diferente:

{% tabs %}
{% tab title="Fysetc Spider" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MbBdlXXWHCr1Sg1HFUi%2F-MbGvWbgDI78uhSLvK77%2Fimage.png?alt=media\&token=babaeaac-479f-45ca-8e16-7b26bfac2a60)

{% hint style="success" %}
Esta placa cuenta con un arsenal de conexiones aunque podemos conectar en sus múltiples pines es aconsejable realizarlo en Z+ dado que dispone de la posibilidad de alimentación con diferentes voltajes de forma sencilla y además de disponer de un conversor en la entrada de señal para su pin que traduce las señales de cualquier voltaje al 3.3v requerido internamente.
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
En el caso que uséis **Klipper** como firmware para vuestra impresora podéis acceder a esta [**guía específica**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md).
{% endhint %}

## **Cambios en Marlin**

* Si nuestro sensor de nivelación de cama se encuentre en el conector del final de carreras Z-MIN/Z-STOP dependiendo de la placa habilitaremos lo siguiente:\
  **`#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN // 3DWORK PINDAv2`**\
  En el caso que nuestra placa disponga de un conector especial para el endstop del sensor, necesitemos instalarlo en otro conector y dependiendo de la versión de Marlin usada (normalmente 2.0.7.x ya soporta la mayoria de placas actuales)\
  **`#define USE_PROBE_FOR_Z_HOMING // 3DWORK PINDAv2`**\
  Si nuestro fichero pin de nuestra placa no contempla la definicion del PROBE\_PIN deberemos definirla aqui (XX sera el pin usado):\
  **`#define Z_MIN_PROBE_PIN XXX // 3DWORK PINDAv2`**
* Indicamos el tipo de sensor de nivelación\
  **`#define FIX_MOUNTED_PROBE // U1JO PINDAv2`**
* Ajustamos los offsets (localización del sensor de nivelación con respecto a la punta del nozzle) del sensor de nivelación\
  **`#define NOZZLE_TO_PROBE_OFFSET…`**

![Se aconseja dejar 1-2mm entre el punto Z0 y el sensor PINDAv2](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MbBdlXXWHCr1Sg1HFUi%2F-MbH0RjiIFVD5GhcyOrU%2Fimage.png?alt=media\&token=cee9fb80-e6db-422f-9bfa-5aaace080772)

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MflwP_JCncfwugKQXP4%2F-MflwY3Tm_GXtSdjE7of%2Fimage.png?alt=media\&token=f997e7c6-298b-436c-a884-e09ad8046bbc)

![](https://lh6.googleusercontent.com/MIzOshOTC8vslx7nFkpDWoTm5BKDquaQ_hJwKyiYPGruNr0namQnSjOnOyM8Je0da4-NwVCrvlhtlb4eoG0aHlpLdhnQwWLP0tRkS8zFHY32IVg6mupLJPvBN9IkwKY_fgUOdDQO)

![](https://lh3.googleusercontent.com/LJVKD2x3FXgO03Pb9lZPsqnFR0J55nJIRInl-DhLDFLwkQ6nGK82BTbbNAY3KkeKR1EBlVMzHT2lOkQ1ZxFXA0yS3KEvrPe9_HEjCA4Vf86E_dU6zxTLSzX91XIYGu1vR2NI_gkv)

> Es muy importante una vez subidos los cambios veríficar que los offsets esten correctamente cargados en la EEPROM. Esto lo podemos verificar usando el comando **M503** desde Pronterface/Octoprint o desde la propia pantalla (segun version y opciones habilitadas en Marlin) en Configuración/Avanzado/Probe Offsets. \\
>
> En el caso que no estén cargados correctamente esros valores podemos refrescar los datos desde Pronterface/Octoprint usando **M502** **M500** o desde la pantalla de la impresora **Configuración Reset Load Save Eeprom**.
>
> Si deseamos **cambiarlos sin tener que compilar Marlin podemos desde Pronterface/Octoprint** usar el comando **M851** y despues un **M500** (guardarlos en EEPROM) y un **M503** para verificar que se guardaron correctamente. Por ejemplo para un desfase X de -1.7 e Y -1.3 de nuestro PROBE usariamos el siguiente comando
>
> ```
> M851 X-1.70 Y-1.30
> ```

* Ajustamos el tipo de nivelación automática, inicialmente durante la instalación del sensor de nivelación se aconseja usar BILINEAR pero el aconsejable para dejar en nuestra impresora es UBL que se puede encontrar en esta misma guía el proceso de configuración\
  **`#define AUTO_BED_LEVELING_BILINEAR`**
* En el caso de tener cama de cristal con grapas/clips ajustamos el margen de seguridad para que el sensor no toque con las grapas/clips\
  **`#define MIN_PROBE_EDGE 20 // En este caso decimos 20mm de seguridad`**\
  Para versiones 2.0.6 de Marlin o superiores:\
  **`#define PROBING_MARGIN 20 // En este caso decimos 20mm de seguridad`**

{% hint style="info" %}
**Márgenes en el área de sondeo:**

A la hora de realizar el sondeo de nuestra cama Marlin calcula los puntos en base al tamaño de nuestra cama y a los offsets del sensor. Por eso es crítico/importante que tanto los offsets de la cama sean correctos (nuestro X0Y0 coincidan con el inicio de la cama y XmaxYmax con el final de esta) como los del sensor.

En cualquier caso en ocasiones nos interesa disponer de más o menos márgenes para la zona de sondeado... por ejemplo si nuestro sensor dispone de un punto de sondeado grueso que pueda quedar fuera de márgenes o si disponemos de clips para sujetar nuestra superficie de impresión. En estos casos contamos con dos valores que nos pueden interesar conocer y en que afectan exactamente:

* PROBING\_MARGIN : este valor aplica un margen sobre los valores calculados del área de nuestra cama + los offsets del sensor. En la práctica, que si ponemos a 0 sondeará justo en los limites de nuestra cama pudiendo ser un riesgo.

* MESH\_INSET: al igual que el anterior aplica un margen pero en este caso sería un margen extra al área calculado sobre PROBING\_MARGING.\
  Por ejemplo si configuramos un PROBING\_MARGING de 10 (mm) solamente e imaginando que no tenemos offsets en nuestro sensor (algo poco probable pero lo usamos para que se entienda el concepto de forma más sencilla) el primer punto de sondeo será sobre X10Y10.\
  Si además de PROBE\_MARGIN usamos MESH\_INSET con un valor de 5 (mm) el primer punto de sondeo será X15Y15.
  {% endhint %}

* Para una mayor resolución en las medidas del sensor podemos habilitar que realice diferentes medidas en un mismo punto\
  **`#define MULTIPLE_PROBING 3 // Realizar tres medidas en cada punto`**

* Para poder encontrar el Z-offset que necesitaremos más adelante y para el cual tenemos varios métodos es interesante poder bajar nuestro eje Z por debajo de su límite. Para ello podemos comentar la siguiente línea de Marlin:

  **`// #define MIN_SOFTWARE_ENDSTOP_Z // Permite mover el nozzle por debajo de 0 en Z`**

  <div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p><strong>Aconsejamos realizar este cambio solamente si eres un usuario avanzado ya que puede ser peligroso no deshabilitar los limites de la máquina.</strong></p><p><strong>Es preferible usar el proceso de Z-Offset desde el</strong> <a href="#ajuste-del-z-offset-wizard"><strong>Wizard</strong></a> <strong>o desde</strong> <a href="#ajuste-del-z-offset-pronterface"><strong>Pronterface</strong></a>.</p></div>

* Dependiendo del tipo de sensor puede ser necesario invertir el funcionamiento de final de carrera\
  **`#define Z_MIN_PROBE_ENDSTOP_INVERTING true`**

* Por seguridad y teniendo en cuenta la localización del sensor es aconsejable que el homing en Z se realice en el medio de la cama\
  **`#define Z_SAFE_HOMING`**

* Es importante habilitar esta linea dado que un G28 desactiva el autonivelado, de esta forma no lo hará\
  **`#define RESTORE_LEVELING_AFTER_G28`**

* Podemos habilitar el comando G26 que nos permite lanzar un test de nivelación directamente sin necesidad de generar ninguno desde nuestro slicer, algo muy útil para un test rápido. Dentro de las opciones del G26 podrás ajustar los parámetros básicos de impresión **`#define G26_MESH_VALIDATION.`**\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FfS0fSqnjtzR5GSdwkFih%2Fimage.png?alt=media\&token=9833535c-a59d-4cc9-92ba-bcc8039b4a71)\
  **En el siguiente** [**link de la documentación de Marlin sobre G26**](https://marlinfw.org/docs/gcode/G026.html) **podéis encontrar como añadir parámetros al lanzar el gcode G26 para ajustar el test o podéis hacerlo desde las fuentes para poner la configuración por defecto:**

{% code title="Marlin/configuration.h" %}

```cpp
  /**
   * Enable the G26 Mesh Validation Pattern tool.
   */
  #define G26_MESH_VALIDATION
  #if ENABLED(G26_MESH_VALIDATION)
    #define MESH_TEST_NOZZLE_SIZE    0.4  // (mm) Diameter of primary nozzle.
    #define MESH_TEST_LAYER_HEIGHT   0.2  // (mm) Default layer height for G26.
    #define MESH_TEST_HOTEND_TEMP  205    // (°C) Default nozzle temperature for G26.
    #define MESH_TEST_BED_TEMP      60    // (°C) Default bed temperature for G26.
    #define G26_XY_FEEDRATE         20    // (mm/s) Feedrate for G26 XY moves.
    #define G26_XY_FEEDRATE_TRAVEL 100    // (mm/s) Feedrate for G26 XY travel moves.
    #define G26_RETRACT_MULTIPLIER   1.0  // G26 Q (retraction) used by default between mesh test elements.
  #endif

#endif
```

{% endcode %}

* Es muy útil y necesario habilitar las opciones de nivelación en el LCD\
  **`#define LCD_BED_LEVELING`**

{% hint style="warning" %}
***LCD\_BED\_LEVELING*** no es compatible con pantallas que no usan modo Marlin, en el caso que de error de compilación se deberá de deshabilitar.
{% endhint %}

* Seleccionar el método de nivelado a usar, descomentar una de las líneas solamente, en este mismo documento está descrito como realizar el tipo UBL aconsejable para camas de gran tamaño o con problemas:\
  **`//#define AUTO_BED_LEVELING_3POINT`**\
  **`//#define AUTO_BED_LEVELING_LINEAR`**\
  **`//#define AUTO_BED_LEVELING_BILINEAR // Aconsejable camas menores 235x235`**\
  **`//#define AUTO_BED_LEVELING_UBL // Aconsejable resto de tamaños o con problemas nivelacion`**\
  **`//#define MESH_BED_LEVELING`**
* Otro valor interesante es el de ajustar hasta que punto de la impresión se realizarán las correcciones, por defecto Marlin aplica estas correcciones en los primeros 10mm pero dependiendo de las necesidades se puede ajustar asegurando que habilitamos\
  **`#define ENABLE_LEVELING_FADE_HEIGHT`**

![](https://lh3.googleusercontent.com/4gh4NwC0kjGEfpy7iiS9xGEaw8IMMe2kt8OvGRVn5lwH0JM-rWEmFnHI6kY7jUSbpfo4S7trK9iK14NM6DRTs1ysMwH1e5r3G--kzj4V2KMiCUnUKCzArgT5J0-uQpLoOcNQBdP2)

![](https://lh6.googleusercontent.com/k9AzQIyVbu4dEixRRkGHPK8oXlUlGAeaGC9VFd4Fv1tUQCS2Zb2g_Pv0n59xujlY1gp6OVjyjJM7DX9rtSJhmdP7dsvES1l9cZtH9WCgEFo9iiWWEdlNmWrm-VwPTAx9OQy0XUdB)

* Habilitar el homing por eje, muy útil para ver que cada eje funciona correctamente en el proceso de homing\
  **`#define INDIVIDUAL_AXIS_HOMING_MENU`**
* En el caso que nuestro sensor disponga de sonda de temperatura para compensación lo habilitaremos de la siguiente forma\
  **`#define TEMP_SENSOR_PROBE 1`**\
  Tenemos que tener en cuenta que deberemos conectar el pin del thermistor de nuestra sonda a un pin PWM para poder obtener dichas lecturas en el caso que nuestro fichero pins no disponga de el deberemos de crearlo y asignarlo a un pin libre.

| Pin    | Función                                     |
| ------ | ------------------------------------------- |
| Blanco | Pin del thermistor a conectar en un pin PWM |
| Negro  | Pin de señal del endstop normalmente en Z-  |
| Azul   | GND                                         |
| Marrón | 5v                                          |

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MbH4X5Ui8KetxaZNAvb%2F-MbH50UW4l1lonLR7rvs%2Fimage.png?alt=media\&token=452dab16-c2f1-4ef2-b7b1-9bd15055dfc3)

### Activar asistentes de nivelación de cama manual asistido por el sensor

Otro cambio muy interesante e útil es la activación del nivelado mediante sensor/probe en el asistente de nivelación de cama de 4 esquinas que nos ayudará a dejar nuestra cama de una forma sencilla y fiable lo más recta posible.

Actualmente diponemos de dos tipos de asistentes que pueden ser más adecuados o no dependiendo de nuestra impresora y sensor.

**Nivelado de cama usando la activación del sensor**, en este caso nuestro sensor toma la lectura de uno de las esquinas y la usa como referencia para ajustar el resto de esquinas... en este caso movera a cada una de las esquinas y moveremos manualmente las ruedas hasta que active el sensor y de por buena la nivelación de ese punto.

* Para versiones de Marlin anteriores a la 2.0.9.x:

{% code title="./Marlin/configuration.h" %}

```cpp
#define LEVEL_BED_CORNERS
...
#define LEVEL_CORNERS_INSET_LFRB { 45, 45, 45, 45 }
...
#define LEVEL_CORNERS_USE_PROBE
```

{% endcode %}

* Para versiones de Marlin posteriores a la 2.0.9.x

{% code title="./Marlin/configuration.h" %}

```cpp
#define LCD_BED_TRAMMING
...
#define BED_TRAMMING_INSET_LFRB { 45, 45, 45, 45 }
...
#define BED_TRAMMING_USE_PROBE
```

{% endcode %}

{% hint style="warning" %}
Es **necesario ajustar las coordenadas donde se realizará el test** de las 4 esquinas para que al compilar no genere un error.\
Primero **revisaremos el valor que tenemos en los offsets de nuestro sensor/probe**, tomamos el siguiente como ejemplo:\
define NOZZLE\_TO\_PROBE\_OFFSET { **35**, 5, -0.799 }\
A continuación **cogiendo como referencia el valor absoluto mayor en los offsets del sensor/probe para los ejes X e Y de la anterior linea le sumaremos 5**, en nuestro caso 35+5=40 y colocaremos ese valor en la siguiente linea:\
define LEVEL\_CORNERS\_INSET\_LFRB { **40**, **40**, **40**, **40** }

Esto es una sugerencia de cálculo rápido y válido para el cálculo para las 4 esquinas con sensor aunque dependiendo de la máquina puede variar, es importante entender que ese punto que elijamos para las 4 esquinas el sensor de nivelación quede dentro de la cama ya que las coordenadas hacen referencia a la punta del nozzle
{% endhint %}

**Nivelado de cama usando las lecturas del sensor**, en este caso nuestro sensor toma la lectura de uno de las esquinas y la usa como referencia para ajustar el resto de esquinas... a diferencia del anterior en este caso el asistente pasa por las diferentes esquinas y podemos realizar lecturas de ese punto y vamos ajustando a mano hasta ajustar al valor más ajustado que podamos.

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define ASSISTED_TRAMMING
...
#define TRAMMING_POINT_XY { {  20, 20 }, { 180,  20 }, { 180, 180 }, { 20, 180 } }
...
#define REPORT_TRAMMING_MM
...
#define ASSISTED_TRAMMING_WIZARD
```

{% endcode %}

{% hint style="warning" %}
Al igual que con LEVEL\_CORNERS\_INSET\_LFRB deberemos ajustar las coordenadas de TRAMMING\_POINT\_XY correctamente para nuestra impresora.\
Las coordenadas son las físicas de nuestros tornillos de ajuste pero teniendo en cuenta nuestro offset del sensor así que tendremos que ajustar en el caso que al aplicar esos offsets quede fuera la coordenada de nuestra área de impresión.\
Tenéis, **como referenci**a, una calculadora [aquí](https://docs.google.com/spreadsheets/d/13HRMthbNTPspwKwkEIWNmPAaOoeO86hTfnx7uR3Jrwc/edit?usp=sharing) que podéis encontrar más abajo.
{% endhint %}

{% embed url="<https://docs.google.com/spreadsheets/d/13HRMthbNTPspwKwkEIWNmPAaOoeO86hTfnx7uR3Jrwc/edit?usp=sharing>" %}

{% hint style="info" %}
Asistente de Tramming o nivelado de cama manual asistido por sensor:

Desde Marlin 2.0.6 disponemos del asistente para nivelado manual de cama asistido por nuestro sensor de nivelación. Este asistente toma medidas de nuestra cama y nos devuelve la corrección a aplicar sobre las ruedas de nivelación para un ajuste óptimo.

Al activarlo dispondremos de una nueva opción en nuestra pantalla para lanzar el asistente pero... y si no disponemos de una pantalla o esta no es compatible?

Podremos mediante Pronterface, u otro cliente terminal como Octoprint, lanzar el comando `G35` que realizará el proceso y nos mostrará por consola los ajustes a realizar:

<img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F6BeqzmsYjn0oxgR7iC0A%2Fimage.png?alt=media&amp;token=c10057a1-6471-40f3-86ee-5cf0ce8fdbf1" alt="" data-size="original">

Es importante que al lanzar el comando indiquemos el parámetro S que añadiendo el valor de la métrica de nuestro tornillo (3 para M3, 4 para M4 y 5 para M5) seguido del sentido de la rosca (0 sentido horario CW, 1 sentido anti-horario CCW).

<https://marlinfw.org/docs/gcode/G035.html> para más información
{% endhint %}

### **Otros cambios en configuration\_adv.h**

* Es aconsejable activar reintentos en el proceso de generacion de malla G29 para prevenir problemas durante el proceso (**esta función puede no ser compatible con todos los sistemas de nivelación como por ejemplo UBL**)\
  **`# define G29_RETRY_AND_RECOVER`**
* Al usar un sensor PINDAv2 activaremos la calibración por temperatura para compensar las desviaciones que la temperatura puede provocar en este tipo de sensores\
  **`#define PROBE_TEMP_COMPENSATION`**

### Resumen de cambios

Para nuestro ejemplo usaremos una placa Fysetc Spider conectando el sensor en el conector Z+ tal como sugiere el fabricante quedando nuestra configuración de la siguiente forma:

```cpp
// cambios en Marlin/configuration.h
#define USE_PROBE_FOR_Z_HOMING // 3DWORK PINDAv2 - usar sensor para homing
...
#define Z_MIN_PROBE_PIN PA3 // 3DWORK PINDAv2 - definir en que pin esta el probe
...
#define FIX_MOUNTED_PROBE // 3DWORK PINDAv2 - usamos sensor fijo
...
#define NOZZLE_TO_PROBE_OFFSET { 0, -50, -2.90 } //3DWORK PINDAv2 - offsets
...
#define AUTO_BED_LEVELING_BILINEAR //3DWORK PINDAv2 - sistema nivelacion
...
#define PROBING_MARGIN 20 //3DWORK PINDAv2 - margen de seguridad bordes cama
...
#define MULTIPLE_PROBING 3 //3DWORK PINDAv2 - tests por punto
...
#define Z_MIN_PROBE_ENDSTOP_INVERTING true //3DWORK PINDAv2 - ajuste de logica deteccion sensor
...
#define Z_SAFE_HOMING //3DWORK PINDAv2 - realizar homing en el centro de la cama
...
#define RESTORE_LEVELING_AFTER_G28 //3DWORK PINDAv2 - habilitar nivelacion automatica despues del homing
...
#define LCD_BED_LEVELING //3DWORK PINDAv2 - habilitar menu avanzado de nivelacion
...
#define LEVEL_CORNERS_USE_PROBE // 3DWORK PINDAv2 - habilitar asistente de nivelacion 4 esquinas con sensor
...
#define ENABLE_LEVELING_FADE_HEIGHT //3DWORK PINDAv2 - aplicar limites en correccion de nivelacion
...
#define INDIVIDUAL_AXIS_HOMING_MENU //3DWORK PINDAv2 - añadir home por eje en el menu
...
#define TEMP_SENSOR_PROBE 1 //3DWORK PINDAv2 - habilitar el tipo de thermistor del probe, hay que asegurarse que existe el pin en el fichero pins de la placa

// cambios en Marlin/configuration_adv.h
# define G29_RETRY_AND_RECOVER //3DWORK PINDAv2 - permite reintentar el G29 de nivelacion ante un fallo
...
#define PROBE_TEMP_COMPENSATION //3DWORK PINDAv2 - habilita el proceso de calibracion del probe por temperatura

// cambios en Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h
// añadiremos lo siguiente debajo del bloque Heaters para indicar que usaremos el thermistor del TH2 de nuestra spider

//
// Temperature Sensors
//
#define TEMP_PROBE_PIN                   TEMP_2_PIN // U1JO PINDAv2 
```

### **Activar Babystepping**

Esta funcionalidad es muy útil para un ajuste fino durante la impresión de la altura del eje Z\
En **configuration\_adv**:\
**`#define BABYSTEPPING`**\
**`#define DOUBLECLICK_FOR_Z_BABYSTEPPING`**\
**`#define BABYSTEP_DISPLAY_TOTAL`**

## **Comprobaciones previas y resolución de problemas**

Es más que aconsejable que antes de intentar cualquier movimiento con nuestra máquina realicemos unas comprobaciones previas para asegurarnos que todo funciona correctamente y no llevarnos algún susto o dañar nuestra máquina.

* **Comprobación de la parte ENDSTOP**, la parte endstop funciona como cualquier endstop que normalmente colocamos en el puerto PROBE o Z-STOP/Z-MIN de la placa.\
  Dependiendo de las versiones de Marlin debera colocarse en uno o en otro si esta soportada la placa o no completamente.\
  Para comprobar que funcione correctamente comprobamos con M119 que el enstop cambia de TRIGERED (algo metálico cerca de la punta del sensor) a OPEN (sin nada metálico en la punta del sensor) correctamente.
* **Activar Modo Debug nivelado**\
  El modo debug para el nivelado se tiene que activar solo en caso de problemas con el proceso de nivelación si no es el caso puedes obviar este punto.\
  *Cambios en Marlin (configuration.h):*\
  `#define DEBUG_LEVELING_FEATURE // Permite obtener información detallada en caso de problemas`\
  *Comandos gcode para habilitar/deshabilitar el modo Debug:*\
  M111 S38 ; LEVELING, ERRORS, INFO\
  M111 S0 ; Disable debug
* **Activar Test de precisión**\
  Permite habilitar un menú dentro del LCD para realizar tests de repetitibilidad y mostrar el rango de precisión del sensor:\
  \#define Z\_MIN\_PROBE\_REPEATABILITY\_TEST
* **Nuestro eje X se encuentra 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://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FvHDTffIWEZPpa0Px9Djz%2Ftelegram-cloud-photo-size-4-5798463668353088688-y.jpg?alt=media\&token=7652dfc7-85cd-4f1d-8a64-6c754dd82aa7)\
  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.\
  En Marlin contamos con **X\_AXIS\_TWIST\_COMPENSATION (M423)** con el cual podremos compensar estas desviaciones para que no afecten a nuestro sondeo de cama con el sensor.\
  Una vez activada en nuestro Marlin esta función podremos lanzar el asistente para el ajuste el cual os aconsejamos usar una galga metálica en lugar de un trozo de papel ya que va a ser más fiable el proceso.

## **Ajuste Z-Offset**

El z-offset es la distancia entre que se activa el endstop del sensor y la punta del nozzle + margen de seguridad (tal como hacemos con el test del papel al nivelar manualmente).

Para encontrar y ajustar nuestro z-offset tenemos diferentes procedimientos que podemos seguir, a continuación os explicamos los más comunes.

**En todo caso os sugerimos por simplicidad y siempre que vuestro firmware lo soporte o podamos activarlo usar el Wizard de Z-Offset de Marlin.**

### **Ajuste del Z-Offset - WIZARD**

Desde la version 2.0.7.2 Marlin incluye un nuevo asistente para encontrar el valor Z Offset de una forma sencilla. Para activarlo iremos a configuration\_adv y habilitaremos:

**`#define PROBE_OFFSET_WIZARD`**

Con esto dispondremos de un nuevo menu en Configuración/Avanzado/Probe Offsets

{% embed url="<https://www.youtube.com/watch?v=2gRfU26aTDs>" %}

### **Ajuste del Z-Offset - Pronterface**

En ocasiones puede que nuestra pantalla de la impresora no funcione o no disponga de funciones para mostrar el asistente/wizard o que no sea cómodo realizar el proceso anterior.

Para estos casos podemos desde un cliente terminal como [**Pronterface**](/marlin/troubleshooting-marlin/pronterface):

* **Calentaremos cama y fusor a las temperaturas de impresión habitual**, idealmente dejar que se estabilicen esas temperaturas durante unos minutos.
* **Ajustaremos el z-offset a 0** mediante el comando `M851` y seguidamente **guardaremos en EEPROM** con `M500`:

```gcode
M851 Z0    ; Set z-offset to 0
M500       ; Save to EEPROM
```

* **Realizaremos un homing** usando el comando `G28`
* Mediante los controles de movimiento en **Pronterface ajustaremos el eje Z hasta que se encuentre en la coordenada Z0**, recuerda ajustar la escala de movimientos al menos a 1mm.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FrzVcrsTqkOkAxgsRYV2F%2Fimage.png?alt=media\&token=88e72ae9-8e14-4619-9566-278705520d53)

* **Marlin cuenta con protecciones llamadas software endstops**, que previenen que podamos mover los motores en coordenadas fuera de rango, las cuales **deberemos deshabilitar para poder movernos a coordenadas negativas**. Enviando el comando `M211 S0` deshabilitaremos los software endstops.
* Volveremos a los controles de movimiento en Pronterface, importante ajustar la escala en 0.1, y con un folio o una galga (0.1) bajar el eje Z hasta que la boquilla roce.
* Una vez tengamos la coordenada deseada de Z revisaremos nuestra pantalla o Pronterface para obtener ese número. Por ejemplo en nuestro caso hemos obtenido un valor de -1.48mm con lo que usaremos los siguientes comandos para aplicar ese valor como z-offset, habilitaremos los software endstops y por último guardaremos EEPROM:

```gcode
M851 Z-1.48 ; Apply z-offset values
M211 S1     ; Enable software endstops
M500        ; Save to EEPROM
```

* Es aconsejable, para evitar perder este valor en futuros cambios, ajustar el z-offset en tus fuentes de Marlin en :

{% code title="Marlin/configuration.h" lineNumbers="true" %}

```cpp
#define NOZZLE_TO_PROBE_OFFSET
```

{% endcode %}

## Calibración del sensor de temperatura

Este proceso puede llegar a durar mucho tiempo, cerca de 1hora, con este proceso nos ayudará a mejorar la precisión de las lecturas, realizaremos el siguiente proceso desde nuestro cliente terminal favorito:

1. **G76** - inicia la calibración, tarda alrededor de 1h
2. **M871** - muestra los valores de las lecturas
3. **M500** - almacena en la EEPROM las lecturas de compensación de temperatura

{% hint style="warning" %}
**IMPORTANTE!!! cada vez que la EEPROM sea borrada o reseteada se tiene que volver a realizar este proceso si no almacenamos este valor en nuestros fuentes de Marlin!!**!
{% endhint %}

## Script de inicio (Comandos GCODE)

Deberás añadir la función de autonivelación al principio de cada impresión. Eso se hace muy fácilmente configurándose en tu Slicer favorito (Repetier, Simplify3D, Cura, etc.). Simplemente es añadir el comando G29 para nivelar vuestro cabezal antes de cada impresión.

Os dejo un ejemplo de mi script de inicio en cada impresión usando BILINEAR como sistema de nivelación:

```
G28          ; Efectuar HOME en todos los ejes
G29          ; Comando de nivelar cabezal
```

En todo caso os aconsejamos revisar la [**Guia de Calibración Inicial**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md) ya que contiene un script de inicio completo con todas las opciones completas.

## Visualizar nuestra malla de nivelación

Como ya os hemos explicado la instalación de un sensor de nivelación nos va a permitir realizar mediciones del estado de nuestra plataforma de impresión para identificar desviaciones y así durante la impresión, normalmente de primeras capas, compensar estas desviaciones para tener esas primeras capas perfectas.

Estas mediciones se llaman "malla de nivelación" (mesh en inglés) y básicamente contiene las medidas del sensor en diferentes puntos de nuestra plataforma de impresión.

### Porqué es importante visualizar esta malla de nivelación?

* nos va a permitir identificar si nuestra cama esta correctamente nivelada, mediante los tornillos de ajuste manual que suelen llevar
* identificar problemas en nuestra superficie para compensarlos con un mallado de nivelación más efectivo con más puntos de test o [nivelado adaptativo/inteligente](/marlin/configuracion-marlin/nivelacion/mallado-de-cama-inteligente-prusaslicer)

### Como obtener nuestra malla de nivelación?

Tenemos diferentes opciones para obtener nuestra malla:

* M503, si hemos realizado una nivelación (G29) y guardado en la EEPROM esta mediante este gcode M503 lanzado desde un cliente serial como un ordenador ([Pronterface](/marlin/troubleshooting-marlin/pronterface)) o host ([Octoprint](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md)) conectado a nuestra impresora:

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FHUkoYQJjxKhPoImKMRKB%2Fimage.png?alt=media&amp;token=da248c6b-b763-4b6e-807c-ec69d9c102cf" alt=""><figcaption><p>Ejemplo de M503 y la información de nuestra malla de nivelación</p></figcaption></figure>

* G29 T, este comando nos va a devolver también nuestra malla de nivelación pero en este caso de una forma más legible. Normalmente el punto \[0,0] es el primer punto de nuestra malla que sería en la parte frontal izquierda de nuestra cama, por otro lado cada fila representa el eje Y (del frontal hacia la parte trasera) y cada columna representa el eje X (de izquierda a derecha).

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FxWUGbUF7RtVZUw3c7UmV%2Fimage.png?alt=media&amp;token=18ff68e1-2e0e-4119-8a9a-61160c54ee3f" alt=""><figcaption><p>Ejemplo de G29 T</p></figcaption></figure>

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F46sioUsm5ybU2UNsP53Y%2Fimage.png?alt=media&amp;token=10cf5a99-cce0-4b10-b109-c1e807647dda" alt=""><figcaption></figcaption></figure>

### Visualizar nuestra malla

En este caso podemos visualizar nuestra malla de formas diferentes:

* Analizando el M503 o G29 T, os aconsejamos este último por simplicidad.

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FDNA4BVhgXAhzv5tUAyTA%2Fimage.png?alt=media&amp;token=1d9bb678-4a56-45d9-96f8-7e21602d8503" alt=""><figcaption></figcaption></figure>

* Usando un visualizador online, como el del compañero ChillRain que podéis acceder desde [aquí](https://i.chillrain.com/index.php/3d-printer-auto-bed-leveling-mesh-visualizer/), donde básicamente copiaremos el resultado del G29T:\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FdvwdKig4fOprUkFdQUAG%2Fimage.png?alt=media\&token=9914b23a-0b11-4096-961c-2d886236e364)\
  Y podremos obtener una imagen 3D de los datos:\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FK1cJIjENAT7HOYeOmVNJ%2Fimage.png?alt=media\&token=4e43f1ba-d2a9-49ff-ba49-2ab1d4059373)
* [Octoprint](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md), si utilizamos un host como Octoprint tenemos plugins como Bed Visualizar que ejecutará los gcode necesarios y nos creará la visualización 3D:\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FzIbvLtyThH8Gd45XWBOp%2Fimage.png?alt=media\&token=6dfab3da-3918-4233-8238-b6b1a4340da1)


# Nivelado manual MESH

Mejora el nivelado de tu cama sin necesidad de sensor de nivelación

![](https://telegra.ph/file/9faf4b29f0850641ff9ea.jpg)

El nivelado MESH permite una control más avanzado y sencillo de nuestra cama, permite crear una malla de puntos de control de la cama de forma manual y cómodamente desde la pantalla.

Puedes ver en el siguiente video cómo funciona:

{% embed url="<https://youtu.be/YRE6DkD1c_U>" %}

## Como activar nivelado MESH

### **1. Cambios en Marlin (configuration.h)**

* \#define MESH\_BED\_LEVELING // Habilita el nivelado manual MESH
* \#define RESTORE\_LEVELING\_AFTER\_G28 // Habilita el nivelado después de un homing
* \#define LCD\_BED\_LEVELING // Habilita los menús LCD para crear la malla manual
* \#define INDIVIDUAL\_AXIS\_HOMING\_MENU // Habilita el homing por eje

### **2. Ajuste de la malla manual MESH**

#### **Ajuste de la malla utilizando un terminal (Pronterface/Octoprint/Repetier)**

![](https://lh6.googleusercontent.com/Rr8RqrnxGIQ29EIUatM6Phb7M307Ns3kzZhEeA_FLzh9crPlDfJJUSw938IK-nH45PrkYWzashHZbqh8VKeRgCsiKvUl6SZf-b-npBlTOH4ld4P5Fk9TqpVqeG5J7tR8P-2zWE9-)

1. Idealmente realizar primero un nivelado de 4 esquinas utilizando los tornillos de nivelación de la cama y un folio. Esto se hace para minimizar, en la medida de lo posible, que se tengan que compensar grandes desviaciones por una cama mal nivelada.
2. Desde el terminal lanzaremos G29 S1 y pulsamos enter. Esto comenzará el proceso de nivelación.
3. Poner un folio debajo del nozzle.
4. Utilizar los controles de movimientos de la aplicación de terminal usada (idealmente en pasos de 0.1 o menos) para mover el nozzle arriba o abajo hasta que el nozzle comience a rozar el folio. Debes poder mover el folio debajo del nozzle pero notando un poco de fricción entre el nozzle y el folio.
5. Una vez tengamos el punto correcto lanzaremos un G29 S2 en la línea de comandos y pulsamos enter. Esto almacenará la altura de Z para ese punto y el nozzle se moverá al siguiente punto (por defecto son 9).
6. Repetir los pasos 4 y 5 hasta que completamos el proceso asegurándose que lanzamos un G29 S2 al finalizar.
7. Lanzaremos el comando M500 para guardar los valores en la EEPROM. IMPORTANTE!!! SI VOLVEMOS A RESTAURAR LA EEPROM DEBEREMOS REALIZAR ESTE PROCESO DE NUEVO.

#### **Ajuste de la malla utilizando la pantalla**

1. Ajuste manual de la cama 4 esquinas y folio tradicional, desde el LCD tendremos un asistente para realizarlo en las 4 esquinas
2. Desde el LCD iremos a Nivelado Cama/Bed Leveling y Nivelar Cama/Level Bed, el cabezal se colocara en el primer punto a ajustar mediante el folio y desde el control de la pantalla podemos ir ajustando la altura de Z (izquierda baja y derecha sube el cabezal)

### **3. Activación nivelado MESH en tus impresiones y primeras pruebas**

Una vez realizado el proceso de creación de malla MESH, y guardado en la EEPROM, tenemos que indicar a nuestro slicer/fileteador que use esta funcionalidad. Para realizar esto es necesario añadir M420 S1 en tu slicer/fileteador en la configuración de gcode de inicio. Tiene que estar justamente seguido del comando G28 que hace el homing ya que por defecto el G28 deshabilita el nivelado de cama.

Puedes desde el terminal realizar un G29 S0 para visualizar los valores numéricos de desfase de tu malla y utilizar este visualizador online <https://mkdev.co.uk/mesh-visualizer/> para ver estos desfases de una forma más visual.

Es aconsejable realizar un test de nivelación de cama, este por ejemplo <https://www.thingiverse.com/thing:34558>, para comprobar que todo está correcto, podemos utilizar BABYSTEPPING para realizar correcciones en caso de ser necesario y anotar esas correcciones editando desde el LCD los puntos de nivelación.


# Nivelado UBL

Unified Bed Leveling. El sistema más avanzado de nivelación de Marlin

Si no conoces la nivelación automática, explicarte que esta se encarga de medir la topología de tu plataforma de impresión para compensar imperfecciones o desviaciones de esta. Estas compensaciones las realizará durante la impresión ajustando la altura del eje Z.

## Tipos de nivelación

En Marlin contamos con 5 tipos de nivelación:

* **nivelación de 3 puntos (3 Point Leveling)**, asume que tenemos una plataforma de impresión totalmente plana y simplemente realiza mediciones en tres puntos para triangular las desviaciones
* **nivelación lineal (Linear Leveling)**, realiza un sondeo de puntos creando una matriz utilizando el algoritmo "least squares"
* **nivelación bi-lineal (Bilinear Leveling)**, realiza un sondeo de puntos creando una malla para representar las imperfecciones de nuestra plataforma de impresión pudiendo elegir el cálculo de esta malla mediante diferentes algoritmos
* **nivelación mediante malla manual (Mesh Bed Leveling)**, para poder crear una malla de nuestra cama manualmente con el típico test de papel sin necesidad de utilizar un sensor... tenéis más información en la siguiente [guía](/marlin/configuracion-marlin/nivelacion/nivelado-manual-mesh)
* **nivelación UBL (Unified Bed Leveling)**, el sistema de nivelación más avanzado de Marlin que integra varias herramientas como edición de los puntos de mallado, múltiples mallas almacenadas para diferentes tipos de superficies, check rápido al inicio de la impresión, etc... que explicaremos con más detalles en esta guía

## UBL

UBL es el sistema más avanzado de nivelación existente para Marlin. Incorpora mejores herramientas (gcode/terminal y menús LCD) para la generación, edición y gestión de las mallas generadas. Además, permite un muestreo de puntos en la cama de hasta 100 puntos y un check rápido de 3 puntos de referencia en el momento de iniciar la impresión generada con el slicer.

**¿Qué necesitamos?**

* **un sensor de nivelación automático**, dispones en nuestras guías para sensores tipo [bltouch](/marlin/configuracion-marlin/nivelacion/bltouch-3dtouch) y [pinda](/marlin/configuracion-marlin/nivelacion/pindav2)
* **tener bien nivelada nuestra cama manualmente**, en las guías anteriores tienes información de como habilitar un asistente de nivelación de cama con sensor de nivelación para hacer el proceso más sencillo
* **conocimientos para compilar Marlin**, tienes el proceso y herramientas necesarias explicadas en nuestra [guía de compilación Marlin](/marlin/marlin-guia-compilacion)

## **1. Cambios en Marlin (configuration.h)**

`#define AUTO_BED_LEVELING_UBL // Habilita UBL como sistema nivelación, en siguientes líneas indica el número de puntos 7 aconsejable`

`#define DEBUG_LEVELING_FEATURE // Permite obtener información detallada en caso de problemas`

`#define ENABLE_LEVELING_FADE_HEIGHT // Indica hasta qué altura aplica las correcciones de cama 10 mm por defecto`

<figure><img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fa4YUtCYgToGNEHsDyNJo%2Fimage.png?alt=media&amp;token=e45af178-7593-4e7b-a59c-3789b1197c52" alt=""><figcaption></figcaption></figure>

`#define G26_MESH_VALIDATION // Habilita el comando G26 para realizar un test de impresión de la malla`

`#define MESH_INSET 10 // Permite ajustar el margen a partir del cual puede realizar las mediciones en mm`

`#define GRID_MAX_POINTS_X 3 // permite especificar los puntos a usar por eje, si ponemos 3 puntos creará una malla de 3 x 3 puntos (9) de nuestra cama, siempre y cuando no modifiquemos la fórmula en #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X. El límite de puntos son 15.`

`#define UBL_MESH_WIZARD // a partir de Marlin 2.0.8.1 habilita un asistente para la generación de la malla`

{% hint style="info" %}
**Márgenes en el área de sondeo:**

A la hora de realizar el sondeo de nuestra cama Marlin calcula los puntos en base al tamaño de nuestra cama y a los offsets del sensor. Por eso es crítico/importante que tanto los offsets de la cama sean correctos (nuestro X0Y0 coincidan con el inicio de la cama y XmaxYmax con el final de esta) como los del sensor.

En cualquier caso en ocasiones nos interesa disponer de más o menos márgenes para la zona de sondeado... por ejemplo si nuestro sensor dispone de un punto de sondeado grueso que pueda quedar fuera de márgenes o si disponemos de clips para sujetar nuestra superficie de impresión. En estos casos contamos con dos valores que nos pueden interesar conocer y en que afectan exactamente:

* PROBING\_MARGIN : este valor aplica un margen sobre los valores calculados del área de nuestra cama + los offsets del sensor. En la práctica, que si ponemos a 0 sondeará justo en los limites de nuestra cama pudiendo ser un riesgo.
* MESH\_INSET: al igual que el anterior aplica un margen pero en este caso sería un margen extra al área calculado sobre PROBING\_MARGING.\
  Por ejemplo si configuramos un PROBING\_MARGING de 10 (mm) solamente e imaginando que no tenemos offsets en nuestro sensor (algo poco probable pero lo usamos para que se entienda el concepto de forma más sencilla) el primer punto de sondeo será sobre X10Y10.\
  Si además de PROBE\_MARGIN usamos MESH\_INSET con un valor de 5 (mm) el primer punto de sondeo será X15Y15.
  {% endhint %}

## **2.a Ajuste del Z-Offset utilizando el wizard a partir de 2.0.7 (método rápido)**

Con esto dispondremos de un nuevo menu en Configuración/Avanzado/Probe OffsetsDesde la version 2.0.7.2 Marlin incluye un nuevo asistente para encontrar el valor Z Offset de una forma sencilla. Para activarlo iremos a configuration\_adv y habilitaremos:\
\
`#define PROBE_OFFSET_WIZARD`

{% embed url="<https://www.youtube.com/watch?v=2gRfU26aTDs>" %}

## **2.b Ajuste del Z-Offset manualmente**

Desde el terminal pero se puede realizar de otras formas

1. **G28** para realizar un home
2. **M851 Z0** ajusta el offset de Z a 0
3. **M211 S0** desactiva los enstop de seguridad, ojo!!! al deshabilitar esto los motores pueden chocar con chasis o cama... ir con cuidado
4. **G1 X150 Y150 Z0 F7000** para ubicar el cabezal de impresión en el centro de la cama, este ejemplo es para una cama de 300x300 para adaptarlo al tamaño de tu cama modifica X150 e Y150 por los valores adecuados a tu impresora
5. Desde el Pronterface o LCD ir bajando Z y ajustar con un folio de la forma tradicional
6. Una vez encontremos la altura adecuada revisar el valor Z en el LCD y ajustarlo como Z-Offset mediante el comando **M851 Z "X"** (X es el valor mostrado en la pantalla)
7. Hacer un homing de todos los ejes desde el LCD o **G28**
8. Realizar el paso 4 de nuevo y verificar que el cabezal queda correctamente ubicado y la posición de Z es la correcta obtenida anteriormente si no volver a realizar el proceso
9. **M500** para guardar los valores en EEPROM y se aconseja guardar este valor en los Offset del Probe en Marlin para futuro. Tambien se puede hacer desde los menus del LCD en Configuracion/Salvar EEPROM

![](https://lh4.googleusercontent.com/Mce2bNax3D9-ZzPxJ1eEDM23ytPynKdZe9kqLu-QJ_yG8f9xu1l_9BsNNJe7U-M2vnE184ULljGgfe_BjbdeSOjRNLDePRR9JZaD678npKjCqQYJJpIv5hqFX74mdBpd2OR5pQOk)

## **3. Generación de malla UBL**

### Usando el asistente UBL (a partir de Marlin >2.0.8)

Desde la versión 2.0.8.1 de Marlin ha sido incluido un asistente para la creación de malla donde solamente tenemos que configurar desde la propia pantalla desde Motion/UBL Mesh Wizard la temperatura de la cama, nozzle y el slot de memoria donde guardar la malla.

Podéis ver el proceso en el siguiente video:

{% embed url="<https://www.youtube.com/watch?v=wn-Vhy5R9vc>" %}

### Usando un sensor de nivelación

Se puede realizar desde el LCD en las herramientas UBL como desde terminal (emplearemos el terminal para el ejemplo)

1. **Ajuste manual de la cama 4 esquinas y folio tradicional**
2. Realizaremos un **G28**
3. Realizaremos un **pre-calentado de cama y nozzle** que normalmente usemos
4. Realizaremos una malla usando **G29 P1** desde el terminal o desde las herramientas UBL de la pantalla
5. Una vez finalizado podemos usar **G29 T** para visualizar los valores de la malla. Puedes usar estas herramientas web para verlo graficamente:\
   <https://mkdev.co.uk/mesh-visualizer/>\
   <http://lokspace.eu/3d-printer-auto-bed-leveling-mesh-visualizer/>\
   <https://i.chillrain.com/index.php/3d-printer-auto-bed-leveling-mesh-visualizer/>
6. Por la ubicación del sensor de nivelación en muchas ocasiones Marlin no va a llegar a todos los puntos de la malla con lo que en el paso anterior veremos coordenadas sin valores solamente con un ".".\
   Para realizar el relleno de todos los puntos que no pudieron medirse lanzaremos un **G29 P3** (**G29 P3 T** mejor ya que calcula todos los puntos que falten) este comando calcula extrapolando valores que si que se pudieron verificar a los que no pudieron medirse.
7. Una vez aparezcan todos los puntos de la malla con un valor, fuera medido o extrapolado por el punto anterior, almacenaremos la malla en la posición 1 de la EEPROM con **G29 S1**
8. Nos aseguramos de que el autonivelado quede activo con **G29 A**
9. Ahora que ya tenemos todos los valores básicos correctos lanzaremos un **M500** para guardarlos en la EEPROM.\
   **IMPORTANTE!!! cada vez que la EEPROM sea borrada o reseteada se tiene que volver a realizar este proceso!!**!

#### Descripcion del proceso en Marlin:

```
;------------------------------------------
;--- Setup and initial probing commands ---
;------------------------------------------
M502            ; Reset settings to configuration defaults...
M500            ; ...and Save to EEPROM. Use this on a new install.
M501            ; Read back in the saved EEPROM.

M190 S65        ; Not required, but having the printer at temperature helps accuracy
M104 S210       ; Not required, but having the printer at temperature helps accuracy

G28             ; Home XYZ.
G29 P1          ; Do automated probing of the bed.
G29 P2 B T      ; Manual probing of locations USUALLY NOT NEEDED!!!!
G29 P3 T        ; Repeat until all mesh points are filled in.

G29 T           ; View the Z compensation values.
G29 S1          ; Save UBL mesh points to EEPROM.
G29 F 10.0      ; Set Fade Height for correction at 10.0 mm.
G29 A           ; Activate the UBL System.
M500            ; Save current setup. WARNING: UBL will be active at power up, before any [`G28`](/docs/gcode/G028.html).
;---------------------------------------------
;--- Fine Tuning of the mesh happens below ---
;---------------------------------------------
G26 C P5.0 F3.0 ; Produce mesh validation pattern with primed nozzle (5mm) and filament diameter 3mm
                ; PLA temperatures are assumed unless you specify, e.g., B 105 H 225 for ABS Plastic
G29 P4 T        ; Move nozzle to 'bad' areas and fine tune the values if needed
                ; Repeat G26 and G29 P4 T  commands as needed.

G29 S1          ; Save UBL mesh values to EEPROM.
M500            ; Resave UBL's state information.
;----------------------------------------------------
;--- Use 3-point probe to transform a stored mesh ---
;----------------------------------------------------
G29 L1          ; Load the mesh stored in slot 1 (from G29 S1)
G29 J           ; No size specified on the J option tells G29 to probe the specified 3 points
                ; and tilt the mesh according to what it finds.
```

### Manualmente sin sensor de nivelación

Como hemos comentado UBL puede ser usado con o sin sensor de nivelación (**PROBE\_MANUALLY** tiene que estar definido en Marlin) permitiendo tener un mejor control en las desviaciones en nuestra cama si esta no esta perfectamente recta.

Más importante que en el caso de disponer un sensor de nivelacion es muy importante que tengamos correctamente nivelada nuestra cama de impresion con el metodo de 4 esquinas y el folio para asegurar que los valores obtenidos con la malla solo requiera correcciones.

En este caso en lugar de empezar con un G29 P1 (sondeo de la cama automático) lo haremos con G29 P0 para realizar el sondeo de forma manual.

```
G29 P0      ; Zero the mesh
; Optional
G29 P2...   ; Probe manually at appropriate locations
G29 P3...   ; Fill in missing points
G26         ; Jump into validation print / edit process
G29 P4 R... ; Refine mesh points
; /Optional
G29 S1      ; Save to slot 1, return to G26 for further refinement
M500            ; Save current setup. WARNING: UBL will be active at power up, before any [`G28`](/docs/gcode/G028.html).
```

## **4. Modificaciones en gcode inicio(start) del slicer**

Debes añadir los siguientes gcodes en le script de inicio de tu slicer justo después del G28 (homing)

* **G29 L1** ; Carga la malla guardada en la memoria 1 usado en los pasos anteriores para almacenar la malla
* **G29 J** ; realiza un test rápido de 3 puntos para validar cualquier desviación

{% hint style="info" %}
**IMPORTANTE!!! en el caso de usar nivelación UBL sin sensor de nivelación el G29 J no se debe de añadir a nuestro gcode de inicio.**
{% endhint %}

Realizar un test de impresión a ser posible de un modelo de calibración de cama como...

{% embed url="<https://teachingtechyt.github.io/calibration.html#firstlayer>" %}

...donde puedes crearlo personalizado para tu impresora. Idealmente durante la impresión de dicho test podemos ir ajustando con babbystepping a nuestro gusto el ZOffset y posteriormente si hicimos cambios aplicarlos al ZOffset y guardar en EEPROM.

## **Troubleshooting**

M111 S38 habilita el modo debug

\#define DEBUG\_LEVELING\_FEATURE si no es posible habilitarlo por el comando anterior


# Asistente Z-Offset \[Marlin]

Desde la versión 2.0.7.2 de Marlin disponemos de un útil asistente para encontrar el Z-Offset de nuestro sensor de nivelación.

## Activación del asistente Z-Offset

Para poder tener disponible este asistente es aconsejable la activación de las siguientes funcionalidades en tu Marlin:

| Función/Descripción    | Ruta                        | Valor                                                                                               |
| ---------------------- | --------------------------- | --------------------------------------------------------------------------------------------------- |
| **Asistente Z-Offset** | Marlin/configuration\_adv.h | #define PROBE\_OFFSET\_WIZARD                                                                       |
| **Babystepping**       | Marlin/configuration\_adv.h | <p>#define BABYSTEPPING<br>#define BABYSTEP\_DISPLAY\_TOTAL<br>#define BABYSTEP\_ZPROBE\_OFFSET</p> |

Con estas opciones activadas ya podremos generar nuestro firmware y subirlo a nuestra máquina.

## Asistente Z-Offset

### Preparación antes de iniciar el asistente

Antes de iniciar el asistente y para obtener un ajuste lo más fiable posible ajustaremos la temperatura de nuestra cama y nozzle a los valores que usemos normalmente durante nuestras impresiones.

Desde el menú de nuestra impresora iremos a Temperatura y seleccionaremos la temperatura de nuestro nozzle y nuestra cama.

### Iniciar el asistente

Una vez nuestra máquina alcance las temperaturas del paso anterior lanzaremos el asistente Z-Offset desde Configuración/Avanzado/Desplazamiento Sonda/Asistente Z-Probe.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FSJLLSVTcJwuQ5ydG4bEC%2Fimage.png?alt=media\&token=db98a2bd-cb06-4126-91a9-84d4d507ded6)

* Iremos moviendo nuestro cabezal de impresión hasta llegar a la altura en que el papel roce con nuestro nozzle de la misma forma que usamos para nivelar manualmente nuestra cama
* Una vez tengamos la altura deseada volveremos al menu inicial del asistente e indicaremos que ya está hecho el ajuste en la opción de menú

{% hint style="info" %}
Asistente Z-Offset en pantallas TFT táctil:

Si disponemos de una pantalla TFT táctil que usen su propio firmware depende del fabricante/firmware de la pantalla que disponga de compatibilidad con este asistente.

En nuestro caso vamos usar una TFT35 de Bigtreetech que si que dispone de este:

* Abriremos el menú
* Iremos a Movimiento/ABL/Desplazamiento Z
* Seleccionamos Desactivado en la parte inferior izquierda para activar el asistente
* Bajaremos o subiremos desde el interfaz hasta que el papel roce con nuestro nozzle
* Guardaremos y luego seleccionaremos Volver
  {% endhint %}

## Ajuste fino usando Babystepping

Aunque normalmente directamente con el asistente suele dejar la altura correcta en ocasiones puede gustarnos un ajuste más fino durante una impresión, en este caso usaremos Babystepping para, durante una impresión, hacer un ajuste en vivo y obtener el valor de corrección sobre el obtenido durante el Z-Offset.

Para ello iniciaremos una impresión de test, lo ideal es un test de primera capa o nivelación de cama aunque también podemos usar una pieza que tenga gran superficie de cama.

Durante la impresión para poder usar Babystepping iremos al menú Tune y seleccionaremos Babystep Z y ajustaremos a nuestro gusto prestando atención al valor de Babystep ya que usaremos este después.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fauybwp4NrEHx1tpAB05F%2Fimage.png?alt=media\&token=367a026a-c52d-4282-98a2-f52dce49539d)

### Ajuste del Z-Offset con valor corrección Babystep

Una vez que mediante el test anterior tenemos un valor que nos guste más en la altura de Z usaremos ese valor para ajustar nuestro Z-Offset.

* Iremos a Configuración/Desplazamiento Z de la sonda si por ejemplo nuestro valor anterior era -3.2 y el que obtuvimos con Babystep era -0.1 ajustaremos el valor a -3.2

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FASxnVxeiioDhyL0DGhR7%2Fimage.png?alt=media\&token=bbd5bf37-a60a-4e0f-a840-0a05f84ce788)

* Nos aseguraremos de guardar este valor en la EEPROM para que no se pierda al reiniciar la máquina

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F5yL2X66r12TQDfDGyENe%2Fimage.png?alt=media\&token=4c6e55df-fc7f-4d5a-a6fd-19ca0c89e874)


# Mallado de cama inteligente en Marlin

Cómo configurar el mallado adaptativo de cama en Marlin con PrusaSlicer, SuperSlicer, OrcaSlicer y Bambu Studio para sondear únicamente el área donde imprimimos.

Una de las funciones de Klipper que más nos gusta es el mallado de cama inteligente: sondea solo la zona donde va a ir la pieza, no toda la cama. Esto reduce el tiempo de inicio, mejora la precisión de la primera capa y evita que el sensor trate de medir zonas que quedan fuera de la impresión.

Buena noticia: en Marlin también es posible, aunque con algunas condiciones.

## Requisito de firmware: Bilineal obligatorio

{% hint style="danger" %}
**Este sistema solo funciona con `AUTO_BED_LEVELING_BILINEAR` activado en el firmware.**

UBL (Unified Bed Leveling) **no es compatible** con el mallado adaptativo por área de impresión. Si tu impresora usa UBL, consulta la sección al final de esta guía para una alternativa.
{% endhint %}

El comando `G29` de Bilineal en Marlin acepta los parámetros `L`, `R`, `F`, `B` para definir el área de sondeo:

| Parámetro | Significado                        |
| --------- | ---------------------------------- |
| `L`       | Límite izquierdo (Left, eje X min) |
| `R`       | Límite derecho (Right, eje X max)  |
| `F`       | Límite frontal (Front, eje Y min)  |
| `B`       | Límite trasero (Back, eje Y max)   |
| `V<0-4>`  | Nivel de verbosidad (0-4)          |

Ejemplo manual desde terminal:

```gcode
G29 L50 R150 F50 B150 V4
; Sondea únicamente entre X50-X150, Y50-Y150
```

La densidad de puntos sigue siendo la configurada en `GRID_MAX_POINTS_X/Y` del firmware — no se puede cambiar en tiempo de ejecución con Bilineal estándar.

## Implementación por laminador

{% tabs %}
{% tab title="OrcaSlicer" %}
OrcaSlicer tiene soporte nativo para mallado adaptativo desde la versión 2.0. Es la implementación más limpia y no requiere scripts manuales.

{% hint style="success" %}
Disponible en **OrcaSlicer 2.0 o superior** (versión estable). La versión actual es la 2.3.x.
{% endhint %}

#### Configuración en Machine Settings

Ve a **Machine Settings → Machine G-code** y en el Start G-code reemplaza el `G29` habitual por:

```gcode
; Mallado adaptativo Marlin — OrcaSlicer
; (Marlin bilineal no permite especificar densidad de puntos, solo el área)
G29 L{adaptive_bed_mesh_min[0]} R{adaptive_bed_mesh_max[0]} F{adaptive_bed_mesh_min[1]} B{adaptive_bed_mesh_max[1]} V4
```

#### Variables disponibles (placeholders de OrcaSlicer para Marlin)

| Variable                     | Descripción                                                                |
| ---------------------------- | -------------------------------------------------------------------------- |
| `{adaptive_bed_mesh_min[0]}` | Coordenada X mínima del área adaptativa                                    |
| `{adaptive_bed_mesh_min[1]}` | Coordenada Y mínima del área adaptativa                                    |
| `{adaptive_bed_mesh_max[0]}` | Coordenada X máxima del área adaptativa                                    |
| `{adaptive_bed_mesh_max[1]}` | Coordenada Y máxima del área adaptativa                                    |
| `{bed_mesh_probe_count[0]}`  | Número de puntos de sondeo en X (no soportado en Marlin bilineal estándar) |
| `{bed_mesh_probe_count[1]}`  | Número de puntos de sondeo en Y (no soportado en Marlin bilineal estándar) |

{% hint style="info" %}
A diferencia de Klipper, **Marlin Bilineal no permite cambiar el número de puntos de sondeo en tiempo de ejecución**. Por eso en el G-code para Marlin se omiten los parámetros `X`/`Y` de conteo de puntos y solo se define el área.
{% endhint %}

#### Opciones de control en OrcaSlicer

En **Machine Settings → Bed leveling**, OrcaSlicer ofrece tres parámetros clave:

**Bed mesh min** (default: -99999, -99999) Define el límite inferior del área de sondeo permitida. Importante si tu sensor no puede alcanzar el borde completo de la cama (offset XY del sensor). Ajústalo a los valores reales de tu impresora, por ejemplo `20, 20`.

**Bed mesh max** (default: 99999, 99999) Define el límite superior. Ejemplo para una cama de 235×235: `215, 215`.

**Probe point distance** (default: 50 mm) Distancia entre puntos de sondeo. Con este valor OrcaSlicer calcula cuántos puntos caben en el área adaptativa. Aunque Marlin Bilineal ignora esta densidad, mantener un valor razonable ayuda a que el cálculo del área sea coherente.

**Mesh margin** (default: 0) Margen adicional alrededor del área de impresión. Con 0 el área es exactamente la de la pieza. Puedes subir a 5-10 mm para mayor seguridad en bordes.

#### Ejemplo completo de Start G-code con OrcaSlicer + Marlin Bilineal

```gcode
G90                                          ; coordenadas absolutas
M83                                          ; extrusor en modo relativo
M140 S{bed_temperature_initial_layer_single} ; temperatura cama
M104 S150                                    ; preheat nozzle (sin fundir filamento)
M190 S{bed_temperature_initial_layer_single} ; esperar cama
M109 S150                                    ; esperar nozzle a 150°C
G28                                          ; homing completo
M420 S0                                      ; desactivar mallado previo
G29 L{adaptive_bed_mesh_min[0]} R{adaptive_bed_mesh_max[0]} F{adaptive_bed_mesh_min[1]} B{adaptive_bed_mesh_max[1]} V4
M104 S{nozzle_temperature_initial_layer}     ; temperatura impresión nozzle
M109 S{nozzle_temperature_initial_layer}     ; esperar nozzle
G92 E0                                       ; reset extrusor
```

{% hint style="warning" %}
Calienta la cama **antes** de sondear. Los materiales se dilatan con el calor: sondear en frío da una malla incorrecta para imprimir en caliente.
{% endhint %}
{% endtab %}

{% tab title="PrusaSlicer / SuperSlicer" %}
PrusaSlicer y SuperSlicer permiten usar **placeholders y scripting con variables locales** en el Start G-code. Esto nos permite calcular el área de sondeo directamente a partir del bounding box de la pieza.

{% hint style="success" %}
Este script funciona en **PrusaSlicer 2.5+** y **SuperSlicer**. Para otros laminadores similares (BambuStudio, etc.) consulta la lista de placeholders de cada uno.

Referencias útiles:

* [PrusaSlicer — Lista de placeholders](https://help.prusa3d.com/es/article/lista-de-placeholders_205643)
* [SuperSlicer — Variables y macros](https://github.com/supermerill/SuperSlicer/wiki/Macro-&-Variable-list)
* [Bambu Studio — Placeholder list](https://wiki.bambulab.com/en/software/bambu-studio/placeholder-list)
  {% endhint %}

#### Script completo

Incluye el cálculo automático del área, precalentado, homing, mallado y calentado para impresión. Reemplaza o integra en tu Start G-code actual:

```gcode
; === Cálculo del área de sondeo ===
{
local probexmin = (max(print_bed_min[0], first_layer_print_min[0] - 20));
local probexmax = (min(print_bed_max[0], first_layer_print_max[0] + 20));
local probeymin = (max(print_bed_min[1], first_layer_print_min[1] - 20));
local probeymax = (min(print_bed_max[1], first_layer_print_max[1] + 20));
}

; === Configuración general ===
G90                                     ; coordenadas absolutas
M83                                     ; extrusor relativo

; === Precalentado para sondeo ===
M104 S150                               ; nozzle a 150°C (caliente sin fundir filamento)
M140 S[first_layer_bed_temperature]     ; temperatura cama
M109 S150                               ; esperar nozzle
M190 S[first_layer_bed_temperature]     ; esperar cama

; === Preparación ===
M302 S140                               ; reducir límite cold extrusion (para retracción)
G1 E-2 F2400                            ; retracción en frío
M302 S170                               ; restaurar límite
G28                                     ; homing completo

; === Mallado adaptativo ===
G29 L{probexmin} R{probexmax} F{probeymin} B{probeymax} V4

; === Calentado para impresión ===
G90
G1 X10 Y10 Z15 F3000                    ; mover a posición de parking
M104 S[first_layer_temperature]         ; temperatura nozzle impresión
M109 S[first_layer_temperature]         ; esperar nozzle
G92 E0                                  ; reset extrusor
; (añade aquí tu línea de purga o activa brim para evitar stringing)
```

#### Cómo funciona el cálculo

**Sección de cálculo de variables:**

El bloque `{ }` se evalúa en el laminador antes de generar el G-code. No llega a la impresora: solo produce los valores numéricos que luego se insertan en el `G29`.

| Variable local | Descripción                                                                       |
| -------------- | --------------------------------------------------------------------------------- |
| `probexmin`    | X mínima: borde izquierdo de la pieza menos 20 mm de margen, sin salir de la cama |
| `probexmax`    | X máxima: borde derecho de la pieza más 20 mm de margen, sin salir de la cama     |
| `probeymin`    | Y mínima: borde frontal de la pieza menos 20 mm de margen                         |
| `probeymax`    | Y máxima: borde trasero de la pieza más 20 mm de margen                           |

El `20` es el margen en mm entre el área de impresión y el área de sondeo. Puedes ajustarlo a gusto (10-25 mm es lo habitual).

**Placeholders de PrusaSlicer utilizados:**

| Placeholder                     | Valor                                                           |
| ------------------------------- | --------------------------------------------------------------- |
| `first_layer_print_min[0]`      | X mínima del bounding box de la pieza                           |
| `first_layer_print_max[0]`      | X máxima del bounding box de la pieza                           |
| `first_layer_print_min[1]`      | Y mínima del bounding box de la pieza                           |
| `first_layer_print_max[1]`      | Y máxima del bounding box de la pieza                           |
| `print_bed_min[0/1]`            | Coordenadas mínimas de la cama configurada                      |
| `print_bed_max[0/1]`            | Coordenadas máximas de la cama configurada                      |
| `[first_layer_bed_temperature]` | Temperatura de cama primera capa (entre corchetes = formato PS) |
| `[first_layer_temperature]`     | Temperatura nozzle primera capa                                 |

{% hint style="warning" %}
**Limitaciones importantes:**

* Este script **no cambia la densidad de puntos** de sondeo — solo limita el área. La densidad sigue siendo la del firmware (`GRID_MAX_POINTS_X/Y`).
* Si el parámetro `L/R/F/B` no está soportado en tu versión de Marlin, el `G29` ignorará los límites y sondeará toda la cama.
* **En impresiones que ocupan toda la cama**, los límites calculados coinciden con los de la cama y el resultado es equivalente a un G29 normal. En ese caso, el offset XY del sensor puede hacer que el comando intente sondear fuera de los límites físicos — ajusta bien tus `print_bed_min/max` en el perfil de impresora.
  {% endhint %}

#### Verificación

Para comprobar que el G-code generado es correcto, exporta el G-code de una pieza pequeña centrada en la cama y busca la línea `G29`. Los valores `L`, `R`, `F`, `B` deben corresponder al área de la pieza ±20 mm.
{% endtab %}

{% tab title="Bambu Studio" %}
Bambu Studio tiene su propio sistema de placeholders, compatible con la sintaxis `{variable}`. Aunque está pensado para impresoras Bambu Lab, puede adaptarse a impresoras genéricas Marlin añadidas como perfiles personalizados.

{% hint style="info" %}
Bambu Studio soporta un subconjunto de los placeholders de OrcaSlicer (están basados en el mismo código). La variable `{adaptive_bed_mesh_min}` y `{adaptive_bed_mesh_max}` **puede no estar disponible** en todas las versiones para impresoras genéricas.

Para impresoras Bambu Lab (que usan firmware propio, no Marlin), el mallado adaptativo se gestiona automáticamente por el firmware, sin necesidad de G-code personalizado.
{% endhint %}

Para impresoras genéricas con Marlin en Bambu Studio, el enfoque más fiable es usar los placeholders de área de impresión directamente:

```gcode
; Mallado adaptativo aproximado para Marlin en Bambu Studio
G28
G29 L{first_layer_print_min[0]} R{first_layer_print_max[0]} F{first_layer_print_min[1]} B{first_layer_print_max[1]} V4
```

Consulta la [lista completa de placeholders de Bambu Studio](https://wiki.bambulab.com/en/software/bambu-studio/placeholder-list) para confirmar las variables disponibles en tu versión.
{% endtab %}

{% tab title="Cura" %}
Cura **no soporta scripts con variables locales ni cálculos matemáticos** en el Start G-code. Los placeholders disponibles (como `{mesh_min_x}`, `{mesh_max_x}`) solo representan el bounding box del modelo, sin permitir operaciones como sumar el margen o limitar a los bordes de la cama.

**Opciones para Cura:**

1. **Plugin "Adaptive Bed Mesh"**: Existen plugins de terceros para Cura que añaden esta funcionalidad. Busca en el Cura Marketplace.
2. **Post-processing script**: Puedes usar un script Python de post-procesado (Cura → Extensions → Post Processing) que modifique el `G29` después de laminar, aunque requiere más configuración.
3. **Usar OrcaSlicer en su lugar**: Si tu objetivo principal es el mallado adaptativo, OrcaSlicer es la opción más directa y con mejor soporte para Marlin.
   {% endtab %}
   {% endtabs %}

## Alternativa para UBL: cargar malla guardada

Si tu firmware usa **UBL (Unified Bed Leveling)**, no puedes hacer mallado adaptativo por área en tiempo real de la misma forma. La estrategia recomendada es:

1. **Crea una malla de alta resolución una vez** (desde terminal o LCD):

```gcode
G28          ; home
G29 P1       ; sondeo automático completo (fase 1)
G29 P3       ; relleno matemático de zonas no alcanzables (fase 3)
G29 F10.0    ; fade height a 10 mm
G29 S1       ; guardar malla en slot 1
G29 A        ; activar UBL
M500         ; guardar en EEPROM
```

2. **En el Start G-code del laminador**, carga la malla guardada y aplica una corrección de plano rápida (3 puntos):

```gcode
G28          ; home
G29 L1       ; cargar malla del slot 1
G29 J        ; ajuste de plano rápido (3 puntos — no sondea toda la cama)
G29 F10.0    ; fade height
```

`G29 J` es la clave: sondea solo 3 puntos para detectar si la cama ha rotado o inclinado, y aplica esa corrección sobre la malla guardada. Resultado: precisión de un sondeo completo con la velocidad de 3 puntos.

{% hint style="success" %}
Este método UBL con `G29 J` es muy eficiente para impresoras que tienen camas grandes y tardan varios minutos en sondar. Combina lo mejor de los dos mundos: malla detallada + inicio rápido.
{% endhint %}

## Fade Height — compensación gradual

Independientemente del método, es recomendable activar el **Fade Height** (`ENABLE_LEVELING_FADE_HEIGHT` en el firmware):

```gcode
M420 S1 Z10  ; activar mallado con fade height de 10 mm
```

El Fade Height hace que la compensación del mallado se aplique progresivamente entre la cama y la altura configurada (10 mm habitual), y a partir de ahí el movimiento es completamente plano. Sin esto, la compensación se aplica en toda la altura de la pieza, lo que puede generar artefactos en piezas altas.

## Con esto ya tienes tu mallado adaptativo funcionando en Marlin

Recuerda: **Bilineal para mallado adaptativo por área**, **UBL para mallas guardadas con corrección rápida de plano**. Cada método tiene su caso de uso y ambos mejoran significativamente la calidad de la primera capa respecto a un `G29` simple.


# Sensorless

Esta funcionalidad nos permitirá realizar la función de endstop o final de carrera sin necesidad de estos

![](https://telegra.ph/file/dfcaa134fa8e2766de7ca.png)

Algunos drivers TMC pueden detectar el choque contra un obstáculo que evita que se pueda mover normalmente. Esta funcionalidad es usada desde Marlin para realizar la función de endstop o final de carrera.

Os recordamos que tienes más guías de ayuda en nuestro bot de Telegram @ThreeDWorkHelpBot

Es muy importante recordar/recomendar que esta función se habilite solamente en los ejes X e Y porque el nivel de precisión dista del requerido en un eje Z donde se aconsejan otros métodos como sensores de nivelación automática.

## Hardware necesario a tener en cuenta

En esta guía no vamos a entrar en la configuración hardware para poder habilitar físicamente la impresora y su electrónica, sino la parte de configuración de Marlin.

En cualquier caso, **recordar que es imprescindible que los drivers estén instalados y configurados en modo UART, o SPI dependiendo del driver que utilicemos, y dependiendo de la placa es necesario habilitar el jumper dedicado para DIAG/Sensorless**.

{% hint style="warning" %}
**Recordad que si vuestra placa no dispone de jumpers para habilitar/deshabilitar sensorless:**

* **en drivers que se use sensorless (X e Y) el pin DIAG debe de estar conectado a la placa**
* **en drivers que no se use sensorless el ping DIAG debe doblarse/cortarse/desoldarse para que no este conectado a la placa**

**En cualquier caso revisar el manual del fabricante de vuestra placa para más detalle.**
{% endhint %}

{% tabs %}
{% tab title="SKR OCTOPUS" %}
![Por orden derecha-izquierda: X Y Z Z2 E0 E1 E2 E3](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-Mji20tSHp-yc4wQmPnO%2F-MjnwQNNJml48XMG547z%2Fimage.png?alt=media\&token=49d5a2f6-f27e-40e7-9970-ece11e4d3927)
{% endtab %}

{% tab title="SKR v2" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MZXUh-n1oJCN_IkVIIL%2F-MZmU_PCLTxrQNs1xA74%2Fimage.png?alt=media\&token=362f5293-48e2-4eeb-9487-9533af6c0b89)
{% endtab %}

{% tab title="SKR 1.3" %}
![](https://telegra.ph/file/adbac297d5197536c1595.jpg)
{% endtab %}

{% tab title="SKR E3 TURBO" %}
![](https://telegra.ph/file/4866b596132d65ee54dcb.jpg)
{% endtab %}

{% tab title="SKR MINI E3 V3" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FyT5pAEUNDWWTGyGwUQgW%2Fimage.png?alt=media\&token=7a49e7fe-1ea8-4ab9-a52a-497ee3174951)
{% endtab %}

{% tab title="SKR MINI E3 v2" %}
![](https://telegra.ph/file/764231febc9c167d4b9d4.jpg)
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="FYSETC SPIDER" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FArjOlPiM9xICTH7m3vRs%2Fimage.png?alt=media\&token=9f073913-906a-4517-bdc8-f5656b158a98)
{% endtab %}

{% tab title="S6" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-Ma8ZemWkFZwRtJiuD_2%2F-Ma8bQ9lWlWnONzHClwI%2Fimage.png?alt=media\&token=762a5ffc-deed-41dd-a72d-5231a38543f8)
{% endtab %}
{% endtabs %}

## Configuración de nuestro firmware

{% tabs %}
{% tab title="Marlin" %}
Una vez ya tengamos la parte hardware correctamente configurada/instalada tendremos que habilitar la función Sensorless en Marlin.\
Empezaremos por verificar que los la lógica de los finales de carrera de X e Y están correctos en **configuration.h**

{% code title="./Marlin/configuration.h" %}

```cpp
#define X_MIN_ENDSTOP_INVERTING false
#define Y_MIN_ENDSTOP_INVERTING false
```

{% endcode %}

{% hint style="info" %}
El ejemplo anterior es para una máquina que realice el proceso de homing en MIN, normalmente en la esquina inferior izquierda, en el caso que tu máquina realice el homing en MAX deberías realizar el cambio en X e Y MAX\_*ENDSTOP\_INVERTING*
{% endhint %}

Continuaremos los cambios en **configuration\_adv.h** habilitaremos lo siguiente:

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define SENSORLESS_HOMING // StallGuard capable drivers only
```

{% endcode %}

Una parte clave para que el funcionamiento de Sensorless sea óptimo es tener en cuenta los siguientes puntos que trataremos a continuación con detalle:

* Velocidad de Homing
* Corriente del driver
* Sensibilidad

{% hint style="danger" %}
**Es importante recordar que la funcionalidad de Sensorless solo funciona correctamente con los drivers en modo stealChop habilitado**
{% endhint %}

Habilitar el homing por eje, nos será extremadamente útil para el proceso de ajuste de la sensibilidad, que podremos encontrar en **configuration.h**

{% code title="./Marlin/configuration.h" %}

```cpp
// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu.
#define INDIVIDUAL_AXIS_HOMING_MENU
#define INDIVIDUAL_AXIS_HOMING_SUBMENU
```

{% endcode %}

#### **Velocidad de Homing**

Marlin dispone de una configuración de velocidades específicas para el Homing que se pueden encontrar dentro de **configuration.h**:

{% hint style="warning" %}
**Los siguientes valores de velocidades de homing SON ORIENTATIVOS deberás averiguar cuáles funcionan mejor con tu máquina.**
{% endhint %}

**Para versiones <= Marlin 2.0.7.x**

{% code title="./Marlin/configuration.h" %}

```cpp
// Homing speeds (mm/min)
#define HOMING_FEEDRATE_XY (50*60)
#define HOMING_FEEDRATE_Z  (4*60)
```

{% endcode %}

**Para versiones >= Marlin 2.0.8.x**

{% code title="./Marlin/configuration.h" %}

```cpp
// Homing speeds (mm/min)
#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) }
```

{% endcode %}

Valores bajos/medios hacen que el proceso de Homing sea más lento pero mejoran la detección y precisión si usamos sensorless.

Por otro lado **versiones recientes de Marlin incluyen una función adapta/ajusta los valores de aceleración y jerk/junction durante el proceso de homing**

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define IMPROVE_HOMING_RELIABILITY // 3DWORK SENSORLESS
```

{% endcode %}

#### Corriente del driver

Como comantamos anteriormente esta función de los drivers TMC permiten detectar el choque contra un objeto y esto lo hacen comprobando el consumo de corriente del driver. Durante un movimiento normal del motor el consumo, a una velocidad estable, suele ser siempre el mismo... ahora bien cuando encuentra algún obstáculo el motor aumenta el consumo para continuar su camino y es en ese punto donde los drivers TMC interpretan como un choque y por tanto como un final de carrera/endstop en nuestras impresoras.

**Como norma lo ideal es usar el minimo de corriente sin que nuestro motor pierda pasos en este caso Marlin dispone de una configuración especialmente útil para Sensorless que podemos encontrar en configuration\_adv.h**

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define X_CURRENT_HOME X_CURRENT // 3DWORK SENSORLESS
#define Y_CURRENT_HOME Y_CURRENT // 3DWORK SENSORLESS
```

{% endcode %}

Esta opción nos permite ajustar la corriente en ese punto crítico para Sensorless, normalmente bajando un poco la corriente normal por poner un ejemplo podríamos reducir en 20 unidades ese valor para mejorar las lecturas

{% hint style="warning" %}
**Es imprescindible que antes tengas ajustado correctamente el** [**vref de tus motores**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md)**, revisa como hacerlo en nuestra guía de calibración.**

**El valor de -20 es orientativo deberás encontrar el valor óptimo para tu máquina.**

**En todo caso la velocidad de homing y la sensibilidad suelen tener más peso normalmente.**
{% endhint %}

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define X_CURRENT_HOME (X_CURRENT - 20) // 3DWORK SENSORLESS
#define Y_CURRENT_HOME (Y_CURRENT - 20) // 3DWORK SENSORLESS
```

{% endcode %}

{% hint style="info" %}
En el caso de usar **TMC2130 en modo SPI** es aconsejable en caso de problemas habilitar:

**#define SPI\_ENDSTOPS**
{% endhint %}

{% hint style="info" %}
Para **impresoras CoreXY** o similares (el movimiento de los ejes X e Y se realice mediante el uso de dos motores) es aconsejable deshabilitar la siguiente función de Marlin para que los movimientos del homing no realicen movimientos diagonales que hagan funcionan ambos motores a la vez

**// #define QUICK\_HOME // 3DWORK sensorless CoreXY**
{% endhint %}

#### **Sensibilidad**

Dependiendo de la mecánica, motores, etc de nuestra impresora los valores para detectar esos obstáculos no es siempre la misma, es por eso que en Marlin permiten configurar unos umbrales llamados comúnmente sensibilidad

{% hint style="warning" %}
**El valor de sensibilidad del siguiente ejemplo es meramente orientativo y deberás encontrar el valor correcto para tu máquina.**

**Es importante que antes tengas ajustado correctamente el** [**vref de tus motores**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md)**, revisa como hacerlo en nuestra guía de calibración.**
{% endhint %}

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define X_STALL_SENSITIVITY 100 // 3DWORK SENSORLESS
#define Y_STALL_SENSITIVITY 100 // 3DWORK SENSORLESS
```

{% endcode %}

Estos valores van desde el valor más bajo donde no detectará ningún cambio en la corriente hasta el valor máximo en el cual cualquier variación en el consumo de corriente disparará la señal de final de carrera.

Este valor máximo varía dependiendo del tipo de TMC que tengamos:

* **TMC2209/TMC2226 donde el valor más bajo es 0 y el más alto es 255**
* **Otros TMC, TMC2130/TMC2160/TMC2660/TMC5130/TMC5160, donde el valor más bajo es +63 y el más alto -64**

Relacionado con el ajuste de sensibilidad, hay otros dos valores de Marlin que deberemos ajustar siempre que habilitemos Sensorless:

* **SENSORLESS\_BACKOFF\_MM** el cual siempre hará una retracción de 2 mm en el lado opuesto del Homing para asegurar que el movimiento de homing no es en una posición de bloqueo

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define SENSORLESS_BACKOFF_MM  { 2, 2, 0 } // 3DWORK SENSORLESS
```

{% endcode %}

* **HOMING\_BUMP\_MM** con este y al igual que la anterior le decimos que una vez hecha la primera aproximación no retroceda para la segunda aproximación

{% code title="./Marlin/configuration\_adv.h" %}

```cpp
#define HOMING_BUMP_MM      { 0, 0, 2 }       // 3DWORK SENSORLESS
```

{% endcode %}

#### Ajuste de la sensibilidad

Una vez ya tenemos nuestro firmware compilado y aplicado a nuestra impresora, el siguiente paso es verificar y ajustar la sensibilidad de nuestros ejes.

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

Os caconsejamos encarecidamente que antes de realizar vuestro primer homing:

* **nuestros drivers están en UART/SPI funcionando correctamente, usando M122 para verificar comunicación**
* **verificar que nuestros drivers cuentan con pin DIAG correctamente conectado siguiendo las instrucciones del fabricante**
* **si nuestra placa tiene jumpers para habilitar sensorless, que estos estén instalados correctamente**
* **que nuestros antiguos finales de carrera físicos NO estén conectados a la placa**
* **comprobar que los valores de sensibilidades están cargados en la EEPROM, esto se puede hacer...**
  * **desde los menús clásicos de Marlin en Configuracion/Avanzado/TMC**
  * **mediante un terminal,** [**Pronterface**](/marlin/troubleshooting-marlin/pronterface) **o cualquier otro, usando de nuevo M122 y fijándonos en los valores para X e Y de la fila Stallguard thrs**
  * **si disponéis de una pantalla TFT táctil, serial, dentro de sus menús de configuración si ofrecen esas opciones**

**En el caso que no tengamos los valores correctos cargados en vuestra EEPROM, que son los que va a usar la máquina, deberemos realizar la recarga de valores en ella:**

* **desde los menús clásicos de Marlin en Configuracion mediante Reset/Load/Save EEPROM**
* **desde terminal usando M502, M500**
* **desde una pantalla TFT táctil si disponemos de las opciones en ella**
  {% endhint %}

Comenzaremos por lanzar un home en el eje X ya sea desde el menú de nuestra pantalla o desde un terminal, como [Pronterface](/marlin/troubleshooting-marlin/pronterface), lanzando el comando G28 X.

{% hint style="danger" %}
**Deberemos estar muy atentos por si el ajuste de la sensibilidad no es la adecuada y tenemos que apagar la corriente de la impresora!!!**
{% endhint %}

Nos podremos encontrar con dos situaciones:

* Que se **pare al mover unos mm** realizando el proceso de homing, en ese caso **reduciremos la sensibilidad** y volveremos a realizar el proceso.
* Que **no pare o que lo haga dando un golpe fuerte**, en este caso **aumentaremos la sensibilidad** y volveremos a realizar el proceso.

{% hint style="info" %}
**El ajuste de la sensibilidad podremos realizarlo desde la propia pantalla desde Configuracion/Avanzado/TMC o mediante el comando M914 X10 (ejemplo para el eje X ajustando la sensibilidad a 10**

Es aconsejable que los ajustes los hagamos de 10-5 unidades en cada ajuste para encontrar el punto correcto para nuestra máquina.
{% endhint %}

Una vez encontremos los valores correctos para nuestra máquina, guardaremos los valores en nuestra EEPROM desde el menú Configuración o usando el comando M500. También os aconsejamos anotar esos valores en los ficheros de configuración fuentes de Marlin para que en futuras compilaciones no se pierdan.

### Resolución de problemas:

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

Os caconsejamos encarecidamente que antes de realizar vuestro primer homing:

* **nuestros drivers están en UART/SPI funcionando correctamente, usando M122 para verificar comunicación**
* **verificar que nuestros drivers cuentan con pin DIAG correctamente conectado siguiendo las instrucciones del fabricante**
* **si nuestra placa tiene jumpers para habilitar sensorless, que estos estén instalados correctamente**
* **que nuestros antiguos finales de carrera físicos NO estén conectados a la placa**
* **comprobar que los valores de sensibilidades están cargados en la EEPROM, esto se puede hacer...**
  * **desde los menús clásicos de Marlin en Configuracion/Avanzado/TMC**
  * **mediante un terminal,** [**Pronterface**](/marlin/troubleshooting-marlin/pronterface) **o cualquier otro, usando de nuevo M122 y fijándonos en los valores para X e Y de la fila Stallguard thrs**
  * **si disponéis de una pantalla TFT táctil, serial, dentro de sus menús de configuración si ofrecen esas opciones**

**En el caso que no tengamos los valores correctos cargados en vuestra EEPROM, que son los que va a usar la máquina, deberemos realizar la recarga de valores en ella:**

* **desde los menús clásicos de Marlin en Configuracion mediante Reset/Load/Save EEPROM**
* **desde terminal usando M502, M500**
* **desde una pantalla TFT táctil si disponemos de las opciones en ella**
  {% endhint %}
  {% endtab %}

{% tab title="Klipper" %}
Para aquellos de vosotros que uséis Klipper os aconsejamos revisar el [**apartado sensorless de nuestra guía de puesta en marcha inicial para Klipper**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/configuracion-marlin/nivelacion/broken-reference/README.md).
{% endtab %}
{% endtabs %}


# Doble Z y autonivelado

Una gran mejora para una impresora 3D es la posibilidad de disponer de doble motor en el eje Z dando más consistencia a este eje ya que normalmente tiene que soportar el peso del cabezal de impresión

Una gran mejora para una impresora 3D es la posibilidad de disponer de doble motor en el eje Z dando más consistencia a este eje ya que normalmente tiene que soportar el peso del cabezal de impresión o la cama en formato CoreXY.

![](https://telegra.ph/file/0415a3d5dd0ee59c944a5.jpg)

Nos vamos a centrar solamente en la parte de configuración ya que la parte mecánica dependerá mucho del tipo y modelo de impresora.

Tenemos las siguientes opciones...

## **Usar los dos motores Z en un mismo driver**.

Esta opción es la normal y más adecuada en el 90% de los casos, para averiguar si estamos en ese 10% tendremos que ver el consumo A (amperios) de nuestros motores y la capacidad de nuestros drivers, en este aspecto no hace falta que el driver soporte la suma A de ambos motores pero si que al menos soporte ⅔ de esa suma.\
Para la conexión de ambos motores dependiendo de tu placa disponemos de dos opciones:

### **La placa dispone de doble conector para motores en Z**

Placas SKR 1.4, SKR MINI v2, MINI E3 TURBO... como ejemplo.

![](https://lh5.googleusercontent.com/UH6oNygA0geJYXWpSi7UaNx1cYwVZ85hiGwUYR1rIKQE6aglcV_YsWsxEtgawpCmKBaXRs-3HMGImHYxpddUhOWEfgYFCtQXCNvAS5MB31pkI4dAUxuNVUCUDlIBHGt3qgp-j6FH)

### Si no disponemos de doble conector en la placa

Podemos optar por un módulo splitter existen serie y paralelo

{% embed url="<https://s.click.aliexpress.com/e/_APU7K5>" %}

![](https://lh4.googleusercontent.com/98781UiF01nPbb1sSFZOz0sb6LJArEMKpCJhL9YU2-KgsLt1foVyTEewDgfo05gBBF0AvZ9l1njIB5T3c6AfNBJEFiIynhRfT14bAnS4ACY4nkRZrSyl278kBhYqzBslH3QQGHbn) ![](https://lh6.googleusercontent.com/5nE_kZQsV62u-OXpuhA3mieGboW4OQV0pfNJRxiSQ6H9MuqRSDax_53U9n1J0n6Jzc_Htf9eTE4COYrEKBd6Q6lBFxzGx6uUkmt-UL6yPycMKeEbnG8V3zA3dIyr7fGc0rEIIjC8)

## Usar drivers separados en Z

En el caso que nuestros motores no sean soportados por un solo driver o que nos interese separarlos por disponer de otras funcionalidades para sincronización automática de nivelado en Z deberemos de usar un puerto de driver libre de nuestra placa para instalar el nuevo driver y configurarlo en Marlin.

{% embed url="<https://www.youtube.com/watch?v=d7EFw_1PDlk>" %}

{% embed url="<https://www.youtube.com/watch?v=fOtm0V7h0Oo>" %}

Instalación del nuevo driver, para este ejemplo utilizaremos una SKR 1.4 y el módulo del driver E1.

{% hint style="info" %}
**Recordar que los jumpers y/o cualquier otra configuración de la placa para habilitar el driver correctamente se tiene que hacer de igual forma que el resto de drivers.**
{% endhint %}

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FECFfdpsAQXr5TyReYse4%2Fimage.png?alt=media\&token=b6c16717-7531-4e8a-ba0f-8f66883741b1)

{% hint style="warning" %}
**Recuerda que al usar doble Z en drivers independiente cada motor de Z ha de ir conectado a su correspondiente driver destinado a Z.**

**El primer motor Z, cartesiana el del lado izquierdo, ha de ir conectado normalmente en el zocalo de Z.**

**El segundo motor Z, cartesiana en el lado derecho, se ha de conectar en el zocalo del motor de ese driver (NO, en el caso que la placa disponga de ello, en el segundo zócalo de Z ya que este va sobre el mismo driver).**
{% endhint %}

### **Habilitar Doble Z con autonivelación**

Habilitaremos en Marlin (configuration.h) un nuevo driver en Z2, en este caso como ejemplo un TMC2209 en modo UART.\
Recuerda que en configuration\_adv deberías de configurar del mismo modo que el eje Z original los valores de microsteps y vref (revisa el apartado de UART del documento para más detalle)\
**`#define Z2_DRIVER_TYPE TMC2209`**

{% hint style="info" %}
**`Al definir Z2 Marlin usará como Z2 el siguiente driver que no este en uso. En el ejemplo E1 ya que no tiene definida ninguna función directamente.`**\
**`En el caso de tener una placa con tres extrusores (E0,E1 y E2) y tener definidos dos extrusores en Marlin (E0 y E1) se le asignará el rol de Z2 al siguiente driver libre, en este caso E2.`**
{% endhint %}

Habilitaremos también (configuration.h) el doble Z\
**`#define Z_DUAL_STEPPER_DRIVERS`**\
en el caso de versiones de Marlin 2.0.6.x o superiror en configuration\_adv.h\
**`#define NUM_Z_STEPPER_DRIVERS 2`**

**En el caso de versiones de Marlin 2.1.x o superiores ya no es necesario realizar estos cambios ya que al activar los diferentes drivers en Z que hicimos en el paso anterior será suficiente.**

{% hint style="info" %}
**Para versiones de Marlin <2.0.8 si los** **motores giran en direcciones contrarias girar el cableado para corregirlo.**

**Para versiones >= 2.0.8.x ya puedes cambiar el giro del motor desde configuration\_adv.h en las siguientes lineas:**

**`// Enable if Z motor direction signals are the opposite of Z1 //#define INVERT_Z2_VS_Z_DIR`**\
**`//#define INVERT_Z3_VS_Z_DIR`**\
**`//#define INVERT_Z4_VS_Z_DIR`**
{% endhint %}

Podemos realizar el autoalineado de dos formas:

#### Usando finales de carrera fisicos

En el caso que sea necesario habilitar doble final de carrera y en que endstop está ubicado\
**`#define Z_DUAL_ENDSTOPS`**\
**`#if ENABLED(Z_DUAL_ENDSTOPS)`**\
**`#define Z2_USE_ENDSTOP _XMAX_`**

Para veriones 2.0.6.x o superiores:

**`#define Z_MULTI_ENDSTOPS`**

En este caso recordar que el final de carrera a utilizar se tiene que habilitar también.

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

#### Usando un sensor de nivelación automático (bltouch, inductivo, etc...)

Si realizamos el ajuste de doble Z con un ABL o sensor de nivelación, algo más que aconsejable, habilitaremos el comando G34 de la siguiente forma (recordar que previamente debemos tener configurado un probe y correctamente funcionando (revisar la parte de nivelación en este documento para más información y habilitado el driver):

```cpp
// configuration_adv.h
#define Z_STEPPER_AUTO_ALIGN
```

El siguiente paso es para indicar en qué puntos se tomarán las medidas por parte del sensor para realizar la alineación. Podemos definir estos puntos de dos formas diferentes:

**Automático**, de esta forma Marlin calculará la posición de los puntos dependiendo del número de drivers en Z definidos y las posiciones que indiquemos en Z\_STEPPERS\_ORIENTATION siguiendo el siguiente esquema:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F9ga9TPE2no7phACJ9dlQ%2Fimage.png?alt=media\&token=734a3ac8-75dc-4d0f-80d6-25b988832a3c)

Para ello habilitaremos Z\_STEPPERS\_ORIENTATION y le asignaremos el número que coincida con la orientación de nuestros ejes Z:

```cpp
// configuration_adv.h
  #ifndef Z_STEPPER_ALIGN_XY
    #define Z_STEPPERS_ORIENTATION 0 // Ejemplo para dos motores en Z y estos colocados en X
  #endif
```

{% hint style="warning" %}

* **El cálculo de coordenadas automático está disponible en versiones recientes de Marlin**
* **El cálculo automático puede no siempre ser correcto ya que depende de otras configuraciones en Marlin relacionadas con los offsets del sensor, márgenes de mallado y offsets en el homing**
  {% endhint %}

**Manual**, en el caso que por fallo del método automático o por necesidades personales de nuestra máquina necesitemos definir los puntos de medida para el alineado habilitaremos y definiremos los puntos mediante **Z\_STEPPER\_ALIGN\_XY**. Para el cálculo de puntos os hacemos las siguientes sugerencias/tips:

{% tabs %}
{% tab title="Doble Z" %}
Para calcular coordenadas de medición en un doble Z tenemos dos opciones:

* **coordenada segura**, son unas coordenadas que calcularemos en base al tamaño de nuestra cama. **No es la forma más óptima pero si la más segura aunque es importante revisar que el valor de X de la primera coordenada no sea menor que el offset (entero) de nuestro sensor**.
  * Primera coordenada usaremos el valor de 1/4 de X y 1/2 de Y
  * Segunda coordenada usaremos el valor de 3/4 de X y 1/2 de Y

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FljbWOVihvP0pzy9KSYGw%2Fimage.png?alt=media\&token=6f75d512-9d06-43bb-a675-1a11c0bf8efb)

* **coordenada ajustada a offsets del sensor de nivelación**, es otra opción que permitirá un cálculo más ajustado (los siguientes ejemplos son para una cama de 220x220)
  * Primera coordenada
    * X
      * si nuestro offset de X del sensor de nivelación es positivo usaremos X5 dado que nuestro sensor no quedaría fuera de la cama podemos ajustar al mínimo con un margen de 5mm
      * si nuestro offset de X es negarivo usaremos ese valor y le sumaremos 5... por ejemplo un offset de X-50 usaremos X55 (50+5)
    * Y
      * si nuestro offset de Y es positivo usaremos la siguiente fórmula (Ymax/2)-Yoffset... para un caso que nuestro sensor tenga un offset en Y de 10... (220/2)-10=100... con lo cual usaremos Y100
      * si nuestro offset de Y es negativo la fórmula será (Ymax/2)+Yoffset... para un caso de Yoffset de -10... (220/2)+10=120.. con lo cual usaremos Y120
    * Segunda coordenada
      * X
        * Si nuestro offset de X es positivo usaremos la siguiente fórmula Xmax-Xoffset-5.. para el caso anterior de Xoffset -50... 220-50-5=165... usaremos X165
        * Si nuestro offset es negativo simplemente restaremos 5 al valor Xmax dado que nuestro sensor no tiene peligro de quedar fuera de la cama... 220-5=215... usaremos X215
      * Y usaremos el mismo cálculo que en el primer punto

Ejemplo para impresora 220x220, con offsets del sensor X50Y10 y en "**coordenada ajustada a offsets del sensor de nivelación**":

```cpp
// configuration_adv.h
#define Z_STEPPER_ALIGN_STEPPER_XY { { 5, 100 }, { 165, 100 } }
```

{% endtab %}

{% tab title="Triple Z" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FkfynOrrfEZiSPK8K8CIA%2Ftelegram-cloud-photo-size-4-5785290136072861911-x.jpg?alt=media\&token=30f17f45-8f95-4208-bcbc-e003d6f39452)
{% endtab %}

{% tab title="Cuádruple Z" %}

{% endtab %}
{% endtabs %}

Ejemplo para impresora 220x220 y en "**coordenada segura**":

```cpp
// configuration_adv.h
#define Z_STEPPER_ALIGN_XY { { 50, 110 }, { 175, 110 } }
```

{% hint style="warning" %}
**Por defecto Marlin incluye tres puntos de medida, depende del numero de motores estos puntos deben coincidir en número, 2 motores Z 2 puntos de control, 3 motores Z 3 puntos de control...**
{% endhint %}

**Número de repeticiones de test** para un ajuste fino del offset.\
**`#define Z_STEPPER_ALIGN_ITERATIONS 10`**

**Habilitar el leveling después de un G34,** tal como hacemos con un G28 con un nivelado de cama G29\
**`#define RESTORE_LEVELING_AFTER_G34`**

## Comprobaciones previas:

* verificar la correcta dirección de los motores en Z
* verificar que los finales de carrera o probe funcionen correctamente M119
* realizar un G34 desde un terminal para verificar que las posiciones de check y el proceso se hace correctamente

{% file src="/files/j8Zp8bKY5XSrVI4lPFYM" %}


# Sensor de filamentos

Configura un sensor de filamentos en Marlin para detectar fin de filamento o atascos y salvar tus impresiones automáticamente.

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


# Módulo UPS - Recuperación ante fallos corriente

Como mejorar nuestras impresiones evitando que estas no finalicen correctamente ante un fallo de corriente.

El lanzar una impresora de muchas horas y descubrir que esta no finalizó correctamente es una de las grades frustracciones de la impresión 3D.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MZT8-G85tcmObBujMmk%2F-MZTITzqsUelUnfPK2O0%2Fimage.png?alt=media\&token=988c0a10-ab45-497a-892e-d228aa13eda1)

Para solventar este problema hay diferentes alternativas, siempre pensando en el "universo" Marlin, como pueden ser:

* Activado de Power Less Recovery (PLR en adelante) en Marlin con log en cambio de capa
* Activado de PLR usando un modulo UPS con detección y control de apagado
* Un SAI/UPS para mantener nuestra impresora funcionando sin suministro durante X minutos

En este caso vamos a optar por una solución intermedia entre el primer y el segundo caso mejorando y solucionando los fallos del primero (la maquina no se apaga correctamente dañando la impresion en un alto porcentaje de veces) y evitando el alto gasto de tener un SAI/UPS dedicado aunque sin duda es de las mejores opciones.

{% hint style="danger" %}
IMPORTANTE!!!\
**La función PLR gestionada por Marlin solamente funciona al imprimir desde la SD de la placa no desde un componente externo como pantallas TFT (que pueden tener su propio sistema PLR) o Octoprint, Pronterface o similares**
{% endhint %}

## Módulo UPS

Os sugerimos usar los siguientes módulos UPS que son compatibles con la mayoría de placas y la diferencia principal es el acabado del módulo y el cableado a la placa, es importante recalcar que a la hora de comprarlo tengamos bien presente a que voltaje funciona nuestra placa:

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

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

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

Personalmente en cuanto a calidad recomendamos el módulo de MKS pero si buscamos sencillez y menos complicaciones usemos el que mejor se adapte a la marca de nuestra electrónica.

{% hint style="danger" %}
**IMPORTANTE!!!**\
Estos módulos se conectan a la alimentación de nuestra fuente y/o a 220/110v así que es muy importante al manipular tomar todas las medidas de seguridad necesarias para evitar descargas eléctricas, si no estas seguro de lo que haces lleva tu impresora a un técnico.\
También es aconsejable que se coloquen en sitios que eviten el contacto o manipulación fácil además de intentar dejarlos protegidos con algún tipo de cubierta/protección.
{% endhint %}

## Cableado del módulo

A continuación y para los modelos sugeridos os facilitamos los esquemas de conexión que dependiendo de vuestra placa puede variar el pin de control:

{% tabs %}
{% tab title="BTT UPS" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MZS8o8RDS9TnuPa7zUv%2F-MZSphWlk71OoXZfA6GB%2Fimage.png?alt=media\&token=bee0f150-3f42-433a-be8d-41273ffef758)
{% endtab %}

{% tab title="MKS UPS" %}
![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MZS8o8RDS9TnuPa7zUv%2F-MZSpK4MUP0qYkx_tG68%2Fimage.png?alt=media\&token=f65262e2-c395-47f4-a926-eb0b814b8c5a)
{% endtab %}
{% endtabs %}

La parte más importante de la conexión es la que se hace al pin que tengamos asignado o asignemos a PLR que normalmente usaremos un conector JST-XH de 3 pines prestando atención en la ubicación del pin SGN tanto del módulo como de nuestra placa.\
En la siguiente tabla os indicamos para los modelos más usados por nosotros:

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

| Placa                  | Puerto asignado                                                |                                   Pin SGN                                   | Num. Pin                                                                                        |
| ---------------------- | -------------------------------------------------------------- | :-------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------- |
| **BTT SKR 1.3**        | Ninguno por defecto, elige un endstop de X, Y o Z MAXO         | <p><strong>O</strong></p><p><strong>O</strong></p><p><strong>X</strong></p> | <p><strong>X+ P1.28</strong></p><p><strong>Y+ P1.26</strong></p><p><strong>Z+ P124</strong></p> |
| **BTT SKR 1.4/Turbo**  | Al lado de Z- y EXP1                                           | <p><strong>O</strong></p><p><strong>O</strong></p><p><strong>X</strong></p> | **P1.00**                                                                                       |
| **BTT SKR PRO**        | Ninguno por defecto, elige un sensor de filamentos E0, E1 o E2 | <p><strong>O</strong></p><p><strong>O</strong></p><p><strong>X</strong></p> | <p><strong>E0 PE15</strong></p><p><strong>E1 PE10</strong></p><p><strong>E2 PG5</strong></p>    |
| **BTT SKR DIP v1.1**   | Ninguno por defecto, elige E0 que es el sensor de filamentos   |                                   **OXO**                                   | **E0 PC2**                                                                                      |
| **BTT SKR MINI E3 v2** | Al lado del conector Y-stop                                    |                                   **XOO**                                   | **PC12**                                                                                        |
| **BTT SKR E3 Turbo**   | A la derecha de EXP1                                           |                                   **XOO**                                   | **P1\_20**                                                                                      |
| **BTT SKR E3 RRF**     | Al lado de Z-Stop y termistor hot-end                          |                                   **XOO**                                   | **PE0**                                                                                         |
| {% endtab %}           |                                                                |                                                                             |                                                                                                 |

{% tab title="MKS" %}

| Placa              | Puerto asignado                 | Pin SGN                                                                            |
| ------------------ | ------------------------------- | ---------------------------------------------------------------------------------- |
| **MKS SGEN\_L v1** | Al lado de Z- en el conector Z+ | <p><strong>O</strong></p><p><strong>O</strong></p><p><strong>X - PB10</strong></p> |
| {% endtab %}       |                                 |                                                                                    |

{% tab title="FYSECT" %}

| Placa        | Puerto asignado                                         | Pin SGN                                                                            |
| ------------ | ------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| **S6**       | No tiene definido uno, aconsejamos Y\_*MIN*\_PIN (PB13) | <p><strong>X - PB13</strong></p><p><strong>O</strong></p><p><strong>O</strong></p> |
| {% endtab %} |                                                         |                                                                                    |

{% tab title="FLY" %}

{% endtab %}
{% endtabs %}

## Configuración en Marlin

Dentro de nuestro fichero configuration\_adv.h buscaremos POWER LOSS RECOVERY dejando habilitada esta función de Marlin eliminando //

```cpp
#define POWER_LOSS_RECOVERY
```

Si queremos que PLR esté siempre habilitado deberemos activar PLR ENABLED DEFAULT de la siguiente forma, aunque podemos habilitarlo en el gcode de inicio de nuestro slicer para activarlo solo cuando lo consideremos necesario con el gcode **M413 S1** (**M413 S0** para deshabilitarlo y **M413** sin ningún parámetro para ver el estado)

```cpp
#define PLR_ENABLED_DEFAULT   true
```

En nuestro caso y como vamos a instalar un módulo UPS habilitaremos esta funcionalidad que permitirá al PLR poder realizar unas opciones avanzadas:

```cpp
#define BACKUP_POWER_SUPPLY
```

Relacionado con el punto anterior y dado que montaremos el módulo UPS habilitaremos la opción que al detectar un fallo en corriente levante el eje Z unos milímetros para evitar que el nozzle nos estropee nuestra pieza, **es muy importante entender que la cantidad de corriente disponible en el módulo es limitada y tenemos que minimiza el consumo de la misma durante el proceso PLR para que todo el proceso se realice de forma adecuada**, lo haremos habilitando teniendo en cuenta poner un multiplicador del valor de full step para nuestro eje Z:

```cpp
#define POWER_LOSS_ZRAISE       2

Calculo de full step para Ender 3
400 (steps) / 16 (micro steps) = 25 (steps por mm)
1 (step) / 25 ) = 0.04 (mm por cada full step)

2 (mm usados en POWER_LOSS_ZRAISE) / 0.04 (mm por cada full step) = 50 (full steps)
```

Como ya hemos indicado el módulo UPS va conectado a la placa para dar la señal de que la corriente ha fallado y proceda a realizar el proceso de apagado. Para nuestro caso vamos a usar nuestra [SKR E3 RRF ](https://3dwork.qitec.net/guias-impresion-3d/mejoras-upgrades/electronica/skr-e3-rrf)la cual tiene un conector PT-DET (pin PE0) para este uso, en las tablas del punto anterior puedes encontrar indicados para las placas que normalmente usamos:

```cpp
#define POWER_LOSS_PIN         PE0
```

Deberemos indicar dependiendo el módulo UPS usado cual es el estado del pin por defecto, en el caso del módulo BTT este será HIGH:

```cpp
#define POWER_LOSS_STATE     HIGH // 3DWORK PLR indicamos el estado correcto pin UPS
```

Al igual que el anterior necesitamos indicar si nuestra placa en el pin utilizado es PULLUP o PULLDOWN, en nuestro caso debemos de dejarlo activado para que funcione correctamente:

```cpp
#define POWER_LOSS_PULLUP // 3DWORK PLR habilitamos PULLUP SKR
```

El siguiente valor dependerá de nuestro sistema de extrusión en el cual indicaremos cuantos mm de filamento vamos a purgar antes de retomar la impresión para asegurar que tenga un flujo constante de filamento al reanudar la impresión:

```cpp
#define POWER_LOSS_PURGE_LEN   20
```

También para evitar el reflujo de filamento al realizar el apagado controlado podemos ajustar una retracción la cual debería de ser del mismo valor que las opciones de retracción de nuestro slicer en su gcode final que siempre aconsejamos de unos 3-5mm. Este valor lo ajustaremos en

```cpp
// #define POWER_LOSS_RETRACT_LEN 3
```

En todo caso y dado que ya realizamos una purga al retomar la impresión y por lo comentado que disponemos de una cantidad de corriente limitada NO lo vamos a habilitar en nuestro ejemplo.

Dado que disponemos de un módulo UPS no es necesario tener definido que Marlin guarde el estado de la impresión en cada cambio de capa además de que mejoraremos considerablemente la vida de nuestra SD por lo que dejaremos comentado esta opción:

```cpp
//#define POWER_LOSS_MIN_Z_CHANGE 0.05
```

Pues ya esta!!! a continuación os mostramos como debería quedar nuestra función PLR en Marlin (2.0.9.1 en este ejemplo):

```cpp
  #define POWER_LOSS_RECOVERY // 3DWORK PLR
  #if ENABLED(POWER_LOSS_RECOVERY)
    #define PLR_ENABLED_DEFAULT   true  // 3DWORK PLR habilitado por defecto Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
    #define BACKUP_POWER_SUPPLY       // 3DWORK PLR habilitamos UPS Backup power / UPS to move the steppers on power loss
    #define POWER_LOSS_ZRAISE       2 // 3DWORK PLR habilitamos subir Z (mm) Z axis raise on resume (on power loss with UPS)
    #define POWER_LOSS_PIN         PE0 // 3DWORK PLR habilitamos pin UPS Pin to detect power loss. Set to -1 to disable default pin on boards without module.
    #define POWER_LOSS_STATE     HIGH // 3DWORK PLR indicamos el estado correcto pin UPS State of pin indicating power loss
    #define POWER_LOSS_PULLUP         // 3DWORK PLR habilitamos PULLUP SKR Set pullup / pulldown as appropriate for your sensor
    //#define POWER_LOSS_PULLDOWN
    #define POWER_LOSS_PURGE_LEN   20 // 3DWORK PLR habilitamos purga (mm) Length of filament to purge on resume
    //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power.

    // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card,
    // especially with "vase mode" printing. Set too high and vases cannot be continued.
    #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data

    // Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled!
    //#define POWER_LOSS_RECOVER_ZHOME
    #if ENABLED(POWER_LOSS_RECOVER_ZHOME)
      //#define POWER_LOSS_ZHOME_POS { 0, 0 } // Safe XY position to home Z while avoiding objects on the bed
    #endif
  #endif
```

{% hint style="info" %}
**Recuerda que cada vez que subimos una nueva versión de Marlin, más si añadimos nuevas funcionalidades o ajustamos parámetros editables por pantalla/gcode, hemos de recargar los valores de la EEPRO... para más información sobre el** [**uso de la EEPROM por parte de Marlin os aconsejamos revisar esta información**](https://marlin.3dwork.io/marlin/marlin-guia-compilacion#algunos-consejos)**.**
{% endhint %}

## Resolución de problemas

A continuación os damos algunos consejos a revisar en el caso de no funcionar correctamente:

* Asegúrate que has conectado correctamente todos los cables en la posición correcta según las especificaciones del o de los fabricantes en cada caso
* Que tienes el pin de detección de fallo de corriente bien definido en `POWER_LOSS_PIN`
* Cuando apliques tu versión de Marlin modificada, asegúrate que recargas los valores de la EEPROM tal y como se ha comentado anteriormente... para asegurarse lo ideal es lanzar el comando M503 y buscar el apartado de `Power-loss recovery` y debería aparecer un `M413 S1` indicando que esta habilitada la funcionalidad\
  ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FQxACq5pgRx3Jx1bpv7nE%2Ftelegram-cloud-photo-size-4-5918158995233817366-x.jpg?alt=media\&token=f51388b3-e2f4-4059-9dcb-42a0cc9a99ba)
* Recuerda que el sistema de recuperación ante fallos de corriente funciona solo en impresiones gestionadas por la electrónica de la impresora, aquellas que se hacen desde un host como Octoprint o pantallas TFT serial no funcionan, desde su propia SD donde crea un archivo extra con el log/progreso de nuestra impresión que permita retomarla
* Si solamente iniciar una impresión o la impresora nos salta el asistente de recuperación por fallo de correo comprueba la lógica de activación de esta en `POWER_LOSS_STATE` ajustando su valor `HIGH/LOW`
* Si no funciona correctamente, teniendo lo anterior correcto, el proceso podemos revisar:
  * que nuestra SD contenga el fichero extra de seguimiento de impresión o que la SD no este dañada o le falte espacio
  * que no tengamos en el gcode de inicio de nuestro laminador un M413 S0 que nos deshabilite la funcionalidad
  * podemos habilitar #define DEBUG\_POWER\_LOSS\_RECOVERY en nuestro Marlin temporalmente para, con la impresora conectada a Pronterface, poder obtener más información del proceso\
    ![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F6QnXttVd8B6AjNwhkdDb%2Fimage.png?alt=media\&token=a52e07f8-68be-444b-afdb-0399f65e19f6)


# Leds Neopixel

Configura LEDs Neopixel en Marlin para iluminar tu impresora, mostrar el estado de la impresión y controlar colores desde el laminador.

Añadir una tira LED Neopixel va mucho más allá de la estética: puedes iluminar el área de impresión para supervisarla, mostrar el estado del proceso mediante colores y controlar los LEDs desde los scripts gcode de tu laminador.

{% hint style="info" %}
Pásate por nuestro [grupo Telegram 3Dwork en español](https://t.me/trastornados) para cualquier duda sobre configuración de tu impresora.
{% endhint %}

## Tipos de LED compatibles

Marlin soporta los tipos de LED más comunes. Elige el tuyo para saber qué valor usar en `NEOPIXEL_TYPE`:

| Tipo físico      | Constante Marlin | Canales | Descripción                                   |
| ---------------- | ---------------- | ------- | --------------------------------------------- |
| WS2812 / WS2812B | `NEO_GRB`        | RGB     | El más común. 5V, protocolo de 1 hilo.        |
| SK6812 (RGBW)    | `NEO_GRBW`       | RGBW    | Como WS2812 pero con canal blanco adicional.  |
| WS2811           | `NEO_RGB`        | RGB     | Similar a WS2812, orden de canales diferente. |
| APA102 / DotStar | `NEO_GRB`        | RGB     | 2 hilos (data + clock), más rápido.           |
| WS2801           | `NEO_RGB`        | RGB     | 2 hilos, protocolo SPI.                       |

## Dónde conseguir tiras LED Neopixel

{% tabs %}
{% tab title="WS2812B 5V — BTF-LIGHTING (recomendada)" %}
{% embed url="<https://s.click.aliexpress.com/e/182731559?productUrl=https://www.aliexpress.com/item/2036819167.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 %}

{% hint style="warning" %}
**Voltaje**: La mayoría de tiras para impresoras 3D son de **5V**. Alimentar una tira de 5V con 12V la destruirá. Comprueba el voltaje de tu tira antes de conectarla.

Si usas muchos LEDs (>30) o tiras de 12V, usa una **fuente de alimentación externa** en lugar del conector de la placa, ya que los conectores de las placas tienen una corriente limitada.
{% endhint %}

## Cableado

Las tiras Neopixel tienen 3 conexiones: **VCC** (voltaje), **GND** (masa) y **DIN/DATA** (señal).

Las tiras tienen una dirección marcada con una flecha en la serigrafía — el cable DIN va al inicio de la tira, no al fin. Además pueden cortarse por las marcas designadas para ajustarse a la longitud necesaria.

**Cable recomendado para la señal**: 26 AWG. Para alimentación de tiras largas, usa cable más grueso (22-24 AWG).

### Conectores dedicados en placas comunes

| Placa                 | Conector Neopixel         | Pin     |
| --------------------- | ------------------------- | ------- |
| BTT SKR 1.4 / Turbo   | Puerto Neopixel dedicado  | `P1_24` |
| BTT SKR PRO           | Puerto Neopixel dedicado  | `PE6`   |
| BTT Octopus           | Puerto RGB dedicado       | `PB0`   |
| BTT Manta M8P         | Puerto RGB dedicado       | `PB0`   |
| BTT SKR Mini E3 v2/v3 | Puerto Neopixel           | `PC7`   |
| BTT SKR 1.3           | Puerto SERVO (compatible) | `P2_00` |

{% hint style="info" %}
Si tu placa no tiene conector dedicado, el **puerto SERVO** es compatible con la señal Neopixel. Verifica el archivo `pins_[TU_PLACA].h` en el código de Marlin para confirmar el número de pin.
{% endhint %}

## Configuración en Marlin

### configuration.h — Habilitar Neopixel

Busca y descomenta `NEOPIXEL_LED` en `configuration.h`:

```cpp
#define NEOPIXEL_LED
#if ENABLED(NEOPIXEL_LED)
  #define NEOPIXEL_TYPE       NEO_GRB   // tipo de LED (ver tabla arriba)
  #define NEOPIXEL_PIN        P1_24     // pin de señal de tu placa
  //#define NEOPIXEL2_TYPE    NEOPIXEL_TYPE
  //#define NEOPIXEL2_PIN     5         // segunda tira (opcional)
  #define NEOPIXEL_PIXELS     30        // número total de LEDs en la tira
  //#define NEOPIXEL_IS_SEQUENTIAL      // apagar LEDs en secuencia al finalizar
  #define NEOPIXEL_BRIGHTNESS 255       // brillo inicial (0-255)
  #define NEOPIXEL_STARTUP_TEST         // animar LEDs al arrancar para verificar
  //#define NEOPIXEL_BKGD_LED_INDEX  0  // LED de fondo para indicar estado
  //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // color de fondo RGBW
#endif
```

**Parámetros más importantes:**

| Parámetro               | Descripción                                            |
| ----------------------- | ------------------------------------------------------ |
| `NEOPIXEL_TYPE`         | Tipo de LED (ver tabla de tipos)                       |
| `NEOPIXEL_PIN`          | Pin de señal — ajustar al de tu placa                  |
| `NEOPIXEL_PIXELS`       | Número de LEDs en la tira                              |
| `NEOPIXEL_BRIGHTNESS`   | Brillo de 0 (apagado) a 255 (máximo)                   |
| `NEOPIXEL_STARTUP_TEST` | Cicla RGB al arrancar para verificar que todo funciona |

### configuration\_adv.h — Menú LCD y presets de color

Añade el menú de control de LEDs a la pantalla LCD:

```cpp
#define LED_CONTROL_MENU
#if ENABLED(LED_CONTROL_MENU)
  #define LED_COLOR_PRESETS               // presets de color en el menú
  #if ENABLED(LED_COLOR_PRESETS)
    #define LED_USER_PRESET_RED     255   // componente R del color personalizado
    #define LED_USER_PRESET_GREEN   255   // componente G
    #define LED_USER_PRESET_BLUE    255   // componente B
    #define LED_USER_PRESET_WHITE   255   // componente W (solo RGBW)
    #define LED_USER_PRESET_BRIGHTNESS 255
    #define LED_USER_PRESET_STARTUP     // aplicar preset al arrancar
  #endif
#endif
```

### Segunda tira Neopixel (NEOPIXEL2)

Para usar dos tiras independientes, descomenta las líneas de `NEOPIXEL2`:

```cpp
#define NEOPIXEL2_TYPE   NEO_GRB   // tipo de la segunda tira
#define NEOPIXEL2_PIN    5         // pin de señal de la segunda tira
```

Puedes usarlas independientemente con el gcode `M150 S0` (tira 1) y `M150 S1` (tira 2).

## Controlar los LEDs con G-code (M150)

El gcode `M150` permite controlar color, brillo e índice de cada LED desde el terminal o los scripts de tu laminador.

```
M150 [R<0-255>] [U<0-255>] [B<0-255>] [W<0-255>] [P<0-255>] [I<index>] [S<strip>]
```

| Parámetro | Descripción                                |
| --------- | ------------------------------------------ |
| `R`       | Canal Rojo (0-255)                         |
| `U`       | Canal Verde (0-255) — nota: es `U`, no `G` |
| `B`       | Canal Azul (0-255)                         |
| `W`       | Canal Blanco (0-255) — solo LEDs RGBW      |
| `P`       | Brillo global (0-255)                      |
| `I`       | Índice del LED específico (0 a N-1)        |
| `S`       | Seleccionar tira: 0 = primera, 1 = segunda |

**Ejemplos prácticos:**

```gcode
M150 R255 U0 B0         ; rojo — impresión en marcha
M150 R0 U255 B0         ; verde — impresión completada
M150 R0 U0 B255         ; azul — calentando
M150 R255 U128 B0       ; naranja — pausa / cambio filamento
M150 R255 U255 B255     ; blanco — iluminación máxima
M150 R0 U0 B0 P0        ; apagar todos los LEDs
M150 P128               ; reducir brillo al 50% sin cambiar color
M150 I5 R255 U0 B0      ; poner LED número 5 en rojo (solo ese)
```

## Uso en scripts del laminador

Puedes personalizar el comportamiento de los LEDs añadiendo `M150` a los scripts de tu laminador:

### Script de inicio (Start G-code)

```gcode
M150 R0 U0 B255         ; azul: calentando
M190 S[first_layer_bed_temperature]
M109 S[first_layer_temperature]
M150 R0 U255 B0         ; verde: listo para imprimir
G28
G29
```

### Script de fin (End G-code)

```gcode
M150 R0 U255 B0         ; verde: impresión completada
M104 S0                 ; apagar extrusor
M140 S0                 ; apagar cama
G28 X Y                 ; home X e Y
M84                     ; apagar motores
```

### Cambio de filamento (en PrusaSlicer/OrcaSlicer)

```gcode
M150 R255 U128 B0       ; naranja: cambio de filamento en curso
M600
M150 R0 U255 B0         ; verde: retomar impresión
```

## Resolución de problemas

| Síntoma                                       | Causa probable                              | Solución                                                                      |
| --------------------------------------------- | ------------------------------------------- | ----------------------------------------------------------------------------- |
| LEDs no encienden en absoluto                 | Pin incorrecto o sin alimentación           | Verificar `NEOPIXEL_PIN` en el archivo pins de tu placa y revisar el cableado |
| Solo enciende el primer LED                   | Problema de señal o nivel de voltaje        | Añadir resistencia 300-500Ω en el cable DATA; verificar tierra común          |
| Colores incorrectos (rojo aparece como verde) | Tipo de LED incorrecto                      | Cambiar `NEOPIXEL_TYPE`: prueba `NEO_RGB`, `NEO_GRB`, `NEO_BRG`               |
| LEDs parpadean o son inestables               | Alimentación insuficiente o ruidosa         | Añadir condensador 100-1000µF entre VCC y GND cerca del primer LED            |
| `NEOPIXEL_STARTUP_TEST` no funciona           | La animación está desactivada o pin erróneo | Verificar que `NEOPIXEL_STARTUP_TEST` está descomentado y recompilar          |
| Segunda tira no funciona                      | NEOPIXEL2 no configurado                    | Descomentar `NEOPIXEL2_PIN` y `NEOPIXEL2_TYPE` en configuration.h             |
| Los LEDs no responden a M150                  | `NEOPIXEL_LED` no compilado                 | Verificar que la opción está habilitada y el firmware recompilado/flasheado   |

{% hint style="warning" %}
Las tiras Neopixel consumen corriente. Una tira de 30 LEDs WS2812B a brillo máximo puede consumir \~1.8A. Antes de alimentar desde la placa, revisa cuánta corriente puede entregar el conector Neopixel de tu modelo específico. Para tiras largas o consumos altos, usa alimentación externa con GND compartida con la placa.
{% endhint %}


# Marlin Troubleshooting

Errores comunes en Marlin: mensajes de error, problemas de compilación, fallos de comportamiento y cómo solucionarlos.

{% 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 %}

Aquí encontrarás los problemas más frecuentes al compilar, flashear o usar Marlin, junto con sus causas y soluciones.

## Errores de compilación

| Error                                         | Causa                                                  | Solución                                                                                                   |
| --------------------------------------------- | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
| `#error MOTHERBOARD value is not valid`       | El valor de `MOTHERBOARD` en Configuration.h no existe | Busca tu placa en `Marlin/src/core/boards.h` y usa el valor correcto                                       |
| `#error "Serial port..." is not available`    | Puerto serial incorrecto para la placa                 | Revisa `SERIAL_PORT` en Configuration.h — muchas placas STM32 usan `-1` para USB nativo                    |
| `region 'flash' overflowed`                   | El firmware compilado no cabe en la flash de la placa  | Desactiva funciones no necesarias o usa un entorno con más flash (ej: `STM32F407VG` en vez de `STM32F103`) |
| `#error "NOZZLE_PARK_FEATURE is required..."` | Función dependiente no habilitada                      | Lee el mensaje de error: indica qué `#define` habilitar para resolverlo                                    |
| `Cannot open source file "..."`               | Librería de PlatformIO no descargada                   | Ejecuta `PlatformIO: Clean` y vuelve a compilar para que descargue dependencias                            |

## Errores al flashear

| Error                                        | Causa                                                           | Solución                                                                                              |
| -------------------------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Puerto COM no aparece                        | Driver no instalado o cable sin datos                           | Instala el driver CH340/CP2102 según el chip USB de tu placa; usa cable USB con datos (no solo carga) |
| `avrdude: verification error`                | Flash incorrecta o protegida                                    | Verifica que el `.hex` corresponde al procesador correcto (mega2560 ≠ mega1280)                       |
| Firmware flasheado pero impresora no arranca | Bootloader corrupto o configuración errónea                     | Reflashea el bootloader con un programador externo o verifica `MOTHERBOARD`                           |
| Pantalla en blanco tras actualización        | Cambio en el protocolo de comunicación o reset EEPROM necesario | Envía `M502` + `M500` para resetear la EEPROM a valores por defecto                                   |

## Problemas de comportamiento

| Síntoma                                        | Causa probable                                        | Solución                                                                                       |
| ---------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| Eje se mueve en dirección contraria            | `INVERT_X_DIR` (o Y/Z/E) incorrecto                   | Cambia el valor true/false del eje correspondiente en Configuration.h                          |
| El homing no para / activa el endstop al revés | Lógica de endstop invertida                           | Cambia `X_HOME_DIR` o usa `#define ENDSTOPPULLUP_XMIN` según el tipo (NO/NC)                   |
| `Printer halted. kill() called`                | Error crítico de temperatura o protección activada    | Revisa los valores de `TEMP_SENSOR_*` y las protecciones `THERMAL_PROTECTION_*`                |
| Temperatura errática o `-14°C` constante       | Termistor mal configurado o desconectado              | Verifica `TEMP_SENSOR_0` — el valor debe coincidir con el termistor instalado                  |
| `Heating failed` al calentar                   | Calefactor no llega a temperatura en tiempo           | Ajusta `WATCH_TEMP_INCREASE` y `WATCH_TEMP_PERIOD` o revisa la resistencia del heater          |
| Steps/mm incorrectos tras actualización        | EEPROM con valores viejos                             | Envía `M502` para cargar los del firmware y `M500` para guardarlos                             |
| `Probing Failed` durante G29                   | Sonda no alcanza el punto de sondeo                   | Ajusta `X_PROBE_OFFSET_FROM_EXTRUDER` / `Y_PROBE_OFFSET_FROM_EXTRUDER` o los límites de sondeo |
| Ventilador de capa no responde a M106          | `EXTRUDER_AUTO_FAN` o pin incorrecto                  | Verifica `FAN_PIN` en los pins de tu placa; revisa si está controlado por `EXTRUDER_AUTO_FAN`  |
| ABL/BLTouch no despliega la sonda              | Pin de control incorrecto                             | Verifica `SERVO0_PIN` o `Z_PROBE_PIN` en el fichero pins de tu placa                           |
| Impresión se desplaza en capas (layer shift)   | Corriente de driver insuficiente o sobrecalentamiento | Ajusta `#define X_CURRENT` en Configuration\_adv.h; mejora la ventilación de los drivers       |

## Problemas con la pantalla

| Síntoma                                         | Causa                                                | Solución                                                                          |
| ----------------------------------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------- |
| Pantalla en blanco (retroiluminación encendida) | Encoder o tipo de pantalla incorrecto                | Verifica `LCD_LANGUAGE`, `DISPLAY_CHARSET_HD44780` y el modelo en Configuration.h |
| Pantalla TFT muestra "No printer attached"      | Baudrate incorrecto o `SERIAL_PORT_2` no configurado | Ajusta `BAUDRATE` a 115200 y habilita `SERIAL_PORT_2` para la TFT                 |
| Menú de nivelación no aparece                   | Función no compilada                                 | Habilita `LCD_BED_LEVELING` en Configuration.h                                    |

## Herramientas de diagnóstico

```gcode
M115   ; información del firmware y capacidades
M119   ; estado de todos los finales de carrera
M503   ; configuración activa completa (pasos, PID, offsets...)
M155 S2  ; reportar temperaturas cada 2 segundos
```

{% hint style="info" %}
**Pronterface** es la herramienta más cómoda para diagnosticar: conecta via USB, envía gcodes y ve los mensajes de respuesta en tiempo real. Más info en la guía de [Pronterface](/marlin/troubleshooting-marlin/pronterface).
{% endhint %}

## Guías específicas de esta sección

{% content-ref url="/pages/ogpQJHsC8x4RN82qpTu8" %}
[Pronterface](/marlin/troubleshooting-marlin/pronterface)
{% endcontent-ref %}

{% content-ref url="/pages/-MX8-EfV5xaNW8bowUOx" %}
[Control de ventiladores con MOSFET externo](/marlin/troubleshooting-marlin/control-de-ventiladores-con-mosfet-externo)
{% endcontent-ref %}

{% content-ref url="/pages/-MXNGvSDMeuv\_P1ndDa1" %}
[Reparar pin sensor temperatura](/marlin/troubleshooting-marlin/reparar-pin-sensor-temperatura)
{% endcontent-ref %}


# Pronterface

Herramienta de gestión impresoras desde tu ordenador

Pronterface es una herramienta que nos permite gestionar nuestra impresora desde un ordenador mediante, normalmente, una conexión USB.

Podemos usar Pronterface para:

* controlar nuestra impresora a nivel de movimientos o temperaturas
* verificar estabilidad de temperatura
* lanzar comandos gcodes para por ejemplo modificar valores de configuración, habilitar o deshabilitar opciones o realizar procesos de ajuste
* incluso enviar una impresion desde nuestro ordenador

## Dónde conseguir Pronterface?

Pronterface es compatible con diferentes sistemas operativos (Windows, MacOS y Linux) y podéis descargar la versión que necesiteis desde aqui.

{% embed url="<https://www.pronterface.com>" %}

## Usando Pronterface

Como hemos comentado podemos realizar muchas acciones desde Pronterface, a continuación os detallamos algunas de ellas que os pueden ser interesantes.

### Ejecutar Pronterface y conectar tu impresora

* Ejecutaremos Pronterface
* Desde los controles de comunicación seleccionaremos el COM donde se conectó la impresora, la velocidad o baudrate de conexión y le daremos al botón de conectar.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F6KRsZqosCJjGSaamYbeq%2Fimage.png?alt=media\&token=be0138ec-f17d-4b25-ba9c-f0c5ff98f833)

* Si todo ha funcionado correctamente veremos que aparece información en la ventana de comandos (a la derecha).

### Ajustar la configuración de Pronterface

Para que la visualización de Pronterface funcione correctamente es necesario ajustar su configuración.

Podemos ir al menú Settings/Options y pondremos los valores adecuados para nuestra impresora.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FGsiPYl6z0qDmoqYXLvpW%2Fimage.png?alt=media\&token=32c5d452-99ac-42d5-ada4-57504158eb73)

### Mover los ejes de nuestra impresora

Disponemos de unos controles bastante intuitivos donde podremos realizar acciones como mover los ejes, realizar un homing (icono de casa).

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FnGMYFlNN45eupJXl5jIW%2Fimage.png?alt=media\&token=81b7c7ee-ae96-435f-a2e5-45fbf1f3ab4f)

### Calentar la base de impresión

Otra función que podemos hacer es calentar la base de impresión haciendo click en el botón SET ajustando la temperatura a nuestro gusto, al hacerlo veremos como la gráfica de temperatura irá reflejando el cambio en la temperatura.

Podemos usar el botón OFF para apagar el calentador de la base de impresión.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FSm9Y8nB95QmLuz5w6QjH%2Fimage.png?alt=media\&token=74a945b6-4a90-475e-9cc6-64221c44eccd)

### Calentar el extrusor

Al igual que hicimos en el paso anterior podemos calentar de igual forma nuestro extrusor.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FHmblIleelDyvd8l6BzGa%2Fimage.png?alt=media\&token=ec9d475a-6e3f-4bf5-ae2d-706665b9de17)

### Usar la ventana de terminal para enviar gcodes

Como ya comentamos podemos usar Pronterface para lanzar comandos gcodes que nos pueden servir para realizar muchas accions además de averiguar el estado y configuraciones de nuestra máquina.

Para ello en la parte derecha contamos con la ventana de terminal donde tenemos una ventana de texto donde aparecerán las respuestas de nuestra impresora y en la parte inferior otra de texto con un botón SEND para enviar nuestros comandos.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FQiDyoTSrAGerkr7FDZri%2Fimage.png?alt=media\&token=34a9a42d-fec5-454a-b75c-7de678def081)

Algunos comandos que nos pueden ser útiles:

* **M119**, nos va a reportar el estado de nuestros sensores de final de carrera o filamentos
* **M503**, nos devuelve la configuración de nuestra máquina almacenada en la EEPROM
* **PID**, realizar el proceso de ajuste/calibración PID de nuestros calentadores. [**Aquí podéis encontrar más información**](https://github.com/alienboyxp/gitbook_es_marlin_3dwork_io/blob/main/marlin/troubleshooting-marlin/broken-reference/README.md)

Podéis encontrar [**otros gcodes aquí**](/marlin/marlin-guia-compilacion/marlin-gcodes-basicos).

### Enviar un fichero gcode a la impresora

Para cargar un archivo gcode a nuestra impresora usaremos el botón LOAD FILE, buscaremos nuestro archivo y lo abriremos.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FdWZevS8kKvexaUYSjzUb%2Fimage.png?alt=media\&token=3cdf13ac-30d6-4930-8bd7-3454d05183a0)

Una vez cargado usaremos el botón PRINT para comenzar la impresión.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FPpRSf3eJB0NQ1UyFsMXg%2Fimage.png?alt=media\&token=2c7876e2-50cb-4703-a437-a419fc4fc26c)


# Control de ventiladores con MOSFET externo

Se te ha roto el MOSFET del ventilador de capa o necesitas otro ventilador controlable?

Nuestras placas usan un componente MOSFET para proveer de corriente a los diferentes perifericos que se conectan a ella. Básicamente un MOSFET es usado como un interruptor que actúa como amplificador de la señal recibida.

Os recordamos que tienes mas guias de ayuda en nuestro bot de Telegram [@ThreeDWorkHelpBot](https://t.me/ThreeDWorkHelpBot)

En el caso de las impresoras 3D este tipo de puertos se usan para ajustar una señal PWM. Esta señal se envía en pulsos más rápidos o lentos para cambiar la potencia de salida del ventilador.

Antes de proceder lo ideal es asegurarnos que el problema no es el ventilador estropeado o por otro lado tengamos otros pines para ventiladores controlables que nos permitan reasignar los pines para el rol deseado y asi evitar comprar nada.

Para poder realizar este tipo de cambios requerimos un MOSFET externo dado que normalmente sustituir el componente dañado suele ser complicado de encontrar y relativamente complicado de poder reparar sin los conocimientos o herramientas adecuados.

Aunque no esta enfocado al objetivo de la guía normalmente a nuestras impresoras 3D se suelen poner dos tipos de MOSFET externos

* MOSFET para la gestión del hotend o cama calientes, estos normalmente ayudan a proteger la electrónica de la placa y mejoran la potencia y estabilidad suministradas a estos componentes. Son muy aconsejables en el caso de uso de camas calientes ya que generan un alto consumo y desgaste sobre la electrónica.

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

* MOSFET para la gestión de ventiladores, en este caso suelen ser pequeños MOSFET que nos permitirán gestionar un ventilador ya sea para sustituir alguno dañado de la placa o como extra para usar en otras partes de nuestra impresora

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

Por otro lado y si estas buscando ventiladores te aconsejamos los siguientes:

* Ventiladores 4010 para hotend o electronica silenciosos (12v!!!)

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

{% embed url="<https://www.amazon.es/Noiseblocker-BlackSilentFan-40mm-Ventilador-ordenador/dp/B0083A0BY4/ref=sr_1_2?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=noiseblocker+4010&qid=1619086367&sr=8-2>" %}
{% endtab %}

{% tab title="Amazon" %}
{% embed url="<https://www.amazon.es/Solutions-Silent-Carcasa-ordenador-Ventilador/dp/B00BF3S83C/ref=sr_1_1?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=silent+4&qid=1619086404&sr=8-1>" %}
{% endtab %}
{% endtabs %}

* Ventiladores 5015 para ventilación de capa (24v)

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

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

## Conexiónes de un MOSFET externo

Dado que el objetivo de esta guía es solucionar de forma sencilla ante un fallo del mosfet que gestiona nuestro ventilador te ofrecemos dos soluciones, sin contar la del cambio del componente en placa por lo comentado anteriormente, siendo una de ellas un mosfet tradicional y la otra normalmente más sencilla pero con ciertos requerimientos

### Usando un MOSFET externo

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MX82Yr-QRK0ySGJvG1C%2F-MX84cSG_EQc-_SuFdBv%2Fimage.png?alt=media\&token=8e67ec8f-5d70-4712-93bb-cc589ce9f65e)

Básicamente un módulo MOSFET dispone de 3 entradas/salidas:

* Entrada de activación, de donde recibe la señal por parte externa para la activación básicamente dependiendo del tipo de módulo son dos o tres pines:
  * GND que irá conectado al GND de la placa
  * SIG que es el pin de señal de la placa
  * VCC alimentación en el caso de disponer de controlador o led de control, este pin depende del modulo puede estar o no disponible
* Entrada de alimentación externa, es la fuente de corriente que mediante la activación del MOSFET entregará a la salida. En nuestro caso normalmente esta entrada irá conectada a nuestra fuente de alimentación. En la foto anterior serían los pines VIN/GND
* Salida alimentación hotend/cama/ventilador, es donde conectaremos el componente a controlar. En la foto anterior serían los pines V+/V-

![Esquema de conexión MOSFET](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-M_UZyP_fuH_Mukf6Sk9%2F-M_VGVqA1YArvrmSODZn%2Fimage.png?alt=media\&token=12d61ec5-1506-4cf2-9f8d-614e6abb61c6)

### Usando un adaptador específico para zócalo de driver

Esta solución es muy cómoda y versátil al permitirnos disponer de hasta 3 ventiladores extras controlables aunque la partida es que deberemos sacrificar un zócalo de driver de motores para su instalación.

Makerbase dispone de su 3MOS que va perfecto para lo comentado.

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

Con este módulo conectado en nuestra placa dispondremos de hasta 3 ventiladores controlables con un máximo de 1A por salida de ventilador. En la siguiente tabla podréis ver sus características y como configurar los pines:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F481IAo6cjjJVFTLR6PIf%2Fimage.png?alt=media\&token=5bef119c-e803-4694-b830-27c4e41d703e)

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fo7eEN3oZufSy9AlUNhKJ%2Fimage.png?alt=media\&token=60788250-018f-4e54-bfbc-b87726d1e0ea)

## Reasignar pins en Marlin

Dependiendo del uso que queramos dar al módulo externo MOSFET necesitaremos realizar algunos cambios en nuestro firmware Marlin. En nuestro caso vamos a reasignar la función del control de un ventilador.

> **En el caso de ventiladores es importante entender que algunas placas es necesario activar #define FAN\_*****SOFT*****\_PWM que se encuentra en configuration.h. En nuestro ejemplo usando una SKR 1.4 no es necesario especificarlo.**

### Que deshabilitar para poder trasladar la función de ventilador a otro pin?

Para poder trasladar de un pin que no funciona como el ventilador de capa podemos deberemos deshabilitar una asignación de pin al que queremos usar para poder asignarlo posteriormente.

Para poder ver donde están esas definiciones debemos encontrar el fichero pins de nuestra placa:

| Placa          | Fichero pins                                        |
| -------------- | --------------------------------------------------- |
| SKR 1.4 TURBO  | `Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h` |
| SKR 1.4        | `Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h`       |
| SKR MINI TURBO | `Marlin/src/pins/lpx1769/pins_BTT_SKR_E3_TURBO.h`   |

En el caso de querer trasladar un ventilador de pin tenemos que usar un pin compatible PWM para poder usar de forma adecuada nuestro modulo MOSFET externo.

#### Lista de pines PWM disponibles

{% tabs %}
{% tab title="SKR 1.4" %}

* Verificados
  * **Z-Stop P1\_27**
  * **PWRDET P1\_00**
  * **I2C\_SCA1 P0\_00**
  * **I2C\_SCL1 P0\_01**
  * **SPI P0\_26 (top left) (cercano a power CPU) (parece no usado por el puerto SPI)**
  * **NEOPIXEL P1\_24**
  * **PROBE P0\_10**
* No verificados pero deberían de funcionar
  * **SERVO P2\_02**
* PWM pero normalmente en uso
  * **E1 Stepper pins,**
    * **E1 Enable P1\_16**
    * **E1 Step P1\_15**
    * **E1 Dir P1\_14**
  * **TFT Pins**
    * **TFT RX0 P0\_03**
    * **TFT TX0 P0\_02**
  * **Wifi Pins**
    * **Wifi TX3 P4\_28**
    * **Wifi RX3 P4\_29**
* PWM pero NO USAR!!!
  * **SPI\_SCK1 P0\_07**
  * **SPI\_MISO1 P0\_08**
  * **SPI\_MOSI1 P0\_09**
    {% endtab %}

{% tab title="Second Tab" %}

{% endtab %}
{% endtabs %}

En nuestro caso para sustituir nuestro ventilador de capa estropeado vamos a usar los pines asociados con el control de detección de problema de corriente (Power Loss Detection) o el de gestión de encencido (Power Supply Control).

En este caso simplemente deshabilitaremos uno de ellos de la siguiente manera:

`//// Power Supply Control`\
`//#ifndef PS_ON_PIN`\
`//#define PS_ON_PIN P1_00 //3DWORK – Cambio para reasignar funcion`

`//// Power Loss Detection`\
`//#ifndef POWER_LOSS_PIN`\
`//#define POWER_LOSS_PIN P1_00 //3DWORK – Cambio para reasignar funcion`

## Activación controlada del ventilador del HotEnd

Un cambio muy aconsejable a nivel de ventiladores es, para placas que solamente tienen un pin de ventilador controlable y doble extrusión que no usemos... SKR 1.3 y 1.4 por ejemplo, el colocar nuestro ventilador del HotEnd y de refrigeración de la electrónica a la salida del extrusor 1 (HE1) o en uno de los pines que seleccionamos anteriormente

En ese caso podemos activarlo de la siguiente forma en configuration\_adv usando el pin que previamente desactivamos de su función normal:

`#define E0_AUTO_FAN_PIN P1_00 //3DWORK – Asignado pin ventilador hotend controlado a MOSFET externo`

O podemos como comentabamos anteriormente usarlo con la salida del extrusor 1 (HE1) si no lo estamos usando:

`#define E0_AUTO_FAN_PIN FAN1_PIN //3DWORK – Asignado pin ventilador hotend controlado a pin HE1`

En este caso podemos ajustar además a partir de que temperatura queremos ponerlo en marcha y a que velocidad (el valor 255 equivaldría al 100% de velocidad de giro):

`#define EXTRUDER_AUTO_FAN_TEMPERATURE 50`\
`#define EXTRUDER_AUTO_FAN_SPEED 255`

## Activación controlada de un ventilador de Cerramiento (Chamber)

Otro uso para añadir un ventilador controlable es como refrigeración de nuestro cerramiento si queremos tener un control de temperaturas.

`#define CHAMBER_FAN_PIN P1_00 //3DWORK – Asignado pin ventilador chamber controlado`

`#define CHAMBER_AUTO_FAN_TEMPERATURE 50`\
`#define CHAMBER_AUTO_FAN_SPEED 255`

## SegundoVentilador de Capa (doble extrusor)

En este caso el proceso es un poco diferente al anterior ya que debemos de modificar para cambiar el pin actual por el nuevo elegido.

### Fichero pins de nuestra placa

Revisando nuestro fichero nos encontraremos con la definición de FAN\_PIN, para nuestro caso y para nuestra SKR 1.4 lo haremos de la siguiente manera:

`# define FAN_PIN P2_03 // 3DWORK - pin original ventilador de capa`\
`# define FAN1_PIN P1_00 // 3DWORK - nuevo pin ventilador de capa`

### Configuration\_adv

Deberemos asignar el nuevo ventilador a nuestro segundo extrusor:

`# define FANMUX0_PIN P2_03 // 3DWORK - pin original ventilador de capa`\
`# define FANMUX1_PIN P1_00 // 3DWORK - nuevo pin ventilador de capa`

## Reparar pin de Ventilador de Capa

En el caso que nuestro pin de ventilador de capa falle, normalmente estan controlados por un MOSFET integrado y el sintoma de que esta roto es que esta continuamente al 100% sin posibilidad de ser controlado, el proceso es muy sencillo.

Simplemente deberemos intercambiar los pines asignados entre los que usemos:

`# define FAN_PIN P1_00 // 3DWORK - nuevo pin ventilador MOSFET externo`\
`# define POWER_LOSS_PIN P2_03 // 3DWORK - antiguo pin ventilador roto`

{% hint style="info" %}
En ocasiones, dependiendo del pin/mosfet/ventilador usado, es necesario ajustar Marlin para que la señal PWM se ajuste al cambio si nuestro ventilador no funciona como debiera.

Para ello podemos revisar si con **#define FAN\_SOFT\_PWM** (y otras dos opciones relacionadas con este cambio) podemos hacer que esta señal funcione correctamente con nuestra configurracion.
{% endhint %}


# Reparar pin sensor temperatura

Como solucionar problemas con pin de termistor dañados

Un fallo muy común normalmente por mala manipulación o por un corto en un termistor es que el pin de nuestra placa quede dañado y en este caso podemos intentar ajustar nuestro Marlin para usar un pin alternativo para esa función.

Os recordamos que tienes mas guias de ayuda en nuestro bot de Telegram [@ThreeDWorkHelpBot](https://t.me/ThreeDWorkHelpBot)

**Es MUY aconsejable que desechemos ese termistor para evitar que ese fallo vuelva a dañar otro pin de nuestra placa!!!**

{% embed url="<https://s.click.aliexpress.com/e/_9iwUDd>" %}

{% embed url="<https://s.click.aliexpress.com/e/_AOHeqf>" %}

{% hint style="info" %}
Otra alternativa en el caso que no dispongamos de ningún pin alternativo es usar Thermistor Expander de SKR.

<img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FHHHFYC8OIzpqtlFc7IWW%2Fimage.png?alt=media&amp;token=061e80b0-90b0-4c21-86e8-66bd8d2e540d" alt="" data-size="original">

El cual podremos conectar a nuestro conector TFT o adaptar al puerto wifi o AUX de nuestra placa para conseguir dos thermistores extras.

<https://lab4450.com/product/skr-mini-e3-thermistor-expander/>

<img src="https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FeQgTq6xMfSODSsw9ChLs%2Fimage.png?alt=media&amp;token=998535ed-7f61-4ec7-a8b7-a45a64f5fc61" alt="" data-size="original">

También podremos hacernos el nuestro propio <https://github.com/VoronDesign/Voron-Hardware/tree/master/SKR-Mini_TFT_Thermistor_Board>
{% endhint %}

## Cambios en Marlin

El procedimiento es muy sencillo pero antes de nada deberemos de tener claro 3 puntos importantes:

* saber identificar el fichero pins de nuestra placa y si este tiene incluidos otros relacionados. En el caso de ejemplo que desarrollaremos usaremos uno de los más complejos escenarios usando una SKR 1.4 Turbo.\
  En todo caso puedes revisar la table de nuestra guia de ventiladores:

{% embed url="<https://3dwork.qitec.net/guias-impresion-3d/resolucion-de-problemas/problemas-hardware-impresora-3d/control-de-ventiladores-con-mosfet-externo#que-deshabilitar-para-poder-trasladar-la-funcion-de-ventilador-a-otro-pin>" %}

* Identificar un pin de nuestra placa PWM, en este caso no solemos tener muchos disponibles por lo que deberemos revisar el esquema de nuestra placa para identificar uno libre y que no sea útil/necesario.\
  Puedes revisar la lista de pines identificados que incluímos en nuestra guía sobre ventiladores:

{% embed url="<https://3dwork.qitec.net/guias-impresion-3d/resolucion-de-problemas/problemas-hardware-impresora-3d/control-de-ventiladores-con-mosfet-externo#que-deshabilitar-para-poder-trasladar-la-funcion-de-ventilador-a-otro-pin>" %}

* Realizar los cambios de asignación de pines

### Cambios a realizar en nuestro fichero pins en Marlin

Vamos o proponer el siguiente escenario...\
Nuestra placa, SKR 1.4 Turbo, despues de un mantenimiento realizamos un corto en el thermistor y desgraciadamente rompió el pin de la placa... normalmente se dan dos casos:

* nuestra pantalla muestra -14 en la temperatura, en estos casos estamos de "suerte" ya que normalmente significa que nuestro thermisor esta fallando o no se ha conectado correctamente
* la lectura de temperatura da valores muy altos, en estos casos normalmente indica un fallo de pines de nuestra placa. Podemos cambiar thermistores con el de la cama para verificar que un thermistor que funciona correctamente en otro pin en este no lo hace

Una vez identificado que el problema debemos identificar el fichero pins de nuestra placa en Marlin, en nuestro caso SKR 1.4 Turbo el fichero pins se encuentra en:

`Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h`

Los ficheros con la definicion de pines se encuentran en Marlin/src/pins y la siguiente carpeta es el tipo de CPU que usa nuestra placa.

Como podemos ver en el fichero pins de nuestra placa SKR 1.4 TURBO este incluye un include de otro:

```cpp
// Include SKR 1.4 pins
#include "../lpc1768/pins_BTT_SKR_V1_4.h"
```

Donde también vemos que tiene un include:

```cpp
// Include common SKR pins
#include "pins_BTT_SKR_common.h"
```

Verificaremos el ficher pins de nuestra placa, en nuestro caso al solamente usar un extrusor cambiaremos el rol de pines entre el TH0 (falla) con el TH1, en el caso de estar en uso y tal como comentamos al inicio de la guia buscaremos otro pin PWM que no este en uso para trasladar el rol

![Esquema de pines de nuestra SKR 1.4, el TH0 con flecha roja lo trasladaremos al TH1 con flecha verde.](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MXNG_Ryt4UMTDy39sd2%2F-MXNNIULf5P8ljov-tvo%2Fimage.png?alt=media\&token=02f01f7e-8e4f-4792-8253-8ffe8a38816c)

Así que pasaremos a editar ese fichero "SKR V1 4" de pines e identificaremos la parte donde se definen los thermistores que en nuestro caso es primero en

Ajustaremos los valores tal como vemos a continuación:

```cpp
../lpc1768/pins_BTT_SKR_V1_4.h
#define TEMP_1_PIN                      P0_24_A1  // 3DWORK - P0_23_A0 Valor Original - A0 (T0) - (67) - TEMP_1_PIN
#define TEMP_BED_PIN                    P0_25_A2  // A2 (T2) - (69) - TEMP_BED_PIN
```

Aunque este paso no es necesario pero por "consistencia" volveremos al fichero de pins "commons.h" *y corregiremos la asignación del pin para* TEMP1 para que coincida con el anterior

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MXNG_Ryt4UMTDy39sd2%2F-MXNMuytDvCNCULgyK5z%2Fimage.png?alt=media\&token=68cbba3c-2ab5-418e-a566-5f605e096836)

```cpp
../lpc1768/pins_BTT_SKR_common.h
// Temperature Sensors
//  3.3V max when defined as an analog input
#ifndef TEMP_0_PIN
  #define TEMP_0_PIN                    P0_23_A0  // 3DWORK - P0_24_A1 Valor Original - A1 (T1) - (68) - TEMP_0_PIN
#endif
#ifndef TEMP_1_PIN
  #define TEMP_1_PIN                    P0_24_A1  // 3DWORK - P0_25_A2 Valor Original - A2 (T2) - (69) - TEMP_1_PIN
#endif
#ifndef TEMP_BED_PIN
  #define TEMP_BED_PIN                  P0_25_A2  // 3DWORK - P0_23_A0 Valor Original - A0 (T0) - (67) - TEMP_BED_PIN
#endif
```

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MXNG_Ryt4UMTDy39sd2%2F-MXNMgzvPekNOkI0BCCY%2Fimage.png?alt=media\&token=304a305c-ec72-4da2-bc1a-7516b13f2756)

Ahora tan solo nos queda compilar y seguir fundiendo!!!


# Octoprint

Que es y que necesito

## Que es Octoprint?

Octoprint es una aplicación Open-Source completamente gratuita que nos permite monitorizar y gestionar nuestra impresora 3D de forma remota utilizando una Raspberry Pi.

De esta forma, y con nuestro navegador web preferido, podremos efectuar nuevas impresiones, monitorizar la temperatura de nuestra cama o boquilla (nozzle), ver en vídeo nuestra impresión en tiempo real y muchas otras cosas más.

## Que Necesito? <a href="#que-necesito" id="que-necesito"></a>

Antes de comenzar con la instalación debemos revisar que tengamos todo lo necesario:

* Raspberry Pi, aconsejable 3+ o superior
* Fuente de alimentación para nuestra Pi, es importante que esta tenga al menos 2A y sea constante en la entrega de voltaje para evitar problemas. Las originales suelen ser la mejor opción.
* Tarjeta Micro SD y un lector de estas si nuestro ordenador no tiene lector integrado, con un mínimo de 4Gb aunque lo aconsejable son 8Gb o más
* Un ordenador o teléfono/tablet que tenga acceso a tu red para configurar todo
* Disponer de un Marlin configurado para comunicación serial y algunas funciones que mejoran su gestión. Podéis encontrar más info al final de la guía

Tambien es importante disponer de una serie de aplicaciones para poder realizar toda la instalación:

* Un editor de textos como [Notepad++](https://notepad-plus-plus.org/download/) o [Atom](https://atom.io/). Es importante usar uno de estos ya que algunos como Word, Wordpad o editores con formato enriquecido pueden añadir caracteres de escape en los ficheros de configuración y no funcionar correctamente.
* Un cliente SSH para conectar por terminal a nuestra Pi, aconsejamos [Terminus](https://termius.com/) ya que es multiplataforma y dispone de versión para teléfono/tablet... además de que tiene un interfaz sencilla y funcional.
* Un scanner de red para nuestro teléfono/tablet para poder detectar si nuestra Pi se enlazó correctamente en nuesta red. En este caso aconsejamos [Fing](https://www.fing.com/products/fing-app).
* Necesitamos también una aplicación para crear nuestra SD, sugerimos [Etcher](https://www.balena.io/etcher/) que también es multiplataforma.
* Por último necesitaremos una imagen de Octoprint para nuestra SD que podemos descargar desde aquí <https://octoprint.org/download/>.


# Instalació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 %}


# Instalando Octoprint

{% 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 %}

El proceso de instalacion es bastante sencillo, en cualquier caso os detallamos paso a paso el proceso y algunos pequeños trucos que os permitan instalarlo de la forma correcta.

## Instalación usando el generador de imagen OctoPi

Podemos usar la herramienta **Raspberry Pi Imager** para personalizar, crear y quemar la imagen de OctoPi.

* Descargaremos e instalaremos el [Raspberry Pi Imager](https://raspberrypi.org/software) en nuestro ordenador
* Buscaremos la imagen de OctoPi en **Choose OS** y dentro de **Other Specific Purpose OS**
* Abriremos **Open Advanced Options** para configurar las opciones de nuestra Wifi si es necesario para ello dentro de las opciones para seleccionar el OS pulsaremos **CTRL+SHIFT+X**. En la nueva ventana aparecerán nuevas opciones avanzadas, la parte importante es la de configuración de nuestra wifi donde seleccionaremos nuestro **SSID**, **contraseña** y **país.**\
  También es aconsejable:
  * **Habilitar SSH** usando autentificación por password
  * Configurar **Time Zone** y nuestro **layout del teclado**

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MeQi3aI7dVT96DwEofe%2F-MeUxT07Fx5ApyGkjeWP%2Fimage.png?alt=media\&token=e4eb9fa1-475b-4215-a7e6-8a770b8b9aca)

* Elegiremos la SD y grabaremos la imagen.
* Extraeremos de forma segura la SD y la colocaremos en nuestra Raspberry, al encenderla y pasados unos segundos ya podremos conectarnos a ella tal como indicamos en los siguientes puntos de la guia.

## Instalación usando la imagen de OctoPi

* Descargaremos la imagen de Octoprint a nuestro ordenador desde aquí\
  <https://octopi.octoprint.org/latest>
* Conectaremos la SD a nuestro ordenador
* Ejecutaremos Etcher y haremos click en Seleccionar Imagen, seleccionamos la imagen de Octoprint que descargamos previamente. Asegúrate que seleccionaste el dispositivo SD correcto ya que el proceso borrará completamente su contenido y no se podrá recuperar.\
  Daremos a Flash y esperaremos a que el proceso finalice, después de realizar el proceso de copiado Etcher realizará una validación... es aconsejable hacerla ya que muchas SD "baratas" pueden dar problemas o no ser 100% fiables, siempre aconsejamos usar SD de calidad.\
  Una vez Etcher finalizó el proceso podemos cerrarlo.
* Si vamos a conectar nuestra Pi mediante WiFi si no disponemos de un cable de red a nuestro router cerca te aconsejamos realizar el siguiente procedimiento para configurarlo de forma correcta.\
  Abre tu SD con la imagen de Octorprint ya grabada y localiza el fichero octopi-wpa-supplicant.txt y lo abrimos con el editor de textos de nuestra elección (recuerda los sugeridos más arriba).\
  Tenemos 3 tipos de seguridad disponibles para configurar dicho fichero que dependerá de como tenemos configurada nuestra WiFi... estos son... WPA/WPA2 , WEP , Abierta/Insegura. Por norma general suelen estar en WPA/WPA2.\
  Ahora iremos a la sección del fichero que coincide con nuestra configuración de WiFi y lo editaremos... para nuestro ejemplo usaremos una WiFi con SSID 3dworkio y el password WPA/WPA2 123456789 por lo que iremos a esta sección del fichero:\
  **`## WPA/WPA2 secured`**\
  **`# network={`**\
  **`# ssid="put SSID here"`**\
  **`# psk="put password here"`**\
  **`#}`**\
  Y lo dejaremos de la siguiente forma (presta atención a los # que se eliminaron y donde pusimos los datos de nuestra WiFi):\
  **`## WPA/WPA2 secured`**\
  **`network={`**\
  **`ssid="3dworkio"`**\
  **`psk="123456789"`**\
  **`}`**
* Guardamos los cambios y saldremos del editor.
* Extraemos de forma segura la SD de nuestro ordenador y la ponemos dentro de nuestra Pi.

## Como acceder a nuestro OctoPrint/OctoPi

* Conectaremos la alimentación de la Pi y esperaremos unos cuantos minutos para que arranque.
* Utilizaremos el scanner de red para localizar la IP asignada a nuestra pi (la ip tiene un formato numérico de este estilo xxx.xxx.xxx.xxx)
* Abriremos nuestro cliente SSH, Terminus si seguiste nuestro consejo y crearemos una nueva conexión a nuestra Pi usando los siguientes datos:\
  **`IP/Hostname = xxx.xxx.xxx.xxx (la IP identificada en el paso anterior)`**\
  **`Usuario = pi`**\
  **`Password = raspberry`**\
  Una vez creado nos conectaremos y si todo funciona correctamente veremos que conectamos y tenemos un terminal para poder lanzar comandos.
* Una de las primeras cosas a realizar una vez conectados es la de expandir el sistema de ficheror para aprovechar nuestra SD al máximo, para ello ejecutaremos el siguiente comando desde el terminal:\
  **`sudo raspi-config`**\
  Se nos abrirá un menú con opciones que podemos movernos con las flechas. Iremos a **`Advanced Options`** y desde ahí seleccionaremos **`Expand Filesystem`** nos pedirá una confirmación para hacer este cambio que aceptaremos.
* Por defecto el nombre de red es octoprint.local pero si queremos personalizarlo podemo abrir de nuevo el comando anterior, ir a **`Network Options/Hostname`** y desde ahí cambiaremos el de por defecto (idealmente letras y números sin espacios)
* Después de estos cambios reiniciaremos la Pi ya sea físicamente retirando la alimentación o desde el terminal con el comando **`sudo reboot`**.
* Ahora iremos a nuestor ordendor/teléfono/tablet, abriremos nuestro navegador preferido y pondremos la IP asignada a nuestra Pi para comenzar la configuración de Octoprint!!!


# Raspberry Pi 4 – Actualizar firmware

Actualizar firmware a la última versión disponible usando rpi-eeprom-update

La Raspberry Pi 4 es sin duda el mejor modelo que han lanzado nunca, con hasta 4GB de RAM, con USB 3.0 y LAN 1GbE que no comparten bus y dos micro HDMI, es una bestia parda para todo tipo de situaciones. Sin embargo es cierto que salió al mercado con un problema de temperatura que hacía que se fuera a más de los 60 y 70 grados, eso con disipador.\
Antes de realizar nada, actualizaremos nuestros paquetes de raspbian:\
**sudo apt-get update && sudo apt-get upgrade**\
Una vez que termina de actualizar todo, instalaremos, es probable que lo tuvieramos ya instalado, rpi-eeprom-update:\
**sudo apt-get install rpi-eeprom-update**\
Haremos un reinicio de la Raspberry Pi 4:\
**sudo reboot**\
Ya con el nuevo paquete instalado, lo lanzaremos desde la consola, y veremos si mi firmware está muy obsoleto:\
**sudo rpi-eeprom-update**\
**\*\*\* UPDATE REQUIRED \*\*\***\
**BOOTLOADER: update required**\
**CURRENT: Fri 10 May 2019 06:40:36 PM UTC (1557513636)**\
**LATEST: Tue 10 Sep 2019 10:41:50 AM UTC (1568112110)**\
**VL805: update required**\
**CURRENT: 00013701**\
**LATEST: 000137ab**\
Con esta información, lanzaremos el mismo comando pero esta vez con el atributo -a para aplicar el update:\
**pi\@raspberrypi:\~$ sudo rpi-eeprom-update -a**\
**\*\*\* INSTALLING EEPROM UPDATES \*\*\***\
**BOOTLOADER: update required**\
**CURRENT: Fri 10 May 2019 06:40:36 PM UTC (1557513636)**\
**LATEST: Tue 10 Sep 2019 10:41:50 AM UTC (1568112110)**\
**VL805: update required**\
**CURRENT: 00013701**\
**LATEST: 000137ab**\
**EEPROM updates pending. Please reboot to apply the update.**\
Haremos de nuevo un reinicio de la RPi 4:\
**sudo reboot**\
Volveremos a realizar el proceso de verificar la versión y asegurar que ya estsmos al dia.\
Si quisieramos saber qué cambios hay en cada Firmware, [podemos irnos a GitHub](https://github.com/raspberrypi/firmware/releases) y ver los commits por cada Release.


# Cambios y comprobaciones en nuestro Marlin

Como hemos comentado es muy importante la configuración de SERIAL y BAUDIOS en Marlin (configuration.h), os ponemos como ejemplo algunas configuraciones para placas SKR.

## Configuración SERIAL placas SKR

**SKR 1.3**\
\#define SERIAL\_PORT 0\
\#define SERIAL\_PORT\_2 -1\
\
**SKR 1.4**\
\#define SERIAL\_PORT -1\
\#define SERIAL\_PORT\_2 0\
\
**SKR PRO 1.1**\
\#define SERIAL\_PORT -1\
\#define SERIAL\_PORT\_2 1\
\
**SKR MINI E3 V1.2**\
\#define SERIAL\_PORT 2\
\#define SERIAL\_PORT\_2 -1\
\
**SKR E3 DIP**\
\#define SERIAL\_PORT 2\
\#define SERIAL\_PORT\_2 -1

## Configuración BAUDRATE

En cuanto BAUDRATE podeis elegir entre estos que son los que suelen dar mejor resultado:\
\#define BAUDRATE 115200\
O\
\#define BAUDRATE 225000

## **También es aconsejable activar las siguientes funciones en Marlin:**

```
#define EMERGENCY_PARSER // Permite capturar acciones especiales
#define HOST_ACTION_COMMANDS // Habilita gestión de acciones desde el host
#define HOST_PROMPT_SUPPORT // Permite contestar acciones desde el host
```


# Reset Password

## Restablecer el password de acceso SSH

En ocasiones si hemos cambiado el password de acceso a nuestra Pi puede que nos olvidemos, a continuación tienes diferentes alternativas para resetearlo

### Prueba el usuario/password por defecto primero :)

Antes de comenzar con otros procesos lo ideal es verificar que no tengamos el de por defecto :D usaremos **pi como usuario y raspberry como password**.

### Reseteo password modificando la SD

Podemos crear un fichero octopi-password.txt en el volumen boot con el nuevo password que deberia aplicarse al reiniciar nuestra Pi y permitirnos de nuevo el acceso:

* Desde Linux o el terminal de MAC y con la SD insertada en nuestro ordenador:

```bash
cd /Volumes/boot
ls config.txt # para asegurarnos que estamos en el sitio adecuado
sudo echo "mypassword" > ./octopi-password.txt
```

* Desde Windows y con la SD insertada en nuestro ordenador:

```
Abrimos el administrador de archivos y abrimos la unidad boot que deberia salirnos al insertar la SD
Creamos un fichero, en el mismo lugar que el config.txt, llamado octopi-password.txt
Editamos ese fichero octopi-password.txt y ponemos ahí nuestro nuevo firmware
```

## Restablecer password interfaz web Octoprint

Si hemos olvidado el password del interfaz web de **Octoprint** accederemos por SSH a nuestra Pi y tendremos dos opciones dependiendo de como se instaló **Octoprint**:

* **Si usamos la imagen de OctoPi**

```
rm ~/.octoprint/users.yaml
sed -i -e 's/firstRun: false/firstRun: true/g' ~/.octoprint/config.yaml
sudo service octoprint restart
```

{% hint style="info" %}
Si instalamos Octoprint en **Windows** el fichero se encuentra en:

`%APPDATA%\OctoPrint\users.yaml` and `%APPDATA%\OctoPrint\config.yaml`

` En el caso de`` `` `**`MacOS`**`:`

`~/Library/Application\ Support/OctoPrint/users.yaml` `~/Library/Application\ Support/OctoPrint/config.yaml` .
{% endhint %}

* **Si lo instalamos de forma manual**

```
Borrar ~/.octoprint/users.yaml
En ~/.octoprint/config.yaml:
- sustituir firstRun: false por firstRun: true
Reiniciar Octoprint
```


# Configurando Octoprint

Si seguimos los pasos anteriores ya tendremos acceso al interfaz web de Octoprint y podremos comenzar a personalizarlo para nuestra impresora/uso.

![](https://telegra.ph/file/ad0d13fdeb73414b91280.png)

* Seguiremos el asistente de configuración que es muy sencillo e intuitivo, no tiene mucho misterio.
* Una vez finalizada la configuración inicial ya estaremos listos para conectar a nuestra impresora donde idealmente poniendo el puerto/velocidad en AUTO y teniendo el cable USB conectado entre nuestra Pi e impresora debería conectar y poder empezar a tener lecturas de temperaturas.
* Para comprobar que todo esta correcto iremos a la pestaña Control y desde ahi probaremos a realizar un homing o mover nuestros ejes, es un proceso muy intuitivo.
* También podemos comprobar que podemos ajustar las temperaturas de nuestro hotend y cama desde la pestaña Temperature.
* Ya está!!! tienes tu impresora con Octoprint para poder gestionarla remotamente!!! puedes arrastrar tus gcode directamente a la web de Octoprint para subirlos y dar la orden de imprimir.
* También puedes conectar una cámara USB o GPIO, de las soportadas que suelen ser prácticamente todas.
* Añadir más plugins para mejorar y vitaminar tu Octoprint como DisplayLayerProcess (que te permite enviar estado de la impresión a la pantalla de tu impresora), PrintTimeGenious (que te da estimaciones reales del tiempo de finalización de una impresión), Cancel Objects (que te permite, si tu firmware Marlin lo tiene habilitado, cancelar piezas que esten saliendo mal sin parar toda la impresión), IPConnect (que te muestra la IP asignada y por si esta cambia).
* Por otro lado y para una gestión remota de tu impresora cuando no estás en casa te aconsejamos los plugin de Telegram o [Octoeverywhere](https://octoeverywhere.com/) (podras ver el interfaz completo de Octoprint desde cualquier lado y de forma muy sencilla) que tendrás .
* Hay muchísimos plugins con este tipo de mejoras, no dudes en revisarlos!!!


# Plugins/Mejoras Octoprint

{% 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 %}

Ahora que ya tenemos nuestro Octoprint totalmente funcional y después de jugar y hacer nuestras primeras pruebas llega el momento de llevarlo a otro nivel y ver el verdadero potencial de Octoprint mediante sus plugins.

Estos plugins se instalan desde el área de configuración (icono de llave inglesa en la barra superior) desde el Administrador de Complementos (Plugin Manager).

Os sugerimos una lista de los que consideramos nuestros "imprescindibles".


# DisplayLayerProcess

Mostrando el estado de nuestra impresión en la pantalla de nuestra impresora

{% embed url="<https://github.com/OllisGit/OctoPrint-DisplayLayerProgress>" %}

Mediante este plugin podremos añadir mucha información interesante sobre el estado de la impresión en nuestra pantalla como el progrso (M73), tiempos estimados de finalización, información de capa, información del estado de nuestro propio cambio de filamento (M600), estado de la impresora, etc...

Además aplica cambios interesantes al interfaz de Octoprint para poder visualizar toda esta información remotamente en el caso que lo creamos interesante.

![](https://telegra.ph/file/4ea0f51b30e23ed736a5b.png)


# PrintTimeGenious

Mejorando las estimaciones de tiempo de impresión

{% embed url="<https://github.com/eyal0/OctoPrint-PrintTimeGenius>" %}

Con este otro plugin imprescindible podremos mejorar muchísimo las estimaciones de tiempo de impresión con respecto al sistema de cálculo de Octoprint.

![](https://telegra.ph/file/8944b49a79bc882d7621e.png)


# Cancel Objects

Cancela esa pieza que esta arruinando tu impresión

{% embed url="<https://github.com/paukstelis/Octoprint-Cancelobject>" %}

A quien no le ha pasado nunca que durante una impresión de varias piezas una de ellas ha quedado dañada o se está imprimiendo de forma incorrecta. Cancel Objects te permitirá seleccionar esa parte de la impresión y cancelarla permitiendo de esa manera que no tengas problemas con el resto de piezas.

[![screenshot](https://github.com/paukstelis/Octoprint-Cancelobject/raw/master/viewer.png)](https://github.com/paukstelis/Octoprint-Cancelobject/blob/master/viewer.png) [![screenshot](https://github.com/paukstelis/Octoprint-Cancelobject/raw/master/cancellist.png)](https://github.com/paukstelis/Octoprint-Cancelobject/blob/master/cancellist.png)


# ipOnConnect

No pierdas nunca la IP de tu Octoprint

{% embed url="<https://github.com/jneilliii/OctoPrint-ipOnConnect>" %}

Este sencillo plugin no va a cambiar tu vida pero si que te facilitará el encontrar en que IP se encuentra tu Octoprint en el caso que no tenga una IP estática asignada.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MV1TPGo5L38CcegcWD5%2F-MV1Ua-9QCMR2bDxr90K%2Fimage.png?alt=media\&token=f5fdc3b2-f00f-495e-9988-2d4be0ecbbc4)


# Arc-Welder

Mejora la calidad de tus impresionas a la vez que evitas saturación en el flujo de datos

{% embed url="<https://plugins.octoprint.org/plugins/arc_welder/>" %}

Este potentísimo plugin promete mejorar la calidad de tus impresiones además de ser muy muy adecuado para el uso de tu impresora desde Octoprint.\
Básicamente se encarga de mejorar el gcode laminado para sustituir movimientos lineales por arcos que son más optimos con un descenso drástico de la comunicación de gcodes entre Octoprint y tu impresora (que ayudará a evitar cuellos de botella), mejorar la calidad (reducción la cantidad de movimientos y reduciendo las extrusiones/retracciones) además de reducir considerablemente el tamaño de tus archivos.\
No es una tecnología para nada nueva pero con el procesamiento de la electrónica actual esta comenzando a ser una referencia.

{% embed url="<https://youtu.be/18uYYXecH5g>" %}

Su uso es muy sencillo, puedes ponerlo en modo automático para que cuando subes un nuevo gcode automático lo transforme (añadirá uno nuevo con .aw\.gcode en su nombre) o hacerlo manualmente desde un nuevo icono (flechas) en el listado de ficheros.\
Cuenta con un interfaz que te informa del estado de transformación además que te da datos de estadísticas de las mejoras aplicadas.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MV1TPGo5L38CcegcWD5%2F-MV1Xs8T9_ZyA7pKtP2Q%2Fimage.png?alt=media\&token=87b11e0a-a29e-40ba-9e7e-5619225bd27a)

Tienes una parte de configuración que puedes personalizar a tu gusto para generar el nuevo gcode optimizado para tu máquina.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MV1TPGo5L38CcegcWD5%2F-MV1Y1XL4FitHJlaCcoP%2Fimage.png?alt=media\&token=3679b4b8-bff0-43c0-8bda-264fd245a876)

Es importante recalcar que para que funcione correctamente el Marlin de tu impresora debe tener habilitado ARC\_SUPPORT (configuration\_adv.h) que desde la versión 2.0.6 ha sido mejorado enormemente. Si no sabes si lo tienes o no habilitado puedes lanzar un comando M115 desde tu cliente terminal favorito a tu impresora para ver el estado de esta opción.\
Por supuesto es también compatible con otros firmwares pero deberás comprobar la compatibilidad en cada caso.


# Telegram

Controla y supervisa tu impresora remotamente sin complicaciones

Una de las formas más sencillas y rápidas de controlar nuestra impresora remotamente es usando el plugin [Telegram para Octoprint](https://github.com/fabianonline/OctoPrint-Telegram). Os indicamos unos pasos rápidos para poder instalarlo y configurarlo correctamente:

**Creación del Bot**

Telegram permite la creación de nuestros propios bots, para ello lo primero es crear uno simplemente desde Telegram abriremos una conversación con [@BotFather](http://telegram.me/botfather) desde tu cliente Telegram y lanzamos el comando /start para comenzar el proceso.

1. Envía /newbot y te solicitará un nombre para tu nuevo bot, para el ejemplo usaremos 3dWork Bot
2. Una vez establecemos el nombre del bot nos solicitará un nombre de usuario para ese bot, es importante que acabe en bot, para nuestro caso usaremos @ThreeDWorkBot (sin la arroba)
3. Inmediatamente BotFather nos devolverá un código llamado token que será el que usaremos más tarde. Es importantísimo guardarlo en un sitio seguro.

**Configuración del plugin Telegram en Octoprint**

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MV1Y4laZwrnjsK40mi6%2F-MV1ZGSuHSIGiEmZwEqs%2Fimage.png?alt=media\&token=4b3f8329-cc40-43a9-b6b4-41e8ffa126fe)

Cambiamos a nuestro interfaz web de Octoprint para instalar y configurar el plugin de Telegram.

1. Podemos instalar el plugin desde el Administrador de Complementos (Plugin Manager) o instalarlo manualmente desde [aquí](https://github.com/fabianonline/OctoPrint-Telegram/archive/stable.zip)
2. Una vez instalado nos solicitará reiniciar el servidor de Octoprint
3. Una vez reiniciado nos abrirá el asistente de configuración de Telegram, en el caso que no lo haga o no hagamos en el siguiente reinicio en las opciones de configuración de Octoprint puedes encontrar Telegram como plugin y de ahi realizar el proceso.
4. Introduciremos el token que obtuvimos desde BotFather en el punto 3 del paso anterior y probaremos que funcione correctamente.

**Configuración del usuario**

Ahora cambiamos de nuevo a nuestre cliente de Telegram, debemos abrir un chat con nuestro bot... para ello tenemos varias formas de buscarlo ya sea por el buscador de usuarios de Telegram, en la conversación con BotFather o en la captura del paso anterior nos lo indica en Token status.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MV1Y4laZwrnjsK40mi6%2F-MV1ZQ08YBfsk1ei1HKg%2Fimage.png?alt=media\&token=46c45346-85c6-40ae-b6ef-2ad1ed553786)

Una vez abierto el chat con nuestro bot lanzaremos el comando /start y este nos indicará que tenemos que volver a Octoprint para ajustar los permisos para poder interactuar con el.

Cambiamos de nuevo a Octoprint, en su configuracion, panel izquierdo y abajo veremos Telegram. Dentro de la configuración de Telegram tendremos un apartado de Known Chats, si nuestro chat no aparece pulsaremos el botón Reload y debería aparecernos nuestro usuario.

Ahora daremos al icono del lápiz en la sección Action y permitiremos la ejecución de comandos y notificaciones.

Una vez habilitados volvemos a Known Chats y entraremos pulsando en el icono de Command y Notify para marcar las opciones que más nos interesen.

Ya podremos interactuar desde nuestre cliente Telegram con nuestra impresora!!! Facil verdad?

**Notificaciones**

En la configuración del plugin de Telegram tenemos una sección para configurar las notificaciones (Messages at...) estas están escritas en inglés pero podemos cambiarlas por lo que nos interese más.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MV1Y4laZwrnjsK40mi6%2F-MV1ZUSLSlIuafGRKf6G%2Fimage.png?alt=media\&token=790e9df8-9f06-4973-9b5d-839e9e2e8e0a)

En la parte de iconos azules podremos ver información sobre el lenguaje markup que se utiliza, las variables y los iconos que podemos usar.

Además podemos ajustar las opciones de enviar imágenes, combinar mensajes, etc...

**Comandos y personalización del bot**

Ya tenemos todo funcional pero como nos gusta dejarlo todo perfecto para "hablar" con nuestra impresora tenemos que recordar la lista de comandos que se pueden usar o pedirle con un /help que nos las liste.

Volveremos a hablar con BotFather y le enviamos el comando /setcommands y pegamos el listado siguiente:

```
abort - Detiene la impresión. Requiere confirmación.
shutup - Silencia el bot hasta que la impresión termine.
dontshutup - Vuelve a permitir al bot que te mande notificaciones.
status - Información del estado de la impresora.
settings - Configura el intervalo de las notificaciones, ajustable en cada altura o en cada tiempo. Por defecto 5 milímetros o cada 15 minutos.
files - Muestra un listado de ficheros en el que tienes guardado en la microSD de la Raspberry. También te permite subir nuevos archivo e incluso descargarlos. Si presionamos sobre un archivo GCode nos mostrará información sobre el tiempo de impresión, filamento que gastará y lo que ocupa.
print - Comienza una impresión. En ella seleccionamos el archivo a imprimir.
togglepause - Pausa o reanuda la impresión.
con - Conecta / desconecta la impresora.
upload - Sube un archivo a Octoprint.
sys - Ejecuta un comando de Octoprint que pueden ser reiniciar, apagar o reiniciar el servidor.
ctrl - Controla la impresora, como haríamos con G28, G0 Z10... Es un poco inútil y necesita ser configurado.
tune - Ajusta la temperatura del cabezal, cama, feedrate y flowrate. Con ella podemos precalentar la impresora.
user - Muestra la información del usuario, permisos que tienes y las notificaciones permitidas.
help - Muestra la lista de comandos.
```

Con esto al hablar con el bot de nuestra impresora nos rellenará automaticamente al poner / el comando que deseemos o tendremos en la caja de texto de chat un icono / que nos listara los comandos y su descripción.

Por último pero no menos importante personalizaremos el icono de nuestro bot, para ello vovemos de nuevo a BotFather y le enviamos el comando /setuserpic, nos solicitará que subamos una imagen que será la que se usará en el perfil del bot de nuestra impresora.


# OctoDash - UI

Añadiendo una pantalla y un interfaz bonito para manejar nuestro Octoprint

![](https://lh5.googleusercontent.com/1Vs7rR5dESwn2fc5X1KEzqb7F2EdzKUXIprXvYQS6w6mQVSwwpKD2YXDN8tlJaKphKuMSDgF3NV61dtfIzSKl2zPJHfY767CrzdkypY52aDp4M6Nfkst0nRCfhK4gpPaKQogHqvt)

OctoDash es un simple pero bonito dashboard para OctoPrint que cuenta con pantallas.

Utiliza llamadas API para lanzar los comandos a tu Octoprint desde un bonito interfaz que funciona fantástico con una pantalla touch.

## El proceso de instalación:

### Preparar Octoprint

Instalando los siguientes plugins:

* **DisplayLayerProgress** (requerido) : muestra en la pantalla de la impresora el tiempo estimado para finalizar, el porcentaje y las capas.

{% embed url="<https://plugins.octoprint.org/plugins/DisplayLayerProgress/>" %}

* **PrintTimeGenius Plugin** (sugerido) : estimaciones exactas de tiempo de impresión.

{% embed url="<https://plugins.octoprint.org/plugins/PrintTimeGenius/>" %}

* **Filament Manager** (opcional): podemos añadir nuestras bobinas y que nos lleve la cuenta del material que gastamos. Está relacionado con el Cost Estimation, puesto que pilla de ahí lo que cuesta cada uno de los materiales.

{% embed url="<https://plugins.octoprint.org/plugins/filamentmanager/>" %}

* **Preheat Button** (opcional), para hacer el precalentado

{% embed url="<https://plugins.octoprint.org/plugins/preheat/>" %}

* **Slicer Thumbnails** (sugerido), tener una imagen de previsualización de la pieza, requiere de configuración en el Slicer y es muy aconsejable

{% embed url="<https://plugins.octoprint.org/plugins/prusaslicerthumbnails/#:~:text=This%20plugin%20will%20extract%20embedded,open%20in%20a%20modal%20window>." %}

* **Enclosure** (sugerido si tenemos reles), nos permite controlar los relés configurados en este plugin

{% embed url="<https://plugins.octoprint.org/plugins/enclosure/>" %}

También es importante activar **CORS** en tu Octoprint, CORS permitirá que la autodetección de la instancia de Octoprint por parte de OctoDash funcione mejor, puedes activarlo en **Opciones/API/CORS**

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MeuVZ_Wbzp2zENEtlcU%2F-MeunrfZFi-llnc3b7qA%2Fimage.png?alt=media\&token=72839b6b-b7eb-4a27-b735-14af85f29b86)

### Conectanco a tu Raspberry OS

Acceder por SSH (puedes usar [PuTTY](https://www.putty.org/) o [Terminus](https://termius.com/) para conectar ambos son multiplataforma o sea Windows MAC Linux) el usuario por defecto es pi y el password raspberry.

Preparando el sistema Raspbian para hacer autologin (dependiendo de la versión pueden variar los menus):\
`sudo raspi-config`\
`"3 Boot Options"`\
`"B1 Desktop / CLI"`\
`"B2 Console Autologin"`\
Finalizar y reiniciar la Pi.

Volveremos a conectar y nos aseguraremos que tenemos nuestro OS actualizado:

```bash
# Actualizar Raspbian:
sudo apt update
sudo apt upgrade

# Si nos indica algun paquete incorrcto lanzar:    
sudo apt install -f
```

### Instalando Octoprint

Lanza el siguiente comando:

```bash
bash <(wget -qO- https://github.com/UnchartedBull/OctoDash/raw/main/scripts/install.sh)
```

> Aconsejable poner un teclado en el caso que la versión de Octoprint o OctoDash no permitan el auto-enlazado (ver siguiente punto).

Al arrancar OctoDash intentará detectará instancias de Octoprint en la red selecciona la que quieres controlar (normalmente la misma donde instalaste OctoDash...octoprint.local) y deberás poner la API KEY que la puedes encontrar en los ajustes de Octoprint opción API o depende de la versión te saldrá un botón verde en OctoDash que lanza una petición a Octoprint para verificar, en ese caso con ir a Octoprint le das a Allow en la ventana que sale y a disfrutar!!!

![](https://lh4.googleusercontent.com/ugNgFLwbFaXCvhC0XG6lpiJLcjXMKarRDXRQie6Wtpnh2ixjYPF81oQjy01SbZnZnzA4Y9LdJ0ruoujRTwmvdjxNOQwdQHc6jyzDm2TCwqJeXJdgidn97a9ZT2ChmFaYqjt-EmNs)

> Si no tenemos teclado o problemas con el proceso de permisos del botón verde y la parte de permitir en Octoprint podemos editar el fichero de configuración desde SSH\
> **`sudo nano ~/.config/octodash/config.json`**\
> el formato es bastante sencillo de leer aunque de la parte superior tan solo necesitamos poner la IP de Octoprint y la API KEY.

> Si deseas actualizar OctoDash desde SSH por si falla desde el interfaz podéis ejecutar el siguiente comando desde el terminal SSH:\
> **`sudo wget -qO- https://github.com/UnchartedBull/OctoDash/raw/main/scripts/update.sh | bash`**\\

> Si deseas desinstalar OctoDash podéis ejecutar el siguiente comando desde el terminal SSH:\
> **`wget -qO- https://github.com/UnchartedBull/OctoDash/raw/main/scripts/remove.sh | bash`**

## Resolución de errores

### Fallo al iniciar entorno gráfico por fallo en fbturbo

En el caso que tengamos un error al iniciar OctoDash que indique un fallo en la libreria fbturbo

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MeQh4V54ju19tZHMx0n%2F-MeQhylHiTOj5GC6Tnyh%2Fimage.png?alt=media\&token=0633cb4e-fc4c-43cc-94e7-7ecdef0f01bb)

Podemos seguir los siguientes pasos para solucionarlo:

```
sudo apt-get install libgtk-3-0 xserver-xorg xinit x11-xserver-utils
sudo apt-get install git build-essential xorg-dev xutils-dev x11proto-dri2-dev
sudo apt-get install libltdl-dev libtool automake libdrm-dev
git clone https://github.com/ssvb/xf86-video-fbturbo.git

cd xf86-video-fbturbo
autoreconf -vi
./configure --prefix=/usr
make
sudo make install
sudo cp xorg.conf /etc/X11/xorg.conf
```

## Sugerimos las siguientes pantalla para disfrutar de OctoDash:

### Waveshare 3.5" (GPIO) o clones

{% embed url="<https://s.click.aliexpress.com/e/_A1gQjM>" %}

Instalando los drivers Waveshare:

```bash
# Descargar los drivers Waveshare:
git clone https://github.com/waveshare/LCD-show.git

# Cambiar los permisos de la carpeta:
chmod -R 755 LCD-show

# Cambiamos al directorio:
cd LCD-show/

# Cambiamos permisos de ficheros:
chmod +x LCD35-show

# Ejecutamos el script de nuestro modelo de pantalla, en nuestro caso 3.5
sudo ./LCD35-show

# Podemos volver a ejecutarlo indicando el angulo de giro si queremos cambiarlo
sudo ./LCD35-show 180

```

Cambios a realizar para su funcionamiento (añadir al final del fichero):

```bash
sudo nano /boot/config.txt
```

Y modificaremos/añadiremos lo siguiente

```bash
# Enable audio (loads snd_bcm2835)
dtparam=audio=on
dtoverlay=waveshare35a
#dtoverlay=ads7846,cs=1,penirq=17,penirq_pull=2,speed=1000000,keep_vref_on=1,swapxy=1,pmax=255,xohms=60,xmin=200,xmax=3900,ymin=200,ymax=3900
hdmi_force_hotplug=1
#max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 533 60 6 0 0 0
hdmi_drive=2
```

ificaremos/añadiremos lo siguiente

### Waveshare 7" HDMI Touch (HDMI)

{% embed url="<https://www.amazon.es/dp/B07PKLGMSY/ref=cm_sw_r_cp_apa_fabc_jm77FbPWNZKBZ?_encoding=UTF8&psc=1>" %}

Cambios a realizar para su funcionamiento (añadir al final del fichero):

```
sudo nano /boot/config.txt
```

Y modificaremos/añadiremos lo siguiente

```bash
max_usb_current=1

hdmi_force_hotplug=1
config_hdmi_boost=7
hdmi_group=2
hdmi_mode=87
hdmi_drive=1
display_rotate=0 # 0 conectores a la derecha, 1 a 90 grados, 2 connectores a la izquierda, 3 270 grados
hdmi_cvt 1024 600 60 6 0 0 0
```

### LongRunner 5" XPT2046 (HDMI GPIO Táctil)

{% embed url="<https://www.amazon.es/gp/product/B07QC6G6S9/ref=ppx_yo_dt_b_asin_image_o00_s00?ie=UTF8&psc=1>" %}

Cambios a realizar para su funcionamiento (añadir al final del fichero):

```
sudo nano /boot/config.txt
```

Y modificaremos/añadiremos lo siguiente:

```bash
# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=0

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt=800 480 60 6 0 0 0

# Enable touchscreen on Elecrow HDMI interface.
dtparam=spi=on
dtparam=i2c_arm=on
dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
dtoverlay=w1-gpio-pullup,gpiopin=4,extpullup=1
```

### **FYSECT CTP40 (GPIO)**

Para esta pantalla asegurarse de instslar los drivers siguiendo las instrucciones

{% embed url="<https://github.com/FYSETC/FYSETC-CTP40/tree/main/Pi3>" %}

## Soporte/Ayuda

{% embed url="<https://discord.com/invite/PeFgKUuZ?utm_source=Discord%20Widget&utm_medium=Connect>" %}
Discord OctoDash
{% endembed %}

{% embed url="<https://github.com/UnchartedBull/OctoDash/blob/master/README.md>" %}
OctoDash Github
{% endembed %}

{% embed url="<https://unchartedbull.github.io/OctoDash/index.html>" %}
OctoDash Website
{% endembed %}


# Controlar varias impresoras usando varias instancias Octoprint

OctoPrint 0.18.0 Raspberry Pi

{% 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 %}

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint00.png)

De entrada puede parecer una guía muy larga y difícil, si es larga es porque está todo lo necesario para no tener ningún problema con múltiples instancias en octoprint. Tampoco es difícil, solo hay que ir haciendo los pasos como se muestran.

Temas claros antes de duplicar la instancia:

* Plugins:
  * Quedan compartidos entre todas las instancias instaladas.
  * Los datos cada instancia guarda sus datos, eso no queda compartido.
  * Para actualizar un plugin, solo basta en actualizar en una instancia, para que se muestre actualizado en las otras, o se reinicia la raspberry o las distintas instancias.
  * Recomendado actualizar plugins cuando no se este imprimiendo en ninguna de las impresoras.
  * Si en una instancia no se quiere uno de los plugins, con desactivar para esa instancia es suficiente.
  * Si se borra un plugin, al reiniciar se borrara de las otras instancias.
* Muy importante renombrar los puertos usb, para evitar problemas de conexión.
* Los gcode subidos a cada instancia, solo se mostrarán en esa instancia, eso es bueno, ya que solo veremos los ficheros para esa impresora.

Verificar la versión, al final de la página de octoprint verás que versión tienes, esta guía es válida para la versión 0.18.0.\
\\

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint01.png)

#### **Duplicado de instancias de octorpint**

Primero entramos por SSH a octoprint, por ejemplo desde Windows con la aplicación PuTTy, introducimos la IP de la raspberry, marcamos SSH y finalmente a Open.![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint02.png)

Nos logeamos, si no habéis cambiado el usuario y password, por defecto el usurario es pi y el password es raspberry.

Por Seguridad es recomendable cambiar el password.

Duplicamos el fichero octorpint.service, es posible que os vuelva a pedir de nuevo el password, es decir raspberry o el que tengáis.

Recuerdo que para pegar los comando en PuTTy, se puede hacer pulsando el botón derecho del ratón.

```
sudo cp /etc/systemd/system/octoprint.service /etc/systemd/system/octoprint2.service
```

Si queréis más impresoras, el proceso es igual, pero cambiado el 2 por 3, 4, etc…

```
sudo cp /etc/systemd/system/octoprint.service /etc/systemd/system/octoprint3.service

sudo cp /etc/systemd/system/octoprint.service /etc/systemd/system/octoprint4.service
```

Entramos en el nuevo fichero duplicado:

```
sudo nano /etc/systemd/system/octoprint2.service
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint03.png)

Os saldrá una ventana como esta:

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint04.png)

Editamos estos parámetros, 5001 para la segunda impresora.

```
Description=The snappy web interface for your 3D printer 2
Environment="PORT=5001"
```

Añadimos al final de ExecStart esto:

```
--config /home/pi/.octoprint2/config.yaml --basedir /home/pi/.octoprint2
```

Quedando así:

```
ExecStart=/home/pi/oprint/bin/octoprint serve --host=${HOST} --port=${PORT} --config /home/pi/.octoprint2/config.yaml --basedir /home/pi/.octoprint2
```

Quedando así:

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint05.png)

Guardamos con CRTL+X, luego a Y (yes), finalmente a ENTER

De nuevo, para más de dos impresora, el proceso es el mismo, hay que editar los otros ficheros:

Tercera impresora, puerto 5002:

```
sudo nano /etc/systemd/system/octoprint3.service

Description=The snappy web interface for your 3D printer 3
Environment="PORT=5002"
ExecStart=/home/pi/oprint/bin/octoprint serve --host=${HOST} --port=${PORT} --config /home/pi/.octoprint3/config.yaml --basedir /home/pi/.octoprint3
```

Cuarta Impresora, puerto 5003:

```
sudo nano /etc/systemd/system/octoprint4.service
Description=The snappy web interface for your 3D printer 4
Environment="PORT=5003"
ExecStart=/home/pi/oprint/bin/octoprint serve --host=${HOST} --port=${PORT} --config /home/pi/.octoprint4/config.yaml --basedir /home/pi/.octoprint4
```

Activamos el inicio automático al iniciar la raspberry para estas segundas instancias:

```
sudo systemctl enable octoprint2
sudo systemctl enable octoprint3
sudo systemctl enable octoprint4
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint06.png)

Si sale como la imagen es que ya han quedado activadas correctamente para el inicio.

Pasamos a editar el haproxy.cfg, abriéndolo con:

```
sudo nano /etc/haproxy/haproxy.cfg
```

Crearemos un nuevo frontend para cada impresora, esto tiene como ventaja poder tener una cámara para cada una de las impresoras, y la gestión de multi-instancia, desde mi punto de vista, es mejor.

Con esto accederemos a la segunda impresora desde el puerto 81, tercera 82 etc. Mencionar que la primera se accede desde el puerto 80, que no es necesario introducir en el navegador.

Vamos al final fichero y pegamos esto para la segunda impresora:

```
frontend public2
        bind :::81 v4v6
        bind :::444 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        default_backend octoprint2

backend octoprint2
        acl needs_scheme req.hdr_cnt(X-Scheme) eq 0

        reqrep ^([^\ :]*)\ /(.*) \1\ /\2
        reqadd X-Scheme:\ https if needs_scheme { ssl_fc }
        reqadd X-Scheme:\ http if needs_scheme !{ ssl_fc }
        option forwardfor
        server octoprint2 127.0.0.1:5001
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint07.png)

Repetimos lo mismo para las otras instancias:

```
frontend public3
        bind :::82 v4v6
        bind :::445 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        default_backend octoprint3

backend octoprint3
        acl needs_scheme req.hdr_cnt(X-Scheme) eq 0

        reqrep ^([^\ :]*)\ /(.*) \1\ /\2
        reqadd X-Scheme:\ https if needs_scheme { ssl_fc }
        reqadd X-Scheme:\ http if needs_scheme !{ ssl_fc }
        option forwardfor
        server octoprint3 127.0.0.1:5002
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http


frontend public4
        bind :::83 v4v6
        bind :::446 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        default_backend octoprint4

backend octoprint4
        acl needs_scheme req.hdr_cnt(X-Scheme) eq 0

        reqrep ^([^\ :]*)\ /(.*) \1\ /\2
        reqadd X-Scheme:\ https if needs_scheme { ssl_fc }
        reqadd X-Scheme:\ http if needs_scheme !{ ssl_fc }
        option forwardfor
        server octoprint4 127.0.0.1:5003
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http
```

Guardamos el fichero y comprobamos que todo este correcto con:

```
sudo service haproxy restart
```

Si no da ningún error es que todo es correcto.

En el caso que os salga un error como este, debes volver a editar haproxy, revisando bien el fichero y que no haya algún valor mal introducido.

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint08.png)

Reiniciamos la raspberry con:

```
sudo reboot now
```

Una vez reiniciada ya tendremos acceso a las nuevas instacias, las direcciones serian estas:

```
http://192.168.X.XX (pimera)
http://192.168.X.XX:81 (segunda)
http://192.168.X.XX:82 (tercera)
http://192.168.X.XX:83 (cuarta)
```

o

```
http://octopi.local (pimera)
http://octopi.local:81 (segunda)
http://octopi.local:82 (tercera)
http://octopi.local:83 (cuarta)
```

Vamos a configurar las nuevas instancias:

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint09.png)

Importante, en la sección de Server Commands, hay que poner:

```
sudo service octoprint2 restart
sudo shutdown -r now
sudo shutdown -h now
```

Para la tercera y cuarta

```
sudo service octoprint3 restart
sudo service octoprint4 restart
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint10.png)

Ahora, para distinguir cada impresora y evitar confusiones, es recomendable cambiar el nombre de cada una de ellas y su color.\
\\

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint11.png)

#### **Renombrado de los puertos USB**

Finalmente, y muy pero que muy importante, es renombrar los puertos. Esto es muy importante, ya que al abrir la raspberry puede que cambie el nombre del puerto, y no conectes a la impresora correcta. Pero aun puede ser peor, como que en otra instancia conectes a otra impresora que esta imprimiendo, provocando el reinicio de esa placa y adiós a esa impresión.

1\. Conectamos solo una de las impresoras, y miramos, desde octorpint, cual es el nombre de Serial Port que le asigna la raspberry:

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint12.png)

En este caso está asignada a `/dev/ttyUSB0`, el nombre puede ser diferente, por ejemplo, `ttyAMC1`.

Si las impresoras no tienen la misma placa, da igual a que puerto usb de la raspberry conectes la impresora, en el caso de tener la misma placa hay que acordarse a que puerto as conectado cada impresora.

Mandamos este comando, con el nombre del puerto asignado a nuestra impresora.

```
udevadm info -q all -n /dev/ttyUSB0 --attribute-walk
```

Saldrán muchos números. Nos desplazamos aproximadamente al tercer parágrafo, nos paramos en el primero mas largo, como en la foto.

Apuntamos estos dos valores:

```
ATTRS{idVendor}=="" 
ATTRS{idProduct}==""
```

En el caso que las dos impresores sean iguales, o tengan la misma placa, estos valores saldrán iguales, hay que apuntar un tercer valor.

```
ATTRS{devpath}==""
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint13.png)

Una vez apuntados estos valores, desconectamos del usb de la impresora y conectamos la otra, volvemos a octoprint para saber que nombre le da octoprint al puerto usb a la nueva impresora, puede que sea igual que la otra impresora.

¡OJO! Si tus impresoras son iguales o tienen la misma placa, tienes que conectar a otro puerto usb de la raspberry, y acordarte a que puerto usb as conectado cada impresora, sino conectara a la que no toca.

Repetimos el proceso para todas la impresoras. Al final conseguiremos los valores de idVendor, idProduct, y en caso necesario, el devpath, para cada una de las impresoras.

Con esto terminamos con PuTTY, editamos este fichero, si es la primera vez que accedes saldrá en blanco.

```
sudo nano /etc/udev/rules.d/99-usb.rules
```

Dentro añadimos una línea para cada impresora, rellenándolo con los valores conseguidos anteriormente. En `SYMLINK+`, añadimos el nombre que le daremos al nuevo puerto. Quedando algo así:

```
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ARTIX1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c99", ATTRS{idProduct}=="0002", SYMLINK+="PMINI"
```

En el caso de impresoras iguales o con la misma placa, hay que añadir el tercer parámetro, quedando así:

```
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{devpath}=="1.1", SYMLINK+="ARTIX1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{devpath}=="1.3", SYMLINK+="PMINI"
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint14.png)

Guardamos, y posteriormente reiniciamos la raspberry.

Con todas las impresoras conectadas, podemos comprobar si los nombres asignados son correctos, podemos mandar este comando por SSH.

```
ls -l /dev
```

Ahora vamos a una de las instancias de octoprint. Por ejemplo, en este caso, la de la Prusa.

Vamos a Settings – Serial Connection – General.

En Additional serial ports, añadiremos el nuevo nombre del puerto para la Prusa, en este caso /dev/PMINI

Luego en Blacklisted serial ports, pondremos todos los nombres de los puertos que nos aparezcan de mas. Es decir, algo así:

```
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyACM0
```

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint15.png)

Finalmente guardamos, si está todo correcto veremos que ahora solo nos sale el puerto de la Prusa, en esa instancia de octorpint.

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint16.png)

Repetimos el mismo proceso para la Artillery X1, vamos al octoprint para esta impresora y la configuramos igual que la otra, solo que en Additional serial ports, esta vez añadimos el puerto de la Arillery.

![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint17.png)

Si todo es correcto, volveremos a ver que ahora solo nos muestra el puerto de la Artillery.![](https://drababuilding.com/wp-content/uploads/octomultiprint/octomultiprint18.png)

Repetimos este proceso para cada una de las máquinas. De esta forma, no correremos el riesgo de conectar a la impresora que no toca.

Esto es todo lo necesario para poder crear múltiples instancias de octoprint 0.18.0\
\
Extraído del manual de nuestro compañero <https://t.me/rogodra> que podéis encontrar aquí

{% embed url="<https://drababuilding.com/octoprint/octoprint-0-18-raspberry-pi-multiple-printers/>" %}

Si tenéis alguna duda poder entrar en la magnífica comunidad de octoprint para telegram:

<https://t.me/Octoprint>

Y quiero dar mención a Chris Riley y Thomas Messmer por sus manuales para la versión de octoprint 0.17.0

[Channel Chis Riley](https://www.youtube.com/watch?v=-_sM2367Gq8)

[Web Thomas Messmer](http://thomas-messmer.com/index.php/14-free-knowledge/howtos/79-setting-up-octoprint-for-multiple-printers)


# Multiples Webcam

OctoPrint 0.18.0 Raspberry Pi

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam00.png)

Verificar la versión, al final de la página de octoprint verás que versión tienes, esta guía es válida para la versión 0.18.0.

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam01.png)

Primero entramos por SSH a octoprint, por ejemplo desde Windows con la aplicación PuTTy, introducimos la IP de la raspberry, marcamos SSH y finalmente a Open.![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam02.png)

Duplicamos este fichero:

```
sudo cp /root/bin/webcamd  /root/bin/webcamd2
```

Editamos el primer fichero:

```
sudo nano /root/bin/webcamd
```

Solo editaremos estos dos parámetros para la pi cam:

```
camera="raspi"
camera_raspi_options="-x 1280 -y 720 -fps 15 -q 75"
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam03.png)

Podéis poner la configuración que prefiráis.

Guardamos con CRTL+X, luego Y (yes), finalmente ENTER.

Vamos a configurar la webcam por usb, en este caso será un Logitech C270.

Antes que nada, tenemos que detectar el puerto del video de la webcam. Con este comando nos saldrá lo que vemos en la imagen, en este caso donde vemos UVC Camera es la camera sub, donde encontramos el video en /dev/video0, apuntarlo porque se usará más adelante.

```
v4l2-ctl --list-devices
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam04.png)

Aparte también se puede renombrar el puerto usb, al final del tutorial estará explicado.

Entramos el fichero duplicado de la segunda webcam:

```
sudo nano /root/bin/webcamd2
```

En este caso editaremos estas líneas, y las dejaremos como se indica aquí, añadiendo el puerto 8081, para la segunda camera.

```
camera="usb"
camera_usb_options="-d /dev/video0 -r 1280x720 -f 15"
camera_http_options="-p 8081 -n --listen 127.0.0.1"
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam05.png)

Sin salir del fichero, vamos bajando y buscamos el apartado # add video device into options. Donde eliminaremos la parte `-d /dev/$device` quedando así:

```
    # add video device into options
    options="$options"
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam06.png)

Guardamos y salimos de este fichero.

Duplicamos este segundo fichero:

```
sudo cp /etc/systemd/system/webcamd.service /etc/systemd/system/webcamd2.service
```

Abrimos el fichero duplicado:

```
sudo nano /etc/systemd/system/webcamd2.service
```

Editamos estos parámetros:

```
Description=the OctoPi webcam2 daemon with the user specified config

StandardOutput=append:/var/log/webcamd2.log
StandardError=append:/var/log/webcamd2.log
ExecStart=/root/bin/webcamd2
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam07.png)

Activamos porque se inicie el servicio de la segunda webcam al arrancar la raspberry.

```
sudo systemctl enable webcamd2
```

Ahora editaremos el archivo haproxy para añadir la webcam 2.

```
sudo nano /etc/haproxy/haproxy.cfg
```

Hay dos tipos de configuración:

En caso de tener 2 instancias de octoprint, dejar el apartado de `frontend public2`, así:

```
frontend public2
        bind :::81 v4v6
        bind :::444 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        use_backend webcam2 if { path_beg /webcam/ }
        default_backend octoprint2

backend octoprint2
        acl needs_scheme req.hdr_cnt(X-Scheme) eq 0

        reqrep ^([^\ :]*)\ /(.*) \1\ /\2
        reqadd X-Scheme:\ https if needs_scheme { ssl_fc }
        reqadd X-Scheme:\ http if needs_scheme !{ ssl_fc }
        option forwardfor
        server octoprint2 127.0.0.1:5001
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http

backend webcam2
        reqrep ^([^\ :]*)\ /webcam/(.*)     \1\ /\2
        server webcam2  127.0.0.1:8081
        errorfile 503 /etc/haproxy/errors/503-no-webcam.http
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam08.png)

En el caso que solo tengáis una instancia de octoprint y 2 cameras, hay que añadir en `frontend public` la nueva línea de la webcam.

```
frontend public
        bind :::80 v4v6
        bind :::443 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        use_backend webcam if { path_beg /webcam/ }
        use_backend webcam2 if { path_beg /webcam2/ }
        use_backend webcam_hls if { path_beg /hls/ }
        use_backend webcam_hls if { path_beg /jpeg/ }
        default_backend octoprint

.... añadir al final ....

backend webcam2
        reqrep ^([^\ :]*)\ /webcam2/(.*)     \1\ /\2
        server webcam2  127.0.0.1:8081
        errorfile 503 /etc/haproxy/errors/503-no-webcam.http
```

Guardamos el fichero y comprobamos que todo esté correcto con:

```
sudo service haproxy restart
```

Si no da ningún error es que todo es correcto.

En el caso que os salgo un error como este, volver a editar haproxy, revisad bien el fichero y que no este algún valor mal introducido.

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam09.png)

Reiniciamos la raspberry con:

```
sudo reboot now
```

Una vez reiniciado octoprint, podremos verificar fácilmente si las cámaras funcionan, entrando en estos enlaces:

Camera pi cam:

```
http://octopi.local/webcam/
http://octopi.local:8080
http://192.168.X.XXX/webcam/
http://192.168.X.XXX:8080
```

Segunda webcam con multi-instancia:

```
http://octopi.local:81/webcam/
http://192.168.X.XXX:81/webcam/
```

Segunda webcam sin multi-instancia:

```
http://octopi.local/webcam2/
http://octopi.local:8081
http://192.168.X.XXX/webcam2/
http://192.168.X.XXX:8081
```

Finalmente solo queda configurar la segunda webcam en la segunda instancia de octoprint.

Vamos a `Settings` –> `Webcam & Timelapse`

Activamos `Enable webcam support`

En la casilla Stream URL: `/webcam/?action=stream`

Probamos con el botón `test`.

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam10.png)

Activamos la opción de `Timelapse Recordings`, luego añadimos estos valores en:

Snapshot URL: `http://127.0.0.1:8081/?action=snapshot`

Path to FFMPEG: `/usr/bin/ffmpeg`

Probamos con el botón `test`.

Esto es todo lo necesario para poder tener múltiples cameras en octoprint 0.18.0\
\\

#### Renombrar puerto usb camera USB

Mandamos este comando, con el nombre del puerto asignado a nuestra webcam, recomendable solo conectar a los usb la webcam, para evitar encontrar los valores de otros dispositivos.

```
udevadm info -q all -n /dev/ttyUSB0 --attribute-walk
```

Saldrán muchos números. Nos desplazamos aproximadamente al tercer parágrafo, nos paramos en el primero mas largo, como en la foto.

Apuntamos estos dos valores:

```
ATTRS{idVendor}=="" 
ATTRS{idProduct}==""
```

En el caso que las webcams tengan los mismos valores, hay que apuntar un tercer valor y recordar a que puerto se ha conectado esa webcam.

```
ATTRS{devpath}==""
```

![](https://drababuilding.com/wp-content/uploads/octomulticam/octomulticam11.png)

Editamos este fichero, si es la primera vez que accedes saldrá en blanco.

```
sudo nano /etc/udev/rules.d/99-usb.rules
```

Dentro añadimos una línea para cada webcam, rellenándolo con los valores conseguidos anteriormente. En `SYMLINK+`, añadimos el nombre que le daremos al nuevo puerto. Quedando algo así:

```
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0825", ATTRS{devpath}=="1.3", SYMLINK+="WEBCAM"
```

Guardamos, y posteriormente reiniciamos la raspberry.

Vamos a configurar la webcam con su nuevo nombre.

Primera webcam:

```
sudo nano /root/bin/webcamd
```

Segunda webcam:

```
sudo nano /root/bin/webcamd2
```

Buscamos esta linea, y las dejaremos como se indica aquí:

```
camera_usb_options="-d /dev/WEBCAM -r 1280x720 -f 15"
```

Reiniciamos la raspberry, y si todo es correcto ya deberíamos ver correctamente las webcam.\
\
Extraído del manual de nuestro compañero <https://t.me/rogodra> que podéis encontrar aquí

{% embed url="<https://drababuilding.com/octoprint/octoprint-0-18-raspberry-pi-multiple-printers/>" %}

Si tenéis alguna duda poder entrar en la magnífica comunidad de octoprint para telegram:

<https://t.me/Octoprint>

Y quiero dar mención a Chris Riley y Thomas Messmer por sus manuales para la versión de octoprint 0.17.0

[Channel Chis Riley](https://www.youtube.com/watch?v=F0wC4jjF9EQ)

[Web Thomas Messmer](http://thomas-messmer.com/index.php/14-free-knowledge/howtos/79-setting-up-octoprint-for-multiple-printers)


# Controlar varias impresoras usando instancias Docker

Otra alternativa que nos gusta mucho es el uso de Docker para que la creación, uso y mantenimiento de instancias de Octoprint sea más versátil

## Qué necesitamos?

A continuación os detallamos los componentes que vamos a necesitar, indicar que vamos a centrar esta guía basada en Raspberry Pi pero podemos usar cualquier otro "host" que soporte Docker.

* Raspberry Pi 3B+ o superior, idealmente una 4 con 2Gb al menos de RAM
* Tarjeta Micro SD y un lector de estas si nuestro ordenador no tiene lector integrado, con un mínimo de 8Gb aunque lo aconsejable son 16Gb o más dado que vamos a tener varias instancias... es aconsejable que esta SD sea de la máxima calidad y velocidad posibles
* Una imagen de Raspberry PiOS (idealmente la lite). Descargaremos e instalaremos el [**Raspberry Pi Imager**](https://raspberrypi.org/software) en nuestro ordenador que nos facilitará la tarea de generar la SD para nuestra Raspberry.
* Un cliente SSH para conectar por terminal a nuestra Pi, aconsejamos [**Terminus**](https://termius.com/) ya que es multiplataforma y dispone de versión para teléfono/tablet... además de que tiene un interfaz sencilla y funcional.
* Un scanner de red para nuestro teléfono/tablet para poder detectar si nuestra Pi se enlazó correctamente en nuesta red. En este caso aconsejamos [Fing](https://www.fing.com/products/fing-app).
* Un editor de textos como [**Visual Studio Code**](https://code.visualstudio.com/download), [**Notepad++**](https://notepad-plus-plus.org/download/) o [**Atom**](https://atom.io/). Es importante usar uno de estos ya que algunos como Word, Wordpad o editores con formato enriquecido pueden añadir caracteres de escape en los ficheros de configuración y no funcionar correctamente.
* Obviamente un par de impresoras 3D al menos y un par de webcams si queremos controlar visualmente estas

## Instalación de PiOS usando Raspberry Pi Imager

Podemos usar la herramienta **Raspberry Pi Imager** para personalizar, crear y quemar la imagen de PiOS que es quizás la forma más sencilla.

* Descargaremos e instalaremos el [Raspberry Pi Imager](https://raspberrypi.org/software) en nuestro ordenador
* Buscaremos la imagen de PiOS en **Choose OS** y dentro de **Raspberry Pi OS (other)** y seleccionaremos **Raspberry Pi OS Lite** (32 o 64 bits dependiendo del modelo que Raspberry que tengamos)
* Abriremos **Advanced Options** (icono de engranaje) para configurar las opciones de nuestra Wifi si es necesario para ello dentro de las opciones para seleccionar el OS pulsaremos **CTRL+SHIFT+X (Windows) o CMD+SHIFT+X (MAC)**. En la nueva ventana aparecerán nuevas opciones avanzadas, la parte importante es la de configuración de nuestra wifi donde seleccionaremos nuestro **SSID**, **contraseña** y **país.**\
  También es aconsejable:
  * **Habilitar SSH** usando autentificación por password
  * Configurar **Time Zone** y nuestro **layout del teclado**

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTqLw6KI5FruaRNEMZD%2F-MeQi3aI7dVT96DwEofe%2F-MeUxT07Fx5ApyGkjeWP%2Fimage.png?alt=media\&token=e4eb9fa1-475b-4215-a7e6-8a770b8b9aca)

* Elegiremos la SD y grabaremos la imagen.
* Extraeremos de forma segura la SD y la colocaremos en nuestra Raspberry, al encenderla y pasados unos segundos ya podremos conectarnos a ella tal como indicamos en los siguientes puntos de la guia.
* Si hemos hecho todos los pasos de forma correcta y configurado nuestra Wifi o conectado por cable nuestra Raspberry ya podremos mirando en nuestro router o mediante [Fing](https://www.fing.com/products/fing-app) encontrar la IP de nuestra Raspberry.

## Haciendo login usando Terminus via SSH

Si hemos realizado el proceso anterior tenemos nuestra Pi lista para conectarnos, para ello usaremos [**Terminus**](https://termius.com/) que es un cliente SSH multiplataforma y bastante intuitivo. Básicamente añadiremos un nuevo host, le daremos un nombre, IP, puerto (22) y el usuario y password por defecto (pi/raspberry).

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FqmncaVorhhqgM3nE8o0W%2Fimage.png?alt=media\&token=5ab6441c-2810-4da0-b625-235bba621610)

{% hint style="danger" %}
Por seguridad es muy aconsejable que cambiemos el password por defecto de nuestra Pi. Para ello usaremos el comando **passwd**

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FLY5bzO0ltmb6Y3zrsKwJ%2Fimage.png?alt=media\&token=97f9e7a7-f299-444d-badc-bae39cd6229e)\
Una vez cambiado reiniciaremos usando el comando **sudo reboot**
{% endhint %}

## Actualización del sistema e instalación de Docker

Una vez ya tenemos acceso SSH otro de los pasos es asegurarnos que nuestro PiOS está actualizado, usaremos el siguiente comando:

```bash
sudo apt-get update && sudo apt-get upgrade -y
```

Una vez finalizado el proceso procederemos a instalar Docker:

```bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```

Daremos permisos a nuestro usuario pi a Docker y reiniciamos:

```bash
sudo usermod -aG docker pi
reboot
```

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FjKajn9owsnfGFwcX3jTI%2Fimage.png?alt=media\&token=c43ec8a3-cf59-4e09-b4df-bcc7aa4a7bf6)

## Instalación de Portainer

En un mundo ideal lo aconsejable es que conozcamos los comandos Docker para gestionar nuestras instancias... la realidad es que es mucho más sencillo y visual usar una interfaz/UI web para gestionarlas de una forma sencilla. En nuestro caso siempre usamos [**Portainer**](https://www.portainer.io/).

Para instalar Portainer lanzaremos desde el terminal los siguientes comandos:

```bash
docker pull portainer/portainer-ce:linux-arm
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:linux-arm
```

Donde el primer comando **docker pull** descargará la imagen del container Portainer a nuestra Pi y el segundo, **docker run**, lo ejecutará.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FKDv7NW7YQqYJojKljSmr%2Fimage.png?alt=media\&token=35f657d3-407a-4470-a0d0-00bfe9749585)

Si todo ha ido bien ya tendremos nuestro container con Portainer funcionando y solamente deberemos acceder a el desde nuestro browser usando <http://RaspberrypiIP:9000> donde RaspberrypiIP es la IP que encontramos en nuestro router o mediante Fing y usamos para conectar por SSH.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FwSKPIhn70wMTT3S945lK%2Fimage.png?alt=media\&token=23a1fccc-f2d8-40b0-9cc7-1680afe0a523)

El primer paso del asistente de Portainer es para ajustar el password del usuario admin, no te aconsejo por ahora cambiar el nombre del usuario, solamente seguiremos las indicaciones y daremos sobre **Create user**.

El siguiente paso es el seleccionar el tipo de entorno de containers a gestionar. En nuestro caso seleccionaremos **Docker** y daremos sobre **Connect**.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FAb7u6zh2qpgEjxRrvFlj%2Fimage.png?alt=media\&token=e27a4852-5b23-46aa-81b3-5da770812228)

De nuevo si todo ha salido según lo esperado ya tenemo nuestro Portainer gestionando nuestro entorno Docker funcionando!!!

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2F9PlRy74h1fs5cxYNkbQA%2Fimage.png?alt=media\&token=099a03e5-cf64-414e-91bd-9d09f30bd4b4)

## Identificando nuestras impresoras y cámaras USB

Ya estamos cerca de poder tener nuestra multi instancia de Octoprint listo, el siguiente paso es identificar nuestras impresoras y cámaras para preparar nuestros contenedores.

Asumiendo que tengamos nuestras impresoras y webcams conectadas a nuestra Pi lanzaremos el siguiente comando:

```bash
ls /dev | grep 'ttyUSB\|ttyACM'
```

Este comando debería de mostrarnos los puntos de montaje de nuestras impresoras:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2Fig59b1qxFDuhjuQnGdEH%2Fimage.png?alt=media\&token=510489f5-3e37-48ef-991e-558f18300717)

Ya tenemos nuestro par de impresoras detectadas y nos anotaremos sus nombres añadiendo /dev/ a lo detectatado en el punto anterior:

```
/dev/ttyACM0 --> Impresora #1
/dev/ttyUSB0 --> Impresora #2
```

Ahora haremos algo similar pero para detectar nuestras cámaras:

```bash
v4l2-ctl --list-devices
```

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FdQoxlc49dAz5y0WHsn79%2Fimage.png?alt=media\&token=7d321cfe-8902-4775-9944-1d1068f4ab21)

De los dispositivos detectados solamentete usaremos los dos últimos que son nuestras cámaras. La información importante es:

```
/dev/video0 --> WebCam #1
/dev/video2 --> WebCam #2
```

Ya tenemos todo detectado!!! ahora volveremos a nuestro Portainer.

## Creando multiples instancias de Octoprint con Docker-Compose

De vuelta a nuestro Portainer iremos en STACKS y ADD STACK:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FrWE6o1MUAsWQ4vUAUNwl%2Fimage.png?alt=media\&token=e7884908-a8ae-471c-a7bb-2b375516bed3)

Esto abrirá el interfaz de Docker-Compose donde nos pedirá el nombre del stack el cual es aconsejable usar un nombre fácil de identificar si tenemos pensado usar otros containers en el futuro... en nuestro caso usaremos multiinstance.

En la parte de **web editor section**, vamos a escribir el **Compose** que podéis encontrar más abajo.

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FmDky5vf6QdDS7yUKtfsT%2Fimage.png?alt=media\&token=54e08c8d-3d77-4f80-aaf1-69eed7a6a70c)

{% hint style="warning" %}
**Por favor asegúrate que pones correctamente los parámetros de impresora y cámara detectados en el punto anterior.**
{% endhint %}

```yaml
version: '2'
volumes:
  octoprint-1:
  octoprint-2:
services:
  ghost5:
    image: octoprint/octoprint
    ports:
    #Puerto para instancia octoprint controlara Impresora #1
      - 5001:80
    devices:
    #Impresora #1
      - /dev/ttyUSB0:/dev/ttyUSB0
    #WebCam #1
      - /dev/video0:/dev/video0
    volumes:
      - octoprint-1:/home/octoprint/.octoprint
    environment:
      #Calidad del streaming de WEBCAM #1
      - MJPG_STREAMER_INPUT=-n -r 1280x720 -f 30
      #Habilitar streaming WEBCAM #1
      - ENABLE_MJPG_STREAMER=true
    restart: always
  prusa:
    image: octoprint/octoprint
    ports:
    #Puerto para instancia octoprint controlara Impresora #2
      - 5002:80
    devices:
    #Impresora #2
      - /dev/ttyACM0:/dev/ttyACM0
    #WebCam #2
      - /dev/video2:/dev/video0
    volumes:
      - octoprint-2:/home/octoprint/.octoprint
    environment:
      #Calidad del streaming de WEBCAM #2
      - MJPG_STREAMER_INPUT=-n -r 1280x720 -f 30
      #Habilitar streaming WEBCAM #2
      - ENABLE_MJPG_STREAMER=true
    restart: always
```

Una vez completado el Compose daremos en **Deploy the stack**.

Mágicamente si todo ha ido bien las dos instancias Octoprint estarán listas... para verificarlo iremos a **Containers**.

En la siguiente captura podemos ver los containers levantados con el estatus **RUNNING** y el puerto usado por cada uno de ellos:

![](https://1888789367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MTqLw6KI5FruaRNEMZD-887967055%2Fuploads%2FcbywZJ3W7ZtntSDeKkTu%2Fimage.png?alt=media\&token=2330cee0-7a59-4e35-b55b-9a8a5f49f008)

Ahora ya podemos comenzar a configurar nuestros nuevos Octorpint siguiendo nuestra [**guía**](/octoprint/instalacion/configurando-octoprint)**.**

\*\*Para acceder a cada instancia pondremos en nuestro navegador la http\://\*\*RaspberrypiIP:5001 para acceder a nuestra instancia de la impresora 1 y \*\*http\://\*\*RaspberrypiIP:5002 para acceder a la instancia de la impresora 2.

Esperamos que os fuera de ayuda!!!


# Quieres promocionar tus productos/empresa?

¿Tu empresa se dedica a la impresión 3D? En 3Dwork tendrás una oportunidad única para promocionar tus productos y servicios entre los usuarios del sector.

Ponte en contacto con nosotros hoy mismo para descubrir las opciones publicitarias. Estaremos encantados de ayudarte con ello.

{% embed url="<https://forms.gle/SgBQryZG9uvBax6e7>" %}


