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_cShPCsJComentar 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/iSi 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/EEPROMClearY 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!