Настройка 3D принтера

После того, как я собрал 3D принтер своими руками, самое время перейти к его настройке. Настройка 3D принтера — это самый ответственный этап. Если не уделить ему достаточно внимания, то это может привести к неприятным последствиям. Например, первое, что я сделал со своим 3D принтером — это расцарапал каптоновое покрытие на поверхности нагревательного столика. Но обо всем по порядку.

Настройка прошивки 3D принтера

Самое первое после сборки — настройка и заливка прошивки для 3D принтера. Я использовал самую распространенную прошивку Marlin. Скачиваем ее в виде zip-архива и распаковываем в отдельную папку. Устанавливаем также Arduino IDE для правки настроек, компиляции и заливки прошивки в 3D принтер по USB. Arduino IDE нам нужен потому, что контроллер большинства 3D принтеров строится на базе распространенной платы Arduino 2560.

Запускаем Arduino IDE и идем в меню Файл->Открыть… Далее находим нашу распакованную папку с прошивкой Marlin, в ней будет вложенная папка с тем же названием Marlin, а уже в ней файл проекта Marlin.ino. Открываем его, и у нас появляется множество закладок с файлами прошивки. Главная закладка, которая нас будет интересовать — это Configuration.h. Там собраны все основные настройки для нашего 3D принтера, обильно снабженные комментариями на английском. Если владеешь языком, то из комментариев более-менее все понятно. Параметры, которые можно настраивать, выглядят так:

#define НАЗВАНИЕ_ПАРАМЕТРА значение параметра

Некоторые параметры идут только с названием и без значения. Такие параметры просто включают или отключают определенную функцию прошивки. Чтобы выключить такой параметр, достаточно закомментировать его двойной косой чертой //. Включить такой параметр можно удалением двойной косой перед словом #define.

Что нужно выставить в настройках прошивки?

1. Типы термисторов, используемых в нашем 3D принтере для измерения температуры HotEnd’а и нагревательного столика. За это отвечает параметр TEMP_SENSOR (кстати, его проще найти через поиск в меню Правка->Найти… или просто нажать Ctrl+F). Перед этим параметром есть огромная таблица значений с указанием различных наиболее распространенных термисторов. Я использовал самый распространенный термистор EPCOS 100 кОм. Поэтому в параметрах TEMP_SENSOR_0 и TEMP_SENSOR_BED я указал 1. Проверьте также, включен ли параметр PIDTEMP. По умолчанию он должен быть включен, кажется. Он нужен для включения PID-регулятора, управляющего температурой HotEnd’а.

2. Режим нагрева нагревательного столика. Я использовал нагревательный столик на 220 V, подключаемый через реле на 12 V. Если вы не дай Бог купили нагревательный столик на 12 V, то сдайте его обратно в магазин — он наверняка поплавит вам все соединительные клеммы. Все дело в том, что ток 12-ти вольтового столика просто дикий. Разделите его мощность на напряжение и получите ток. Например, для 200 Ваттного столика на 12 вольт ток будет около 17 Ампер! Под такой столик вам не помешал бы отдельный блок питания. А у моего столика 220 Вытт на 220 Вольт ток всего около 1 Ампера, и греться будет только столик, а не провода и клеммники.

Так вот, для столика на 220 Вольт нужно отключить PID-регулирование, иначе реле будет щелкать как оголтелое, и быстро выйдет из строя. Для этого закомментируем строку

//#define PIDTEMPBED

3. Настраиваем кинематику. Я собирал 3D принтер с кинематикой CoreXY, поэтому ищем параметр COREXY и включаем его в настройках, удалив двойную косую //.

#define COREXY

О достоинствах кинематики CoreXY немного говорится в статье про 3D принтер своими руками. Коротко говоря — круче CoreXY пока нет ничего! Разве что только Delta-робот.

4. Настраиваем размеры рабочей зоны. Стандартные нагревательные столики идут размером 200 х 200 мм. Но их нужно еще как-то крепить, поэтому я сделал небольшой отступ по 10 мм от краев, поэтому рабочая зона 200 — 10 х 2 = 180 мм.

#define X_MAX_POS 180
#define X_MIN_POS 0
#define Y_MAX_POS 180
#define Y_MIN_POS 0
#define Z_MAX_POS 100
#define Z_MIN_POS 0

5. Включаем автокалибровку уровня нагревательного столика. На самом деле автокалибровку себе я не делал, но без этого параметра не работает функция безопасной парковки по оси Z:

#define ENABLE_AUTO_BED_LEVELING

И теперь, собственно, включаем безопасную парковку по Z:

#define Z_SAFE_HOMING

О том, что дает безопасная парковка и как она работает, я расскажу немного ниже.

6. Настраиваем скорости перемещений по осям. По мере развития вашего 3D принтера эту настройку нужно будет повторить несколько раз, подстраиваясь под разные моторы.

  • HOMING_FEEDRATE — скорость парковки для каждой из трех осей в миллиметрах в минуту. Для наглядности в прошивке лучше писать скорость в миллиметрах в секунду и умножать на 60, например {80*60, 80*60, 4*60, 0}. В фигурных скобках идут настройки для осей X, Y, Z и E (экструдера).
  • DEFAULT_AXIS_STEPS_PER_UNIT — число шагов для двигателя, требуемое для перемещения оси на 1 миллиметр. Для определения этого числа мы число шагов шагового двигателя на один полный оборот умножаем на делитель микрошагового режима, если он у вас включен (если нет, то на умножаем на 1), и делим на шаг резьбы для винтовых передач или длину ремня на один оборот для ременных передач. Длину ремня на один оборот можно найти, умножив число зубьев шкива на шаг ремня. Для моего принтера получились такие значения: {200*1/(2.0*20), 200*1/(2.0*20), 200*1/1.25, 100*1/23.0}, т.е. по оси X и Y у меня работают шаговики с 200 шагами на один полный оборот, микрошаг у меня отключен (множитель — 1), я применяю зубчатый ремень GT2 с шагом 2мм и шкивы на моторах с 20-ю зубами. На оси Z у меня строительная шпилька с шагом 1.25 мм, а на экструдере у меня моторчик со 100 шагами на один оборот, и шестеренка с длиной внешней окружности 25.0 мм (23.0 — это с учетом вгрызания шестеренки в пластик прутка).
  • DEFAULT_MAX_FEEDRATE — максимальная скорость перемещения по осям в миллиметрах в секунду. У меня {200, 200, 5, 100}.
  • DEFAULT_MAX_ACCELERATION — максимальные ускорения по осям. Мои значения {400, 400, 10, 10000}. Ускорения обычно зависят от максимально возможной скорости. Чем выше возможная скорость, тем выше можно поставить ускорения. Для экструдера вообще ускорение ставится максимальное, потому как экструдер работает в дискретном режиме.

Из основных настроек вроде все. Если чего забыл — допишу потом.

После всех изменений, сохраняем файл Configuration.h (Ctrl+S). Перед заливкой прошивки проверьте подключение контроллера по USB. Также в Arduino IDE проверьте настройки в меню Сервис->Плата… (Нужно поставить «Arduino Mega 2560 или Mega ADK»), а также Сервис->Последовательный порт… Обычно после подключения контроллера по USB нужный порт в этом пункте меню появляется автоматически. Теперь запускаем заливку Файл->Загрузить (Ctrl+U) или просто нажмите кнопку со стрелочкой (вторая слева в панельке под меню). Несколько секунд подождем, пока в строке состояния внизу не появится «Загрузка завершена». Если выскочат оранжевые ошибки, значит где-то чего-то не так наменяли. Нужно снова распаковать архив с прошивкой Marlin в эту же папку с заменой всех файлов. А можно просто где-то сохранить исходный Configuration.h и в случае ошибок просто перезаписать его поверх испорченного.

Первый запуск 3D принтера

Итак, волнующий момент — первый запуск 3D принтера!

Для управления своим 3D принтером я использую Repetier-Host. При его установке он сам скачивает последнюю версию слайсера Slic3r для нарезки 3D-моделей на слои.

После установки этих программ, нужно тоже немножко ковырнуть настройки. Заходим в меню Конфигурация->Настройки принтера. Там во вкладке Соединение устанавливаем

  • Последовательное соединение и Порт (можно auto).
  • Скорость в бодах = 250000.

Во вкладке Принтер ставим

  • Скорость перемещения = 4800 мм/мин (у меня пока такая с моими шаговичками с током на 0,4 А)
  • Скорость оси Z = 150 мм/мин
  • Температура экструдера начальная = 200°С (у меня ABS-пастик)
  • Температура стола начальная = 100°С (у меня все еще ABS-пластик)

Во вкладке Размеры

  • Тип принтера — Классический принтер
  • Начало X = 0, Начало Y = 0, Начало Z = Min.
  • Мин X = -100, Макс X = 90, Слева: 0
  • Мин Y = -100, Макс Y = 90, Спереди: 0
  • Ширина области печати: 190 мм
  • Глубина области печати: 190 мм
  • Высота области печати: 100 мм

Жмем ОК и понеслась :)

В верхнем левом углу программы Repetier-Host есть кнопка Подсоединить. Жмем ее, и, если в настройках Соединения мы указали все правильно, то программа подключится к нашему 3D принтеру. Далее справа есть панель с закладками. Нас пока будет интересовать закладка Управление. В ней есть все необходимые кнопки, чтобы погонять наш 3D принтер по рабочему полю, но сначала нужно припарковаться!

Парковка — это установка печатающей головки в начальное положение. Для определение начальных положений осей на 3D принтере устанавливаются так называемые концевые датчики. Это могут быть как магнитные или оптические датчики, так и обычные кнопочки-»микрушки». Я в качестве концевых датчиков использовал обычные SMD-кнопочки, напаянные на кусочки фольгированного стеклотекстолита, т.е. сделал небольшие платки с выключателями, которые привинтил к началу каждой из осей. Благо мой набор для сборки 3D принтера сделан из фанеры, в которой можно сверлить дырки где захочется :)

Кстати говоря, есть два варианта установки концевого датчика на ось Z — сверху и снизу. Снизу — это безопасный вариант, но самый долгий, потому как для поиска начала координат по оси Z столику придется отъехать на самый низ, а потом снова подняться на самый верх для начала печати. Второй вариант — установка концевика сверху. Самый быстрый, но небезопасный вариант. Как обойти все опасности парковки по оси Z, я расскажу ниже.

Перед началом парковки опустим нагревательный столик пониже на безопасное расстояние, чтобы сопло случайно не начало возить по его поверхности. Для этого клацаем на положительное направление оси Z: пару раз по +10 или сразу на +50, но только аккуратно — не врежьтесь в пол! Кстати говоря, я не так расцарапал свой каптоновый слой :) Об этом позднее…

Для начала попробуем припарковать ось X. В Repitier-Host есть кнопочки для отдельной парковки каждой из осей (домики с буквами X, Y и Z). Жмем домик с X, и смотрим, как головка мчится к концевому датчику оси X, ткается об него, после чего слегка отъезжает на заданное расстояние. Все ОК!

Если же головка уперлась в датчик, но двигатель продолжает пытаться ее протолкнуть дальше, и рычит, как дикий зверь, значит с датчиком что-то не так. Возможно, вы его не туда воткнули. Проверьте схему подключения вашего датчика к плате RAMPS.

Бывает так, что головка начинает ехать не в ту сторону. В этом случае нужно инвертировать направление оси в прошивке контроллера. За это отвечает параметр INVERT_X_DIR. У меня стоят вот такие настройки для направлений осей:

#define INVERT_X_DIR true
#define INVERT_Y_DIR false
#define INVERT_Z_DIR true

Иногда проще перевернуть коннектор шагового двигателя наоборот, чтобы поменять обмотки между собой, чем перезаливать прошивку.

Вообще говоря, для кинематики CoreXY, наверное, нельзя поехать «не туда». Либо сразу поедет куда надо, либо будет клинить и перемещаться диагонально, потому как в кинематике CoreXY оба двигателя работают синхронно даже для перемещения по одной из осей. В общем, если клинит или едет по диагонали, значит один из двигателей надо инвертировать. А вот какой именно — это уже зависит от того, с какой из углов своего 3D принтера вы хотите сделать началом координат.

Пробуем повторить процедуру с осью Y — жмем на домик с буквой Y. Каретка ткается в концевик, слегка отъезжает и останавливается. Все ОК!

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

Однако не спешите радоваться! Есть и еще одна проблема с парковкой оси Z. Это крепление нагревательного стола. Когда X и Y стоят в нулях, то сопло обычно висит прямо над креплением стола, и паркуя столик по оси Z, мы обязательно ткнем этим креплением в сопло и чего-нибудь попортим. Разработчики прошивки Marlin, тем не менее, разработали механизм безопасной парковки по оси Z. О нем я говорил выше в разделе про настройку прошивки 3D принтера. Поведение этого механизма оказалось для меня немного странным. Суть его в том, что перед парковкой оси Z сопло отводится в безопасное положение — на середину стола по X и Y. Но что будет, если столик уже по оси Z находится в нуле? Правильно — парковка по X и Y как раз шибанет сопло о крепление стола!

Я решил немного модернизировать алгоритм безопасной парковки. С моей точки зрения, логичным было бы перед парковкой осей X и Y сперва опустить столик немного вниз, чтобы головка не налетела на крепление. Именно это я и сделал, модернизировав прошивку Marlin. Все операции по парковке описаны в файле Marlin_main.cpp. В функции process_commends() есть обработчик G-кода G28 (Home all Axis — припарковать все оси). Ищем в файле «case 28:» и далее  прямо перед строчкой «#ifdef QUICK_HOME» вставляем следующий код:

// Dimanjy FIX
// Опускание оси Z на заданное безопасное расстояние перед парковкой осей X и Y
current_position[X_AXIS] = 0; current_position[Y_AXIS] = 0; current_position[Z_AXIS] = 0;
destination[X_AXIS] = 0; destination[Y_AXIS] = 0;
destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1);
current_position[Z_AXIS] = 0;
feedrate = max_feedrate[Z_AXIS];
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder);
st_synchronize();
current_position[Z_AXIS] = destination[Z_AXIS];

Расстояние, на которое опустится ось Z, задается все в том же файле настроек Configuration.h в параметре Z_RAISE_BEFORE_HOMING в миллиметрах. Мне хватает 10 мм, чтобы объехать крепление стола.

Я даже записал небольшое видео модернизированного процесса парковки головки 3D принтера. Скоро выложу…

Но, наверняка, есть и другие варианты безопасной парковки. Просто я, видимо, в них пока не разобрался и решил проблему, что называется «в лоб» — по программерски.

Ну все, вроде припарковались.

Калибровка стола 3D принтера

Настройка 3D принтера у нас еще в самом разгаре! Перед первой печатью необходимо очень точно выставить параллельность стола 3D принтера к его печатающей головке. Для этого в конструкции большинства 3D принтеров предусмотрены подпружиненные регулировочные винты. Гоняя печатную головку по всем четырем углам, мы аккуратно подкручиваем винты и добиваемся минимального расстояния от стола до печатающей головки. Я для этого использую ровный квадратный кусок бумаги. Если бумага между соплом и столом проходит с трудом — можно считать, что сопло находится на минимальном расстоянии от стола. Если бумага застревает, то мы придавили сопло столиком — нужно слегка подтянуть винт и увеличить зазор. И так несколько раз по кругу.

Если учесть, что само стекло (или из чего там у вас сделан столик) ровное, то настройку можно делать только по углам. Однако и стекло бывает кривое, поэтому лучше делать регулировку в той области, в которой будет происходить печать.

Первая печать на 3D принтере

Итак, самый волнующий момент — первая печать!

 

  • Роман

    Добрый день!
    А у Вас не возникало такой проблемы:
    при печати из Cura, после прогрева стола и хотенда, каретка и стол паркуются в дом, а затем стол почему-то уезжает вниз.
    С чем это может быть связанно?

    • http://tech.dimanjy.com/ Dimanjy

      С настройками, вероятно. Или в G-коде что-то не то. Я из Cura не печатал, честно говоря.

      • Роман

        Нашел в чем причина:

        #define X_HOME_DIR -1
        #define Y_HOME_DIR 1
        #define Z_HOME_DIR 1

        #define X_MIN_POS 0
        #define Y_MIN_POS 0
        #define Z_MIN_POS 0
        #define X_MAX_POS 354
        #define Y_MAX_POS 354
        #define Z_MAX_POS 250

        Сначала стол паркуется в 0 (#define Z_MIN_POS 0), а затем отсчитывает 250 мм вниз (#define Z_MAX_POS 250) и начинает печатать.

        Если изменить нижние две строчки таким образом:

        #define Z_MIN_POS 250
        #define Z_MAX_POS 0

        то стол едет на парковку вниз, но там у меня концевика нет.

        И почему-то не получается изменить концевик на минимальный т.е.

        #define Z_HOME_DIR -1
        Принтер упорно видит, при подаче команды M119, только максимальный концевик.

    • http://synxronica.com synxronica

      наверное не актуально уже, но припоминаю, что кура ближе к концу генерировала строку вида:
      g0 z-0.5
      то есть подняться на пол миллиметра вверх от текущей позиции. Однако мой принтер интерпретировал её как руководство к действию по абсолютным координатам, с последствиями аналогичным вашим.