# QIDI Plus 4 - Technical Guide

## Hardware

### Mecánica/Chasis

#### Calibración de plataforma de impresión

Os facilitamos el proceso para realizar este proceso de una forma sencilla siguiendo el siguiente video:

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

#### Juego en el toolhead

Al parecer en algunas unidades de la QIDI Plus 4 podían tener problemas de juego, o wobble en inglés, lo cual puede provocar una calidad de las impresiones deficiente.

En el siguiente video podemos ver una solución al mismo, aunque es aconsejable contactar con el soporte de QIDI.

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

### Electrónica

{% tabs %}
{% tab title="Conexiones MCU" %}

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FPbCvG9EFFO9PbYPSGzLm%2Fimage.png?alt=media&#x26;token=0848bca2-b961-4e9b-a48f-be616836f0ba" alt=""><figcaption></figcaption></figure>

1. Conector Wifi
2. Puerto USB
3. Puerto de red por cable
4. Conector serial pantalla
5. Conectores de alimentación electrónica (a.+ b.-)
6. Conector calefactor cama (a.+ b.-)
7. Conector iluminación led
8. Conector cama
9. Conector ventilador circulación aire cerramiento
10. Conector ventilación capa auxiliar
11. Conector ventilador electrónica
12. Conector ventilador cerramiento
13. Conector motor Z (azul)
14. Conector motor Z secundario (azul)
15. Conector motor X (verde)
16. Conector motor Y (amarillo)
17. Conector USB toolhead
18. Conector sensor temperatura cerramiento
19. Conector sensor filamento
20. Conector sensor nivelación piezo
21. Conector sensor temperatura cama
22. EMMC almacenamiento sistema operativo
    {% endtab %}

{% tab title="Pinout MCU" %}

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FxhelCrqlTYsz2qIx3IKV%2Fimage.png?alt=media&#x26;token=20e81123-a674-482f-b687-c76bdf3533f6" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Pinout Toolhead" %}

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FCJkUt777uqz5Q7pg5n2k%2Fimage.png?alt=media&#x26;token=66da9388-4d69-46d2-89fa-5001ba53693e" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

## Klipper

### Gestión/configuración de Klipper

QIDI, por suerte, deja bastante acceso al sistema Klipper para poder realizar algunas mejoras sobre este. Por suerte en esta QIDI Plus 4 contamos con versiones de Klipper actualizadas recientemente:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FGcVYS2bN9BW1fFRjnqNc%2Fimage.png?alt=media&#x26;token=1587912d-6c5a-4354-a93a-4a211143a241" alt=""><figcaption></figcaption></figure>

#### Interfaz web Fluidd

QIDI por defecto habilita la interfaz Fluidd para la gestión de Klipper remota, disponemos de pantalla en la impresora pero las opciones y funciones de esta son bastante limitadas comparadas con Fluidd.

Para acceder a el, y una vez conectada la impresora a nuestra red y conociendo la IP asignada, usaremos cualquier dispositivo que se encuentre en la misma red y desde el navegador web que usemos iremos a [http://IP\_HOST](http://ip_host)

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FM91m6fF6saAiGsmUaKFG%2Fimage.png?alt=media&#x26;token=86e23185-25c9-4585-aaa1-91f18cc2c60c" alt=""><figcaption></figcaption></figure>

#### Conexión SSH a linea de comandos

QIDI también permite acceso al host por SSH para utilizar la linea de comandos, especialmente útil para algunos usuarios y algunos procesos que explicaremos más adelanta.

Desde nuestro cliente SSH favorito usaremos la IP de nuestra impresora y el usuario mks

| rol            |     |           |
| -------------- | --- | --------- |
| user (o user2) | mks | makerbase |

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FozxDX6KOEsue7idLWlvZ%2Fimage.png?alt=media&#x26;token=8421821b-0169-44cd-bddf-7cc05b52aa6f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FdhhG0zsFrdO1nC2haGBn%2Fimage.png?alt=media&#x26;token=16ba5048-7f69-41fd-8cf3-cb44aca75601" alt=""><figcaption><p>contenido /home/mks donde se encuentra la instalación de Klipper y el resto de componentes</p></figcaption></figure>

Kiauh

D**isponemos de** [**Kiauh**](https://github.com/dw-0/kiauh) **preinstalado que podremos lanzar ejecutando `./kiauh/kiauh.sh`**, probablemente nos solicite actualizarlo:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FX1nQxwAXDJdg2thImdSv%2Fimage.png?alt=media&#x26;token=b337bc2e-fe69-45ca-bc68-95ac86c3892c" alt=""><figcaption></figcaption></figure>

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

**NO ACTUALIZAR NINGÚN COMPONENTE CORE (KLIPPER/MOONRAKER/SYSTEM) DADO QUE PUEDEN ROMPER LA CONFIGURACIÓN Y PERSONALIZACIONES DE QIDI Y DEJAR EL SISTEMA INUSABLE.**
{% endhint %}

## Mejoras Klipper

LA QIDI Plus 4 viene con muchos cambios con respecto a modelos anteriores, el uso de la v0.12.x de Klipper (vs modelos anteriores con v0.10.x) y cambios en la configuración en gran parte sugeridos por la comunidad, hacen que funcione relativamente bien.

En cualquier caso siempre se tien margen de mejora y es por ello que os vamos a sugerir algunos cambios para mejorar en este aspecto.

{% hint style="info" %}
Algunas de las fuentes que hemos utilizado para realizar estos mods:

<https://github.com/qidi-community/Plus4-Wiki>

<https://www.printables.com/model/1035564-qidi-plus-4-rear-cover-with-various-fan-sizes>
{% endhint %}

### Cambios de configuración Klipper

Dado que Klipper usa un proceso secuencial de la configuración y tenemos opciones de poder tener una configuración modular incluyendo otros ficheros de configuración a nuestro printer.cfg os sugerimos que todas las modificaciones, o las que sean posibles, se realicen en un fichero cfg como include.

Dentro de nuestro printer.cfg añadiremos un include para que cargue nuestro/s nuevo/ cfg al final de este, pero **recuerda que como siempre por encima de la sección SAVE\_CONFIG!!!**:

En nuestro caso creamos una carpeta 3dwork/printers y un fichero qidi-plus-4.cfg donde incluiremos todas las modificaciones:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FtPNDKqN8hRHyyDlNUM1w%2Fimage.png?alt=media&#x26;token=67cecc39-adff-4113-80cf-2cb64c121352" alt=""><figcaption></figcaption></figure>

Una vez lo tengamos tan solo tendremos que crear el include en nuestro printer.cfg:

```
### 3DWORK - QIDI Plus 4 Modifications
[include 3dwork/printers/qidi-plus-4.cfg]

#*# <---------------------- SAVE_CONFIG ---------------------->
```

Utilizamos esta forma de configuración aparte de por lo comentado anteriormente, porque en caso de actualizaciones siempre nos va a ser más rápido el poder restaurarlas ante futuras actualizaciones del sistema.

{% hint style="success" %}
**En nuestro caso hemos creado carpetas porque usamos la misma estructura del** [**Bundle Klipper 3Dwork** ](https://klipper.3dwork.io/klipper/mejoras/3dwork-klipper-bundle)**donde en el futuro incluiremos esta máquina.**
{% endhint %}

### Actualización horaria

Dado que **la electrónica no dispone de una batería para mantener los ajustes horarios lo ideal es que configuremos el sistema para que lo haga automáticamente**.&#x20;

Es importante porque **de esta forma tendremos estimaciones correctas de tiempos de impresión, además de poder realizar actualizaciones software mediante internet**.

El proceso es muy sencillo lanzando los siguientes comandos:

Lo primero de todo ajustaremos nuestra zona horaria con los siguientes comandos:

```
timedatectl list-timezones # to list available time zones
sudo timedatectl set-timezone Europe/Madrid # to set Europe/Madrid timezone
timedatectl # to check timezone was ok
```

Desactivaremos `systemd-timesync`:

```
systemctl status systemd-timesyncd # to check current status
systemctl stop systemd-timesyncd # to stop systemd-timesyncd daemon
systemctl disable --now systemd-timesyncd.service # to disable systemd-timesyncd daemon
systemctl status systemd-timesyncd # to check systemd-timesyncd is disabled
```

Instalaremos `chrony`:

```
sudo apt install chrony -y # to install chrony
```

Reiniciamos el servicio:

```
sudo systemctl restart chronyd # to restart chrony daemon
```

Podemos revisar la configuración en el caso que queramos ajustar algo, no suele ser necesario:

```
sudo nano /etc/chrony/chrony.conf
```

Revisamos el estado de la sincronizacion con estos comandos:

```
chronyc sources
chronyc tracking
```

Podemos lanzar un comando `date` para verificar que todo este sincronizado.

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FMMPuNllg2papTutRDOOq%2Fimage.png?alt=media&#x26;token=3b00581f-bd5b-4a2d-829b-94bc5c8c761d" alt=""><figcaption></figcaption></figure>

Ahora al apagar nuestra máquina esta se ajustará la hora al iniciarse.

### Refrigeración de electrónica inteligente

La QIDI Plus 4 viene configurada por defecto para activar el ventilador de la electrónica como controller\_fan, esto significa que el ventilador no se va a poner en marcha si no ponemos en movimiento la máquina.

Aunque esta forma de funcionar es adecuada para mantener la impresora mientras estamos imprimiendo, no nos ayuda a mantener la temperatura bajo control cuando la impresora está encendida y no estamos imprimiendo.

Para mejorar este aspecto vamos a realizar algunos cambios en la configuración por defecto:

* Primero desactivaremos la configuración por defecto del ventilador de la electrónica que podemos encontrar en la sección `[controller_fan board_fan]` la cual comentaremos añadiendo el símbolo # al inicio de cada línea:

```django
### 3DWORK - MOD - Mainboard Fan Adaptative
# [controller_fan board_fan]
# pin:U_1:PC4
# max_power:1.0
# shutdown_speed:1.0
# cycle_time:0.01
# fan_speed: 1.0
# heater:chamber
# stepper:stepper_x,stepper_y
```

* A continuación, os recomendamos hacerlo en el include tal como os sugerimos al inicio, añadiremos la siguiente configuración:

```django
### 3DWORK - MOD - Mainboard Fan Adaptative
[temperature_fan board_fan]
pin:U_1:PC4
max_power: 1.0
shutdown_speed: 1.0
cycle_time: 0.01
off_below: 0
sensor_type: temperature_host
control: pid
pid_deriv_time: 2.0
pid_Kp: 5
pid_Ki: 2
pid_Kd: 5
target_temp: 45
min_speed: 0.3
max_speed: 1.0
min_temp: 0
max_temp: 100
```

Una vez aplicado el cambio en el propio interfaz ya podremos ver la información, estado y configuración de temperaturas que hemos hecho:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2F542vRYiTf4eapm8n9Q3m%2Fimage.png?alt=media&#x26;token=5579479b-edcf-42e5-9bc8-a61b2e44a90f" alt=""><figcaption></figcaption></figure>

Como podéis ver en la captura anterior la temperatura de nuestra electrónica, sin tener la impresora imprimiendo, se encontraba en más de 50ª. Ahora mantendremos la temperatura controlada para que este dentro de los márgenes que configuramos (45º por defecto):

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FIgRale5oHV1o4Yk3BaBe%2Fimage.png?alt=media&#x26;token=3a1b1090-f907-452c-a302-328e0a3513f6" alt=""><figcaption></figcaption></figure>

En la QUIDI Plus 4 contamos con un ventilador de 40mm para el control de temperatura que si bien suele ser suficiente os aconsejamos cambiarlo por uno más grande que normalmente tienen mayor flujo de aire y van a generar menos niveles de ruido durante su funcionamiento. \
En Printables y gracias al compañero [kruegchen](https://www.printables.com/@kruegchen_2508663) contamos con un [mod que nos va a permitir instalar ventiladores de diferentes diagonales](https://www.printables.com/model/1035564-qidi-plus-4-rear-cover-with-various-fan-sizes).

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FVo347otfpFmLoAGhTVmW%2Fimage.png?alt=media&#x26;token=c761f13d-2597-46e0-884a-c075006157bd" alt=""><figcaption><p>Imagen extraída de Printables.</p></figcaption></figure>

### Mejorar las lecturas de temperatura del cerramiento

La QIDI Plus 4 monta su sensor de temperatura en una posición que probablemente no sea la más óptima. Podemos encontrarlo en la parte trasera derecha, debajo de la estructura del chasis:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2F9FbK020y6qWLXoxKcggH%2Fimage.png?alt=media&#x26;token=19e74280-f56f-45ee-980d-2ebacbf786e8" alt=""><figcaption></figcaption></figure>

Lo más óptimo siempre es que la temperatura sea del punto más cercano a la impresión, por lo que colocar el sensor en una esquina, junto al metal del chasis y en una zona alta y en el lado opuesto a donde sopla el propio calentador, no va a ayudar a que las temperaturas acaben siendo fiables.

Para mejorar estas lecturas y gestionar mejor el sistema de calefacción vamos a aprovechar el sensor de temperatura que tenemos en el toolhead/cabezal de impresión (GD32)  para combinar lecturas de temperatura y así mejorar la precisión.

Gracias a la flexibilidad y potencia de Klipper vamos a crear un sensor de temperatura “virtual” donde combinaremos las lecturas de ambos sensores:

* Primero comentaremos la sección `[heater_generic chamber]` de nuestro `printer.cfg`:

```django
### 3DWORK - MOD - Improve Chamber Temperature Precision
# [heater_generic chamber]
# heater_pin:U_1:PC8
# max_power:0.4
# sensor_type:NTC 100K MGB18-104F39050L32
# sensor_pin:U_1:PA1

# control = pid
# pid_Kp=63.418 
# pid_Ki=1.342 
# pid_Kd=749.125

# min_temp:-100
# max_temp:70
```

* A continuación definiremos de nuevo el sensor de temperatura del cerramiento con otro nombre `[temperature_sensor chamber_probe]` y modificaremos `[heater_generic chamber]` para que use un sensor virtual utilizando la lectura combinada de ambos sensores (el del toolhead y el del cerramiento) dando más peso 3/1 al del toolhead:

```django
### 3DWORK - MOD - Improve Chamber Temperature Precision
[temperature_sensor chamber_probe]
sensor_type:NTC 100K MGB18-104F39050L32
sensor_pin:U_1:PA1

[heater_generic chamber]
heater_pin:U_1:PC8
max_power:0.5 #3DWORK - Original 0.7 or 0.4 depending on firmware version
control = pid
pid_Kp=63.418 
pid_Ki=1.342 
pid_Kd=749.125
min_temp:-100
max_temp:80
sensor_type: temperature_combined
sensor_list: temperature_sensor GD32, temperature_sensor chamber_probe, temperature_sensor GD32, temperature_sensor GD32
combination_method: mean
maximum_deviation: 70
```

Ahora contaremos con unas lecturas de temperaturas más precisas para la gestión de calentado y seguiremos usando el sensor por defecto para la protección termal, como podéis ver en la siguiente captura, la temperatura varía significativamente en varios grados:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FLWHVnAGEB9DzkeUpzkRD%2Fimage.png?alt=media&#x26;token=07654cd4-ebc0-4b7d-b55e-aefb846ffb7f" alt=""><figcaption></figcaption></figure>

### Mejorar tiempos de calentado del cerramiento

Uno de los aspectos a mejorar es el tiempo de calentado del cerramiento cuando utilizamos filamentos técnicos y que puede durar muchos minutos... y el diseño/terminaciones de algunas partes no ayudan.

Para mejorar esto vamos a realizar un par de modificaciones en la configuración de la macro START\_PRINT y verify\_heater:

* START\_PRINT

```django
### 3DWORK - MOD - Improve Chamber Warmup
[gcode_macro PRINT_START]
gcode:
    {% set bedtemp = params.BED|int %}
    {% set hotendtemp = params.HOTEND|int %}
    {% set chambertemp = params.CHAMBER|default(0)|int %}

    # AUTOTUNE_SHAPERS                  # Nothing ever makes uses of this though
    # set_zoffset                       # Sample the Z offset (but why even do this now?)
    M141 S{chambertemp}                 # Initiate Chamber Warmup as early as possible
    M140 S{bedtemp}                     # Initiate Print Bed Warmup as early as possible
    M400                                # Wait for all prior G-code commands to be processed by MCU
    M104 S0                             # Make sure hotend is off
    M106 P3 S0                          # Turn off chamber circulation/exhaust fan
    M106 S255                           # Turn on part cooling fan to full speed

    {% if chambertemp > 0 %}
        M106 P2 S255                    # Set AUX to full to help mix chamber air fully
    {% else %}
        M106 P2 S0                      # Turn off auxiliary part cooling fan
    {% endif %}

    M400                                # Wait for all prior G-code commands to processed before G28
    G28                                 # Home all axes
    CLEAR_NOZZLE HOTEND={hotendtemp}    # Do nozzle purge and wipe

    {% if chambertemp > 0 %}            # Special chamber handling for fastest thorough warmup times
        M106 P0 S255                    # Ensure part cooling fan is full speed for better air mixing
        M106 P2 S255                    # Ensure AUX is at 100% after CLEAR_NOZZLE was called
        G0 Z5 F600                      # Bring print bed to Z=5mm.  This helps with chamber heating
        G0 X152 Y152 F6000              # Bring print head to middle of print bed
        M191 S{chambertemp-5}           # Wait for chamber to reach 5C less than the target temperature
        M141 S{chambertemp}             # Reset chamber target to full target
        M106 P2 S0                      # Turn off AUX Fan
        M106 P0 S0                      # Turn off part cooling fan
    {% endif %}

    G0 X5 Y5 F6000                      # Move print head to front-left in case of any oozing
    M104 S140                           # Set nozzle to 140 so any remaining filament stuck to nozzle is softened
    M190 S{bedtemp}                     # Wait for print bed to reach target temperature
    G29                                 # Perform Z-offset, and bed meshing measurements
    M104 S0                             # Ensure hotend is fully off to minimise any oozing

    {% if chambertemp == 0 %}           # No chamber temp set. This means we're likely printing PLA/PETG.
        M106 P3 S255                    # Set the chamber circulation fan to 100% to minimise heat creep
    {% endif %}

    G0 Z5 F600                          # Move plate to Z=5mm
    G0 X5 Y5 F6000                      # Move print head to front-left
    M141 S{chambertemp}                 # Ensure chamber is set to on after G29 was called earlier
    M109 S{hotendtemp}                  # Commence hotend warmup
    M204 S10000                         # Set velocity limits
    SET_PRINT_STATS_INFO CURRENT_LAYER=1
    ENABLE_ALL_SENSOR
    save_last_file
```

* Otro cambio a realizar para evitar errores durante el proceso de calentado es el relajar los tiempos de check de temperaturas de la cama caliente, ya que usaremos esta para ayudar en el proceso:

```django
### 3DWORK - MOD - Improve Chamber Warmup
[verify_heater heater_bed]
max_error: 200
check_gain_time:180
hysteresis: 10
heating_gain: 1
```

* En nuestro laminador, dependiendo de este... en nuestro caso usamos OrcaSlicer, es aconsejable revisar que en la configuración de nuestro filamento no tengamos `Active temperature control` activado, ya que puede retrasar el proceso de calentado del cerramiento:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2F2mNVAHzPoV2JLX59pqIu%2Fimage.png?alt=media&#x26;token=482e30e7-781b-4b0a-adce-20ef2f530017" alt=""><figcaption></figcaption></figure>

A modo de resumen de todos estos cambios:

* Utilizamos la cama para ayudar durante el proceso de calentado
* Utilizamos los ventiladores de capa para distribuir la temperatura&#x20;
* Relajamos la temperatura objetivo del cerramiento 5º para que el resto del proceso de inicio de impresión sea más rápido, al iniciar la impresión llegará a la temperatura marcada por el laminador
* Los procesos de nivelación se realizan en paralelo con el calentado del cerramiento

¡En nuestras pruebas se redujeron los tiempos de inicio de impresión en más de 5 minutos, lo cual no está nada mal!

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FR3GSWsY18UOJxs6klOBE%2Fimage.png?alt=media&#x26;token=801891f0-0ff6-40d1-beb7-4dda07fe884a" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**Prevención de paradas de emergencia por temperatura cuando utilizamos el sistema de calefacción del cerramiento.**

Teniendo en cuenta la ubicación del sistema de calefacción cuando tenemos una impresión que llega o sobrepasa los 268mm la propia estructura de la cama bloquea el sistema de calefacción provocando en ocasiones que la protección termal de Klipper pueda detener la impresión en curso y bloquear el sistema.\
Dado que es un "problema" de diseño de difícil solución podemos utilizar las funciones avanzadas disponibles en las macros de Klipper para poder minimizar este problema. Para ello y dentro del fichero de configuración `gcode-macro.cfg` editaremos la macro `SET_PRINT_STATS_INFO` , o si usamos el include sugerimos la incluiremos directamente ahi para que la sobreescriba, para que reduzca la temperatura del cerramiento a partir de esas alturas para que finalice la impresión sin errores:

```django
### 3DWORK - FIX - Chamber Heater at +268mm height
[gcode_macro SET_PRINT_STATS_INFO]
rename_existing: SET_PRINT_STATS_INFO_BASE
gcode:
    {% set curlayer =  params.CURRENT_LAYER|default(1)|int %}
    {% if (printer.toolhead.position.z) >= 268 %}
        # Set chamber target to 15C, which still keeps the chamber heater fan on
        # This allows the print bed to warm the chamber more effectively even
        # though the heater coils are effectively disabled
        M141 S15
    {% endif %}
    SET_PRINT_STATS_INFO_BASE CURRENT_LAYER={curlayer}
```

{% endhint %}

### Linea de purga adaptativa/inteligente (KAMP)

La QIDI Plus 4, como modelos anteriores, utilizan KAMP para el mallado adaptativa/inteligente a la hora de imprimir. La que por defecto utiliza QIDI en sus perfiles de máquina para laminadores a veces resulta bastante grande y laboriosa de retirar.

Aprovechando esto podemos utilizar también la línea de purgado adaptativa/inteligente. En unos simples pasos podremos utilizarla y disponer de más opciones de ajuste sencillo:

* Editaremos el fichero `KAMP_Settings.cfg` que encontraremos en la misma ubicación que nuestro printer.cfg:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FzZwHgl74O5vmDztfxOk8%2Fimage.png?alt=media&#x26;token=7350e8a5-dfdc-46c8-8750-67d2ce75b986" alt=""><figcaption></figcaption></figure>

* Simplemente habilitaremos/descomentamos, eliminando el simbolo # del inicio, el `[include ./KAMP/Line_Purge.cfg]` de el:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FC62O04vzjW6aZjlDtXNL%2Fimage.png?alt=media&#x26;token=e4ae8862-f4a0-4ed8-ade6-d7c6412d86f9" alt=""><figcaption></figcaption></figure>

Iremos a nuestro laminador y editaremos el script/gcode de inicio de impresión donde:

* Eliminaremos la parte de los gcodes de linea de purga que encontraremos al final de este:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FVtPJYxVKmGecPTw91P9U%2Fimage.png?alt=media&#x26;token=4e0f479d-e483-4979-97c4-e2944baac77f" alt=""><figcaption></figcaption></figure>

* En su lugar pondremos la macro `LINE_PURGE` que habremos habilitado con el cambio en `KAMP_Settings.cfg`

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FOGkUCbFlywmmjVIXT9z7%2Fimage.png?alt=media&#x26;token=dc70a67f-ea59-47d6-8b98-e0a6b881b458" alt=""><figcaption></figcaption></figure>

### Mejoras configuración motores

QIDI ha dejado algunas configuraciones realmente extrañas en algunas partes de los motores con valores por ejemplo habilitando el `interpolate` o `microsteps` asi que si ajustamos estos es aconsejable aumentar un poco el `run_current`

A continuación os facilitamos una configuración que en nuestro caso ha funcionado muy bien, lo aconsejable es realizar tests:

```
### 3DWORK - MOD - Stepper Accuracy

[tmc2209 extruder]
interpolate: False ### 3DWORK - MOD - Stepper Accuracy - Original True

[stepper_x]
microsteps:64 ### 3DWORK - MOD - Stepper Accuracy - Original 32

[stepper_y]
microsteps: 64 ### 3DWORK - MOD - Stepper Accuracy - Original 32

[stepper_z]
microsteps: 16 ### 3DWORK - MOD - Stepper Accuracy - Original 128

[stepper_z1]
microsteps: 16 ### 3DWORK - MOD - Stepper Accuracy - Original 128

[tmc2240 stepper_y]
run_current: 1.15 ### 3DWORK - MOD - Stepper Accuracy - Original 1.07
interpolate: False ### 3DWORK - MOD - Stepper Accuracy - Original True

[tmc2240 stepper_x]
run_current: 1.15 ### 3DWORK - MOD - Stepper Accuracy - Original 1.07
interpolate: False ### 3DWORK - MOD - Stepper Accuracy - Original True

[tmc2209 stepper_z]
interpolate: False ### 3DWORK - MOD - Stepper Accuracy - Original True

[tmc2209 stepper_z1]
interpolate: False ### 3DWORK - MOD - Stepper Accuracy - Original True
```

{% hint style="warning" %}
**Si aumentamos los valores de run\_current es especialmente aconsejable mejorar la refrigeración de la electrónica que os mostramos en el apartado** [**refrigeración de la electrónica**](#refrigeracion-de-electronica-inteligente)**.**
{% endhint %}

### Mejoras sistema de nivelación

La QIDI Plus 4 dispone de varios sistemas de nivelación que facilitan, simplifican y automatizan estos procesos significativamente. Vamos a intentar mejorar algunos de estos para aprovechar al máximo

#### Ajustes de configuración de ejes Z

Klipper puede tener algunas desviaciones en la gestión de ejes que pueden afectar a un proceso critico como el de nivelación:

* Ajustar los micropasos de los ejes z a 16 micropasos que va a mejorar la precisión de movimientos en especial a velocidades que normalmente son utilizadas durante el proceso de nivelado. \
  Para ello modificaremos en nuestro printer.cfg, en nuestro caso lo haremos en nuestro include añadiendo la sección y el valor a ajustar, las secciones \[stepper\_z] y \[stepper\_z1] su valor microsteps a 16 (originalmente 128, que para nosotros nos parece una barbaridad):<br>

  ```
  ### 3DWORK - MOD - Z Axis Accuracy
  [stepper_z]
  microsteps: 16 ### 3DWORK - MOD - Stepper Accuracy - Original 128

  [stepper_z1]
  microsteps: 16 ### 3DWORK - MOD - Stepper Accuracy - Original 128
  ```

  \
  Guardamos los cambios y reiniciamos nuestro sistema Klipper, si revisamos los logs del servicio Klipper (klippy.log) podremos verificar que el cambio se aplicó correctamente:\
  \
  ![](https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FJANAfQ9j8I3ftDgJ4xdd%2Fimage.png?alt=media\&token=f5589965-44f9-4e5d-a31c-1dd1a418c6fd)
* Otra configuración que suele introducir imprecisión de movimientos es el uso de interpolación de micropasos, para deshabilitarlo identificaremos las secciones `[tmc2209 stepper_z]` y `[tmc2209 stepper_z1]` y las ajustaremos a False:<br>

  ```klipper-config
  ### 3DWORK - MOD - Z Axis Accuracy
  [tmc2209 stepper_z]
  interpolate: False ### 3DWORK - MOD - Z Axis Accuracy - Original True

  [tmc2209 stepper_z1]
  interpolate: False ### 3DWORK - MOD - Z Axis Accuracy - Original True
  ```

#### Ajustes en Smart Effector

Uno de los sistemas que utiliza la QIDI Plus 4 para la nivelación son unos sensores de presión en la cama para, entre otras cosas, poder tener un ajuste de z-offset optimo. \
Para mejorar esta parte identificaremos la sección `[smart_effector]` , donde modificaremos los valores de `speed`, `samples`,  `sample_retract_dist` y`samples_tolerance` especialmente útil si realizamos multi probing (varias medidas por punto):

```klipper-config
### 3DWORK - MOD - Smart Effector Accuracy
[smart_effector]
speed:2.5
samples: 1
sample_retract_dist: 10
samples_tolerance: 0.013
```

#### Ajustes en la configuración del mallado de cama

Teniendo en cuenta el tamaño de impresión de la QIDI Plus 4 y para disponer de una malla más definida podemos subir la malla de sondeo (probe\_count) a un valor superior. \
Además ajustaremos bicubic\_tension al disponer de más puntos de sondero y horizontal\_move para mejorar el proceso como también hicimos en el smart effector anteriormente:

```klipper-config
### 3DWORK - MOD - Bed Mesh Accuracy
[bed_mesh]
horizontal_move_z:10
probe_count:10,10
bicubic_tension:0.3
```

#### Mejoras Z-Tilt

Ya que la QIDI Plus 4 cuenta con doble motor independiente para el eje Z lo que nos va a permitir disponer de nivalación z-tilt (nivelación asistida de ambos ejes por sensor para una plataforma lo más nivelada posible en los ejes) vamos a ver que mejoras pordemos introducir.\
De forma similar que hicimos en el smart effector ajustaremos la sección `[z_tilt]` los valores de `horizontal_move_z`, `retries`, y `retry_tolerance`&#x20;

```klipper-config
### 3DWORK - MOD - Z-Tilt Accuracy
[z_tilt]
horizontal_move_z: 10
retries: 5
retry_tolerance: 0.013
```

Después de realizar estos cambios:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FJBJMAIOyoqK2dHNMu4P4%2Fimage.png?alt=media&#x26;token=11b6aab7-4df8-4572-996c-86216b5cab37" alt=""><figcaption><p>Antes</p></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FNAuQctYPj2aM7PJpS6PZ%2Fimage.png?alt=media&#x26;token=57f454be-b0bd-4c97-96e2-bdbbc54a305d" alt=""><figcaption><p>Después</p></figcaption></figure>

#### Mejoras en nivelado manual de cama asistido por sensor

Aunque la QIDI Plus 4 dispone de un asistente de nivelación manual de la pantalla este se hace de forma totalmente manual. Aprovechando que disponemos de un sensor de nivelación habilitaremos este proceso asistido por el sensor añadiendo la siguiente configuración:

```django
### 3DWORK - MOD - Screws Tilt Adjust
[screws_tilt_adjust]
screw1:250,250
screw1_name: Central
screw2:0,20
screw2_name: Front left
screw3: 260,20
screw3_name: Front right
screw4: 260,280
screw4_name: Back right
screw5: 0,280
screw5_name: Back left
screw_thread: CW-M4

[gcode_macro SCREWS_TILT_CALCULATE]
rename_existing: _SCREWS_TILT_CALCULATE_BASE
gcode:
    { action_respond_info("starting screw rotation calculation...") }
    M141 S0 # disable chamber heater (see https://github.com/qidi-community/Plus4-Wiki/tree/main/content/chamber-heater-issue)
    M4031
    G28
    _SCREWS_TILT_CALCULATE_BASE
```

Una vez aplicado podremos lanzar la nueva macro, recordar antes hacer un home de todos los ejes:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2F8PhvtuKBUTWZ1OxigwRu%2Fimage.png?alt=media&#x26;token=8f92f689-3b4f-4bce-8198-10e5495ecc19" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FWS6VhU8xvBhYj2at36G4%2Fimage.png?alt=media&#x26;token=0eabc68d-0e0f-4e6d-9aab-4f08e5851c02" alt=""><figcaption></figcaption></figure>

Al finalizar el proceso nos indicará que correcciones hemos de realizar en cada uno de los tornillos de ajuste de la cama:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FzaymgrnsbLIdwso3936O%2Fimage.png?alt=media&#x26;token=f67de203-76a3-4c7b-8299-d476ea25b49f" alt=""><figcaption><p>Antes ajuste</p></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FgdJGfd0OuDlMGMbeD1WS%2Fimage.png?alt=media&#x26;token=aa78148b-1a25-48f8-9daf-98c623d20bef" alt=""><figcaption><p>Después de ajuste</p></figcaption></figure>

### Mejoras Input Shaper

QIDI ha implementado un proceso desatendido para el ajuste de Input Shaper, reducción de vibraciones, para que sea más sencillo para los usuarios lo que puede ser una buena idea.

En cualquier caso el ajuste de Input Shaper, si queremos obtener unos resultados óptimos, lo ideal es poder revisar los datos obtenidos del análisis del proceso para tomar la mejor decisión.

En revisiones anteriores de máquinas QIDI ya os sugerimos como realizar el proceso utilizando macros shell-script en este caso os vamos a sugerir una solución más sencilla de implementar y con muchas opciones relacionadas con Input Shaper... y es utilizando [Klippain y su módulo ShakeTune](https://github.com/Frix-x/klippain-shaketune). La instalación es muy sencilla:

* Clonaremos e instalaremos un repositorio de ShakeTune adaptado para correr en QIDI

```
cd /home/mks && wget -O - https://raw.githubusercontent.com/stew675/klippain-shaketune-for-qidi-plus4/main/install.sh | bash
```

* Una vez instalado iremos a nuestro interfaz web y habilitaremos la extensión añadiendo lo siguiente a nuestro printer.cfg:

```
[shaketune]
timeout: 1200
#    The maximum time in seconds to let Shake&Tune process the CSV files and generate the graphs.
# result_folder: ~/printer_data/config/ShakeTune_results
#    The folder where the results will be stored. It will be created if it doesn't exist.
# number_of_results_to_keep: 3
#    The number of results to keep in the result_folder. The oldest results will
#    be automatically deleted after each runs.
# keep_raw_csv: False
#    If True, the raw CSV files will be kept in the result_folder alongside the
#    PNG graphs. If False, they will be deleted and only the graphs will be kept.
# show_macros_in_webui: True
#    Mainsail and Fluidd doesn't create buttons for "system" macros that are not in the
#    printer.cfg file. If you want to see the macros in the webui, set this to True.
```

* Una vez guardados, aplicados los cambios y reiniciado Klipper tendremos disponibles nuevas macros para lanzar el proceso:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2Fgcv6hHftuCvzKnOOsFAu%2Fimage.png?alt=media&#x26;token=b6b688a5-54a8-4de2-8452-e3cecc73bb1b" alt=""><figcaption></figcaption></figure>

Cuando lancemos estas macros, os aconsejamos `COMPARE_BELTS_RESPONSES` primero y ajustar la tensión de correas. \
Al finalizar el test nos creará una imagen con el resultado del mismo que podremos acceder desde el interfaz web dentro de la carpeta /ShakeTune\_results/belts:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2Fj5vHjdHFU8qdkSJXNA2q%2Fimage.png?alt=media&#x26;token=7821cee8-68ba-408f-b33a-328f22de56b8" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FsmtPoVro3ueBR3XV9cjn%2Fimage.png?alt=media&#x26;token=c6f3ae6d-4ecc-4240-b021-6e66b5b79a29" alt=""><figcaption></figcaption></figure>

El objetivo es que ambas gráficas sean lo más similares posibles. En la [Wiki de QIDI tenéis descrito el proceso de ajuste de correas](https://wiki.qidi3d.com/en/Plus4/Maintenance/Adjustment-belt) detalladamente.

La siguiente macro a lanzar es la de [`AXES_SHAPER_CALIBRATION`](https://github.com/stew675/klippain-shaketune-for-qidi-plus4/blob/main/docs/macros/axes_shaper_calibrations.md) que una vez finalizada encontraremos el resultado en la carpeta /ShakeTune\_results/input\_shaper y dispondremos de una imagen generada por eje:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FHgAHFphOe2o4wx41BFVX%2Fimage.png?alt=media&#x26;token=6d581dd5-2f3c-4fb8-9f1a-2c08f1402e9f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FLP4DPBmuUPl4jARa6p2w%2Fimage.png?alt=media&#x26;token=fc7485a8-042c-4dd7-8edd-4144e8e7f799" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FwCAxyj9jtddLnzjygsaQ%2Fimage.png?alt=media&#x26;token=da574b24-e7ea-4e01-8d8a-862152fecf7b" alt=""><figcaption></figcaption></figure>

No vamos a entrar más en detalle de como optimizar o ajustar Input Shaper ya que tenéis información detallada del proceso de analizar resultados en la siguiente guía de [Input Shaper](https://klipper.3dwork.io/klipper/empezamos/input-shaper), para cuestiones sobre las macros de [Klippain ShakeTune tenéis más información aquí](https://github.com/stew675/klippain-shaketune-for-qidi-plus4/blob/main/docs/README.md).

Solamente unos apuntes específicos para esta QIDI Plus 4:

* Al ser una máquina CoreXY es muy importante que la tensión de las correas la [Wiki de QIDI tenéis descrito el proceso de ajuste de correas](https://wiki.qidi3d.com/en/Plus4/Maintenance/Adjustment-belt) detalladamente
* De nuevo relacionado con el tipo de cinemática CoreXY el algoritmo a utilizar es aconsejable que sea el mismo en ambos ejes X e Y ya que comparten sistema de cinemática. Para una máquina CoreXY los más aconsejables son ZV o MZV
* También es importante realizar estas mediciones cuando ajustemos la cinemática, como al tensar correas, lubricado, etc

### Mejorando calidad cámara

Por defecto la configuración de la QIDI Plus 4 es de 640x480 lo cual para monitorizar no va a dar problemas ni va a consumir excesivos recursos.

En el caso que queramos realizar timelapse es aconsejable cambiar la configuración de esta para obtener la máxima resolución que la cámara soporta. Para ello editaremos el fichero de configuración webcam.txt, en concreto la línea camera\_usb\_options:

<figure><img src="https://3760761605-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4SOiUz9PiuHFIwg2qk03%2Fuploads%2FgcwtySAr8V3tFBaaO790%2Fimage.png?alt=media&#x26;token=d2bc705b-3f5a-488a-b2b2-1ac50f140d10" alt=""><figcaption></figcaption></figure>

Que cambiaremos por:

```
camera_usb_options="-r 1080x720 -f 10 -d /dev/v4l/webcam0"
```

### Mejoras calidad de impresión

En esta sección os vamos a aconsejar algunas modificaciones para mejorar la calidad de nuestras impresiones. Es importante recalcar que lo ideal es que vosotros mismosencontréiss, realizando tests, los valores óptimos para vuestra máquina ya que algunas de estas modificaciones van a depender del ajuste mecánico o uso de vuestra máquina.

* El ajuste óptimo de `square_corner_velocity`, dentro de la sección `[printer]` va a ayudar a mejorar el acabado de los giros en trazadas.\
  Os aconsejamos realizar pruebas con diferentes valores para ajustar a vuestro caso.

```klipper-config
### 3DWORK - MOD - Print Quality Tweaks
[printer]
square_corner_velocity: 6
```
