[TUTORIAL] Submenú de Marlin para configurar el Z offset del autoleveling de la cama

2,342 views
Skip to first unread message

WeSo

unread,
Jan 5, 2014, 3:42:49 PM1/5/14
to asrob-uc3m-i...@googlegroups.com
Buenas!

Bueno, tras varias pruebas y alguna vuelta de tuerca, os pongo el código que hay que modificar para añadir la opción. Pero claro, voy a explicar en qué consiste dicha opción xD
Si alguien se ha animado a poner el autoleveling de la cama caliente (algo que yo recomiendo), habrá visto que hay que modificar unos parámetros en el Marlin para indicar la distancia entre el endstop y el propio nozzle. El X y el Y, no es necesario que sean tan exactos como el Z, que es el realmente importante. El problema viene cuando, a los que nos gusta estar cacharreando todo el día, modificamos cosas del extrusor, cambiamos de nozzle o mil cosas más que pueden hacer que la diferencia entre el endstop y el propio nozzle, varíe, aunque sea unas décimas de milímetro. Ésto, obviamente, implica cambiar los parámetros de nuevo en el propio Marlin, y volver a cargarlo.
A priori, puede parecer una nimiedad, pero a mi personalmente, que utilizo la impresora en una habitación sin PC, me es un engorro andarla moviendo, cambiarlo, hacer pruebas y volverla a mover de sitio. Por no hablar si ya te la llevas de viaje para imprimir piezas desde el propio LCD y la SD.

Por ello, en un rato me lié la manta a la cabeza, y decidí añadir una opción al LCD para poder configurar éste offset.

Puestos en situación, a quien le haya entrado la curiosidad del autoleveling y quiera instalarlo (repito, yo lo recomiendo), el compañero Victor puso un manual explicando los pasos a seguir para hacerlo (Julito y yo le echamos una mano en el IRC de CW). El enlace es el siguiente: https://groups.google.com/forum/#!msg/asrob-uc3m-impresoras-3d/KCaffYNZ1o0/REJk_cShPCsJ

Comentar también que las modificaciones las hice sobre la última versión disponible de Marlin hasta la fecha (commit del 23 de diciembre de 2013). En ésta version, respecto a la anterior que yo tenía (de cuando puse el autoleveling), han mejorado precisamente la propia funcionalidad del nivelado, [b]pudiendo elegirse una matriz de 2x2 o 3x3[/b] para la toma de referencias y posterior cálculo para la autonivelación.
Por si alguien lee ésto pasado un tiempo y quiere la versión del Marlin sobre la que trabajé, la he subido a un host propio: http://cut.tf/i

Si tenéis activa la opción del Marlin para almacenar los cambios en la EEPROM del Arduino ([b]#define EEPROM_SETTINGS[/b]) os recomiendo limpiarla antes de hacer las modificaciones de más abajo.
Para ello simplemente creáis un proyecto vacío en el IDE de Arduino y cargáis el siguiente código:
/*
 * EEPROM Clear
 *
 * Sets all of the bytes of the EEPROM to 0.
 * This example code is in the public domain.

 */

#include <EEPROM.h>

void setup()
{
  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);
  
  // turn the LED on when we're done
  digitalWrite(13, HIGH);
}

void loop()
{
}

El código es de la página oficial de Arduino: http://arduino.cc/en/Tutorial/EEPROMClear

Y ahora sí, ya podéis hacer los cambios:
----------------------------
-- ConfigurationStore.cpp --
----------------------------

Search (Line 72):
  EEPROM_WRITE_VAR(i,absPreheatFanSpeed);

Add after:
  // Autoleveling
  #ifndef ENABLE_AUTO_BED_LEVELING
  float autolevelingZOffset = 0.0;
  #endif
  EEPROM_WRITE_VAR(i,autolevelingZOffset);



Search (Line 212):
        EEPROM_READ_VAR(i,absPreheatFanSpeed);

Add after:
        // Autoleveling
        #ifndef ENABLE_AUTO_BED_LEVELING
        float autolevelingZOffset;
        #endif
        EEPROM_READ_VAR(i,autolevelingZOffset);



Search (Line 273):
    absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED;
#endif

Add after:
// Autoleveling
#ifdef ENABLE_AUTO_BED_LEVELING
    autolevelingZOffset = -1*Z_PROBE_OFFSET_FROM_EXTRUDER;
#endif



----------------------------
------ Marlin_main.cpp -----
----------------------------

Search (Line 827 and 863):
    current_position[Z_AXIS] = -Z_PROBE_OFFSET_FROM_EXTRUDER;

Replace with:
    //current_position[Z_AXIS] = -Z_PROBE_OFFSET_FROM_EXTRUDER;
    // Autoleveling
    current_position[Z_AXIS] = autolevelingZOffset;



Search (Line 1287):
          current_position[Z_AXIS] -= Z_PROBE_OFFSET_FROM_EXTRUDER;  //Add Z_Probe offset (the distance is negative)

Replace with:
          //current_position[Z_AXIS] -= Z_PROBE_OFFSET_FROM_EXTRUDER;  //Add Z_Probe offset (the distance is negative)
          // Autoleveling
          current_position[Z_AXIS] += autolevelingZOffset;  //Add Z_Probe offset



----------------------------
-------- language.h --------
----------------------------

Search (Line 91):
    #define MSG_ACC  "Accel"

Add after:
        #define MSG_Z_PROBE_OFFSET_FROM_EXTRUDER "Autolev. Z"



----------------------------
-------- ultralcd.h --------
----------------------------

Search (Line 44):
  extern int absPreheatFanSpeed;

Add after:
  // Autoleveling
  extern float autolevelingZOffset;



----------------------------
------- ultralcd.cpp -------
----------------------------

Search (Line 20):
int absPreheatFanSpeed;

Add after:
// Autoleveling
float autolevelingZOffset;



Search (Line 704):
    MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 500, 99000);

Add after:
    #ifdef ENABLE_AUTO_BED_LEVELING
        MENU_ITEM_EDIT(float52, MSG_Z_PROBE_OFFSET_FROM_EXTRUDER, &autolevelingZOffset, 0, 20);
    #endif


El número de línea es orientativo, ya que es posible que algún fichero ya lo hubiera yo modificado antes. Y sí, me gusta dejar comentado el código en lugar de eliminarlo. Si alguien lo quiere eliminar, se puede sin problemas :D

Como nota, comentar que el valor que se puede modificar ahora desde el LCD, cuanto más próximo sea a 0, más se separa el nozzle de la cama, siempre y cuando el endstop esté "por debajo" del propio nozzle (doy por hecho que es así, si no, es imposible que toque el endstop antes que el nozzle en la propia cama).
El funcionamiento del nuevo menú, es sencillo: Entrar en el apartado Control->Motion y la segunda opción os debería salir la nueva. La modificáis al gusto, y si tenéis activa la opción para almacenar los cambios en la EEPROM, deberéis hacer un "Storage", para que queden guardados los cambios.


Por último, aclarar que a mi no me ha dado ningún problema, pero todas estas cosas ya se sabe, que cada uno lo haga bajo su responsabilidad.

Espero que a alguien le sirva!

P.D. Por orden de Aisflou, si alguien lo ve interesante y se presta a ponerlo en la Wiki, pues genial!

ch1t0

unread,
Jan 7, 2014, 7:09:22 AM1/7/14
to asrob-uc3m-i...@googlegroups.com
muy buen trabajo.

Lepes

unread,
Jan 7, 2014, 9:05:57 AM1/7/14
to asrob-uc3m-i...@googlegroups.com
Buen curro, asias!!

¿se puede pedir? Pues yo pido actualizar el firmware desde SD
(Sí, pido antes de que me digan que no se puede XD )

Pero no me negareis que sería un puntazo!.

Saludos

WeSo

unread,
Jan 7, 2014, 12:02:59 PM1/7/14
to asrob-uc3m-i...@googlegroups.com
xDDD Sería un puntazo, pero no creo que sea posible. Igual se puede hacer algún apaño para reprogramar un Arduino desde otro Arduino, siendo éste segundo autónomo con una batería y con una SD (seguro que ya existe algo).

Iceflow

unread,
Jan 7, 2014, 12:28:01 PM1/7/14
to asrob-uc3m-i...@googlegroups.com
Hablo por hablar, que mucha idea no es que tenga, pero si "sobrara" memoria como para que se pudiera almacenar un programa/rutina o como se llame de grabado de memoria y que eso no se tocase y quedara libre el resto de espacio donde grabar el firmware y que solo de cierta manera se accediera al "menu" de programar micro... quiza se podria, no se... :P divagaciones xDDD ni si quiera se como se programa la memoria en si jejejeje osea que todo esto son un monton de sandeces seguro xDD

La otra idea que como dice WeSo, si que existe jejejje

http://mdiy.pl/uprog-maly-szybki-przenosny-programator-avr-z-sd/?lang=en

Siempre me quedo el "resquemor" de no hacermelo jejeeje y tengo todo por casa ;)


--
 
---
Has recibido este mensaje porque estás suscrito al grupo "Clone Wars: Imprimiendo impresoras 3D" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a asrob-uc3m-impreso...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a asrob-uc3m-i...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Andres Maroto

unread,
Jan 7, 2014, 12:58:38 PM1/7/14
to asrob-uc3m-i...@googlegroups.com
la idea es cojonuda.... desde luego... ¿¿actualizar el Skech por la SD...???? todo un lujazo. y claro, ya puestos a pedir, para el que se conecta un shield RJ-45 o WiFi que fuese automático la actualización... jajajajjajajajaja

pero sinceramente creo que por "construcción" del chip ATMega no es posible........... ¿me equivoco? (que me ilumine alguien)

saludos

P.D. no descarto que se use una memoria RAM en el lector SD para poder actualizar... jajajajajaj 

thingmaker

unread,
Jan 8, 2014, 6:02:56 AM1/8/14
to asrob-uc3m-i...@googlegroups.com
Bueno, yo creo que Ice lo ha dejado bastante claro, existe y se puede hacer:

http://mdiy.pl/uprog-maly-szybki-przenosny-programator-avr-z-sd/?lang=en

entiendo que con un arduino nano (los pequeñitos) se podría usar como 'cargador' y hasta quizás podría acoplarse hasta en la RAMPS ... en fin, la posibilidad existe y es viable ¿a quién le sobran un par de semanas para hacerlo?

Por otro lado WeSo, gracias por el aporte.

Saludos,

thingmaker

Iceflow

unread,
Jan 8, 2014, 6:13:43 AM1/8/14
to asrob-uc3m-i...@googlegroups.com
Releyendo ese "articulo" que tengo en mente montar algun dia, como tantos otros... jejejeje he vuelto a leer algo de lo cual no me acordaba, esto:

Firmware update:
If newer version of firmware will show up, it can be updated in two ways:
ISP: Connect your ISP programmer into ISP-6 header and close “SLF-PRG” marked pins – programming header will become update header (just like in the USBasp programmer).
BootLoader: Device has a build-in bootloader which can update the firmware in very simple way! Get the update BIN file, rename it to “000.bin”, and place it into main (root) directory of your memory card. If after powering-up display is blank, thats good! Firmware file has been successfully recognized and device awaits for your confirmation. Hit the RI button to confirm. Flashing takes few seconds, and after success device will power-up and you should see new version on welcome screen. Now, delete “000.bin” from sd card to prevent enabling actualization mode. If you put your file according to these instructions and actualization mode will not start – you got an SD card which is not supported in actualization mode, but can be supported in programmer mode. Just try another card.

Como se puede leer, tiene una "subrutina" de actualizacion propia desde el bootloader que carga un "software" nuevo desde la SD :D igual no es tanta locura usar algo asi en Marlin con lector de tarjetas... aunque eso depende del bootloader... habria que adaptar los de cada micro para que pudieran hacer eso... 644, 1284, 2560 y mas que ahi...

Como ha dicho Thingmaker, a quien le sobra el tiempo? jejejeje


--
Reply all
Reply to author
Forward
0 new messages