Cómo modificar el firmware de Prusa con éxito en Windows

Preámbulo

No hay ninguna necesidad de modificar el firmware de Prusa, tal y como viene funciona a la perfección con los componentes que traen, sin embargo, hay ciertos elementos, que normalmente es el termistor usado (para aquellas personas que cambian de un 104GT a un PT1000), o, con el que trae el fusor Mosquito y derivados.

Modificar el firmware de Prusa, que es un Marlin muy vitaminado no es tan fácil como parece, aquí hablaremos de esto, paso a paso de cómo modificarlo, compilarlo para tener el fichero .hex -opcional- y subirlo a la placa Rambo, con un par de ejemplos comunes, el cambio de termistores y añadir configuración de precalentar.

Empecemos con ello

En realidad, cualquiera que maneje un poco el inglés, puede ver los pasos brevemente resumido en el Git de Prusa-Firmware, sin embargo, lo explicaré paso a paso y con imágenes para aquellas personas más profanas con el mundo maker y pueda hacer sus pinitos.

IDE de Arduino

Lo primero que debemos tener es el IDE de Arduino, es un entorno en el que los programadores usan para programar funciones para las placas Arduino, el procesador de la placa Einsy Rambo (las que llevan Prusa) es un ATMEGA 2560, el mismo que el Arduino Mega.

Aunque vayan por una versión posterior, que de hecho, se puede compilar, Prusa recomienda la citada versión, para una completa compatibilidad. Instalar el IDE con los drivers USB, aceptar todo, abrir el programa, como es una versión antigua, te dirá que si quieres actualizar a la nueva versión, dar que no, e ignorar y abrir la configuración, ubicado en Archivo -> Preferencias.

Preferencias de Arduino IDE

Y escribir, en el hueco Gestor de URLs Adicionales de Tarjetas y aceptamos:

https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/ID
E_Board_Manager/package_prusa3d_index.json

Ahora, vamos a Herramientas -> Placas: xxx -> Gestor de tarjetas y buscamos Prusa Research AVR Boards e instalamos la versión 1.0.3, cerramos.

Ahora viene lo complicado, que es añadir unos marcadores en el documento platform.txt, ahí es donde suelen fallar las personas, pues hay varios ficheros que se llaman igual, y no se cambia el correcto. Cerramos el IDE de Arduino y buscamos el fichero mencionado antes. La ruta normalmente puede ser la siguiente:

X:\Users\%usuario%\AppData\Local\Arduino15\packages\PrusaResearch\hardware\avr\1.0.3

Ahí verás el fichero platform.txt, lo abrimos para editar, justo en la línea donde pone "compiler.c.elf.flags=", añadimos lo siguiente:

"-Wl,-u,vfprintf -lprintf_flt -lm", justo antes de "--gc-sections", tal que se nos debería que quedar así:

compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections

Guardamos y cerramos.

Consejo: si actualizamos el IDE de Arduino, todo lo descrito antes se perderá. Proceder con precaución.

El Firmware de Prusa, un Marlin muy vitaminado

Lo descargaremos desde su GIT, en el siguiente enlace.

Se descomprime, (al escritorio o a documentos, donde quieras) y veremos un montón de ficheros y carpetas.

Dentro de la carpeta Firmare, veremos otra que se llama variants, dentro de la misma veremos varios ficheros, tendremos que elegir para nuestra impresora, en este caso, será 1_75mm_MK3S-EINSy10a-E3Dv6Full.h. Lo copiamos y lo llevamos al directorio Firmare junto a los otros ficheros y lo renombramos a Configuration_prusa.

En la misma carpeta, damos doble clic a Firmware.ino, se abrirá el IDE. Lo primero que vamos a hacer, para verificar si hicimos bien las modificaciones del paso anterior, primero debemos seleccionar la placa correcta: Herramientas -> Placa: XXX -> PrusaResearch Einsy RAMBo, al final.

Y justo le daremos al botón de verificar. Si no nos devuelve ningún error, es que está todo listo para ser modificado y programado para la placa.

Para exportar como fichero .hex, basta con ir a Programa -> Exportar binarios compilados y lo tendrás en la misma carpeta de Firmware.

¡No sé el idioma Klingon! ¿Cómo lo cambio?

El firmware, a la hora de subirlo a la impresora, la pantalla se verá en idioma Klingon, a no ser que lo entiendas, deberás de cambiarlo, se hace sólo una vez, para ello, en el IDE, con el documento abierto, vamos a la pestaña config.h y en la línea 62 veremos #define LANG_MODE 1, lo tenemos que cambiar de 1 a 0, para activar el idioma “primario”, que es el inglés.

Primeras modificaciones del firmware

Cambiar el sensor de temperatura

El termistor que viene las impresoras clon es un HT-NTC100K, con una tabla térmica distinta al que usar la original, con lo que se recomienda cambiar por un 104GT-2, que es el viene con los E3D-V6 originales.

Para ello vamos a la pestaña Configuration_prusa.h, y vamos a la línea 571, donde veremos #define TEMP_SENSOR_0 5, el 5 lo podemos sustituir por el sensor que vayamos a usar, un poco más arriba tienes una pequeña lista de los sensores, en el caso del PT1000, es el 1047, y si cambiamos por un PT100, sería el 147.

Si insistes en usar el HT-NTC100K en lugar de cambiarlo

El modelo en concreto usado por los clones es el B3950, con lo cual tendrás que poner el número 13, quedando tal que así: #define TEMP_SENSOR_0 13, sin embargo, hay casos en el que no han dado buenos resultados, entonces se prueba con el número 1.

Mi recomendación sigue siendo cambiar por un 104GT-2, pero si no, poner el número 13, hacer una torre de temperatura y observar resultados, si no, probar con el número 1 y repetir prueba.

El sensor de Slice Engineering

El sensor de temperatura de Slice Engineering tiene su tabla, válido para la versión de AliExpress. Se puede implementar en Marlin. En este caso iré al grano, hay que implementar una tabla de temperaturas en la pestaña thermistortables.h y declarar la variable en Configuration_prusa.h.

La tabla es la siguiente:

#if (THERMISTORHEATER_0 == 66) || (THERMISTORHEATER_1 == 66) || (THERMISTORHEATER_2 == 66) || (THERMISTORBED == 66) const short temptable_66[][2] PROGMEM = { // R25 = 2.5 MOhm, beta25 = 4500 K, 4.7 kOhm pull-up, DyzeDesign 500 °C Thermistor COPIED FROM MARLIN-2.0.4.4 { 17.5*OVERSAMPLENR, 850 }, { 17.9*OVERSAMPLENR, 500 }, { 21.7*OVERSAMPLENR, 480 }, { 26.6*OVERSAMPLENR, 460 }, { 33.1*OVERSAMPLENR, 440 }, { 41.0*OVERSAMPLENR, 420 }, { 52.3*OVERSAMPLENR, 400 }, { 67.7*OVERSAMPLENR, 380 }, { 86.5*OVERSAMPLENR, 360 }, { 112.0*OVERSAMPLENR, 340 }, { 147.2*OVERSAMPLENR, 320 }, { 194.0*OVERSAMPLENR, 300 }, { 254.3*OVERSAMPLENR, 280 }, { 330.2*OVERSAMPLENR, 260 }, { 427.9*OVERSAMPLENR, 240 }, { 533.4*OVERSAMPLENR, 220 }, { 646.5*OVERSAMPLENR, 200 }, { 754.4*OVERSAMPLENR, 180 }, { 844.3*OVERSAMPLENR, 160 }, { 911.7*OVERSAMPLENR, 140 }, { 958.6*OVERSAMPLENR, 120 }, { 988.8*OVERSAMPLENR, 100 }, { 1006.6*OVERSAMPLENR, 80 }, { 1015.8*OVERSAMPLENR, 60 }, { 1021.3*OVERSAMPLENR, 30 }, { 1022*OVERSAMPLENR, 25 }, { 1023*OVERSAMPLENR, 20 }, }; #endif

Deberás pegarlo al final, después de la línea 1290, ilustro.

Después vamos a Configuration_prusa.h y como otro cualquier sensor, en la línea donde pone #define TEMP_SENSOR_0, tenemos que colocar el número 66.

Deberá quedar tal que así: #define TEMP_SENSOR_0 66.

Recomiendo calibrar el PID antes de imprimir nada en la propia impresora.

Ajustes de precalentamiento

En Prusa, viene una serie de opciones de precalentamiento, pero no siempre nos gusta la temperatura que viene, (para mi son un poco altas), podemos corregir esto modificando todas las líneas del 498 al 523.

Que, ojo, sólo podemos cambiar los valores de temperatura, es decir, sólo los numeritos, el resto de la frase es una llamada a una variable, si tocamos una letra, no podrá ser compilado por no encontrar la dicha variable.

Cambiar otros ajustes interesantes

Además de cambiar los elementos de medición de temperatura, también podemos cambiar otras cosas como el nombre de la máquina, los pasos del extrusor en caso de que lo cambiemos por uno de engranaje 3:1 (Bondtech), la rotación de los motores en el mismo archivo Configuration_prusa.h.

Nos metemos en un berenjenal…

Proceder con precaución, cualquier mínimo error no podrá ser compilado. Todo queda bajo su resposabilidad.

…la ruleta de la pantalla

Hay algunas pantallas en el clon de Fysetc que el encoder (ruleta giratoria) de la pantalla van al revés. Esa ruleta tiene 5 pines, pues 2 de ellos es para la dirección, uno hacia la izquierda y el otro hacia la derecha. Para invertir basta con que vayamos a la pestaña pins_Einsy_1_0.h, y vamos a las líneas 113 y 114. Tenemos que ver:

#define BTN_EN1 72
#define BTN_EN1 14

Lo comentamos, duplicamos e invertimos los números, poniéndolo así:

#define BTN_EN1 14
#define BTN_EN1 72

Dependerá de tu impresora, los hay que vienen bien y los hay que vienen al revés.

…añadir otro ajuste de precalentar

Esta vez se va a meter un ajuste de precalentar sin necesidad de precalentar la cama, útil para una descarga/carga de filamento puntual sin la necesidad de gastar energía en calentar la base.

Lo primero que haremos es añadir ese submenú en la pantalla de la impresora, para ello nos vamos a la pestaña ultralcd.cpp y nos dirigimos a la línea 2471, justo donde pone static void miFilamentItem_farm(), que es una clase en C, junto a las otras más abajo que dentro va dos funciones, para no complicarnos mucho cogemos las 5 líneas que abarca la clase y la duplicamos. Según donde esté ubicado el

static void mFilamentItem_FLEX()
{
bFilamentPreheatState = false;
mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP);
}

Sustituimos la palabra FLEX por la que queramos poner. En mi caso pondré solo NONL (Nozzle only), tal que quedará así:

static void mFilamentItem_NONL()
{
bFilamentPreheatState = false;
mFilamentItem(NONL_PREHEAT_HOTEND_TEMP, NONL_PREHEAT_HPB_TEMP);
}

Ya tenemos la clase definida, ahora para que se muestre en pantalla nos iremos a un poco más abajo, y buscamos la línea 2569 (es un valor orientativo), quizás esté mas arriba o abajo. Nos vamos al final donde pone:

MENU_ITEM_SUBMENU_P(PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)),mFilamentItem_FLEX);

Volvemos a cambiar todo lo que ponga FLEX por NONL. Tal que quedará así:

MENU_ITEM_SUBMENU_P(PSTR("NONL - " STRINGIFY(NONL_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(NONL_PREHEAT_HPB_TEMP)),mFilamentItem_NONL);

Y al principio, para que sea lo primero que veamos al entrar al menú.

Y por último paso, nos vamos de nuevo a Configuration_prusa.h, a la línea 522, donde debemos asignar los valores a las variables. Duplicamos.

#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50

A:

#define NONL_PREHEAT_HOTEND_TEMP 220
#define NONL_PREHEAT_HPB_TEMP 0

Guardamos, compilamos y la subimos a la impresora si no queremos cambiar nada más.

Fuentes

https://docs.dyzedesign.com/hotends.html#repetier-firmware

https://create.arduino.cc/projecthub/SURYATEJA/rotary-encoder-or-arduino-360-degree-encoder-131437

https://github.com/prusa3d/Prusa-Firmware#windows

https://www.aliexpress.com/item/33029709571.html?spm=a2g0o.detail.1000023.41.71472757WSKPsM

1 comment

  • Muchas gracias por tu tiempo… muy bien explicado, algún cambio me atreveré a hacer gracias a ti 😀 😀

Deja un comentario

Your email address will not be published. Required fields are marked *

Introduzca tus palabras claves y pulsa Intro

Usamos cookies para brindarle la mejor experiencia en línea. Al aceptar que acepta el uso de cookies de acuerdo con nuestra política de cookies.