Софт для калибровки принтера

Обсуждение технологии печати на 3D принтерах. Самостоятельное изготовление и приобретение. RepRap и его последователи.

Re: Софт для калибровки принтера

Сообщение how_eee » 14 мар 2013, 22:03

слепить то можно, только вручную нереально, надо простенький скрипт
Аватара пользователя
how_eee
 
Сообщения: 628
Зарегистрирован: 05 янв 2013, 21:42
Откуда: Ташкент, Питер, Москва

Re: Софт для калибровки принтера

Сообщение karabas2011 » 14 мар 2013, 23:27

есть идея подбирать температуру печатая серию инфилов с разной температурой. Гляда как ложится прямой инфил обычно видно что если вместо ячеек столбики то что-то не правильно.
karabas2011
 
Сообщения: 1607
Зарегистрирован: 04 мар 2012, 01:06
Откуда: Севастополь-Москва

Re: Софт для калибровки принтера

Сообщение TedBeer » 14 мар 2013, 23:42

how_eee писал(а):чтото вы в дебри пошли. Зачем-то приплели сюда механическую часть, калибровку.
Топикстартер хотел всего лишь генерить гкод ...

Извиняюсь, а для чего это всё? Цель - калибровка принтера, а не генерация гкода.
Вот и надо определиться - что и в какой последовательности мы собираемся калибровать и какие для этого нужны тесты.
А сгенерить гкод или склеить из готовых кусков - это дело пятое и не самое трудное.
Например:
1.
- цель: проверка биений оси Z
- модель: высокий цилиндр
- что смотрим: повторяющиеся волны
- варианты, что делать если волны есть: подтянуть ремни, прогнать метчиком оси, смазать гайки, поменять гайки, устранить люфт, добавить тока, поставить одинаковые моторы, если на Z стоит пара, не знаю что еще
2.
- цель: настройка шагов оси Z
- модель: высокий цилиндр
- что смотрим: высота модели с точностью 0.1мм
- что делать если высота отличается: проверить высоту первого слоя, померить верхние 10 слоев и расчитать толщину экструзии, пересчитать шаги и поменять константы в фирмвари

Ну и так далее. Надо собрать список задач, какие для них требуются модели и тогда уже мутить генератор или коллекцию моделей, визард калибровки или сайт с пошаговым руководством иди туда, смотри сюда, печатай это.
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Софт для калибровки принтера

Сообщение how_eee » 15 мар 2013, 00:42

TedBeer писал(а):- цель: проверка биений оси Z
- цель: настройка шагов оси Z



а зачем для этого чтото писать? берите цилиндр и вперед, ищите свои биения и считайте шаги.
Цель не калибровке механики принтера, это и так все ясно без всяких прог. Про некалиброванный принтер в другую тему.
Цель - определение оптимальных настроек слайсера с помощью всего одной печати. Генерация одного файла гкода, в котором разные параметры в разных местах.
Аватара пользователя
how_eee
 
Сообщения: 628
Зарегистрирован: 05 янв 2013, 21:42
Откуда: Ташкент, Питер, Москва

Re: Софт для калибровки принтера

Сообщение setar » 16 мар 2013, 18:28

Попытался написать генератор калибровки и наткнулся на грабли.
Для того чтобы регулировать поток нужно знать как именно он в конкретном слайсере вычисляется.
Например объём экструзии можно считать через овальную "колбасу" (знаем высоту и ширину), можно учитывать некоторое перекрытие слоев (опять же нужно знать на сколько).
Я в примере вообще объём считал через коэфициент заполнения прямоугольного окна.

В общем нужно сначала выковырять формулы из слайсеров, а потом продолжать...
Код: Выделить всё
#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
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Софт для калибровки принтера

Сообщение karabas2011 » 17 мар 2013, 00:49

В кисслайсере он стопудово вычисляется не так как в остальных.
Но думаю неважно как именно он вычисляется. Тестить придётся для каждой толщины слоя отдельно.
Грубо говоря вечатаем 10 серий палок изменяя флоутвик для каэжлй серии
потом вбиваем результат в слайсер и радуемся
Потом следующий слой или соотношение слой/ширина что возможно правильнее.
karabas2011
 
Сообщения: 1607
Зарегистрирован: 04 мар 2012, 01:06
Откуда: Севастополь-Москва

Re: Софт для калибровки принтера

Сообщение TedBeer » 17 мар 2013, 00:53

setar писал(а):Попытался написать генератор калибровки и наткнулся на грабли.
Для того чтобы регулировать поток нужно знать как именно он в конкретном слайсере вычисляется.

А можно изложить теоретическую часть того, что ты собираешься регулировать?
Я правильно понимаю, что ты хочешь печатать калибровочную модель(полосу) с разной скоростью и разной температурой чтобы выяснить предел, где начнутся проблемы?
Я тоже буквально вчера думал над такой проблемой.
Объем пластика выдавливаемого на периметре пропорционален скорости экструзии и площади сечения(назовем величину φ). Т.е. если не принимать во внимание ускорение, то это будет константа.
Вот сегодня накидал на питоне для анализа g-code после КС. В целом мой постулат подтверждается. Эта величина φ колеблется в 4м знаке после запятой. На маленьких отрезках φ не успевает дорасти до нужного значения, я думаю из-за ускорения.
Но есть и странности. На самых коротких отрезках эта величина аномально большая, что объяснить я затрудняюсь. Аномально, в данном случае, если для других отрезков величина колеблется ±2, то здесь сразу +8, хотя должно быть -5. Для равных отрезков величина экструзии должна совпадать, но попадаются отрезки, где это не соблюдается.
Кусок анализированного кода и результат в атаче.

Добавлено спустя 3 минуты 1 секунду:
Я думаю что надо печатать не полосы, а стенки некоторой высоты. Аномалии тогда заметить будет легче. А на однослойной полосе аномалия вообще может не проявиться.
Вложения
z.txt
(5.41 КиБ) Скачиваний: 296
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Софт для калибровки принтера

Сообщение setar » 17 мар 2013, 01:43

что то ты усложняешь
какая нафиг скорость экструзии?
все просто:
объём который вошел в экструдер выйдет из сопла.
V1=V2
объём вошедшего пластика равен площади сечения прутка * длинну прутка
следовательно объём экструзии через объём прутка управляется длинной вошедшего прутка, а это прямой параметр gcode E
а вот на какую длинну экструзии хватит этого объёма можно считать по разному.
я считал как коэфициент заполнения прямоугольного окна сечения экструзии (высота слоя * ширина слоя)

дальше просто - генерю тестовые поля с разным коэфициентом потока.

все остальное можно понять из кода и фотки

вот только это ничего не дает, пока я не опираюсь на базовую формулу требуемого слайсера ...
Код: Выделить всё
#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 (); // код окончания

}
Вложения
20130317-CaptureIt-Picture.png
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Софт для калибровки принтера

Сообщение TedBeer » 17 мар 2013, 01:58

setar писал(а):объём который вошел в экструдер выйдет из сопла.
V1=V2
объём вошедшего пластика равен площади сечения прутка * длинну прутка
следовательно объём экструзии через объём прутка управляется длинной вошедшего прутка, а это прямой параметр gcode E
а вот на какую длинну экструзии хватит этого объёма можно считать по разному.

Я и не усложняю. Я подхожу с того же конца, что и слайсер. У слайсера после пересечения модели с плоскостью есть набор отрезков. И теперь наоборот, исходя из длины отрезка надо рассчитать объем экструзии, поделить на площадь прутка и прописать длину в параметр G1 ..E???
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Софт для калибровки принтера

Сообщение setar » 17 мар 2013, 02:04

:) посмотри функцию
Код: Выделить всё
// расход прутка для заданной длинны экструзии
float filament_length (float path_l)
{
  float fil_l;
  fil_l = path_s*path_l/fil_s;
  return fil_l;
}

у нас есть начало и конец требуемого отрезка
нужно знать сколько прутка вдавить по мере движения
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Софт для калибровки принтера

Сообщение TedBeer » 17 мар 2013, 02:44

вот из твоих исходников:
float dest_e = pos_e+flow*filament_length(len);
если раскрыть filament_length
то и получится
float dest_e = pos_e+flow*path_s*len/fil_s;
фактически flow*path_s/fil_s и есть та величина, про которую я говорил.
Требуемый объем прутка на единицу длины экструзии.
Вот про этот параметр я и написал, что вычисленный из гкода после КС он плавает в 4м знаке и местами есть аномалии. Вычислить из гкода легко - разницу между параметром Е делим на длину отрезка.
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Софт для калибровки принтера

Сообщение setar » 17 мар 2013, 11:29

сложно изъясняешься :)
я тут подумал куда блин в 4 знак то лезть?
у нас точности механические не выше 0.01, значит двух знаков после запятой достаточно, и передавать меньше данных
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Софт для калибровки принтера

Сообщение karabas2011 » 17 мар 2013, 11:49

есть другое предложение.
1 дать команду выдавить например 1мм по прямой с слоем H и шириной W. Движение продолжать и после окончания экструзии. Я ожидаю увидеть отрезок обрывающийся на некотором расстоянии от начала пути.
Реальную длину отрезка померять и сравнить с расчётной.[/quote]

2 печатать набор полос не меняя параметров но меняя расстояния между полосами. Как только они сольются мы получим реальную ширину экструзии при заданной теоретической. Далее уже меняем подачу так чтоб эти величины совпали.

3 печатаем отрезки с расстоянием между ними строго = W (ширина экструзии) меняя подачу для каждой группы ищем первые слившиеся. ( в слайсер этот тест не суём - он попытаеся расчитать ширину отрезка по модели а нужно просто давить как давится)
karabas2011
 
Сообщения: 1607
Зарегистрирован: 04 мар 2012, 01:06
Откуда: Севастополь-Москва

Re: Софт для калибровки принтера

Сообщение TedBeer » 17 мар 2013, 14:09

setar писал(а):сложно изъясняешься :)
я тут подумал куда блин в 4 знак то лезть?
у нас точности механические не выше 0.01, значит двух знаков после запятой достаточно, и передавать меньше данных

Это ж коэффициент. Учитывая, что при ширине экструзии 0.5мм, толщине слоя 0.25, прутке 1.75 значащие цифры начинаются во 2м знаке после запятой, то колебания в 4м и 3м очень даже имеют значения.
Но самое интересное - это аномалии. Увеличение выдачи пластика на самых коротких отрезках может приводить к дефектам в местах, где периметр резко меняет направление.
Автор КС регулярно контачит со мной на "поболтать", поспрашиваю у него про эти аномалии и какие эффекты он принимает во внимание при расчете требуемого объема экструзии.
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Софт для калибровки принтера

Сообщение setar » 17 мар 2013, 15:08

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

IMG_2583.JPG



suck/prime (mm)
IMG_2581.JPG


suck/prime speed mm/s (большие шаги, остановил когда стал виден явный срыв шагов)
IMG_2582.JPG

suck/prime speed mm/s
IMG_2585.JPG
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Пред.След.

Вернуться в 3D печать

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 23