karabas2011 писал(а):
есть другое предложение.
1 дать команду выдавить например 1мм по прямой с слоем H и шириной W. Движение продолжать и после окончания экструзии. Я ожидаю увидеть отрезок обрывающийся на некотором расстоянии от начала пути.
Реальную длину отрезка померять и сравнить с расчётной.
+ принимаю в работу!
Цитата:
2 печатать набор полос не меняя параметров но меняя расстояния между полосами. Как только они сольются мы получим реальную ширину экструзии при заданной теоретической. Далее уже меняем подачу так чтоб эти величины совпали.
это противоречит пункту 3 ибо меняя поток мы меняем ширину экструзии
так мы можем найти только максимальное расплющивание для заданной температуры (максимальное отношение ширины к высоте)
Цитата:
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 (); // код окончания
}
вот результаты:
слой 0.25mm
пруток 1.75mm
скорость 30mm/s
температура 220С
flow (extrusion width=0.45) |flow (extrusion width=0.3) | extrusion width (flow=1)
Вложение:
IMG_2584.JPG [ 1.88 МиБ | Просмотров: 2006 ]
Вложение:
IMG_2583.JPG [ 1.86 МиБ | Просмотров: 1963 ]
suck/prime (mm)
Вложение:
IMG_2581.JPG [ 1.94 МиБ | Просмотров: 1976 ]
suck/prime speed mm/s (большие шаги, остановил когда стал виден явный срыв шагов)
Вложение:
IMG_2582.JPG [ 1.42 МиБ | Просмотров: 1974 ]
suck/prime speed mm/s
Вложение:
IMG_2585.JPG [ 1.53 МиБ | Просмотров: 1980 ]