roboforum.ruТехнический форум по робототехнике. |
|
|
how_eee писал(а):чтото вы в дебри пошли. Зачем-то приплели сюда механическую часть, калибровку.
Топикстартер хотел всего лишь генерить гкод ...
TedBeer писал(а):- цель: проверка биений оси Z
- цель: настройка шагов оси Z
#include <stdio.h>
#include <math.h>
float fil_dia, fil_s;
float path_h, path_k, path_s, path_w;
float pos_e, pos_x, pos_y, pos_z;
int temp, bed_temp;
// инициализация
init ()
{
fil_s = (M_PI*fil_dia*fil_dia)/4; // площадь сечения прутка
path_s = path_k*path_w*path_h; // площадь слоя укладки
pos_x = 0;
pos_y = 0;
pos_z = 0;
pos_e = 0;
}
// расход прутка для заданной длинны экструзии
float filament_length (float path_l)
{
float fil_l;
fil_l = path_s*path_l/fil_s;
return fil_l;
}
label ()
{
printf(";Flow calibrator v0.0.1 setar@roboforum.ru LGPL 2013\n",fil_s);
printf(";Filament Dia = %.3f mm\n",fil_dia);
printf(";Path heigth = %.3f mm\n",path_h);
printf(";Path width = %.3f mm\n",path_w);
printf(";Path filling = %.3f\n",path_k);
printf(";--- calculated ---\n");
printf(";Filament S = %.4f mm^2\n",fil_s);
printf(";Path S = %.4f mm^2\n",path_s);
}
start_g ()
{
printf(";--- start gcode ---\n");
printf("G28 ; home\n");
printf("G21 ; unit in mm\n");
printf("G92 E0 ; set extruder to zero\n");
printf("M82 ; use absolute distances\n");
printf("M107 ; fan off\n");
printf("M104 S%3d; set temp\n",temp);
printf("M190 S%3d; wait bed temp\n",bed_temp);
printf(";--- head clean ---\n");
printf("G1 X-15 Y-15 Z12 F15000;go start positions\n");
printf("M109 S%3d; wait heat\n",temp);
printf("G1 X-10 Y10 Z0.5;go near bed level \n");
printf("G1 E5 F100; extruse a bubble\n");
printf("G4 S5 ; wait 5 sec\n");
printf("G1 Z5\n");
printf("G4 S3 ; wait 3 sec\n");
printf("G1 F15000\n");
printf("G1 X-10 Y20 Z%.2f\n",path_h);
printf("G1 X-10 Y35\n");
printf(";--- end start gcode ---\n");
}
stop_g ()
{
printf(";--- stop gcode ---\n");
printf("M400 ; wait for buffer to clear\n");
printf("M104 S0 ; turn off temperature\n");
printf("M140 S0 ; turn off bed\n");
printf("G0 Y150 Z%.2f F15000 ; Present Part\n",pos_z+5);
printf("M84 ; disable motors\n");
printf("\n");
}
// линия стандартным заполнением из x0,y0 в x1,y1 на высоте z со скоростью s (mm/c)
fill_line (float x0,float y0,float x1,float y1, float z, float s)
{
float len = sqrt ((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
float dest_e = pos_e+filament_length(len);
float f = s * 60;
printf("G1 X%.2f Y%.2f Z%.2f E%.2f F%.f\n",x0,y0,z,pos_e,f);
printf("G1 X%.2f Y%.2f Z%.2f E%.2f F%.f\n",x1,y1,z,dest_e,f);
pos_e = dest_e;
pos_x = x1;
pos_y = y1;
pos_z = z;
}
zerro_pos_e ()
{
printf("G92 E0\n");
pos_e = 0;
}
main ()
{
fil_dia = 1.75; // диаметр прутка
path_h = 0.25; // высота слоя
path_w = 0.25 * 1.8; // ширина слоя
path_k = 0.875; // коэфициент заполнения прямоугольника при экструзии
temp = 220; // температура
bed_temp = 130; // температура стола
init (); // инициализация
label (); // печать заголовка
start_g (); // стартовый код
zerro_pos_e(); // занулим положение прутка
fill_line (0,0,100,100,path_h,30); // рисуем линию
stop_g (); // код окончания
}
setar писал(а):Попытался написать генератор калибровки и наткнулся на грабли.
Для того чтобы регулировать поток нужно знать как именно он в конкретном слайсере вычисляется.
#include <stdio.h>
#include <math.h>
float fil_dia, fil_s;
float path_h, path_k, path_s, path_w;
float pos_e, pos_x, pos_y, pos_z;
int temp, bed_temp;
float fill_speed, move_speed;
// инициализация
init ()
{
fil_s = (M_PI*fil_dia*fil_dia)/4; // площадь сечения прутка
path_s = path_k*path_w*path_h; // площадь слоя укладки
pos_x = 0;
pos_y = 0;
pos_z = 0;
pos_e = 0;
}
// расход прутка для заданной длинны экструзии
float filament_length (float path_l)
{
float fil_l;
fil_l = path_s*path_l/fil_s;
return fil_l;
}
label ()
{
printf(";Flow calibrator v0.0.1 setar@roboforum.ru LGPL 2013\n",fil_s);
printf(";Filament Dia = %.3f mm\n",fil_dia);
printf(";Path heigth = %.3f mm\n",path_h);
printf(";Path width = %.3f mm\n",path_w);
printf(";Path filling = %.3f\n",path_k);
printf(";Temp = %dC\n",temp);
printf(";Bed temp = %dC\n",bed_temp);
printf(";Fill speed = %.f mm/s\n",fill_speed);
printf(";Move speed = %.f mm/s\n",move_speed);
printf(";--- calculated ---\n");
printf(";Filament S = %.4f mm^2\n",fil_s);
printf(";Path S = %.4f mm^2\n",path_s);
}
start_g ()
{
printf(";--- start gcode ---\n");
printf("G28 ; home\n");
printf("G21 ; unit in mm\n");
printf("G92 E0 ; set extruder to zero\n");
printf("M82 ; use absolute distances\n");
printf("M107 ; fan off\n");
printf("M104 S%3d; set temp\n",temp);
printf("M190 S%3d; wait bed temp\n",bed_temp);
printf(";--- head clean ---\n");
printf("G1 X0 Y0 Z15 F15000;go start positions\n");
printf("M109 S%3d; wait heat\n",temp);
printf("G1 X0 Y10 Z0.5;go near bed level \n");
printf("G1 E5 F100; extruse a bubble\n");
printf("G4 S5 ; wait 5 sec\n");
printf("G1 Z5\n");
printf("G4 S3 ; wait 3 sec\n");
printf("G1 F15000\n");
printf("G1 X0 Y20 Z%.2f\n",path_h);
printf("G1 X0 Y35\n");
printf(";--- end start gcode ---\n");
}
stop_g ()
{
printf(";--- stop gcode ---\n");
printf("M400 ; wait for buffer to clear\n");
printf("M104 S0 ; turn off temperature\n");
printf("M140 S0 ; turn off bed\n");
printf("G0 Y150 Z%.2f F15000 ; Present Part\n",pos_z+5);
printf("M84 ; disable motors\n");
printf("\n");
}
// линия из текущей позиции в x,y на высоте z со скоростью s (mm/c) и потоком flow (относительно 1)
fill_line (float x,float y, float z, float s, float flow)
{
float len = sqrt ((pos_x-x)*(pos_x-x)+(pos_y-y)*(pos_y-y));
float dest_e = pos_e+flow*filament_length(len);
float f = s * 60;
printf("G1 X%.2f Y%.2f Z%.2f E%.2f F%.f\n",x,y,z,dest_e,f);
pos_e = dest_e;
pos_x = x;
pos_y = y;
pos_z = z;
}
// перемещение в точку x,y,z со скоростью s (mm/c)
move_to (float x,float y, float z, float s)
{
float f = s * 60;
printf("G1 X%.2f Y%.2f Z%.2f F%.f\n",x,y,z,f);
pos_x = x;
pos_y = y;
pos_z = z;
}
zerro_pos_e ()
{
printf("G92 E0\n");
pos_e = 0;
}
main ()
{
fil_dia = 1.7; // диаметр прутка
path_h = 0.25; // высота слоя
path_w = 0.25 * 1.2; // ширина слоя
path_k = 0.875; // коэфициент заполнения прямоугольника при экструзии
temp = 220; // температура
bed_temp = 130; // температура стола
fill_speed = 30; // скорость экструзии
move_speed = 100; // скорость перемещения
init (); // инициализация
label (); // печать заголовка
start_g (); // стартовый код
zerro_pos_e(); // занулим положение прутка
float x,y;
printf(";--- raft ---\n");
pos_z= 2*path_h;
move_to (10,10,pos_z,move_speed);
for ( y = 10; y < 50; y = y + 2*1)
{
fill_line (100,y,pos_z,fill_speed,2);
fill_line (100,y+1,pos_z,fill_speed,2);
fill_line (10,y+1,pos_z,fill_speed,2);
fill_line (10,y+2*1,pos_z,fill_speed,2);
}
printf(";--- end raft ---\n");
float flow;
int n = 0;
pos_z = 3*path_h;
for ( flow = 0.4; flow <= 2; flow = flow + 0.2)
{
n=n+1;
printf(";--- fill %.2f start ---\n",flow);
for ( x = n*10+5; x < n*10+10; x = x + 2*path_w)
{
move_to (x,10,pos_z,move_speed);
fill_line (x,50,pos_z,fill_speed,flow);
move_to (x+path_w,50,pos_z,move_speed);
fill_line (x+path_w,10,pos_z,fill_speed,flow);
}
printf(";--- fill %.2f stop ---\n",flow);
zerro_pos_e();
}
stop_g (); // код окончания
}
setar писал(а):объём который вошел в экструдер выйдет из сопла.
V1=V2
объём вошедшего пластика равен площади сечения прутка * длинну прутка
следовательно объём экструзии через объём прутка управляется длинной вошедшего прутка, а это прямой параметр gcode E
а вот на какую длинну экструзии хватит этого объёма можно считать по разному.
// расход прутка для заданной длинны экструзии
float filament_length (float path_l)
{
float fil_l;
fil_l = path_s*path_l/fil_s;
return fil_l;
}
setar писал(а):сложно изъясняешься
я тут подумал куда блин в 4 знак то лезть?
у нас точности механические не выше 0.01, значит двух знаков после запятой достаточно, и передавать меньше данных
karabas2011 писал(а):есть другое предложение.
1 дать команду выдавить например 1мм по прямой с слоем H и шириной W. Движение продолжать и после окончания экструзии. Я ожидаю увидеть отрезок обрывающийся на некотором расстоянии от начала пути.
Реальную длину отрезка померять и сравнить с расчётной.
2 печатать набор полос не меняя параметров но меняя расстояния между полосами. Как только они сольются мы получим реальную ширину экструзии при заданной теоретической. Далее уже меняем подачу так чтоб эти величины совпали.
3 печатаем отрезки с расстоянием между ними строго = W (ширина экструзии) меняя подачу для каждой группы ищем первые слившиеся. ( в слайсер этот тест не суём - он попытаеся расчитать ширину отрезка по модели а нужно просто давить как давится)
#include <stdio.h>
#include <math.h>
float fil_dia, fil_s;
float path_h, path_k, path_s, path_w;
float pos_e, pos_x, pos_y, pos_z;
int temp, bed_temp;
float fill_speed, move_speed;
// инициализация
init ()
{
fil_s = (M_PI*fil_dia*fil_dia)/4; // площадь сечения прутка
path_s = path_k*path_w*path_h; // площадь слоя укладки
pos_x = 0;
pos_y = 0;
pos_z = 0;
pos_e = 0;
}
// расход прутка для заданной длинны экструзии
float filament_length (float path_l)
{
float fil_l;
fil_l = path_s*path_l/fil_s;
return fil_l;
}
label ()
{
printf(";3Dprinter calibrator v0.0.1 setar@roboforum.ru LGPL 2013\n",fil_s);
printf(";Filament Dia = %.3f mm\n",fil_dia);
printf(";Path heigth = %.3f mm\n",path_h);
printf(";Path width = %.3f mm\n",path_w);
printf(";Path filling = %.3f\n",path_k);
printf(";Temp = %dC\n",temp);
printf(";Bed temp = %dC\n",bed_temp);
printf(";Fill speed = %.f mm/s\n",fill_speed);
printf(";Move speed = %.f mm/s\n",move_speed);
printf(";--- calculated ---\n");
printf(";Filament S = %.4f mm^2\n",fil_s);
printf(";Path S = %.4f mm^2\n",path_s);
}
start_g ()
{
printf(";--- start gcode ---\n");
printf("G28 ; home\n");
printf("G21 ; unit in mm\n");
printf("G92 E0 ; set extruder to zero\n");
printf("M82 ; use absolute distances\n");
printf("M107 ; fan off\n");
printf("M104 S%3d; set temp\n",temp);
printf("M190 S%3d; wait bed temp\n",bed_temp);
printf(";--- head clean ---\n");
printf("G1 X0 Y0 Z15 F15000;go start positions\n");
printf("M109 S%3d; wait heat\n",temp);
printf("G1 X0 Y10 Z0.5;go near bed level \n");
printf("G1 E5 F100; extruse a bubble\n");
printf("G4 S5 ; wait 5 sec\n");
printf("G1 Z5\n");
printf("G4 S3 ; wait 3 sec\n");
printf("G1 F15000\n");
printf("G1 X0 Y20 Z%.2f\n",path_h);
printf("G1 X0 Y35\n");
printf(";--- end start gcode ---\n");
}
stop_g ()
{
printf(";--- stop gcode ---\n");
printf("M400 ; wait for buffer to clear\n");
printf("M104 S0 ; turn off temperature\n");
printf("M140 S0 ; turn off bed\n");
printf("G0 Y150 Z%.2f F15000 ; Present Part\n",pos_z+5);
printf("M84 ; disable motors\n");
printf("\n");
}
// линия из текущей позиции в x,y на высоте z со скоростью s (mm/c) и потоком flow (относительно 1)
fill_line (float x,float y, float z, float s, float flow)
{
float len = sqrt ((pos_x-x)*(pos_x-x)+(pos_y-y)*(pos_y-y));
float dest_e = pos_e+flow*filament_length(len);
float f = s * 60;
printf("G1 X%.2f Y%.2f Z%.2f E%.2f F%.f\n",x,y,z,dest_e,f);
pos_e = dest_e;
pos_x = x;
pos_y = y;
pos_z = z;
}
// перемещение в точку x,y,z со скоростью s (mm/c)
move_to (float x,float y, float z, float s)
{
float f = s * 60;
printf("G1 X%.2f Y%.2f Z%.2f F%.f\n",x,y,z,f);
pos_x = x;
pos_y = y;
pos_z = z;
}
zerro_pos_e ()
{
printf("G92 E0\n");
pos_e = 0;
}
path_width_adjust()
{
float flow = 1;
int n = 0;
float wk = 0.8;
float x;
pos_z = 3*path_h;
for ( wk = 0.8; wk <= 2; wk = wk + 0.15)
{
n=n+1;
path_w = path_h * wk;
printf(";--- path_w %.2f start ---\n",path_w);
for ( x = n*10+5; x < n*10+10; x = x + 2*path_w)
{
move_to (x,10,pos_z,move_speed);
fill_line (x,50,pos_z,fill_speed,flow);
move_to (x+path_w,50,pos_z,move_speed);
fill_line (x+path_w,10,pos_z,fill_speed,flow);
}
printf(";--- path_w %.2f stop ---\n",path_w);
zerro_pos_e();
}
}
path_flow_adjust ()
{
float flow;
int n = 0;
float x;
pos_z = 3*path_h;
for ( flow = 0.4; flow <= 2; flow = flow + 0.2)
{
n=n+1;
printf(";--- fill %.2f start ---\n",flow);
for ( x = n*10+5; x < n*10+10; x = x + 2*path_w)
{
move_to (x,10,pos_z,move_speed);
fill_line (x,50,pos_z,fill_speed,flow);
move_to (x+path_w,50,pos_z,move_speed);
fill_line (x+path_w,10,pos_z,fill_speed,flow);
}
printf(";--- fill %.2f stop ---\n",flow);
zerro_pos_e();
}
}
do_suck (float suck,float s)
{
float dest_e = pos_e - suck;
float f = s * 60;
printf("G1 E%.2f F%.2f\n",dest_e,f);
pos_e = dest_e;
}
do_prime (float prime,float s)
{
float dest_e = pos_e + prime;
float f = s * 60;
printf("G1 E%.2f F%.2f\n",dest_e,f);
pos_e = dest_e;
}
suck_adjust ()
{
float suck,suck_speed;
int n = 0;
float x;
pos_z = 3*path_h;
suck_speed = 20;
for ( suck= 0.4; suck <= 2; suck = suck + 0.2)
{
n=n+1;
printf(";--- suck %.2f start ---\n",suck);
for ( x = n*10+5; x < n*10+10; x = x + 2*path_w)
{
// прямое направление
move_to (x,10,pos_z,move_speed);
fill_line (x,30,pos_z,fill_speed,1);
do_suck(suck,suck_speed);
move_to (x,80,pos_z,move_speed);
do_prime(suck,suck_speed);
fill_line (x,100,pos_z,fill_speed,1);
// обратное направление
move_to (x+path_w,100,pos_z,move_speed);
fill_line (x+path_w,80,pos_z,fill_speed,1);
do_suck(suck,suck_speed);
move_to (x+path_w,30,pos_z,move_speed);
do_prime(suck,suck_speed);
fill_line (x+path_w,10,pos_z,fill_speed,1);
}
printf(";--- suck %.2f stop ---\n",suck);
zerro_pos_e();
}
}
suck_speed_adjust ()
{
float suck,suck_speed;
int n = 0;
float x;
pos_z = 3*path_h;
suck = 1;
for ( suck_speed= 2; suck_speed <= 50; suck_speed = suck_speed + 4)
{
n=n+1;
printf(";--- suck speed %.2f start ---\n",suck_speed);
for ( x = n*7+5; x < n*7+10; x = x + 2*path_w)
{
// прямое направление
move_to (x,10,pos_z,move_speed);
fill_line (x,30,pos_z,fill_speed,1);
do_suck(suck,suck_speed);
move_to (x,80,pos_z,move_speed);
do_prime(suck,suck_speed);
fill_line (x,100,pos_z,fill_speed,1);
// обратное направление
move_to (x+path_w,100,pos_z,move_speed);
fill_line (x+path_w,80,pos_z,fill_speed,1);
do_suck(suck,suck_speed);
move_to (x+path_w,30,pos_z,move_speed);
do_prime(suck,suck_speed);
fill_line (x+path_w,10,pos_z,fill_speed,1);
}
printf(";--- suck speed %.2f stop ---\n",suck_speed);
zerro_pos_e();
}
}
main ()
{
fil_dia = 1.7; // диаметр прутка
path_h = 0.25; // высота слоя
path_w = 0.25 * 1.24; // ширина слоя
path_k = 0.875; // коэфициент заполнения прямоугольника при экструзии
temp = 220; // температура
bed_temp = 130; // температура стола
fill_speed = 30; // скорость экструзии
move_speed = 100; // скорость перемещения
init (); // инициализация
label (); // печать заголовка
start_g (); // стартовый код
zerro_pos_e(); // занулим положение прутка
float x,y;
printf(";--- raft ---\n");
pos_z= 2*path_h;
move_to (10-path_w/2,10-path_w/2,pos_z,move_speed);
do_prime (1,1);//якорь
fill_line (100+path_w/2,10-path_w/2,pos_z,fill_speed,2.5);
fill_line (100+path_w/2,100+path_w/2,pos_z,fill_speed,2.5);
fill_line (10-path_w/2,100+path_w/2,pos_z,fill_speed,2.5);
fill_line (10-path_w/2,10+path_w/2,pos_z,fill_speed,2.5);
move_to (10,10,pos_z,move_speed);
for ( y = 10; y < 100; y = y + 2*1)
{
fill_line (100,y,pos_z,fill_speed,2.5);
fill_line (100,y+1,pos_z,fill_speed,2.5);
fill_line (10,y+1,pos_z,fill_speed,2.5);
fill_line (10,y+2*1,pos_z,fill_speed,2.5);
}
printf(";--- end raft ---\n");
/*
// подбираем поток
path_flow_adjust ();
// подбираем ширину экструзии
path_width_adjust ();
suck_adjust ();
*/
suck_speed_adjust();
stop_g (); // код окончания
}
Сейчас этот форум просматривают: Yandex [Bot] и гости: 11