From d24df7af2cd7a9fcf7ae4c28c399e6cb31b2ebb5 Mon Sep 17 00:00:00 2001 From: whosawhatsis Date: Fri, 31 Jan 2014 00:54:19 -0800 Subject: [PATCH 1/2] M200 implementation --- Marlin/Marlin.h | 1 + Marlin/Marlin_main.cpp | 35 +++++++++++++++++++++++++++++++++++ Marlin/language.h | 9 +++++++++ Marlin/planner.cpp | 3 ++- 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index af3325be41..57d0c04b3f 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -202,6 +202,7 @@ extern float homing_feedrate[]; extern bool axis_relative_modes[]; extern int feedmultiply; extern int extrudemultiply; // Sets extrude multiply factor (in percent) +extern float filament_area[EXTRUDERS]; // cross-sectional area of filament (in cubic millimeters) extern float current_position[NUM_AXIS] ; extern float add_homeing[3]; #ifdef DELTA diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 920aed00c4..065abf1030 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -188,6 +188,14 @@ bool axis_relative_modes[] = AXIS_RELATIVE_MODES; int feedmultiply=100; //100->1 200->2 int saved_feedmultiply; int extrudemultiply=100; //100->1 200->2 +float filament_area[EXTRUDERS] = {1.0 + #if EXTRUDERS > 1 + , 1.0 + #if EXTRUDERS > 2 + , 1.0 + #endif + #endif +}; float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 }; float add_homeing[3]={0,0,0}; #ifdef DELTA @@ -2190,6 +2198,33 @@ void process_commands() } break; #endif //BLINKM + case 200: // M200 S set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters). + { + float area; + if(code_seen('S')) { + float radius = code_value() / 2; + if(radius == 0) { + area = 1; + } else { + area = M_PI * pow(radius, 2); + } + } else { + //reserved for setting filament diameter via UFID or filament measuring device + break; + } + tmp_extruder = active_extruder; + if(code_seen('T')) { + tmp_extruder = code_value(); + if(tmp_extruder >= EXTRUDERS) { + SERIAL_ECHO_START; + SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER); + } + SERIAL_ECHOLN(tmp_extruder); + break; + } + filament_area[tmp_extruder] = area; + } + break; case 201: // M201 for(int8_t i=0; i < NUM_AXIS; i++) { diff --git a/Marlin/language.h b/Marlin/language.h index 52b1b16059..2d97cc3522 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -163,6 +163,7 @@ #define MSG_END_FILE_LIST "End file list" #define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " #define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " + #define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " #define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " #define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" #define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " @@ -331,6 +332,7 @@ #define MSG_END_FILE_LIST "Koniec listy plikow" #define MSG_M104_INVALID_EXTRUDER "M104 Niepoprawny ekstruder " #define MSG_M105_INVALID_EXTRUDER "M105 Niepoprawny ekstruder " + #define MSG_M200_INVALID_EXTRUDER "M200 Niepoprawny ekstruder " #define MSG_M218_INVALID_EXTRUDER "M218 Niepoprawny ekstruder " #define MSG_ERR_NO_THERMISTORS "Brak termistorow - brak temperatury :(" #define MSG_M109_INVALID_EXTRUDER "M109 Niepoprawny ekstruder " @@ -498,6 +500,7 @@ #define MSG_END_FILE_LIST "Fin de la liste de fichiers" #define MSG_M104_INVALID_EXTRUDER "M104 Extruder invalide" #define MSG_M105_INVALID_EXTRUDER "M105 Extruder invalide" + #define MSG_M200_INVALID_EXTRUDER "M200 Extruder invalide" #define MSG_M218_INVALID_EXTRUDER "M218 Extruder invalide" #define MSG_ERR_NO_THERMISTORS "Pas de thermistor, pas de temperature" #define MSG_M109_INVALID_EXTRUDER "M109 Extruder invalide " @@ -668,6 +671,7 @@ #define MSG_END_FILE_LIST "End file list" #define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " #define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " + #define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " #define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " #define MSG_ERR_NO_THERMISTORS "No thermistors - no temp" #define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " @@ -842,6 +846,7 @@ #define MSG_END_FILE_LIST "Fin de la lista de archivos" #define MSG_M104_INVALID_EXTRUDER "M104 Extrusor Invalido " #define MSG_M105_INVALID_EXTRUDER "M105 Extrusor Invalido " + #define MSG_M200_INVALID_EXTRUDER "M200 Extrusor Invalido " #define MSG_M218_INVALID_EXTRUDER "M218 Extrusor Invalido " #define MSG_ERR_NO_THERMISTORS "No hay termistores - no temp" #define MSG_M109_INVALID_EXTRUDER "M109 Extrusor Invalido " @@ -1006,6 +1011,7 @@ #define MSG_END_FILE_LIST "Конец списка файлов" #define MSG_M104_INVALID_EXTRUDER "M104 ошибка экструдера " #define MSG_M105_INVALID_EXTRUDER "M105 ошибка экструдера " + #define MSG_M200_INVALID_EXTRUDER "M200 ошибка экструдера " #define MSG_M218_INVALID_EXTRUDER "M218 ошибка экструдера " #define MSG_ERR_NO_THERMISTORS "Нет термистра - нет температуры" #define MSG_M109_INVALID_EXTRUDER "M109 ошибка экструдера " @@ -1170,6 +1176,7 @@ #define MSG_END_FILE_LIST "Fine Lista File" #define MSG_M104_INVALID_EXTRUDER "M104 Estrusore non valido " #define MSG_M105_INVALID_EXTRUDER "M105 Estrusore non valido " + #define MSG_M200_INVALID_EXTRUDER "M200 Estrusore non valido " #define MSG_M218_INVALID_EXTRUDER "M218 Estrusore non valido " #define MSG_ERR_NO_THERMISTORS "Nessun Termistore - nessuna temperatura" #define MSG_M109_INVALID_EXTRUDER "M109 Estrusore non valido " @@ -1343,6 +1350,7 @@ #define MSG_END_FILE_LIST "Fim da lista de arquivos" #define MSG_M104_INVALID_EXTRUDER "M104 Extrusor inválido " #define MSG_M105_INVALID_EXTRUDER "M105 Extrusor inválido " + #define MSG_M200_INVALID_EXTRUDER "M200 Extrusor inválido " #define MSG_M218_INVALID_EXTRUDER "M218 Extrusor inválido " #define MSG_ERR_NO_THERMISTORS "Nao ha termistor - no temp" #define MSG_M109_INVALID_EXTRUDER "M109 Extrusor inválido " @@ -1512,6 +1520,7 @@ #define MSG_END_FILE_LIST "Tiedostolistauksen loppu" #define MSG_M104_INVALID_EXTRUDER "M104 Virheellinen suutin " #define MSG_M105_INVALID_EXTRUDER "M105 Virheellinen suutin " + #define MSG_M200_INVALID_EXTRUDER "M200 Virheellinen suutin " #define MSG_M218_INVALID_EXTRUDER "M218 Virheellinen suutin " #define MSG_ERR_NO_THERMISTORS "Ei termistoreja - ei lampotiloja" #define MSG_M109_INVALID_EXTRUDER "M109 Virheellinen suutin " diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index a9da533c77..00693d84a7 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -593,6 +593,7 @@ block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-positi #endif block->steps_z = labs(target[Z_AXIS]-position[Z_AXIS]); block->steps_e = labs(target[E_AXIS]-position[E_AXIS]); + block->steps_e *= filament_area[active_extruder]; block->steps_e *= extrudemultiply; block->steps_e /= 100; block->step_event_count = max(block->steps_x, max(block->steps_y, max(block->steps_z, block->steps_e))); @@ -682,7 +683,7 @@ block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-positi delta_mm[Y_AXIS] = ((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-position[Y_AXIS]))/axis_steps_per_unit[Y_AXIS]; #endif delta_mm[Z_AXIS] = (target[Z_AXIS]-position[Z_AXIS])/axis_steps_per_unit[Z_AXIS]; - delta_mm[E_AXIS] = ((target[E_AXIS]-position[E_AXIS])/axis_steps_per_unit[E_AXIS])*extrudemultiply/100.0; + delta_mm[E_AXIS] = ((target[E_AXIS]-position[E_AXIS])/axis_steps_per_unit[E_AXIS])*filament_area[active_extruder]*extrudemultiply/100.0; if ( block->steps_x <=dropsegments && block->steps_y <=dropsegments && block->steps_z <=dropsegments ) { block->millimeters = fabs(delta_mm[E_AXIS]); From 856edfcc0d844800b887b3b2eaca78ac337656af Mon Sep 17 00:00:00 2001 From: whosawhatsis Date: Fri, 31 Jan 2014 08:43:11 -0800 Subject: [PATCH 2/2] Fixed math This is why I wanted to sleep on the code I wrote while falling asleep rather than immediately submitting a pull request. --- Marlin/Marlin.h | 2 +- Marlin/Marlin_main.cpp | 4 ++-- Marlin/planner.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 57d0c04b3f..6b54aafb6c 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -202,7 +202,7 @@ extern float homing_feedrate[]; extern bool axis_relative_modes[]; extern int feedmultiply; extern int extrudemultiply; // Sets extrude multiply factor (in percent) -extern float filament_area[EXTRUDERS]; // cross-sectional area of filament (in cubic millimeters) +extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner extern float current_position[NUM_AXIS] ; extern float add_homeing[3]; #ifdef DELTA diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 065abf1030..b5e4e85193 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -188,7 +188,7 @@ bool axis_relative_modes[] = AXIS_RELATIVE_MODES; int feedmultiply=100; //100->1 200->2 int saved_feedmultiply; int extrudemultiply=100; //100->1 200->2 -float filament_area[EXTRUDERS] = {1.0 +float volumetric_multiplier[EXTRUDERS] = {1.0 #if EXTRUDERS > 1 , 1.0 #if EXTRUDERS > 2 @@ -2222,7 +2222,7 @@ void process_commands() SERIAL_ECHOLN(tmp_extruder); break; } - filament_area[tmp_extruder] = area; + volumetric_multiplier[tmp_extruder] = 1 / area; } break; case 201: // M201 diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 00693d84a7..bfc71323fe 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -593,7 +593,7 @@ block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-positi #endif block->steps_z = labs(target[Z_AXIS]-position[Z_AXIS]); block->steps_e = labs(target[E_AXIS]-position[E_AXIS]); - block->steps_e *= filament_area[active_extruder]; + block->steps_e *= volumetric_multiplier[active_extruder]; block->steps_e *= extrudemultiply; block->steps_e /= 100; block->step_event_count = max(block->steps_x, max(block->steps_y, max(block->steps_z, block->steps_e))); @@ -683,7 +683,7 @@ block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-positi delta_mm[Y_AXIS] = ((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-position[Y_AXIS]))/axis_steps_per_unit[Y_AXIS]; #endif delta_mm[Z_AXIS] = (target[Z_AXIS]-position[Z_AXIS])/axis_steps_per_unit[Z_AXIS]; - delta_mm[E_AXIS] = ((target[E_AXIS]-position[E_AXIS])/axis_steps_per_unit[E_AXIS])*filament_area[active_extruder]*extrudemultiply/100.0; + delta_mm[E_AXIS] = ((target[E_AXIS]-position[E_AXIS])/axis_steps_per_unit[E_AXIS])*volumetric_multiplier[active_extruder]*extrudemultiply/100.0; if ( block->steps_x <=dropsegments && block->steps_y <=dropsegments && block->steps_z <=dropsegments ) { block->millimeters = fabs(delta_mm[E_AXIS]);