Калибровка стола. Калибровка стола Marlin 3d printer начальные установки

После того, как я собрал , самое время перейти к его настройке. Настройка 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-регулирование, иначе реле будет щелкать как оголтелое, и быстро выйдет из строя. Для этого закомментируем строку

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

О достоинствах кинематики CoreXY немного говорится в статье про . Коротко говоря — круче 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:

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

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-кнопочки, напаянные на кусочки фольгированного стеклотекстолита, т.е. сделал небольшие платки с выключателями, которые привинтил к началу каждой из осей. Благо мой сделан из фанеры, в которой можно сверлить дырки где захочется

Кстати говоря, есть два варианта установки концевого датчика на ось 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 = 0; current_position = 0; current_position = 0;
destination = 0; destination = 0;
destination = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1);
current_position = 0;
feedrate = max_feedrate;
plan_set_position(current_position, current_position, current_position, current_position);
plan_buffer_line(destination, destination, destination, destination, feedrate, active_extruder);
st_synchronize();
current_position = destination;

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

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

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

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

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

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

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

я упоминал, что установка на экструдер драйвера, дающего микрошаг 1/32 - вполне себе полезная вещь (хоть польза и выявляется прибором, который не имеет отметки о поверке в отделе метрологии, иными словами ногтём!). Однако, после этого может возникнуть желание заменить все драйверы на аналогичные. На многих форумах я читал, что это делает звук двигателей более музыкальным. Хочется сказать: Всё хорошо в меру. Не то, чтобы это было совсем плохо, но давайте я опишу аргументы, которые появились после копания в недрах прошивки Marlin, ведь именно она используется в качестве базовой во многих 3D-принтерах.

С чего начать? Сначала я расскажу про ускорения. Они нам пригодятся, а в текст их никуда не вставить, везде повествование будет разорвано. Так что пусть это будет как введение. Если головку рвануть резко, то будет масса проблем. Начиная от уже набивших оскомину в прошлых статьях НЧ-шумов печати, и заканчивая тем, что двигатель может при резком старте пропустить несколько шагов. Во избежание всего этого, головку разгоняют плавно. Ну, и тормозят - тоже, там это уже нужно именно для уменьшения шумов. Прошивка Marlin работает в режиме трапециевидного графика скорости.

То есть, скорость нарастает и спадает линейно на определённом участке. Угол, под которым наклонён график скорости при разгоне и торможении, как раз и задаётся параметром "Ускорение". Вот так спад частоты шагов выглядит на осциллографе (красные всплески - шаги двигателя по оси X, жёлтые - двигателя экструдера, эту осциллограмму я сохранил, когда при борьбе с ВЧ-звоном убеждался, что экструдер и правда шагает вдвое чаще, чем раньше:

Теперь поговорим о том, с какой скоростью шагает наш двигатель. Давайте спросим у самого принтера через панель связи. Я работаю в Simplify3D, но такая панель есть и в других программах:


Только надо выключить надоедливые сообщения о температуре. Вот эту галочку снимаем:



Возвращаемся на вкладку Communication, теперь надписи не мельтешат (старые, правда, остались на месте, но это не беда). Говорим принтеру M503 и нажимаем SEND



Принтер вывел много чего, причём на человеческом языке. Нас интересует вот эта строчка:

RECEIVED: echo:Steps per unit:

Steps per unit:

RECEIVED: echo: M92 X100.00 Y100.00 Z1600.00 E100.00

M92 X100.00 Y100.00 Z1600.00 E100.00

Получается, что у моего по осям X и Y на один миллиметр приходится 100 шагов. Ну, если точнее, то микрошагов.

Чудненько. Что это значит? А значит это, что для перемещения головки на 1 миллиметр, двигатели X и Y должны сделать по 100 шагов. Вообще, там выдалось намного больше информации, почитайте, это очень забавная вещь. Параметры вполне можно поменять и сохранить в EEPROM, но об этом как-нибудь в другой раз.

Пусть головка идёт со скоростью 100 мм/с. Тогда она должна за секунду делать 100*100 =10.000 шагов. То есть, двигатель работает с частотой 10 килогерц. 150 мм/c - 15 килогерц и т.п. Цифры могут быть чуть иными, они зависят от того, какие зубчатые колёса стоят на двигателях.

Из текста прошивки я узнал, что в теории бывают принтеры MZ3D-256A и MZ3D-256B, у них число шагов другое. Но давайте рассмотрим в качестве другого примера не гипотетические A и B, а реальный принтер MakerGear M2, у него прописано 88.8 шагов на миллиметр, тогда 100 мм/с будет 8.88 килогерц, 150 мм/c - примерно 13 килогерц. В общем, спросите у своего принтера, он Вам ответит, какие лично у него параметры.

Собственно, если я увеличу микрошаг двигателя с 16 до 32 шагов, то у моего принтера частоты возрастут до 20 и 30 килогерц, а у M2 (с его 88.8) - до 17 и 26 килогерц соответственно. Много это или мало? Обратимся к прошивке.

Что мы видим в прошивке Marlin? А видим мы, что двигатели обслуживаются таймером 1. Один тик таймера - один шаг. После чего процессор бросает работу с двигателями до следующего тика. Но Marlin - очень хитрая прошивка! Она настраивает таймер так, чтобы следующий тик произошёл строго вовремя! Для этого вызывается функция

unsigned short calc_timer(unsigned short step_rate) {

Как видим, в неё как раз передаётся частота работы двигателя. И что мы наблюдаем на входе? Уууу! Сначала нам встречается безобидное

if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;

Ну, тут проверяется, что частота не выше 40 КГц (для моего принтера в родном варианте это 400 мм/с, но если я сделаю микрошаг 1/32, то всего 200 мм/с). Дальше - больше

if( step_rate > 20000 ) { // If steprate > 20kHz >> step 4 times

Step_rate = (step_rate >> 2)&0x3fff;

Step_loops = 4;

Else if(step_rate > 10000 ) { // If steprate > 10kHz >> step 2 times

Step_rate = (step_rate >> 1)&0x7fff;

Step_loops = 2;

Else {

Step_loops = 1;

Перевожу на русский: Производительности процессора AtMega не хватит для того, чтобы обслуживать прерывание таймера на частоте выше 10 КГц. Поэтому если двигатель работает на скорости до 10 КГц - на одно прерывание будет один шаг. От 10 до 20 ГКц - на одно прерывание будет два шага. И от 20 до 40 КГц - четыре шага.

Собственно, вывод статьи как раз заключается в том, что всё, что ниже 10 КГц (100 мм/с для моего принтера), в прошивке Marlin, работающей на контроллере AtMega (стоящем в Arduino) будет обрабатываться равномерно. Выше - шаги будут неравномерными. Два шага, пауза, снова два шага, снова пауза. Или даже четыре шага, пауза, снова четыре шага, снова пауза.

For(int8_t i=0; i < step_loops; i++) { // Take multiple steps per interrupt (For high speed moves)

If (counter_x > 0) {

#ifdef DUAL_X_CARRIAGE

If (extruder_duplication_enabled){

Else {

If (current_block->active_extruder != 0)

WRITE(X2_STEP_PIN, !INVERT_X_STEP_PIN);

Else

WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN);

#else

WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN);

#endif

Counter_x -= current_block->step_event_count;

Count_position+=count_direction;

delayMicroseconds (2);

// Аналогично для Y, Z и экструдера

В общем, на микрошаге 1/32 двигатели становятся более музыкальными, но работают явно рывками.

Можно ли сделать равномерность? На Arduino - не уверен. Можно перетянуть это всё на ARM, там и сам процессор быстрее, и умножение/деление аппаратно выполняются, поэтому работает быстрее (а попутно можно выкинуть ассемблерные вставки и часть табличных вычислений - это в AVR без них никак, у ARMа уже компилятор преобразует сишный код к приемлемым ассемблерным командам без нашей помощи). А часть Cortexов ещё и плавающую арифметику аппаратно поддерживает (прошивка такими вычислениями просто изобилует). Лично у меня получилось это сделать начерно ровно за неделю, так что всё реально (начисто - ещё пилить и пилить, разумеется). Только не надо думать, что вот сейчас мы переделаем эти сравнения, и всё заработает! Ха! Там проверка на проверке и проверкой погоняет. Скажем, вот концовка той функции calc_timer:

if(timer < 100) { timer = 100; MYSERIAL.print(MSG_STEPPER_TOO_HIGH); MYSERIAL.println(step_rate); }//(20kHz this should never happen)

Return timer;

То есть, если частота тиков таймера выше 20 КГц - её тут снизят. В общем, возможно, надо будет ещё проверять места, где встречаются те или иные ограничения. Вот, скажем, функция расчёта движения головки с учётом ускорения (именно ради неё я приводил теорию трапециевидных скоростей)

void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exit_factor) {

Unsigned long initial_rate = ceil(block->nominal_rate*entry_factor); // (step/min)

Unsigned long final_rate = ceil(block->nominal_rate*exit_factor); // (step/min)

// Limit minimal step rate (Otherwise the timer will overflow.)

If(initial_rate <120) {

Initial_rate=120;

If(final_rate < 120) {

Final_rate=120;

Правда, здесь идёт минимальная скорость, чтобы 16 битный таймер не переполнился. Тем не менее, это показывает, что проверки могут быть спрятаны где угодно в коде. Не так-то просто обеспечить музыкальность двигателей! Однако, в принципе, всё реально. Но не так, что купили новые драйверы, поправили пару констант и всё. Та музыкальность - красивая, но обманчивая.

Заключение

В статье показано, что не факт, что имеет смысл заменять драйверы ходовых двигателей X и Y на прддерживающие микрошаг 1/32. При использовании Arduino (с контроллером на базе AVR), частота шагов может оказаться не совсем честной, если она превышает 10 килогерц. Проверка честности шагов для процессора ARM пока находится в активной фазе, но уже точно известно, что как минимум, снимать или изменять ограничения в прошивке - точно придётся.

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

Как я писал ранее, в качестве внутреннего ПО был выбран проект Marlin . Рассмотрим все необходимые действия для получения работоспособной прошивки для описанной выше конфигурации.

СРЕДА РАЗРАБОТКИ

Первым делом необходимо установить среду разработки для Arduino . Здесь, я думаю, трудностей возникнуть не должно… Сразу хочу заметить, что более ранние прошивки могут не компилироваться на свежих версиях Arduino. Для прошивки, представленной на этой странице, я пользовался Arduino 1.8.3. Скачать версию можно на сайте Arduino или инсталлятор для Windows по ссылке .

ИСХОДНИК ПРОШИВКИ

Текущая версия Marlin для работы над прошивкой Marlin-1.1.0-RC8. Для скачивания прошивки в первоисточнике перейдите по ссылке .

Следующим шагом распаковываем скачанную версию проекта Marlin в удобное для работы место диска. Для более ранних версий в папке проекта можно было заметить наличие папки «ArduinoAddons». В ней расположены дополнительные библиотеки для Arduino без которых наш проект не скомпилируется из-за активированного индикатора! Было достаточно скопировать содержимое папки «ArduinoAddons/Arduino_1.x.x/libraries» в папку с библиотеками установленной оболочки Arduino «Arduino/libraries». Для успешной компиляции требуются библиотеки LiquidCrystal и U8glib.

Для Arduino 1.8.3 и выше библиотеки потребуется установить через «Менеджер библиотек».

ПОДКЛЮЧЕНИЕ КОНТРОЛЛЕРА

На данном этапе можно подключить плату контроллера к USB порту ПК. Дополнительно драйверы на моем ПК устанавливать не пришлось — плата подключилась в систему автоматически. Но в некоторых случаях придется их установить. Процедура стандартная, драйвера находятся в папке «drivers» установленной оболочки Arduino. В результате успешной установки в диспетчере устройств в разделе «Порты (COM и LPT)» должна отобразиться плата контроллера «Arduino Mega 2560 (COM5)». Запоминаем номер порта контроллера в системе — в моем случае это COM5. Теперь все готово для работы с исходниками контроллера.

НАСТРОЙКА ПРОШИВКИ

Запускаем оболочку, открываем проект Marlin. Перед правкой кода указываем в настройках с какой платой и контроллером будет работать оболочка на каком порту «висит» плата. Все это требуется указать в разделе «Tools (Инструменты)» оболочки. Выбираем следующие настройки:
плата — «Arduino Mega or Mega 2560»;
процессор — «ATMega2560 (Mega2560)»;
порт — «COM5» (у Вас возможен другой номер порта!).
Для внесения индивидуальных настроек потребуется внести изменения в исходники библиотек.

ВКЛАДКА Configuration.h

Устанавливаем скорость обмена порта #define BAUDRATE 115200

Я установил достаточно большую скорость обмена. Здесь нужно осознавать, что работоспособность на выбранной скорости определяется не только платой контроллера, но и программой управления. Я использую Repetier Host. Она прекрасно справляется с такой скоростью:).

Выбираем плату контроллера #define MOTHERBOARD BOARD_RAMPS_14_EFB
Этой строкой указываем, что будем использовать силовую плату RAMPS 1.4 с одним экструдером, вентилятором и обогреваемым столом. В комментариях тип платы описан следующим образом:
// RAMPS 1.4 (Power outputs: Hotend, Fan, Bed)

Описание плат управляющего контроллера, поддерживаемые прошивкой, находятся во вкладке Boards.h.

Определяем какой экструдер будем использовать: #define EXTRUDERS 1

В случае, если используется блок питания с программным отключением, прошивка поддерживают возможность управлять таким БП. Для этого необходимо описать тип БП. Поскольку в моем случае управление БП не поддерживается, то: #define POWER_SUPPLY 0

Для надежной работы всей системы очень важно знать тип датчиков температуры, установленных в ХОТЭНДе и на нагреваемом столе. При заказе ХОТЭНДа и датчика температуры стола я как-то не обратил внимание на этот момент… В связи с чем пришлось сильно помучаться добиваясь стабильности подачи проволоки. Сразу рекомендую получить исчерпывающую информацию по используемым датчикам до оплаты ХОТЭНДа. Поскольку позже эту информацию скорее всего получить будет сложно (по личному опыту). В итоге и в нагревателе ХОТЭНДа у меня установлен датчик 5 типа, на столе — датчик 11 типа:

// 5: 100K thermistor — ATC Semitec 104GT-2 (Used in ParCan & J-Head) (4.7k pullup)

// 11: 100k beta 3950 1% thermistor (4.7k pullup)
#define TEMP_SENSOR_0 5
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_BED 11

Так как корпус принтера является открытым, то различные внешние возбудители (сквозняки и пр.) могут сильно влиять на температуру нагревателей. Для более точного поддержания температуры нагревателей я рекомендую использовать PID регулировку. В этом случае потребуется калибровка нагревателей! Она проходит в автоматическом режиме и опишу этот процесс ниже по тексту статьи. На данном этапе достаточно только включить PID регуляторы хотэнда и стола с коэффициентами регулировки по умолчанию.

#define PIDTEMP

#define PIDTEMPBED

Более свежие прошивки имеют в своем составе большое количество настроек, повышающих безопасность работы принтера. В частности контроль скорости нарастания температуры, минимальное и максимальное значение температуры на нагревателях и даже длину непрерывной экструзии. Мне кажется, использование данных фишек совсем не повредит. Посему настраиваем минимальную и максимальную температуру нагревателей:

#define HEATER_0_MINTEMP 5
#define BED_MINTEMP 5

#define HEATER_0_MAXTEMP 270
#define BED_MAXTEMP 140

Запрещаем холодную экструзию проволоки. При температуре ниже 170 гр. С подача осуществляться не будет:

#define PREVENT_COLD_EXTRUSION
#define EXTRUDE_MINTEMP 170

Запрещаем непрерывную подачу пластика более 200 мм:

#define PREVENT_LENGTHY_EXTRUDE
#define EXTRUDE_MAXLENGTH 200

Включаем температурную защиту нагревателей:

#define THERMAL_PROTECTION_HOTENDS
#define THERMAL_PROTECTION_BED

#define USE_XMIN_PLUG
#define USE_YMIN_PLUG
#define USE_ZMIN_PLUG

Для правильной работы оптических концевиков потребуются подтягивающие резисторы:

#define ENDSTOPPULLUPS

При использовании оптических концевиков инвертируем значение логического сигнала:

#define X_MIN_ENDSTOP_INVERTING false
#define Y_MIN_ENDSTOP_INVERTING false
#define Z_MIN_ENDSTOP_INVERTING false

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

#define ENDSTOP_INTERRUPTS_FEATURE

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

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

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

#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false
#define DISABLE_E false

Следующие строки определяют направление вращения приводов для движение в нужном направлении. Напоминаю, что значения приведены для конфигурации Mendel Prusa I3.

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

При использовании экструдера, содержащего редуктор потребуется установить:

#define INVERT_E0_DIR false

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

#define HOMING_FEEDRATE_XY (50*60)
#define HOMING_FEEDRATE_Z (2*60)

Для программного контроля перемещения в рабочем пространстве установим границы перемещения после установки принтером начальной точки:

#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS 185
#define Y_MAX_POS 185
#define Z_MAX_POS 185

Для точного перемещения по осям прошивка должна знать на сколько шагов требуется прокрутить двигатель при перемещении на 1мм:

#define DEFAULT_AXIS_STEPS_PER_UNIT { 2*80, 2*80, 2*4000, 988 } // ДЛЯ 8825 драйверов 1/32 ШАГА

Значение для двигателя экструдера приведено для WADE’S экструдера .

В этой строке прописаны значения осей X, Y, Z, E (экструдера). Все значения, кроме E вполне совпадают с расчетными величинами (по крайней мере у меня). К значению Е вернемся позже. Теорию можно прочесть на форуме RepRap .

#define DEFAULT_MAX_ACCELERATION { 2500, 2500, 250, 4000 } // МАКСИМАЛЬНОЕ УСКОРЕНИЕ

#define DEFAULT_ACCELERATION 500 // УСКОРЕНИЕ ПО УМОЛЧАНИЮ
#define DEFAULT_RETRACT_ACCELERATION 2500 // УСКОРЕНИЕ РЕТРАКТА
#define DEFAULT_TRAVEL_ACCELERATION 500 // УСКОРЕНИЕ ПРИ ПЕРЕМЕЩЕНИИ БЕЗ ПЕЧАТИ

И, пожалуй, последнее, что требуется прописать для запуска платы контроллера — подключение дисплея:

#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER

Для перехода на русский язык в меню управления принтером:

#define LCD_LANGUAGE ru

#define DISPLAY_CHARSET_HD44780 CYRILLIC

и SD карты памяти:

#define SDSUPPORT

Основные параметры настроены, можно приступать к калибровке! Но, раз уж мы ковыряем прошивку, сразу доработаем все необходимое для реализации работы в меню контроллера без ПК.

Опишем температуру преднагрева для PLA и ABS пластика:

#define PREHEAT_1_TEMP_HOTEND 180
#define PREHEAT_1_TEMP_BED 80
#define PREHEAT_1_FAN_SPEED 0

#define PREHEAT_2_TEMP_HOTEND 230
#define PREHEAT_2_TEMP_BED 115
#define PREHEAT_2_FAN_SPEED 0

Если интересно знать статистику работы принтера. Для сохранения статистики в EEPROM включим:

#define PRINTCOUNTER

Данная фишка позволит сохранять в энергонезависимой памяти контроллера следующую информацию:

— общее количество запусков на печать;
— общее количество успешных запусков на печать;
— общее количество неудачных запусков на печать;
— общее время печати.

Информацию можно получить из принтера по команде M78.

#define THERMAL_PROTECTION_HOTENDS // ВКЛЮЧИТЬ ЗАЩИТУ ДЛЯ ВСЕХ ХОТЭНДОВ
#define THERMAL_PROTECTION_BED // ВКЛЮЧИТЬ ЗАЩИТУ ДЛЯ СТОЛА

Режимы требуется настраивать индивидуально для каждой модели принтеров. Описание параметров приведу в части статьи, описывающей вкладку Configuration_adv.h.

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

// ЧИСЛО ИМПУЛЬСОВ ЭНКОДЕРА НА ОДИН ШАГ. ДЛЯ ЭКОДЕРОВ С ВЫСОКИМ РАЗРЕШЕНИЕМ
// ТРЕБУЕТСЯ УВЕЛИЧИТЬ ЗНАЧЕНИЕ

#define ENCODER_PULSES_PER_STEP 3

// КОЛИЧЕСТВО ШАГОВ ЭНКОДЕРА ДЛЯ ПЕРЕХОДА МЕЖДУ ПУНКТАМИ МЕНЮ
#define ENCODER_STEPS_PER_MENU_ITEM 2

// ИЗМЕНЕНИЕ НАПРАВЛЕНИЯ ВРАЩЕНИЯ

#define REVERSE_ENCODER_DIRECTION

ВКЛАДКА Configuration_adv.h

Прошивка поддерживает большое количество дополнительных настроек, очень помогающих в работе. Хотелось бы сразу описать те, которые я активно использую. Для перехода к расширенным настройкам открываем вкладку Configuration_adv.h.

Настройки режимов защиты по температуре:

#define THERMAL_PROTECTION_PERIOD 90 // СЕКУНДЫ
#define THERMAL_PROTECTION_HYSTERESIS 15 // ГРАДУСЫ ЦЕЛЬСИЯ

#define WATCH_TEMP_PERIOD 16 // СЕКУНДЫ
#define WATCH_TEMP_INCREASE 4 // ГРАДУСЫ ЦЕЛЬСИЯ

После включения параметра THERMAL_PROTECTION_HOTENDS при нагреве хотэнда по командам M140 или M190 принтер будет отслеживать прирост температуры! Если за период времени WATCH_TEMP_PERIOD температура не увеличивается на WATCH_TEMP_INCREASE ГРАДУСОВ, то принтер остановится и потребуется полная перезагрузка.

Для нагревателя стола тот же алгоритм защиты и переменные при условии включения THERMAL_PROTECTION_BED:

#define THERMAL_PROTECTION_BED_PERIOD 120 // СЕКУНДЫ
#define THERMAL_PROTECTION_BED_HYSTERESIS 20 // ГРАДУСЫ ЦЕЛЬСИЯ

#define WATCH_BED_TEMP_PERIOD 240 // СЕКУНДЫ
#define WATCH_BED_TEMP_INCREASE 2 // ГРАДУСЫ ЦЕЛЬСИЯ

Если для отвода тепла от платы контроллера используется вентилятор, то разумно использовать его включение программно и подключить через дополнительную недорогую плату . В прошивке при этом требуется:

1. Определить пин контроллера, задействованный для управления вентилятором охлаждения:

#define CONTROLLERFAN_PIN 6

2. Установить время, которое будет вращаться вентилятор после остановки двигателей:
#define CONTROLLERFAN_SECS 90

3. Скорость вращения вентилятора:
#define CONTROLLERFAN_SPEED 255

Очень интересная настройка:

#define FAN_KICKSTART_TIME 50

позволяет запускать вентилятор обдува фактически на любой рабочей скорости. Для этого на установленное в настройке время в миллисекундах задается максимальная стартовая скорость. После запуска установится рабочая скорость.

Для более детального управления вентилятором обдува радиатора задаем пин, скорость вращения и температура включения:

#define E0_AUTO_FAN_PIN 11
#define EXTRUDER_AUTO_FAN_TEMPERATURE 100 // ТЕМПЕРАТУРА ВКЛЮЧЕНИЯ
#define EXTRUDER_AUTO_FAN_SPEED 255 // СКОРОСТЬ ВРАЩЕНИЯ

В предыдущих статьях я упоминал, что драйвер шагового двигателя оси Z при параллельном подключении двух двигателей, существенно перегревается. Прошивка позволяет подключить второй двигатель на драйвер неиспользуемого двигателя экструдера:

#define Z_DUAL_STEPPER_DRIVERS

Пожалуй, это все самые необходимые настройки вкладки.

ВКЛАДКА Language_RU.h

После перехода на русский язык мне не понравился перевод параметров. Я сделал перевод под себя. Для этого во вкладке Language_RU.h изменил константы:

#define WELCOME_MSG MACHINE_NAME » ГОТОВ.»
#define MSG_SD_INSERTED «КАРТА УСТАНОВЛЕНА»
#define MSG_SD_REMOVED «КАРТА ИЗВЛЕЧЕНА»
#define MSG_MAIN «МЕНЮ»
#define MSG_LCD_ENDSTOPS «КОНЦЕВИК»
#define MSG_AUTOSTART «АВТОСТАРТ»
#define MSG_DISABLE_STEPPERS «ВЫКЛ. ДВИГАТЕЛИ»
#define MSG_AUTO_HOME «ПАРКОВКА»
#define MSG_LEVEL_BED_HOMING «НУЛЕВОЕ ПОЛОЖ»
#define MSG_LEVEL_BED_WAITING «НАЖМИТЕ НАЧАТЬ»
#define MSG_LEVEL_BED_NEXT_POINT «СЛЕДУЮЩАЯ ТОЧКА»
#define MSG_LEVEL_BED_DONE «УРОВЕНЬ!»
#define MSG_LEVEL_BED_CANCEL «ОТМЕНИТЬ»
#define MSG_SET_HOME_OFFSETS «ЗАПОМНИТЬ ПАРКОВКУ»
#define MSG_HOME_OFFSETS_APPLIED «КОРРЕКЦИИ ПРИМЕН»
#define MSG_SET_ORIGIN «ЗАПОМНИТЬ НОЛЬ»
#define MSG_PREHEAT_1 «ПРЕДНАГРЕВ PLA»
#define MSG_PREHEAT_1_N «ГРЕТЬ ФОРСУНКУ «
#define MSG_PREHEAT_1_ALL «ГРЕТЬ ВСЕ»
#define MSG_PREHEAT_1_BEDONLY «ГРЕТЬ СТОЛ»
#define MSG_PREHEAT_1_SETTINGS «НАСТРОЙКИ PLA»
#define MSG_PREHEAT_2 «ПРЕДНАГРЕВ ABS»
#define MSG_PREHEAT_2_N «ГРЕТЬ ФОРСУНКУ «
#define MSG_PREHEAT_2_ALL «ГРЕТЬ ВСЕ»
#define MSG_PREHEAT_2_BEDONLY «ГРЕТЬ СТОЛ»
#define MSG_PREHEAT_2_SETTINGS «НАСТРОЙКИ ABS»
#define MSG_COOLDOWN «ОХЛАЖДЕНИЕ»
#define MSG_SWITCH_PS_ON «ВКЛЮЧИТЬ ПИТАНИЕ»
#define MSG_SWITCH_PS_OFF «ОТКЛЮЧИТЬ ПИТАНИЕ»
#define MSG_EXTRUDE «ЭКСТРУЗИЯ»
#define MSG_RETRACT «ВТЯГИВАНИЕ»
#define MSG_MOVE_AXIS «ДВИЖЕНИЕ ПО ОСЯМ»
#define MSG_LEVEL_BED «КАЛИБРОВАТЬ СТОЛ»
#define MSG_MOVE_X «ДВИЖЕНИЕ ПО X»
#define MSG_MOVE_Y «ДВИЖЕНИЕ ПО Y»
#define MSG_MOVE_Z «ДВИЖЕНИЕ ПО Z»
#define MSG_MOVE_E «ЭКСТРУДЕР»
#define MSG_MOVE_01MM «ДВИЖЕНИЕ XYZ 0.1мм»
#define MSG_MOVE_1MM «ДВИЖЕНИЕ XYZ 1мм»
#define MSG_MOVE_10MM «ДВИЖЕНИЕ XY 10мм»
#define MSG_SPEED «СКОРОСТЬ»
#define MSG_BED_Z «Z СТОЛА»
#define MSG_NOZZLE LCD_STR_THERMOMETER » СОПЛО»
#define MSG_BED LCD_STR_THERMOMETER » СТОЛ»
#define MSG_FAN_SPEED «КУЛЕР»
#define MSG_FLOW «ПОТОК»
#define MSG_CONTROL «НАСТРОЙКИ»
#define MSG_MIN LCD_STR_THERMOMETER » МИНИМУМ»
#define MSG_MAX LCD_STR_THERMOMETER » МАКСИМУМ»
#define MSG_FACTOR LCD_STR_THERMOMETER » ФАКТОР»
#define MSG_AUTOTEMP «АВТОТЕМПЕРАТУРА»
#define MSG_ON «ВКЛ. «
#define MSG_OFF «ОТКЛ. «
#define MSG_PID_P «PID-P»
#define MSG_PID_I «PID-I»
#define MSG_PID_D «PID-D»
#define MSG_PID_C «PID-C»
#define MSG_ACC «Acc»
#define MSG_VX_JERK «Vx-РЫВОК»
#define MSG_VY_JERK «Vy-РЫВОК»
#define MSG_VZ_JERK «Vz-РЫВОК»
#define MSG_VE_JERK «Ve-РЫВОК»
#define MSG_VMAX «Vmax «
#define MSG_VMIN «Vmin»
#define MSG_VTRAV_MIN «VПутеш. min»
#define MSG_AMAX «Amax»
#define MSG_A_RETRACT «A-ВТЯГИВАНИЕ»
#define MSG_A_TRAVEL «A-ПУТЕШ.»
#define MSG_XSTEPS «X шаг/мм»
#define MSG_YSTEPS «Y шаг/мм»
#define MSG_ZSTEPS «Z шаг/мм»
#define MSG_ESTEPS «E шаг/мм»
#define MSG_TEMPERATURE «ТЕМПЕРАТУРА»
#define MSG_MOTION «МЕХАНИКА»
#define MSG_VOLUMETRIC «ПРУТОК»
#define MSG_VOLUMETRIC_ENABLED «E в mm3»
#define MSG_FILAMENT_DIAM «ДИАМЕТР ПРУТКА»
#define MSG_CONTRAST «КОНТРАСТ LCD»
#define MSG_STORE_EPROM «СОХРАНИТЬ В EEPROM»
#define MSG_LOAD_EPROM «СЧИТАТЬ ИЗ EEPROM»
#define MSG_RESTORE_FAILSAFE «СБРОС EEPROM»
#define MSG_REFRESH «ОБНОВИТЬ»
#define MSG_WATCH «ОБЗОР»
#define MSG_PREPARE «ДЕЙСТВИЯ»
#define MSG_TUNE «НАСТРОЙКИ»
#define MSG_PAUSE_PRINT «ПАУЗА ПЕЧАТИ»
#define MSG_RESUME_PRINT «ПРОДОЛЖИТЬ ПЕЧАТЬ»
#define MSG_STOP_PRINT «ОСТАНОВИТЬ ПЕЧАТЬ»
#define MSG_CARD_MENU «ОБЗОР КАРТЫ»
#define MSG_NO_CARD «НЕТ КАРТЫ»
#define MSG_DWELL «СОН…»
#define MSG_USERWAIT «ОЖИДАНИЕ»
#define MSG_RESUMING «ВОЗОБНОВЛЕНИЕ…»
#define MSG_PRINT_ABORTED «ОТМЕНА ПЕЧАТИ»
#define MSG_NO_MOVE «НЕТ ДВИЖЕНИЯ.»
#define MSG_KILLED «УБИТО.»
#define MSG_STOPPED «ОСТАНОВЛЕНО.»
#define MSG_CONTROL_RETRACT «ВТЯГИВАНИЕ,мм»
#define MSG_CONTROL_RETRACT_SWAP «ВТЯГ. СМЕНЫ,мм»
#define MSG_CONTROL_RETRACTF «ВТЯГИВАНИЕ V»
#define MSG_CONTROL_RETRACT_ZLIFT «ВТЯГ. ПРЫЖКА,мм»
#define MSG_CONTROL_RETRACT_RECOVER «ВОЗВРАТ +мм»
#define MSG_CONTROL_RETRACT_RECOVER_SWAP «ВОЗВРАТ СМЕНЫ +мм»
#define MSG_CONTROL_RETRACT_RECOVERF «ВОЗВРАТ V»
#define MSG_AUTORETRACT «АВТО ВТЯГИВАНИЕ»
#define MSG_FILAMENTCHANGE «СМЕНА ПРУТКА»
#define MSG_INIT_SDCARD «ИНИЦ. КАРТУ»
#define MSG_CNG_SDCARD «СМЕНИТЬ КАРТУ»
#define MSG_ZPROBE_OUT «Z ДАТЧИК ВНЕ СТОЛА»
#define MSG_HOME «ПАРКУЙ X/Y ПЕРЕД Z»
#define MSG_FIRST «ПЕРВЫЙ»
#define MSG_ZPROBE_ZOFFSET «СМЕЩЕНИЕ Z»
#define MSG_BABYSTEP_X «МИКРОШАГ X»
#define MSG_BABYSTEP_Y «МИКРОШАГ Y»
#define MSG_BABYSTEP_Z «МИКРОШАГ Z»
#define MSG_ENDSTOP_ABORT «СРАБОТАЛ КОНЦЕВИК»
#define MSG_HEATING_FAILED_LCD «РАЗОГРЕВ НЕ УДАЛСЯ»
#define MSG_ERR_REDUNDANT_TEMP «ОШИБКА:СЛИШКОМ ГОРЯЧО»
#define MSG_THERMAL_RUNAWAY «ТЕПЛО УБЕГАНИЯ!»
#define MSG_ERR_MAXTEMP «ОШИБКА: Т макс.»
#define MSG_ERR_MINTEMP «ОШИБКА: Т мин.»
#define MSG_ERR_MAXTEMP_BED «ОШИБКА:Т макс.стол»
#define MSG_ERR_MINTEMP_BED «ОШИБКА:Т мин.стол»
#define MSG_HEATING «ГРЕЮ ФОРСУНКУ…»
#define MSG_HEATING_COMPLETE «НАГРЕВ ВЫПОЛНЕН»
#define MSG_BED_HEATING «ГРЕЮ СТОЛ…»
#define MSG_BED_DONE «СТОЛ РАЗОГРЕТ»
#define MSG_DELTA_CALIBRATE «КАЛИБРОВКА DELTA»
#define MSG_DELTA_CALIBRATE_X «КАЛИБРОВАТЬ X»
#define MSG_DELTA_CALIBRATE_Y «КАЛИБРОВАТЬ Y»
#define MSG_DELTA_CALIBRATE_Z «КАЛИБРОВАТЬ Z»
#define MSG_DELTA_CALIBRATE_CENTER «КАЛИБРОВАТЬ ЦЕНТР»

ОТЛАЖЕННАЯ ПРОШИВКА

Тем, кто собрал таки свою Прушу, выкладываю свою версию прошивки. Прошивка полностью отлажена и позволит сразу запустить принтеры и .

УПРАВЛЯЮЩАЯ ПРОГРАММА

Этап правки исходников можно считать завершенным. Если плата контроллера еще не подключена к порту, подключаем и жмем «Файл/Вгрузить»! После загрузки прошивки принтер готов к работе… Через меню интерфейсной платы доступно управление движением каретки по всем осям с разными шагами, включение/выключение нагревателей ХОТЭНДа и стола, печать с карты памяти и многие другие удобные фишки без использования ПК. Но для завершения калибровки принтера не достаточно функциональности меню и нам потребуется программная оболочка. Из тех, что я попробовал, мне больше подошла программа Repetier Host. Она обладает удобным интерфейсом, хорошим функционалом и что не менее важно вместе с ней мы получаем слайсеры в комплекте. Скачивание доступно на официальном сайте Repetier Host .
Приступаем к работе в программной оболочке. Вид окна программы представлен на рисунке ниже.

После запуска программы необходимо настроить параметры соединения с принтером. Выполняем задачу через меню «Конфигурация/Настройки принтера» или жмем соответствующую иконку.


На вкладке «Соединение» прописываем тип соединения — Serial Connection, номер порта — COM5 (как пример для моей системы), и скорость обмена, выбранную на этапе компиляции прошивки — 256000 (как пример для моей системы).


На вкладке «Принтер» настройки скоростей можно оставить по умолчанию. «Контроль температур панели и экструдера» и «Printer has SD card» включаем обязательно! На этой вкладке доступно поменять направление вращения осей принтера (на случай если в прошивке этот параметр указан неверно).


На вкладке «ЭКСТРУДЕР» потребуется установить диметр сопла, номер экструдера и ограничение температуры стола и ХОТЭНДа.


Вкладка «Размеры» содержит настройки размеров печатного поля и тип подключенного принтера — в нашем случае «Classic Printer». У меня установлены размеры стола 180мм х 180мм по причине того, что я использую дополнительный вентилятор для обдува места печати и приспособление для регулировки уровня стола «на лету». В углах эти приспособления мешают друг другу при работе на весь стол.
Если настройки принтера указаны верно, то после нажатия иконки «Подсоединить», контроллер перезагрузится, изображение на кнопке изменит цвет на зеленый. Принтер полностью готов к работе!
Продолжение следует…

Любое периферическое устройство, чтобы обеспечивать возложенную функциональность, должно работать с программным обеспечением уровня firmware. 3D принтеры в этом отношении не являются исключением. Благодаря придуманному в 1964 году принципу универсальных интерфейсов, основная часть программного обеспечения и электронных компонентов является совместимой. Это подразумевает использование одного программного кода для целого ряда устройств, относящихся к определенному типу.

Все 3D принтеры работают на одном программном коде

Принципы обновления firmware для устройств

Согласно новой парадигме программный софт и аппаратная часть выполняется в рамках проектов с открытым исходным кодом. Именно в рамках такого проекта разрабатываются полупрофессиональные 3D принтеры. Для них существует универсальная прошивка Marlin, рассчитанная на работу с микроконтроллерными платами ArduinoMega и RAMPS Shield v.1.4. Соответственно, прошивка для 3d принтера Marlin совместима со всеми моделями, в которых они использованы. Перед выполнением работ потребуется установить плату RAMPS shield в ArduinoMega и сделать действия, описанные ниже.

Для перепрошивки устройства понадобится плата RAMPS Shield

Проблема данного ПО в отношении пользователей состоит в том, что софт не обновляется автоматически, как это характерно для компьютеров.

Новые версии нужно устанавливать самостоятельно, используя файлы, доступные на сайте Marlin.

После установки выполняется настройка прошивки 3d принтера.

На сайте Marlin необходимо скачать последнюю версию Arduino

Общий процесс соответствует следующей последовательности:

  • файлы скачиваются с сайта Marlin;
  • затем компилируются в среде Arduino IDE;
  • после этого записываются на управляющую плату RAMPS shield.

Чтобы обновить прошивку, нужно самостоятельно скачать файлы и проделать описанные действия. Для всех моделей действия аналогичны, включая модель PRUSA I3.

Все действия нужно производить на вкладке Configuration.h

Инструкция по установке и настройке Марлин для 3д-принтеров

Подготовка прошивки для платы состоит в подготовке конфигурационных настроек Марлин в компиляторе. Что это значит? Arduino IDE имитирует наличие принтера и делает компиляцию программного кода для RAMPS shield с помощью ArduinoMega 2560, чтобы готовый файл можно было записать на контроллер. Если общий принцип, что нужно делать, понятен, то настройка параметров может вызвать определенные сложности. В этом случае вы всегда можете обратиться к специалисту, который работает с моделями PRUSA I3, Anet A2, TevaTarantula.

Для начала прошивки нужно выбрать контролер (motherboard)

Определим основные этапы компилирования файла, которые включает настройка прошивки Marlin для 3d принтера:

  • Потребуется установить среду Arduino IDE, иметь при себе плату ArduinoMega, в нее нужно вставить программируемую принтерную RAMPS Shield v.1.4;
  • Также нужно скачать новую версию прошивки Марлин, распакуйте архив и откройте файл Configuration.h в Arduino IDE;
  • Далее настраивается среда компиляции, в меню «Инструменты» найдите Arduino/GenuinoMegaorMega 2560, отмечаем эту же плату в выпавшем списке ArduinoMega 2560;
  • Требуется настройка кода в Ардуино, именно эта часть вызывает определенные сложности у новичков. Так что если вы не уверены в своих силах, как минимум, не спешите записывать свой файл на контроллер. Дело в том, что проводится настройка технических параметров, в том числе, отвечающих за остановку работы, чтобы исключить повреждения компонентов (основные моменты смотрите ниже);
  • После внесения изменений в конфигурацию нажмите в окне кода «Проверить», при наличии ошибок, проверьте код повторно;
  • После прохождения проверки нажмите кнопку «Сохранить»;
  • Затем нажмите «Загрузка», очевидно, что для этого требуется подключение к разъемам платы.

Настройка файла Configuration.h в Ардуино

Описание этого процесса требует отдельного довольно объемного обзора, поэтому поясним определенные моменты:

  • Устанавливается скорость передачи данных. Обычно 250000 бод/с или другая, поддерживаемая компьютером;
  • Тип платы: rampsshield v.1.4, указав в конце строки efb (extruder, fan, bed – экструдер, вентилятор, стол) даже при отсутствии каких-то функций (подогрева стола и вентилятора);
  • Настройки датчика температуры – установите в «1» на используемые датчики;
  • Минимальная температура работы – устанавливается 5, это имеется в виду 5 градусов цельсия;
  • Максимальная температура – установите 230 с для экструдера, 120 с устанавливается для стола;
  • Проверка соответствия температуры материала и начала работы, можно отключить командой м302, также отключается пролонгированное выдавливание, имеющее лаг запаздывания, но обеспечивающее плавную работу;
  • Требуется настроить механику: концевые выключатели, подтягивающие резисторы и другие. В процессе обычно делается проверка правильной работоспособности;
  • Необходимо также настроить шаговое движение по осям.

Описание самого процесса в Ардуино можно почитать по ссылке , конечно, процесс требует понимания своих действий. Если вы не уверены в своих силах, обратитесь к специалисту. После записи корректного файла обновление для PRUSA I3, Anet A2, TevaTarantula будет готово. Прошивка для 3d принтера I3 PRUSA требует учитывать параметры именно данного устройства, воспользуйтесь оригинальными рекомендациями по обновлению конфигурации.

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

Для начала отмечу, что своё мастерство я оттачивал на принтере SmartCore Aluminium , приобретённом .

Установка нагревательной платформы

Нагревательную (или не нагревательную, зависит от принтера) платформу для начала надо выставить по высоте. Для этого существует концевик для оси Z.

Из википедии:

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

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

Для дальнейшей калибровки будем использовать Pronterface из пакета ПО Printrun .

Преимуществом этого пакета вижу наглядное и удобное управление соплом и платформой принтера, но если кому-то удобнее использовать Repsnapper , он тоже вполне подойдёт. Cura не подойдёт для калибровки, за неимением необходимого для этого функционала.

Для продолжения давайте убедимся, что при нажатии на кнопку «Калибровка» («Home», изображен белый домик), платформа поднимается и упирается вплотную, но не пытается двигаться дальше, к соплу.
Так-как на моём принтере прошивка взята с напрямую с репозитория SmartCore Aluminium (пусть и не напрямую с Marlin), сопло выезжает на середину платформы. Если у вас это не так, и сопло остаётся в углу по нулевых координатах - ничего страшного, для дальнейшей калибровки это не принципиально.

Калибровка

Следующие действия надо поочерёдно провести на центре, по углам и по контрольному кругу:

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

Проверка

Для проверки я использую простую модель , нарисованную в FreeCAD и cгенерированный gcode в Cura. Пластик чем точнее диаметром, тем лучше - я беру из-за заявленной точности и разнообразия цветов. Впрочем, для проверки будем использовать натуральный цвет ABS-пластика.
Смысл простой маленькой проверочной модели, наверное, ясен - экономия средств и времени.

Именно в такой последовательности есть смысл проверять. Впрочем, если вы уверены в своей калибровке, то можете сразу начать с шага 2. Ну если у вас уже есть опыт и вы абсолютно уверены в своей калибровке, то можете сразу перейти к шагу 3 - распечатывать 5pad.gcode.
Разница в количестве и расположении изделий.
Я же опишу проверку первого шага, поскольку остальные аналогичны.
Предположим, одна сторона платформы слишком высоко откалибрована. Это очень легко обнаружить в результате:

Вид сверху:


И что важнее сейчас для нас - вид снизу:

- вот так выглядит ободная кайма Cura, если сопло расположено слишком высоко к платформе. Пластик падает не точно, иногда цепляясь за соседние линии.

Рассмотрим обратную ситуацию - если сопло слишком прижато к платформе:



Как видим, здесь тоже не всё гладко, пластик, стремясь заполнить доступное пространство, налазит на соседние линии, а на следующем слое повторно цепляется сопло, вмазывается вновь по доступному пространству. Впрочем, надо отметить, что прилипает в таком случае модель очень хорошо, а дефект калибровки не виден на следующих слоях. Более того, может быть даже не заметен вовсе, если вы выберете в Cura подложку для прилипания модели к столу.

Наконец, желаемый и правильный результат:



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

Нормальная ситуация, если такой результат получен на стекле при температуре 100 градусов. При этом, если стекло обезжирено и ровное, то после окончания калибровки, отлипать в процессе печати не будет. Вы можете попробовать отодрать деталь от нагретой платформы после печати. Пока не остынет до 90-80 градусов, у вас это может, даже и не получится, без повреждения стекла. Также, может быть важным отсутствие сквозняка, который влияет на не менее важную равномерность прогрева поверхности платформы.

Вот общие фото для удобства сравнения:

Вид сверху:

Вид снизу:

Дальнейшая проверка аналогична по своей сути, но распечатать следует 4pad.gcode - охватывает немного большую центральную область. И 5pad.gcode - покажет качество калибровки по углам.

Всем удачной калибровки!

На завершение развлекательное видео, на котором отображено наслаждение результатом:


Как видно, печатаю я не на стекле, но об этом в следующей статье.

Похожие публикации