roboforum.ru

Технический форум по робототехнике.
Текущее время: 24 ноя 2024, 04:51

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 153 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 11  След.
Автор Сообщение
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 14 мар 2013, 22:03 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 14 мар 2013, 23:27 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 14 мар 2013, 23:42 
Не в сети
Аватара пользователя

Зарегистрирован: 08 авг 2012, 00:38
Сообщения: 1129
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард
how_eee писал(а):
чтото вы в дебри пошли. Зачем-то приплели сюда механическую часть, калибровку.
Топикстартер хотел всего лишь генерить гкод ...

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

Ну и так далее. Надо собрать список задач, какие для них требуются модели и тогда уже мутить генератор или коллекцию моделей, визард калибровки или сайт с пошаговым руководством иди туда, смотри сюда, печатай это.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 15 мар 2013, 00:42 
Не в сети
Аватара пользователя

Зарегистрирован: 05 янв 2013, 21:42
Сообщения: 628
Откуда: Ташкент, Питер, Москва
TedBeer писал(а):
- цель: проверка биений оси Z
- цель: настройка шагов оси Z



а зачем для этого чтото писать? берите цилиндр и вперед, ищите свои биения и считайте шаги.
Цель не калибровке механики принтера, это и так все ясно без всяких прог. Про некалиброванный принтер в другую тему.
Цель - определение оптимальных настроек слайсера с помощью всего одной печати. Генерация одного файла гкода, в котором разные параметры в разных местах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 16 мар 2013, 18:28 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 04 окт 2004, 12:58
Сообщения: 10989
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко
Попытался написать генератор калибровки и наткнулся на грабли.
Для того чтобы регулировать поток нужно знать как именно он в конкретном слайсере вычисляется.
Например объём экструзии можно считать через овальную "колбасу" (знаем высоту и ширину), можно учитывать некоторое перекрытие слоев (опять же нужно знать на сколько).
Я в примере вообще объём считал через коэфициент заполнения прямоугольного окна.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 00:49 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 00:53 
Не в сети
Аватара пользователя

Зарегистрирован: 08 авг 2012, 00:38
Сообщения: 1129
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард
setar писал(а):
Попытался написать генератор калибровки и наткнулся на грабли.
Для того чтобы регулировать поток нужно знать как именно он в конкретном слайсере вычисляется.

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

Добавлено спустя 3 минуты 1 секунду:
Я думаю что надо печатать не полосы, а стенки некоторой высоты. Аномалии тогда заметить будет легче. А на однослойной полосе аномалия вообще может не проявиться.


Вложения:
z.txt [5.41 КиБ]
Скачиваний: 295
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 01:43 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 04 окт 2004, 12:58
Сообщения: 10989
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко
что то ты усложняешь
какая нафиг скорость экструзии?
все просто:
объём который вошел в экструдер выйдет из сопла.
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
20130317-CaptureIt-Picture.png [ 890.7 КиБ | Просмотров: 2068 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 01:58 
Не в сети
Аватара пользователя

Зарегистрирован: 08 авг 2012, 00:38
Сообщения: 1129
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард
setar писал(а):
объём который вошел в экструдер выйдет из сопла.
V1=V2
объём вошедшего пластика равен площади сечения прутка * длинну прутка
следовательно объём экструзии через объём прутка управляется длинной вошедшего прутка, а это прямой параметр gcode E
а вот на какую длинну экструзии хватит этого объёма можно считать по разному.

Я и не усложняю. Я подхожу с того же конца, что и слайсер. У слайсера после пересечения модели с плоскостью есть набор отрезков. И теперь наоборот, исходя из длины отрезка надо рассчитать объем экструзии, поделить на площадь прутка и прописать длину в параметр G1 ..E???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 02:04 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 04 окт 2004, 12:58
Сообщения: 10989
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко
:) посмотри функцию
Код:
// расход прутка для заданной длинны экструзии
float filament_length (float path_l)
{
  float fil_l;
  fil_l = path_s*path_l/fil_s;
  return fil_l;
}

у нас есть начало и конец требуемого отрезка
нужно знать сколько прутка вдавить по мере движения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 02:44 
Не в сети
Аватара пользователя

Зарегистрирован: 08 авг 2012, 00:38
Сообщения: 1129
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард
вот из твоих исходников:
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м знаке и местами есть аномалии. Вычислить из гкода легко - разницу между параметром Е делим на длину отрезка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 11:29 
Не в сети
Site Admin
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 11:49 
Не в сети

Зарегистрирован: 04 мар 2012, 01:06
Сообщения: 1607
Откуда: Севастополь-Москва
есть другое предложение.
1 дать команду выдавить например 1мм по прямой с слоем H и шириной W. Движение продолжать и после окончания экструзии. Я ожидаю увидеть отрезок обрывающийся на некотором расстоянии от начала пути.
Реальную длину отрезка померять и сравнить с расчётной.[/quote]

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

3 печатаем отрезки с расстоянием между ними строго = W (ширина экструзии) меняя подачу для каждой группы ищем первые слившиеся. ( в слайсер этот тест не суём - он попытаеся расчитать ширину отрезка по модели а нужно просто давить как давится)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 14:09 
Не в сети
Аватара пользователя

Зарегистрирован: 08 авг 2012, 00:38
Сообщения: 1129
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард
setar писал(а):
сложно изъясняешься :)
я тут подумал куда блин в 4 знак то лезть?
у нас точности механические не выше 0.01, значит двух знаков после запятой достаточно, и передавать меньше данных

Это ж коэффициент. Учитывая, что при ширине экструзии 0.5мм, толщине слоя 0.25, прутке 1.75 значащие цифры начинаются во 2м знаке после запятой, то колебания в 4м и 3м очень даже имеют значения.
Но самое интересное - это аномалии. Увеличение выдачи пластика на самых коротких отрезках может приводить к дефектам в местах, где периметр резко меняет направление.
Автор КС регулярно контачит со мной на "поболтать", поспрашиваю у него про эти аномалии и какие эффекты он принимает во внимание при расчете требуемого объема экструзии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Софт для калибровки принтера
СообщениеДобавлено: 17 мар 2013, 15:08 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 04 окт 2004, 12:58
Сообщения: 10989
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко
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_2584.JPG [ 1.88 МиБ | Просмотров: 2006 ]

Вложение:
IMG_2583.JPG
IMG_2583.JPG [ 1.86 МиБ | Просмотров: 1963 ]



suck/prime (mm)
Вложение:
IMG_2581.JPG
IMG_2581.JPG [ 1.94 МиБ | Просмотров: 1976 ]


suck/prime speed mm/s (большие шаги, остановил когда стал виден явный срыв шагов)
Вложение:
IMG_2582.JPG
IMG_2582.JPG [ 1.42 МиБ | Просмотров: 1974 ]

suck/prime speed mm/s
Вложение:
IMG_2585.JPG
IMG_2585.JPG [ 1.53 МиБ | Просмотров: 1980 ]


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 153 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 11  След.

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO