Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
APORTE Power Loss Recovery en CR-10.
#1
Como indicaba en el post del sensor de final de filamento, en este voy a terminar de contestar la pregunta sobre la CR-10. En concreto la parte del Power Loss Recovery.

De paso, dado que para cambiar el firmware de la placa que trae esta impresora (y la Ender 3) se necesita grabar el bootloader, explicaré también este proceso.


GRABAR EL BOOTLOADER

La lista de cosas que se necesitan, tanto de hardware como de software, es la siguiente:

- Una placa Arduino Uno o Mega con su cable USB.
- 5 cables con conectores Dupont hembra en los dos extremos.
- 1 cable con conector Dupont macho en un extremo y hembra en el otro.
- IDE de Arduino (descarga).
- Ficheros de descripción del hardware (descarga).

Se han reportado algunos problemas con placas Arduino que no permiten realizar este proceso de forma correcta. Lo único que se puede hacer, en este caso, es cambiar el Arduino por otro.

Primero vamos a preparar todo en el ordenador.

Descomprimimos el archivo ZIP del IDE, lo que nos creará una carpeta de nombre arduino-1.8.7, dentro de la cual está todo el entorno incluido.

Descomprimimos el archivo ZIP del hardware, lo que nos crea una carpeta de nombre Sanguino-master. Copiamos dicha carpeta en arduino-1.8.7\hardware\.

Con esto tendremos el software preparado para el proceso. Ahora tendremos que configurar el Arduino que tengamos (UNO o Mega) como programador ISP.

Conectamos por USB el Arduino al ordenador y comprobamos que se crea en el Administrador de Dispositivos un puerto COM para él.

Si no se crea un puerto COM al conectarlo, tendremos que instalar el driver CH340 de forma manual. Suele venir entre el software que traen las impresoras.

Abrimos la carpeta arduino-1.8.7 y ejecutamos la aplicación arduino.exe.

En el menú, seleccionamos Archivo>Ejemplos>11.ArduinoISP>ArduinoISP,

resim

lo que nos abrirá una nueva ventana con dicho sketch cargado.

En el menú Herramientas, seleccionamos en el apartado Placa: el Arduino que vayamos a utilizar (Arduino/Genuino UNO o Arduino/Genuino Mega or Mega 2560), en Puerto: el COM que se haya creado al conectarla al ordenador y en Programador: USBasp:

resim     resim

Pulsamos en la flecha para subir el sketch al arduino:

resim

Cuando termine, pondrá Subido en la barra de notificaciones y desconectamos el cable USB del ordenador.

Ahora vamos a conectar las dos placas para subir el bootloader.

Para ello, utilizaremos los cables que habíamos indicado y el siguiente esquema de conexiones:

resim

Esta imagen es de un Arduino UNO, pero sería lo mismo para un Mega. Conectamos los pines equivalentes de ambos conectores ISP-ISCP de las placas mediante los cables hembra-hembra, excepto el pin de abajo a la izquierda (mirando el conector según se ve en la foto), que se conecta mediante el cable hembra-macho al pin 10 del Arduino.

Con las dos placas conectadas así, enchufamos el cable USB del Arduino al ordenador y arrancamos de nuevo el IDE.

En el menú Herramientas, seleccionamos ahora como Placa: Sanguino, como Procesador: ATMega1284 or ATMega1284P (16 MHz), como Puerto: el que se haya creado al conectarlo, como Programador: Arduino as ISP y pulsamos en la opción Quemar bootloader:

resim

Cuando termine, desconectamos el cable USB y después todos los demás cables.

Con esto tenemos cargado el bootloader en la placa, lo que ya nos permitirá actualizar el firmware.


POWER LOSS RECOVERY (PLR)

Para activar esta función, tendremos que instalar Marlin (descarga) y dependiendo de cómo se realice esto, pueden surgir problemas.

También tendremos que instalar en el IDE de Arduino la librería U8Glib (descarga), ya que la impresora tiene una pantalla de tipo gráfico. Para ello, una vez descargado el archivo ZIP que la incluye, hay que ir al menú Programa>Incluír librería>Añadir librería .ZIP…, seleccionar el fichero descargado y aceptar.

Una vez descargado Marlin, descomprimimos el archivo ZIP y nos crea una carpeta de nombre Marlin-1.1.x que contiene todos los archivos del firmware. Pero para poder instalarlo en la impresora, primero hay que configurarlo adecuadamente para ella.

Toda la configuración a realizar está incluida en dos archivos: Configuration.h y Configuration_adv.h, que se encuentran en la ruta Marlin-1.1.x\Marlin\. Pero tal y como están tienen una configuración mínima por defecto, que no es adecuada para la CR-10 (o la Ender 3).

Para facilitar el proceso, Marlin trae en la carpeta Marlin-1.1.x\Marlin\example_configurations\, una serie de carpetas de distintas marcas de impresoras, dentro de las cuales se encuentran separados por modelos, los archivos anteriores pre configurados para cada impresora concreta.

En nuestro caso, en la ruta Marlin-1.1.x\Marlin\example_configurations\Creality\CR-10\ tenemos cuatro archivos: _Bootscreen.h, _Statusscreen.h, Configuration.h y Configuration_adv.h.

Los dos primeros contienen los logos personalizados de Creality (para la pantalla de inicio y la de estado) y los otros dos son los que indicaba que contienen la configuración para esta impresora.

Habría que copiar los cuatro en la carpeta Marlin-1.1.x\Marlin\ para continuar con el proceso, pero hay un problema: si se utiliza ese archivo Configuration_adv.h, a la hora de compilar, se consume una cantidad desmesurada y fuera de lo normal de la memoria que posee la MCU para contener las variables, incluso toda si se activa la función PLR, dando un error de compilación que impide continuar.

Aún no he dado con la causa de esto por lo que, para evitarlo, hay que utilizar el archivo que viene por defecto, configurando lo que sea necesario.

Por lo tanto, sólo copiamos de la carpeta CR-10 los tres primeros archivos, dejando sin copiar el Configuration_adv.h.

Ya podemos abrir el IDE de Arduino y cargar el sketch de Marlin. Para ello, vamos a la opción del menú Archivo>Abrir y seleccionamos el archivo Marlin.ino que se encuentra en Marlin-1.1.x\Marlin\:

resim

Los archivos que integran el sketch están agrupados en pestañas, identificadas con el nombre del archivo.

Seleccionamos la pestaña Configuration.h, donde tenemos que cambiar las siguientes líneas:

//#define EEPROM_CHITCHAT   // Give feedback on EEPROM commands. Disable to save PROGMEM.
#define LCD_LANGUAGE es


La primera línea es para conseguir memoria de programa, pues la vamos a necesitar. La segunda, para poner la pantalla en castellano (o en el que se quiera de los soportados, por defecto es inglés).

Pasamos ahora a la pestaña Configuration_adv.h, donde cambiamos las siguientes líneas:

#define STATUS_MESSAGE_SCROLLING
#define POWER_LOSS_RECOVERY
#define POWER_LOSS_PIN   17     // Pin to detect power loss
#define POWER_LOSS_STATE HIGH   // State of pin indicating power loss
#define BABYSTEPPING
#define BABYSTEP_MULTIPLICATOR  10 // Babysteps are very small. Increase for faster motion.
#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
#define ADVANCED_PAUSE_FEATURE
#define PAUSE_PARK_RETRACT_LENGTH            4  // (mm) Initial retract.
#define FILAMENT_CHANGE_UNLOAD_LENGTH      420  // (mm) The length of filament for a complete unload.
#define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE   8  // (mm/s) Load filament feedrate. This can be pretty fast.
#define PAUSE_PARK_NOZZLE_TIMEOUT          120  // (seconds) Time limit before the nozzle is turned off for safety.
#define FILAMENT_CHANGE_ALERT_BEEPS          6  // Number of alert beeps to play when a response is needed.
#define PARK_HEAD_ON_PAUSE                      // Park the nozzle during pause and filament change.
#define HOME_BEFORE_FILAMENT_CHANGE             // Ensure homing has been completed prior to parking for filament change
#define PARK_HEAD_ON_PAUSE                      // Park the nozzle during pause and filament change.
#define HOME_BEFORE_FILAMENT_CHANGE             // Ensure homing has been completed prior to parking for filament change
#define NO_WORKSPACE_OFFSETS


Excepto las líneas que activan el PLR, las demás son las que trae el archivo pre configurado para la CR-10 que no hemos podido usar por la razón ya comentada.

Para la función PLR habrá que comprobar si funcionan esos parámetros: el pin 17 para la detección del corte de corriente y el estado del pin en alto (HIGH). Si no funciona el PLR habrá que cambiarlos.

Hechos estos ajustes, ya podemos compilar y subir el firmware a la impresora.

Lo primero, como siempre, configurar el IDE para comunicarse con la placa: En el menú Herramientas, seleccionamos ahora como Placa: Sanguino, como Procesador: ATMega1284 or ATMega1284P (16 MHz), como puerto el que se haya creado al conectar la impresora y como Programador: USBasp.

Pulsamos la flecha para compilar y subir el firmware. Una vez subido, la impresora se reiniciará e indicará en pantalla la nueva versión de Marlin instalada.

Por lo que he visto por ahí, puede que aún haya en la función PLR algunos “bugs” no corregidos. Si es así, habrá que estar atentos para descargar de nuevo Marlin cuando estén corregidos.

Por último, decir que la Ender 3, que usa la misma placa que la CR-10, no tiene los mismos problemas de ocupación de memoria y pueden utilizarse los archivos pre configurados que vienen para ella, modificando únicamente el idioma (en su caso) y las líneas para la activación del PLR.
Citar
#2
Hola
Efectivamente en Ender 3 carga todos los archivos de configuración de la misma.
Para la activación del PLR solo hay que modificar esta línea :
#define POWER_LOSS_RECOVERY

Saludos
Citar
#3
Hola, gracias por el comentario.
Un saludo.
Citar
#4
Hola!
alguno tuvo problemas con el power recovery?
mas puntualmente en que hace todo bien pero no extruye filamento, queda como en un loop entre que si y que no.
Si imprimo normalmente funciona perfecto, pero si pruebo corta la energia y  tratar de retomar la impresion siempre pasa lo mismo.
Lo probe en dos impresoras con la versiones 1.1.9 y 2.0, ahsta con las bugfix.

saludos.
Citar
#5
Hola, mirate este video que puede que te sirva.
Citar
#6
Gracias!
sisi, ese fue el primero que vi y que comento q habia cosas que no pudo activar para que funcione, pero no sirvió de mucho para mi caso.
Mas hasta pregunte ahi, y lei un mensaje de alguien que le paso lo mismo pero sin respuesta aun.
Citar
#7
Pues si has hecho todo lo que que dicen ahí y no te funciona, puede que hayas dado con otro bug.
Si indicas de una forma más clara lo que hace la impresora cuando reanuda, intentaré investigar un poco el tema.
Citar
#8
Bueno, después de buscar y buscar, se me ocurrió algo diferente que fue usar cura 3d y no simplify3d.
Ahora funciona, el punto ahora ver que hace en el gcode que rompe.

Acá pongo por defecto los script de cura y simplify, lo que si hice fue poner el script de Start del cura en el simplify y eureka al tratar de imprimir (no de recuperar una impresion) comenzo el extrusor con ese que voy y q no voy el famoso loop.

Si alguien ve algo raro me avisa, ahora voy a seguir con prueba y error hasta dar en el clavo.


SIMPLIFY3d

Starting

G28 ; home all
G92 E0
G1 Z0.1 F1000
G1 X8.0 F2000
G1 Y60.0 E4.0 F1000.0 ; prime
G1 Y100.0 E8.5 F1000.0 ; prime
G92 E0


Ending

M104 S0 ; turn off extruder
M140 S0 ; turn off bed
G91 ; use relative coordinates
G1 Z0.6 F5000 ; lift nozzle by 0.6mm
G90 ; use absolute coordinates
G28 X0 ; home X axis
G1 Y195 ; move Y axis to end position
M84 ; disable motors
M107 ; turn off fan

CURA3d

Iniciar

G21 ;metric values
G90 ;absolute positioning
M82 ;set extruder to absolute mode
M107 ;start with the fan off
G28 X0 Y0 ;move X/Y to min endstops
G28 Z0 ;move Z to min endstops
G1 Z15.0 F9000 ;move the platform down 15mm
G92 E0 ;zero the extruded length
G1 F200 E3 ;extrude 3mm of feed stock
G92 E0 ;zero the extruded length again
G1 F9000
;Put printing message on LCD screen
M117 Printing...


Finalizar

M104 S0 ;extruder heater off
M140 S0 ;heated bed heater off (if you have it)
G91 ;relative positioning
G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure
G1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more
G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way
M84 ;steppers off
G90 ;absolute positioning
Citar
#9
Gracias a Dios, con destildar esa opción se resolvió. algún experto sabrá explicar jaj

resim
Citar
#10
Hola, pues parece que has dado con una situación que no han tenido en cuenta los desarrolladores del Power Loss Recovery.
Consiste en que la impresión que se reanuda puede estar con las medidas en el eje E relativas, en lugar de absolutas. En honor a la verdad, algo que no es muy habitual, pero sí posible.
En CURA no estoy seguro si hay una opción que permita cambiar de medidas absolutas a relativas, pero por defecto utiliza absolutas.
En Simplify3D se puede configurar mediante la opción que indicas, aunque no es muy habitual tenerla activada.
La diferencia entre tenerla activada o no, es el comando que se incluye al comienzo del archivo gcode: si no esta activada es un M82 (extrusión en medidas absolutas) y si lo está un M83 (extrusión en medidas relativas).
El firmware tiene definido por defecto que las medidas de la extrusión sean absolutas, por lo que si se quiere que sean relativas hay que indicarlo expresamente.
A la hora de imprimir los archivos de principio a fin, no hay ninguna diferencia en el resultado final, pero cuando el PLR reanuda la impresión parece que no guardar ese dato y por lo tanto, no vuelve a definir las medidas como relativas.
Si un fichero que está definido con medidas relativas se procesa como si fuesen absolutas, el resultado es un vaivén en la extrusión ya que, lo que deberían ser distancias extruidas, pasan a ser coordenadas desde el punto 0.
En programación tenemos un axioma: nunca descubrirás todos los errores de tu programa por ti mismo, se necesita un usuario (si es inexperto, mejor) para sacarlos a la luz. Por eso existen las versiones para betatesters o las "bugfix".
Te animo a que crées una Issue en la Github de Marlin indicando este problema.
Citar
#11
Gran sonrisa 
Excelente explicación, ya había abierto una Issue en marlin y en simplify3d. Me mataste con el axioma, jaja, es verdad no hay como el usuario inexperto.


Simplify3d

https://forum.simplify3d.com/viewtopic.php?f=9&t=11752&p=46135&hilit=power+loss#p46135
Marlin
https://github.com/MarlinFirmware/Marlin/issues/12433
Citar
#12
Buff, con los años de programar y programar uno se acaba a acostumbrando a ir parcheando posibles fallos en el codigo ya sobre la marcha... yo, por ejemplo tuve la suerte (o desgracia... no lo tengo muy claro) de administrar un juego en el cual jugaban mas de 3000 personas, y pese a que siempre programaba adelantandome al usuario, no habia una sola vez que no viniese alguien y me reventase por algun lado el programa. Tenia y aun tengo un compañero que es particularmente habil en encontrar bugs en lo que sea.

Como dice Simemart... no hay plan que sobreviva al contacto con el enemigo, y por mucho que se quiera y mucha experiencia que tenga quien programa... siempre habrá alguna situación en la que no hayas pensado.

Lo del power recovery con relativos supongo que podran arreglarlo facilmente leyendo el fichero desde el principio. No deberia ser muy complicado modificar el codigo para leer entero el fichero y ignorar los comandos de movimiento/instrucciones innecesarias hasta llegar a la instrucción en la que se ha quedado.
Citar