Калибровка стола. Калибровка стола Прошивка 3d принтера prusa i3

По просьбе подписчика выкладываю пост о прошивках (Firmware) для 3D принтеров. Данный пост разделен на две части. Первая часть посвящена новичкам и ее я решил оформить в качестве FAQ, надеюсь подобное изложение материала будет кратким, понятным и ответит на большинство вопросов. Во второй части - экзотика, прошивки, которые давно покрылись слоем пыли и совсем молодые или специализированные прошивки. Эта статья так же войдет в книгу "3D Ликбез".

Более подробно про настройку написано в статье.В. Что такое прошивка для принтера?

О. Прошивка для 3D принтера - это написанный программный код, основной задачей которого является считывать и воспроизводить G-code (Специально разработанный код для ЧПУ станков). Это основная задача прошивки. Дополнительный функции, такие как вывод информации о процессе печати, печать с SD карты памяти, управление принтером через интерфейсы - это все дополнительные функции, и в разных прошивках набор этих дополнительных модулей разнообразен, как и сама идея каждой отдельной прошивки.

В. Что можно настроить в прошивке?

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

В. Какую прошивку выбрать для новичка?

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

В. В чем принципиальная разница между прошивками?

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

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

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

В. Как залить прошивку в электронику?

О. В 90% случаев у вас на руках имеется Arduino mega 2560 + Ramps 1.4. Или любая другая плата на основе Arduino mega 2560. (В противном случае, читайте вторую часть статьи). Если это так, то вам потребуются программы: Arduino IDE (для работы с файлами прошивки), Pronterface (для настройки и управлением принтера), и сама Marlin .

Первым делом устанавливаем Arduino IDE, и пытаемся подключить Arduino Mega к компьютеру. Если это удалось, и нашлись и установились все драйверы, то радуйтесь, можно двигаться дальше, в противном случае у вас либо Mega основанная на usb чипе ch340g, либо мертвая плата. Платы на ch340g дешевле, но к ним нужно искать специальный драйвер, на всякий случай оставлю его .

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

Напомню, что пошаговая инструкция хорошо описана в статье.

В. Я прошил принтер, но двигатели едут не туда/температура неправильно показывается, не загорается дисплей.

О. Самое время настроить прошивку, для этого открываем в Arduino IDE файл configuration.h и начинаем читать комментарии. Опять же, в статье, упомянутой выше есть полный перечень настроек, но почитать на русском языке о всех возможностях прошивки будет не лишним.

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

О. Сам ни раз натыкался на это, а реальная проблема была, когда первый раз начал калибровать delta принтер, каждый раз вносить изменения, перепрошивая принтер это смерти подобно. На такие случаи придумали записывать настройки в энергонезависимую память, т.н. EEPROM. Данная функция включается в конфигурации и позволяет в том же pronterface записывать изменения в принтер из консоли при помощи M-команд.

А теперь давайте подробней рассмотрим каждую из прошивок. Разобьем их пожалуй по поддерживаемой электроники.

Прошивки для Arduino (Atmel):

Прошивки для плат на основе 32-битных процессоров ARM.

Любые вопросы, вы можете задать мне лично в VK или написав в ЛС: http://vk.com/tigeer

Итак, вы собрали принтер, спаяли электронику, все включили, что делать дальше?

Первое, что необходимо сделать — скачать и залить необходимую прошивку. К разным типам плат подходят разные прошивки. Т.к. у меня плата Ramps 1.25 на базе Arduino Mega 2560, я выбрал наиболее подходящую и одобряемую людьми прошивку . В чем её преимущество: управление 2 экструдерами, чтение файлов с SD-карт и работа в автономном режиме, возможность подключения ЖК-экранчика.

Скачиваем IDE Arduino, в ней находятся все необходимые драйвера и если плата сразу не определилась, то устанавливаем драйвер arduino из папки «arduino\drivers\».

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

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

Хоть плата и подключена к USB, но определяется как com-порт.

Надеюсь вы уже скачали прошивку . Архив надо распаковать. В IDE Arduino открываем файл marlin.pde.. Вы должны увидеть следующую картину:

Среди закладок видно все файлы, которые входят в проект. Просто так заливать прошивку бессмысленно, в ней надо указать тип нашей платы. Так, переходим в закладках в файл configuration.h и на 10 строчке видим все типы плат, которые поддерживаются прошивкой:

Выбираем тип платы. Если у вас плата , то в поле #define MOTHERBOARD вписываем цифру 3, если у вас на плате 3 транзистора: 1-ый на , 2-ой на , 3-ий для fan (кулера), то пишем в этом поле 33, если вы собираетесь подключить второй экструдер, то пишите 34.

Кому не терпится запустить принтер на этом можно закончить настройку прошивки, но только в том случае, если у вас стоят все концевые датчики (6шт), экструдер имеет датчик температуры и есть нагревательный стол.

Иногда владельцу 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 - покажет качество калибровки по углам.

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

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


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

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