ВСТУПЛЕНИЕ

Все узлы и механизмы принтера, включая электронику, исправно заработали. Настало время выполнить персонализацию принтера. Под персонализацией я подразумеваю не только задание габаритов области печати, русификацию меню, но и добавление функций, полезных при печати принтером, настройку правильной работы этих функций. В статье рассмотрю детальную настройку прошивки MARLIN 2. MARLIN 2 сконфигурирована таким образом, что в основное окно выведены только основные конфигурационные файлы – Configuration.h и Configuration_adv.h. Именно в этих файлах требуется искать перечисленные в статье настройки. Если потребуется внести изменения в дополнительные файлы, укажу отдельно!

Поехали…

ГАБАРИТЫ ЗОНЫ ПЕЧАТИ ПРИНТЕРА

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

Самое время настроить максимальные значения перемещений принтера (геометрию), позиционирование форсунки после установки начального положения (срабатывания концевиков).

// РАЗМЕР СТОЛА
#define X_BED_SIZE 260
#define Y_BED_SIZE 310

Значениями задаются размеры области печати по осям X и Y.

// ПРЕДЕЛЫ ПЕРЕМЕЩЕНИЯ ПОСЛЕ ПОЗИЦИОНИРОВАНИЯ, СООТВЕТСТВУЮЩИЕ КОНЕЧНЫМ ПОЗИЦИЯМ
#define X_MIN_POS -12
#define Y_MIN_POS -7
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE

// ЛИМИТ ПО Z ДЛЯ КАРЕТКИ
#define Z_MAX_POS 300

Как видно из комментариев и наименования переменных, задаются значения для минимальных и максимальных возможных перемещений принтера.

Отдельно можно дать комментарий по минимальным значениям осей X и Y. Некоторые принтеры спроектированы таким образом, что при парковке головки в начальное положение, форсунка выходит за рабочий стол. ORTUR-4 попадает в эту категорию. Для компенсации как раз и удобно использовать переменные X_MIN_POS и Y_MIN_POS. В них задается смещение от точки парковки до начала рабочего стола принтера. Прошивка будет автоматически компенсировать заданные значения при перемещениях, правильно выводя форсунку в рабочее пространство.

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

ПАРКОВКА

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

// СКОРОСТЬ ПАРКОВКИ (mm/m)
#define HOMING_FEEDRATE_XY (100*60)
#define HOMING_FEEDRATE_Z (20*60)

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

// ЗАПРЕТ ДВИЖЕНИЯ ДО ВЫПОЛНЕНИЯ ПОЗИЦИОНИРОВАНИЯ
#define NO_MOTION_BEFORE_HOMING

Лично я, включением функции, запрещаю любые перемещения до установки нуля (парковки).

// МИНИМАЛЬНАЯ ВЫСОТА ГОЛОВКИ ПРИ АВТОУСТАНОВКЕ НУЛЯ –
// БЕЗОПАСНАЯ ВЫСОТА ДЛЯ ГАРАНТИИ ОТСУТСТВИЯ КАСАНИЯ СТОЛА ПРИ ПЕРЕМЕЩЕНИИ
#define Z_HOMING_HEIGHT 10

// ОТВОД ГОЛОВЫ ОТ НУЛЯ ПО Z ПОСЛЕ АВТОУСТАНОВКИ НУЛЯ
#define Z_AFTER_HOMING 10

Значение, указанное в Z_HOMING_HEIGHT, позволяет поднимать форсунку на безопасную высоту при установке нуля по осям X и Y. Другими словами, принтер автоматически приподымает форсунку на указанную высоту для последующего смещения головки к нулевым точкам X и Y.

// НЕ ВЫПОЛНЯТЬ ПОДНЯТИЯ ГОЛОВЫ, ЕСЛИ КООРДИНАТА Z НЕ УСТАНОВЛЕНА (НЕ ВЫПОЛНЕНА АВТОУСТАНОВКА НУЛЯ)
#define UNKNOWN_Z_NO_RAISE

Данная переменная запускает контроль установки нуля для подъема форсунки. Как понятно из названия, запрещает делать подъем при отсутствии выполненной парковки. Это очень полезно тем, кто отводит форсунку на максимальную высоту по окончании печати. После включения принтера и начальной установки нуля в этом случае каретка не упрется в механизмы. Но установка нуля будет проходить без подъема форсунки!

В прошивке MARLIN организован отскок (bump) от концевого датчика и приближение с меньшей скоростью для более точного позиционирования.

// ПОЗИЦИИ ОТСКОКА ПРИ АВТОУСТАНОВКИ НУЛЯ – ВОЗВРАТ НА УКАЗАННУЮ ДИСТАНЦИЮ И ПОВТОРНОЕ ДВИЖЕНИЕ К КОНЦЕВИКУ
// С УМЕНЬШЕННОЙ СКОРОСТЬЮ
#define X_HOME_BUMP_MM 3
#define Y_HOME_BUMP_MM 3
#define Z_HOME_BUMP_MM 2
#define HOMING_BUMP_DIVISOR { 2, 2, 2 } // ДЕЛИТЕЛИ ДЛЯ СКОРОСТИ ВОЗВРАТА К КОНЦЕВИКУ ПОСЛЕ ОТПРЫГИВАНИЯ
#define QUICK_HOME // ТРАЕКТОРИЯ ПО ДИАГОНАЛИ ПРИ ПОЗИЦИОНИРОВАНИИ ОСЕЙ X, Y
// #define HOMING_BACKOFF_MM { 12, 7, 10 } // СМЕЩЕНИЕ ГОЛОВКИ ПОСЛЕ ПОЗИЦИОНИРОВАНИЯ – НУЛЕВАЯ ТОЧКА
#define HOMING_BACKOFF_MM { 22, 17, 10 } // СМЕЩЕНИЕ ГОЛОВКИ ПОСЛЕ ПОЗИЦИОНИРОВАНИЯ – НУЛЕВАЯ ТОЧКА

Переменные HOME_BUMP задают значения смещения, на которые требуется отступить после срабатывания концевиков.

HOMING_BUMP_DIVISOR задает значение делителей скоростей движения к концевикам, определенных в переменных HOMING_FEEDRATE_XY и HOMING_FEEDRATE_Z. Именно с этой скоростью, кратной делителям, будет осуществляться повторное движение к концевикам.

QUICK_HOME включает диагональное движение к концевикам в плоскости XY. Парковка выполняется чуточку быстрее…

Переменные HOMING_BACKOFF_MM определяют дистанцию смещения после выполнения парковки. Я умышленно привел два значения, одно из которых закрыто комментарием (значения при отладке). В случае ORTUR-4 форсунка выходит за рабочий стол в плоскости XY. Как видно из приведенных значений, закомментированная строка позволяет вывести форсунку в начало стола и приподнять форсунку на 10 мм (0, 0, 10). Практика показывает, что удобнее выбирать позицию форсунки с небольшим смещение от начала стола. Именно это реализовано в незакоментированной строке – форсунка окажется в точке (10, 10, 10) от начала фактической области печати.

// #define INDIVIDUAL_AXIS_HOMING_MENU

Функция включает в меню индивидуальную парковку по каждой из осей. На нее также не хватило места. 

НАСТРОЙКА СИСТЕМЫ НАГРЕВАТЕЛЕЙ

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

// МИНИМАЛЬНАЯ ТЕМПЕРАТУРА
#define HEATER_0_MINTEMP 10
#define BED_MINTEMP 10

// МАКСИМАЛЬНАЯ ТЕМПЕРАТУРА
#define HEATER_0_MAXTEMP 285
#define BED_MAXTEMP 130

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

При задании максимальной температуры (температуры срабатывания защиты) есть особенности. В прошивках MARLIN 2 задается значение на 15 градусов выше максимальной рабочей температуры для нагревателя форсунки и на 10 градусов выше для нагревателя стола. Исходя из указанных мной значений, максимальные рабочие температуры составят 270 и 120 градусов для форсунки и стола.

В прошивке возможно выбрать один из двух режимов регулировки температуры – “включение-выключение” нагревателя и “ПИД” регулировка. На мой взгляд, ПИД регулятор позволяет более эффективно использовать мощность нагревателей. И, если Вы не используете релейные системы включения нагревателей, то лучше активировать ПИД регулировку как на форсунке, так и на столе.

// ВКЛЮЧЕНИЕ ПИД РЕГУЛЯТОРА ФОРСУНКИ. ДЛЯ ИСПОЛЬЗОВАНИЯ РЕЖИМА ВКЛЮЧЕНИЯ-ВЫКЛЮЧЕНИЯ ТРЕБУЕТСЯ ОТКЛЮЧЕНИЕ ПИД
#define PIDTEMP
#define PID_MAX 255     // ОГРАНИЧЕНИЕ МАКСИМАЛЬНОГО ТОКА
#define PID_K1 0.95        // КОЭФФИЦИЕНТ СГЛАЖИВАНИЯ

Первой переменной включается ПИД регулятор. Если планируется управлять в режиме включения-выключения, то нужно поставить комментарий. PID_MAX позволяет ограничить максимальный ток при включении нагревателя, PID_K1 задает коэффициент сглаживания.

После включения ПИД потребуется задать коэффициенты, определяющие его работу.

// E3DV6
#define DEFAULT_Kp 20.25
#define DEFAULT_Ki 1.75
#define DEFAULT_Kd 80.00

Коэффициенты подобраны в режиме автоматической настройки, встроенной в MARLIN процедурой для хотэнда E3DV6.

Для запуска автонастройки коэффициентов ПИД регулятора в командной строке Repetier Host задается команда GCODE – M303 E0 C5 S220. В синтаксисе команды: “E0” – настройка хотэнда 0, “C5” – настройка ПИД в 5 циклов, “S220” – целевая температура для настройки ПИД регулятора. Большее количество циклов позволяет точнее настроить ПИД, но указанных параметров, как правило, вполне хватает. После отработки команды M303 в статусном окне Repetier Host отобразятся рассчитанные настройки, которые копируются в прошивку.

// #define PID_EDIT_MENU                             // ВКЛЮЧЕНИЕ НАСТРОЙКИ КОЭФ. ПИД В РАСШИРЕННОЕ МЕНЮ (~700 БАЙТ)
// #define PID_AUTOTUNE_MENU             // ВКЛЮЧЕНИЕ ФУНКЦИИ АВТОНАСТРОЙКИ ПИД В РАСШИРЕННОЕ МЕНЮ (~250 БАЙТ)
#define PID_FUNCTIONAL_RANGE 30  // ПОРОГ ВКЛЮЧЕНИЯ ПИД РЕГУЛЯТОРА ПО ОТНОШЕНИЮ К ЦЕЛЕВОЙ ТЕМПЕРАТУРЕ

PID_EDIT_MENU позволяет вносить коэффициенты для ПИД непосредственно в меню принтера. 

PID_AUTOTUNE_MENU добавляет функцию автонастройки ПИД в меню. После выполнения функции, значения прописываются в EEPROM автоматически и остаются активными после выключения принтера.

Обе функции очень удобные! И, если позволяет объем программной памяти контроллера, то рекомендую включить. Как я писал ранее, контроллер ANET 1.7 имеет огромный недостаток – очень маленькое кол-во программной памяти. По этой причине я сэкономил почти килобайт и выключил функции…

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

#define PIDTEMPBED // 1856 БАЙТ

Несмотря на большой объем занимаемой памяти, рекомендую использовать ПИД регулятор для нагрева стола. Были случаи когда за счет тонкой настройки ПИД удавалось поднять температуру стола почти на 10 градусов.

Особенных настроек ПИД регулятора стола в прошивке нет. Единственное отличие в команде автонастройки коэффициентов. Для выполнения автонастройки команда имеет вид M303 E-1 C8 S90. Логика работы та же, что для форсунки.

#define DEFAULT_bedKp 84.60
#define DEFAULT_bedKi 16.39
#define DEFAULT_bedKd 291.08

Значения коэффициентов для стола ORTUR-4.

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

#define THERMAL_PROTECTION_HOTENDS

Задача функции отслеживать работу нагревателя в течение заданного периода (THERMAL_PROTECTION_PERIOD) с целью выявления ухода температуры от целевой на заданное значение (THERMAL_PROTECTION_HYSTERESIS).

#define THERMAL_PROTECTION_PERIOD 90           // В СЕКУНДАХ
#define THERMAL_PROTECTION_HYSTERESIS 15  // В ГРАДУСАХ

Допустим плохо закреплен датчик температуры в хотэнде или датчик “пропадает” из-за некачественной проводки. При резких перемещениях возможен плохой тепловой контакт датчика с нагревательным блоком. Вот именно в этих случаях микроконтроллер выключит принтер, если увидит, что в течение защитного периода значительно “плывут” показания температуры.

#define WATCH_TEMP_PERIOD 16     // В СЕКУНДАХ
#define WATCH_TEMP_INCREASE 4   // В ГРАДУСАХ

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

Аналогично работает дополнительная функция защиты нагрева стола.

#define THERMAL_PROTECTION_BED

#define THERMAL_PROTECTION_BED_PERIOD 300        // В СЕКУНДАХ
#define THERMAL_PROTECTION_BED_HYSTERESIS 20 // В ГРАДУСАХ

#define WATCH_BED_TEMP_PERIOD 240   // В СЕКУНДАХ
#define WATCH_BED_TEMP_INCREASE 2  // В ГРАДУСАХ

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

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

ДАТЧИК ОКОНЧАНИЯ ПЛАСТИКА

Для включения датчика окончания пластика требуется убрать комментарий в строке

#define FILAMENT_RUNOUT_SENSOR

Далее в настройках указываем параметры.

#define FIL_RUNOUT_PIN 29                        // ФИЗИЧЕСКИЙ ПИН
#define NUM_RUNOUT_SENSORS 1        // КОЛИЧЕСТВО ДАТЧИКОВ
#define FIL_RUNOUT_INVERTING false // ВЫБОР ЛОГИКИ РАБОТЫ ДАТЧИКА
#define FIL_RUNOUT_PULLUP                     // ИСПОЛЬЗОВАНИЕ ПОДТЯГИВАЮЩИХ К ПИТАНИЮ ВНУТРЕННИХ РЕЗИСТОРОВ
// #define FIL_RUNOUT_PULLDOWN      // ИСПОЛЬЗОВАНИЕ ПОДТЯГИВАЮЩИХ К ЗЕМЛЕ ВНУТРЕННИХ РЕЗИСТОРОВ

#define FILAMENT_RUNOUT_SCRIPT “M600”

#define FILAMENT_RUNOUT_DISTANCE_MM 25  // ДИСТАНЦИЯ СРАБАТЫВАНИЯ ПОСЛЕ ФИКСАЦИИ ДАТЧИКА

Здесь задаются пин подключенного датчика, если требуется, подтягивающий резистор и логика (уровень логической “1” или “0”) срабатывания датчика. Протестировать работу датчика можно с помощью команды M119 по алгоритму из предыдущей статьи.

Использование датчика окончания пластика возможно только совместно с функциями NOZZLE_PARK_FEATURE и ADVANCED_PAUSE_FEATURE. Функции съедают большое кол-во памяти, но тут ничего не поделаешь!

// ФУНКЦИЮ NOZZLE_PARK_FEATURE ТРЕБУЕТ ДАТЧИК ОКОНЧАНИЯ ФИЛАМЕНТА – RUNOT SENSOR

#define NOZZLE_PARK_FEATURE

#if ENABLED(NOZZLE_PARK_FEATURE)
#define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS – 10), 20 } // ПОЗИЦИЯ ПАРКОВКИ ФОРСУНКИ
#define NOZZLE_PARK_XY_FEEDRATE 100 // СКОРОСТЬ ПАРКОВКИ ФОРСУНКИ ПО ОСЯМ X, Y В мм/c
#define NOZZLE_PARK_Z_FEEDRATE 5 // СКОРОСТЬ ПАРКОВКИ ФОРСУНКИ ПО ОСИ Z В мм/c
#endif

В настройках функции необходимо указать точку парковки форсунки для смены пластика и скорости перемещения при парковке.

#define ADVANCED_PAUSE_FEATURE
#if ENABLED(ADVANCED_PAUSE_FEATURE)
#define PAUSE_PARK_RETRACT_FEEDRATE 100 // СКОРОСТЬ РЕТРАКТА ПЕРЕД ПАРКОВКОЙ
#define PAUSE_PARK_RETRACT_LENGTH 4 // РЕТРАКТ НЕПОСРЕДСТВЕННО ПЕРЕД ПАРКОВКОЙ

#define FILAMENT_CHANGE_UNLOAD_FEEDRATE 50 // СКОРОСТЬ ВЫГРУЗКИ ПЛАСТИКА
#define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // УСКОРЕНИЕ ВЫГРУЗКИ ПЛАСТИКА
#define FILAMENT_CHANGE_UNLOAD_LENGTH 500 // ДЛИНА ДЛЯ ПОЛНОЙ ВЫГРУЗКИ ПЛАСТИКА
// (ОПРЕДЕЛЯЕТСЯ ДЛИНОЙ ТРУБКИ ОТ ЭКСТРУДЕРА ДО ХОТЭНДА И ДЛИНОЙ МАТЕРИАЛА В ХОТЭНДЕ)
// УСТАНАВЛИВАЕТСЯ В 0 ДЛЯ РУЧНОЙ ВЫГРУЗКИ ПЛАСТИКА
#define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 10 // СКОРОСТЬ НАЧАЛЬНОЙ ЗАГРУЗКИ ПЛАСТИКА
#define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // ДИСТАНЦИЯ ПРЕДВАРИТЕЛЬНОЙ ЗАГРУЗКИ ДЛЯ УСТАНОВКИ ПЛАСТИКА
// УСТАНАВЛИВАЕТСЯ В 0 ПРИ ОТСУТСТВИИ ПРЕДВАРИТЕЛЬНОЙ ЗАГРУЗКИ
#define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 50 // СКОРОСТЬ ЗАГРУЗКИ ПЛАСТИКА
#define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // УСКОРЕНИЕ ЗАГРУЗКИ ПЛАСТИКА
#define FILAMENT_CHANGE_FAST_LOAD_LENGTH 450 // ДИСТАНЦИЯ ПОЛНОЙ ЗАГРУЗКИ ПЛАСТИКА
// (ОПРЕДЕЛЯЕТСЯ ДЛИНОЙ ТРУБКИ ОТ ЭКСТРУДЕРА ДО ХОТЭНДА И ДЛИНОЙ МАТЕРИАЛА В ХОТЭНДЕ)
// УСТАНАВЛИВАЕТСЯ В 0 ДЛЯ РУЧНОЙ ЗАГРУЗКИ ПЛАСТИКА
//#define ADVANCED_PAUSE_CONTINUOUS_PURGE // НЕПРЕРЫВНАЯ ЗАГРУЗКА ПЛАСТИКА ДО НАЖАТИЯ КНОПКИ
#define ADVANCED_PAUSE_PURGE_FEEDRATE 10 // СКОРОСТЬ ЭКСТРУДЕРА ПОСЛЕ ЗАГРУЗКИ
#define ADVANCED_PAUSE_PURGE_LENGTH 25 // ДИСТАНЦИЯ ПОДАЧИ ПЛАСТИКА ДЛЯ ПРОЧИСТКИ ФОРСУНКИ ПОСЛЕ ЗАГРУЗКИ
// УСТАНАВЛИВАЕТСЯ В 0 ДЛЯ РУЧНОЙ ЭКСТРУЗИИ
#define ADVANCED_PAUSE_RESUME_PRIME 1 // ДОПОЛНИТЕЛЬНАЯ ДИСТАНЦИЯ ПОСЛЕ ВОЗВРАЩЕНИЯ С ПАРКОВКИ
#define ADVANCED_PAUSE_FANS_PAUSE // ОТКЛЮЧЕНИЕ ВЕНТИЛЯТОРА ОБДУВА ВО ВРЕМЯ СМЕНЫ ПЛАСТИКА

#define FILAMENT_UNLOAD_PURGE_RETRACT 13 // ДЛИНА НАЧАЛЬНОГО РЕТРАКТА ВЫГРУЗКИ
#define FILAMENT_UNLOAD_PURGE_DELAY 5000 // ЗАДЕРЖКА ДЛЯ ОСТЫВАНИЯ ПЛАСТИКА ПОСЛЕ РЕТРАКТА
#define FILAMENT_UNLOAD_PURGE_LENGTH 10 // ДИСТАНЦИЯ ДЛЯ ПРОЧИСТКИ ПОСЛЕ РЕТРАКТА
#define FILAMENT_UNLOAD_PURGE_FEEDRATE 25 // СКОРОСТЬ ОЧИСТКИ ПЕРЕД ВЫГРУЗКОЙ

#define PAUSE_PARK_NOZZLE_TIMEOUT 60 // ЗАДЕРЖКА ОТКЛЮЧЕНИЯ НАГРЕВА ФОРСУНКИ (ЗАЩИТА)
#define FILAMENT_CHANGE_ALERT_BEEPS 12 // КОЛИЧЕСТВО ЗВУКОВЫХ СИГНАЛОВ ОПОВЕЩЕНИЯ В СЛУЧАЕ НЕОБХОДИМОСТИ ОТВЕТА ПОЛЬЗОВАТЕЛЯ
#define PAUSE_PARK_NO_STEPPER_TIMEOUT // ЗАПРЕТ ОТКЛЮЧЕНИЯ ПИТАНИЯ ШАГОВЫХ ДВИГАТЕЛЕЙ XYZ НА ВРЕМЯ ЗАМЕНЫ ПЛАСТИКА

//#define PARK_HEAD_ON_PAUSE // ПРИПАРКОВАТЬ ФОРСУНКУ ВО ВРЕМЯ СМЕНЫ ПЛАСТИКА
//#define HOME_BEFORE_FILAMENT_CHANGE // ПРОВЕРКА ТОГО, ЧТО ДО СМЕНЫ ПЛАСТИКА ОСУЩЕСТВЛЯЛАСЬ ПАРКОВКА (УСТАНОВКА НУЛЕВЫХ ПОЛОЖЕНИЙ)

//#define FILAMENT_LOAD_UNLOAD_GCODES
//#define FILAMENT_UNLOAD_ALL_EXTRUDERS
#endif

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

НАСТРОЙКИ EEPROM

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

#define EEPROM_SETTINGS // ПРАВКА ДАННЫХ С ПОМОЩЬЮ КОМАНД M500, M501
#define DISABLE_M503 // ОТОБРАЖЕНИЕ НАСТРОЕК. 2700 БАЙТ. ОТКЛЮЧИТЬ ДЛЯ ЭКОНОМИИ ПАМЯТИ
//#define EEPROM_CHITCHAT // ОБМЕН ДАННЫМИ 
//#define EEPROM_BOOT_SILENT // ОТОБРАЖЕНИЕ ОШИБОК ТОЛЬКО ВО ВРЕМЯ ПЕРВОЙ ЗАГРУЗКИ
#if ENABLED(EEPROM_SETTINGS)
//#define EEPROM_AUTO_INIT // ВОССТАНОВЛЕНИЕ ЗАВОДСКИХ УСТАНОВОК ПРИ ОШИБКЕ
#endif

// #define PRINTJOB_TIMER_AUTOSTART // ЗАПУСК ТАЙМЕРА ПЕЧАТИ. 88 БАЙТ

// #define PRINTCOUNTER // ЗАПУСК СЧЕТЧИКА ЗАДАНИЙ. ‭1358 БАЙТ

PRINTJOB_TIMER_AUTOSTART и PRINTCOUNTER ведут подсчет и сохранение в энергонезависимой памяти статистики работы принтера с возможностью отображения в меню принтера. К сожалению, места в памяти ANET 1.7 для них не нашлось!

РАСШИРЕННЫЕ НАСТРОЙКИ

В последних прошивках MARLIN появилась альтернативная функция, управляемая рывками при смене направления движения JUNCTION_DEVIATION_MM. Пользуюсь исключительно этий функцией.

//#define CLASSIC_JERK

#if DISABLED(CLASSIC_JERK)
#define JUNCTION_DEVIATION_MM 0.02 
#endif

Для правильного расчета подаваемого пластика требуется указать диаметр филамента (проволоки).

#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75

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

#define PREVENT_COLD_EXTRUSION
#define EXTRUDE_MINTEMP 170      // МИНИМАЛЬНАЯ ТЕМПЕРАТУРА ПОДАЧИ ПЛАСТИКА 

Также возможно определить длину разовой подачи пластика.

#define PREVENT_LENGTHY_EXTRUDE
#define EXTRUDE_MAXLENGTH 550

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

// ОГРАНИЧЕНИЕ ЛИМИТОВ FEEDRATE ПО КОМАНДЕ M203 (УСТАНОВКА МАКСИМАЛЬНОГО FEEDRATE)
#define LIMITED_MAX_FR_EDITING
#if ENABLED(LIMITED_MAX_FR_EDITING)
#define MAX_FEEDRATE_EDIT_VALUES { 300, 300, 15, 400 }
#endif

// ОГРАНИЧЕНИЕ ЛИМИТОВ УСКОРЕНИЙ ПО КОМАНДЕ M203 (УСТАНОВКА МАКСИМАЛЬНЫХ УСКОРЕНИЙ)
#define LIMITED_MAX_ACCEL_EDITING
#if ENABLED(LIMITED_MAX_ACCEL_EDITING)
#define MAX_ACCEL_EDIT_VALUES { 3000, 3000, 250, 4000 } 
#endif

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

#define S_CURVE_ACCELERATION

Не стоит отключать шаговые двигатели сразу после использования.

// ОТКЛЮЧЕНИЕ ШАГОВИКОВ НЕПОСРЕДСТВЕННО ПОСЛЕ ИСПОЛЬЗОВАНИЯ
#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false

#define DISABLE_E false

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

// ПРОГРАММНЫЙ КОНТРОЛЬ ВЫХОДА ЗА МИНИМУМ СТОЛА
#define MIN_SOFTWARE_ENDSTOPS
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
#define MIN_SOFTWARE_ENDSTOP_X
#define MIN_SOFTWARE_ENDSTOP_Y
#define MIN_SOFTWARE_ENDSTOP_Z
#endif

// ПРОГРАММНЫЙ КОНТРОЛЬ ЗА ВЫХОДОМ ЗА МАКСИМУМ СТОЛА
#define MAX_SOFTWARE_ENDSTOPS
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
#define MAX_SOFTWARE_ENDSTOP_X
#define MAX_SOFTWARE_ENDSTOP_Y
#define MAX_SOFTWARE_ENDSTOP_Z
#endif

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

// ДОБАВЛЕНИЕ В МЕНЮ ФУНКЦИИ ВЫРАВНИВАНИЯ ПО УГЛАМ
#define LEVEL_BED_CORNERS

#if ENABLED(LEVEL_BED_CORNERS)
#define LEVEL_CORNERS_INSET_LFRB { 30, 50, 30, 50 } // ОТСТУПЫ ОТ УГЛОВ
#define LEVEL_CORNERS_HEIGHT 0.0 // ВЫСОТА ФОРСУНКИ ПРИ ВЫРАВНИВАНИИ УГЛОВ
#define LEVEL_CORNERS_Z_HOP 5.0 // ПОДЪЕМ ФОРСУНКИ ПРИ СМЕНЕ ТОЧКИ РЕГУЛИРОВКИ
//#define LEVEL_CENTER_TOO // ИСПОЛЬЗОВАТЬ ЦЕНТРАЛЬНУЮ ТОЧКУ
#endif

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

Те, кто работал с вентиляторами, знают, что при ШИМ управлении вентилятор начинает работать далеко не с минимальных значений. Приходится помнить об этом при управлении вентилятором в слайсерах. MARLIN имеет возможность сузить динамический диапазон ШИМ для гарантированного включения вентиляторов.

// СУЖЕНИЕ ДИНАМИЧЕСКОГО ДИАПАЗОНА ВЕНТИЛЯТОРА
#define FAN_MIN_PWM 64 // ГАРАНТИРОВАННЫЙ ПОРОГ ВКЛЮЧЕНИЯ ВЕНТИЛЯТОРА. 64 СООТВЕТСТВУЕТ 25% ДИАПАЗОНА
#define FAN_MAX_PWM 255 // МАКСИМАЛЬНОЕ ВРАЩЕНИЕ

При использовании этой функции, если в GCODE присутствует команда включения вентилятора на 1% мощности, вентилятор запустится при значении, указанном в FAN_MIN_PWM.

В MARLIN возможно включить форсированный запуск вентилятора для запуска на минимальных значениях ШИМ. При этом на указанное в миллисекундах время вентилятор включается на полную мощность.

// #define FAN_KICKSTART_TIME 200

Но функция работает только для аппаратных ШИМ. В платах контроллеров Sanguinololu, к которым относится ANET 1.7 ШИМ программный и функция бесполезна.

ДИСПЛЕЙ И МЕНЮ ПРИНТЕРА

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

// ИНФОРМАЦИЯ О ПРИНТЕРЕ В МЕНЮ ДИСПЛЕЯ
// #define LCD_INFO_MENU
#if ENABLED(LCD_INFO_MENU)
// #define LCD_PRINTER_INFO_IS_BOOTSCREEN 
#endif

LCD_INFO_MENU позволяет внести раздел для отображения информации о принтере, времени печати на принтере, времени максимальной задачи, числа неудачных задач (при условии включенных счетчиков – выше по тексту). LCD_PRINTER_INFO_IS_BOOTSCREEN отображает экранную заставку вместо текстовой информации о принтере. К сожалению, места снова не хватило, функции не активировал.

// ВОЗВРАЩЕНИЕ СРАЗУ НА ВЕРХНЮЮ СТРОКУ ПРЕДЫДУЩЕГО МЕНЮ
#define TURBO_BACK_MENU_ITEM

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

// АКТИВАЦИЯ РЕЖИМА МЕНЮ
#define SLIM_LCD_MENUS‬

// НАСТРОЙКИ РАБОТЫ ЭНКОДЕРА
#define ENCODER_PULSES_PER_STEP 4‬

ENCODER_PULSES_PER_STEP отвечает за “чувствительность” к вращению энкодера. Чем меньше импульсов на шаг, тем быстрее определяется вращение энкодера.

#define ENCODER_STEPS_PER_MENU_ITEM 2

ENCODER_STEPS_PER_MENU_ITEM определяет число шагов при вращении энкодера для перехода на следующую позицию меню.

#define REVERSE_ENCODER_DIRECTION

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

// #define REVERSE_MENU_DIRECTION

То же самое для перемещения по меню.

#define REVERSE_SELECT_DIRECTION

Изменение направления при уменьшении – увеличении значений параметров.

// ПРОКРУТКА ДЛИННЫХ СООБЩЕНИЙ
#define STATUS_MESSAGE_SCROLLING

// ВРЕМЯ ВЫХОДА НА ЭКРАН СТАТУСА
#define LCD_TIMEOUT_TO_STATUS 10000

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

// ОТОБРАЖЕНИЕ ДЛИНЫ ИСПОЛЬЗОВАННОГО ПЛАСТИКА ПРИ ПЕЧАТИ
#define LCD_SHOW_E_TOTAL  //  346 БАЙТ

LCD_SHOW_E_TOTAL включает отображение при печати длины уже использованного платика. Функция удобна для визуального контроля остатка пластика на катушке.

#if ENABLED(SHOW_BOOTSCREEN)
#define BOOTSCREEN_TIMEOUT 2000 // ДЛИТЕЛЬНОСТЬ ОТОБРАЖЕНИЯ КАРТИНКИ ПРИ ЗАПУСКЕ ПРИНТЕРА
#endif

В этом разделе задается в миллисекундах длительность отображения заставки при загрузке принтера.

#define SHOW_REMAINING_TIME // ОТОБРАЖЕНИЕ РАСЧЕТНОГО ВРЕМЕНИ ДО ЗАВЕРШЕНИЯ ЗАДАЧИ. 196 БАЙТ

#define SD_MENU_CONFIRM_START // ВКЛЮЧЕНИЕ ПОДТВЕРЖДЕНИЯ НАЧАЛА ПЕЧАТИ ВЫБРАННОГО ФАЙЛА

// #define MENU_ADDAUTOSTART // ОТОБРАЖЕНИЕ РАЗДЕЛА АВТОПЕЧАТИ ФАЙЛОВ “auto#.g” В ЭКРАННОМ МЕНЮ

Этот раздел позволяет запускать с SD карты файлы GCODE, подготовленные к автозапуску “auto#.g”.

Задаем сортировку файлов на карте памяти.

#define SDCARD_SORT_ALPHA // СОРТИРОВКА ФАЙЛОВ НА КАРТЕ ПАМЯТИ. 820 БАЙТ

// ОПЦИИ СОРТИРОВКИ ФАЙЛОВ
#if ENABLED(SDCARD_SORT_ALPHA)
#define SDSORT_LIMIT 16 // МАКСИМАЛЬНОЕ ЧИСЛО СОРТИРУЕМЫХ ФАЙЛОВ (10-256). ЗАНИМАЕТ 27 БАЙТ НА КАЖДЫЙ
#define FOLDER_SORTING 1 // -1 = СОРТИРОВКА ВВЕРХ 0 = НЕТ 1 = СОРТИРОВКА ВНИЗ
#define SDSORT_GCODE false // РАЗРЕШЕНИЕ ВКЛЮЧЕНИЯ/ВЫКЛЮЧЕНИЯ СОРТИРОВКИ С ПОМОЩЬЮ ДИСПЛЕЯ И КОМАНДЫ M34
#define SDSORT_USES_RAM true // ВЫДЕЛЕНИЕ СТАТИЧЕСКОГО МАССИВА ДЛЯ БЫСТРОЙ ПРЕДВАРИТЕЛЬНОЙ СОРТИРОВКИ
#define SDSORT_USES_STACK true // ПРЕДПОЧТЕНИЕ СТЕКУ ДЛЯ СОРТИРОВКИ ДЛЯ ЭКОНОМИИ ПАМЯТИ
#define SDSORT_CACHE_NAMES false // ДЕРЖАТЬ ДОЛЬШЕ ЭЛЕМЕНТЫ СОРТИРОВКИ В ОПЕРАТИВНОЙ ПАМЯТИ ДЛЯ БОЛЕЕ БЫСТРОЙ СОРТИРОВКИ (ЗАНИМАЕТ БОЛЬШОЙ ОБЪЕМ ПАМЯТИ)
#define SDSORT_DYNAMIC_RAM false // ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКОГО РАСПРЕДЕЛЕНИЯ (В МЕНЮ КАРТЫ ПАМЯТИ). САМЫЙ ЭКОНОМНЫЙ МЕТОД. ТРЕБУЕТСЯ УСТАНОВИТЬ SDSORT_LIMIT ПЕРЕД НАЧАЛОМ ИСПОЛЬЗОВАНИЯ!
#define SDSORT_CACHE_VFATS 2 // МАКСИМАЛЬНОЕ КОЛИЧЕСТВО 13ТИ БАЙТНЫХ ЗАПИСЕЙ VFAT ДЛЯ ИСПОЛЬЗОВАНИЯ СОРТИРОВКИ
// ЗАМЕЧАНИЕ: ВЛИЯЕТ ТОЛЬКО НА SCROLL_LONG_FILENAMES С ПАРАМЕТРОМ SDSORT_CACHE_NAMES, НО НЕ НА SDSORT_DYNAMIC_RAM.
#endif

// ВКЛЮЧЕНИЕ ДЛИННЫХ ИМЕН
#define LONG_FILENAME_HOST_SUPPORT

// ВКЛЮЧЕНИЕ ПРОКРУТКИ ПРИ ПРОСМОТРЕ ДЛИННЫХ ИМЕН
#define SCROLL_LONG_FILENAMES

Используя ПК, все давно привыкли использовать длинные имена файлов. Если не активировать SCROLL_LONG_FILENAMES, то просмотр полного длинного имени файла будет невозможен. Придется ограничиться началом имени файла.

Устанавливаем значения для преднагрева типовых пластиков.

// ЗНАЧЕНИЯ ПРЕДНАГРЕВА ТИПОВЫХ ПЛАСТИКОВ
#define PREHEAT_1_LABEL “PLA”
#define PREHEAT_1_TEMP_HOTEND 200
#define PREHEAT_1_TEMP_BED 80
#define PREHEAT_1_FAN_SPEED 0 

#define PREHEAT_2_LABEL “ABS”
#define PREHEAT_2_TEMP_HOTEND 240
#define PREHEAT_2_TEMP_BED 120
#define PREHEAT_2_FAN_SPEED 0 

Здесь указываются температуры типовых пластиков и скорости вращения вентиляторов охлаждения зоны печати для преднагрева из меню принтера.

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

#define STRING_CONFIG_H_AUTHOR “ZDV” // ЗАДАЕМ НИК 
#define CUSTOM_VERSION_FILE Version.h // ПЕРЕХОДИМ К ПЕРСОНАЛЬНЫМ НАСТРОЙКАМ ИЗ ФАЙЛА “Version.h”

#define SHOW_BOOTSCREEN // ОТОБРАЖЕНИЕ ЗАСТАВКИ

#define SHOW_CUSTOM_BOOTSCREEN // ОТОБРАЖЕНИЕ ПОЛЬЗОВАТЕЛЬСКОЙ ЗАСТАВКИ ИЗ ФАЙЛА “_Bootscreen.h”

После включения пользовательской заставки нужно подготовить картинку размером в экран – 128*64, перейти на официальный сайт прошивки MARLIN, запустить онлайн конвертер картинки в код… 

Остается только скопировать полученный код и вставить в “_Bootscreen.h”.

После перезагрузки принтера теперь появляется моя персональная заставка. Но, при этом, следующим окном отображается информационное окно прошивки MARLIN. Все бы ничего, а памяти не хватает для хранения и отображения двух картинок. Явного отключения “родной” заставки в прошивке нет, что вполне понятно. Для отключения придется изучить прошивку на уровне кодов.

Решение нашел. Для отключения “родной” заставки открываем файл “ultralcd_DOGM.cpp” в папке “Marlin\src\lcd\dogm\”, ищем код:

void MarlinUI::show_bootscreen() {
  #if ENABLED(SHOW_CUSTOM_BOOTSCREEN)
   show_custom_bootscreen();
  #endif

 show_marlin_bootscreen();
}

В коде отчетливо видно, что в случае активации персонализированной картинки при загрузке “if ENABLED(SHOW_CUSTOM_BOOTSCREEN)“, происходит ее загрузка и осуществляется переход к “родному” экрану MARLIN. Для отключения, ставим команду “return” возврата из функции после отображения картинки пользователя “show_custom_bootscreen()“.

void MarlinUI::show_bootscreen() {
 #if ENABLED(SHOW_CUSTOM_BOOTSCREEN)
  show_custom_bootscreen();
  return;
 #endif

 show_marlin_bootscreen();
}

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

Далее открываем файл “Version.h” и правим имя принтера.

#define MACHINE_NAME “ZDV ORTUR-4”

При необходимости дату релиза и ссылку на исходные коды прошивки.

ЛОКАЛИЗАЦИЯ

Под завершение работы с прошивкой переключаемся на русский язык.

#define LCD_LANGUAGE ru

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

Мой пример русификации языкового файла “language_ru.h” ниже.

namespace Language_ru {
using namespace Language_en; // Inherit undefined strings from English

constexpr uint8_t CHARSIZE = 2;
PROGMEM Language_Str LANGUAGE = _UxGT(“Russian”);

PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(” В ДЕЛЕ!”);
// PROGMEM Language_Str MSG_MARLIN = _UxGT(“Marlin”);
PROGMEM Language_Str MSG_YES = _UxGT(“ДА”);
PROGMEM Language_Str MSG_NO = _UxGT(“НЕТ”);
PROGMEM Language_Str MSG_BACK = _UxGT(“Назад”);
PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT(“Карта вставлена”);
PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT(“Карта извлечена”);
PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT(“Карта не активна”);
PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT(“Эндстопы”); // Max length 8 characters
PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT(“Прогр. эндстопы”);
PROGMEM Language_Str MSG_MAIN = _UxGT(“Меню”);
PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT(“Расшир. настройки”);
PROGMEM Language_Str MSG_CONFIGURATION = _UxGT(“Настройки”);
PROGMEM Language_Str MSG_AUTOSTART = _UxGT(“Автостарт”);
PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT(“Отключить двигатели”);
PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT(“Меню отладки”);
PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT(“Тест индикатора”);
PROGMEM Language_Str MSG_AUTO_HOME = _UxGT(“Парковка XYZ”);
PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT(“Парковка X”);
PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT(“Парковка Y”);
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT(“Парковка Z”);
PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT(“Нулевое положение”);
PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT(“Нажмите для начала”);
PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT(“Следующая…”);
PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT(“Выравнено!”);
PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT(“Высота спада”);
PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT(“Запомнить парковку”);
PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT(“Откорректировано”);
PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT(“Запомнить ноль”);
PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT(“Преднагрев “) PREHEAT_1_LABEL;
PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT(“Нагрев “) ” ~”;
PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT(“Нагрев “) _UxGT(“форсунки”);
PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT(“Нагрев “) _UxGT(“форсунки ~”);
PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT(“Нагрев “) _UxGT(“полный”);
PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT(“Нагрев “) _UxGT(“стола”);
PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT(“Нагрев “) _UxGT(“правка”);
PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT(“Преднагрев “) PREHEAT_2_LABEL;
PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT(“Нагрев “) ” ~”;
PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT(“Нагрев “) _UxGT(“форсунки”);
PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT(“Нагрев “) _UxGT(“форсунки ~”);
PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT(“Нагрев “) _UxGT(“полный”);
PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT(“Нагрев “) _UxGT(“стола”);
PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT(“Нагрев “) _UxGT(“правка”);
PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT(“Задать температуру”);
PROGMEM Language_Str MSG_COOLDOWN = _UxGT(“Охлаждение”);
PROGMEM Language_Str MSG_LASER_MENU = _UxGT(“Управление лазером”);
PROGMEM Language_Str MSG_LASER_OFF = _UxGT(“Выключить лазер”);
PROGMEM Language_Str MSG_LASER_ON = _UxGT(“Включить лазер”);
PROGMEM Language_Str MSG_LASER_POWER = _UxGT(“Мощность лазера”);
PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT(“Управление шпинделем “);
PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT(“Выключить шпиндель”);
PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT(“Включить шпиндель”);
PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT(“Мощность шпинделя”);
PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT(“Инверсия шпинделя”);
PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT(“Включить питание”);
PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT(“Выключить питание”);
PROGMEM Language_Str MSG_EXTRUDE = _UxGT(“Экструзия”);
PROGMEM Language_Str MSG_RETRACT = _UxGT(“Втягивание”);
PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT(“Перемещение”);
PROGMEM Language_Str MSG_BED_LEVELING = _UxGT(“Калибровка стола”);
PROGMEM Language_Str MSG_LEVEL_BED = _UxGT(“Калибровать стол”);
PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT(“Выравнивание углов”);
PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT(“Следующий”);
PROGMEM Language_Str MSG_EDIT_MESH = _UxGT(“Редактировать сетку”);
PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT(“Правка сетки окончена”);
PROGMEM Language_Str MSG_PROBING_MESH = _UxGT(“Точка сетки:”);
PROGMEM Language_Str MSG_MESH_X = _UxGT(“Индекс X”);
PROGMEM Language_Str MSG_MESH_Y = _UxGT(“Индекс Y”);
PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT(“Значение Z”);
PROGMEM Language_Str MSG_USER_MENU = _UxGT(“Свои команды”);

PROGMEM Language_Str MSG_M48_TEST = _UxGT(“Проверка Z-датчика”);
PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT(“Отклонение”);
PROGMEM Language_Str MSG_M48_POINT = _UxGT(“Измерение”);

// TODO: IDEX Menu
PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT(“Размещение форс.”);

PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT(“2-я форсунка X”);
PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT(“2-я форсунка Y”);
PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT(“2-я форсунка Z”);

PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT(“Выполняется G29”);
PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT(“Утилиты UBL”);
PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT(“Калибровка UBL”);
PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT(“Правка сетки вручную”);
PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT(“Z-пробник и замеры”);
PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT(“Измерение”);
PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT(“Убрать и замер стола”);
PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT(“Двигаемся дальше”);
PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT(“Активировать UBL”);
PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT(“Деактивировать UBL”);
PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT(“Температура стола”);
PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT(“Температура стола”);
PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT(“Температура форсунки”);
PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT(“Температура форсунки”);
PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT(“Редактор сеток”);
PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT(“Править свою сетку”);
PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT(“Точная правка сетки”);
PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT(“Правка сетки завершена”);
PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT(“Построить свою сетку”);
PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT(“Построить сетку”);
PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT(“Построить сетку “) PREHEAT_1_LABEL;
PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT(“Построить сетку “) PREHEAT_2_LABEL;
PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT(“Построить хол. сетку”);
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT(“Правка высоты сетки”);
PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT(“Высота”);
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT(“Проверить сетку”);
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT(“Проверить сетку “) PREHEAT_1_LABEL;
PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT(“Проверить сетку “) PREHEAT_2_LABEL;
PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT(“Проверить свою сетку”);
PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT(“Продолжить сетку”);
PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT(“Калибровка сетки”);
PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT(“Калибровка 3-х точек”);
PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT(“Калибровка растера”);
PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT(“Выровнить сетку”);
PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT(“Крайние точки”);
PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT(“Тип карты”);
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT(“Вывести карту сетки”);
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT(“Вывести на хост”);
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT(“Вывести в CSV”);
PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT(“Резервировать сетку”);
PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT(“Вывод информации UBL”);
PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT(“Кол-во заполнителя”);
PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT(“Ручное заполнение”);
PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT(“Умное заполнение”);
PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT(“Заполнить сетку”);
PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT(“Аннулировать всё”);
PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT(“Обнулить ближ. точку”);
PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT(“Точная правка всего”);
PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT(“Настр. ближ. точки”);
PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT(“Хранилище сеток”);
PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT(“Слот памяти”);
PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT(“Загрузить сетку стола”);
PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT(“Сохранить сетку стола”);
PROGMEM Language_Str MSG_MESH_LOADED = _UxGT(“M117 Сетка %i загружена”);
PROGMEM Language_Str MSG_MESH_SAVED = _UxGT(“M117 Сетка %i сохранена”);
PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT(“Нет хранилища”);
PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT(“Ошибка: Сохран. UBL”);
PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT(“Ошибка: Восстан. UBL”);
PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT(“Смещение Z останов.”);
PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT(“Пошаговое UBL”);
PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT(“1.Построить хол. сетку”);
PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT(“2.Умное заполнение”);
PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT(“3.Проверить сетку”);
PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT(“4.Точная настр. всего”);
PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT(“5.Проверить сетку”);
PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT(“6.Точная настр. всего”);
PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT(“7.Сохранить сетку стола”);

PROGMEM Language_Str MSG_LED_CONTROL = _UxGT(“Настройка подсветки”);
PROGMEM Language_Str MSG_LEDS = _UxGT(“Подсветка”);
PROGMEM Language_Str MSG_LED_PRESETS = _UxGT(“Предустановки цвета”);
PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT(“Красный”);
PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT(“Оранжевый”);
PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT(“Жёлтый”);
PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT(“Зелёный”);
PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT(“Синий”);
PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT(“Индиго”);
PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT(“Фиолетовый”);
PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT(“Белый”);
PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT(“Цвет по умолчанию”);
PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT(“Свой цвет подсветки”);
PROGMEM Language_Str MSG_INTENSITY_R = _UxGT(“Уровень красного”);
PROGMEM Language_Str MSG_INTENSITY_G = _UxGT(“Уровень зелёного”);
PROGMEM Language_Str MSG_INTENSITY_B = _UxGT(“Уровень синего”);
PROGMEM Language_Str MSG_INTENSITY_W = _UxGT(“Уровень белого”);
PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT(“Яркость”);

PROGMEM Language_Str MSG_MOVING = _UxGT(“Движемся…”);
PROGMEM Language_Str MSG_FREE_XY = _UxGT(“Освобождаем XY”);
PROGMEM Language_Str MSG_MOVE_X = _UxGT(“Перемещение X”);
PROGMEM Language_Str MSG_MOVE_Y = _UxGT(“Перемещение Y”);
PROGMEM Language_Str MSG_MOVE_Z = _UxGT(“Перемещение Z”);
PROGMEM Language_Str MSG_MOVE_E = _UxGT(“Экструдер”);
PROGMEM Language_Str MSG_MOVE_EN = _UxGT(“Экструдер *”);
PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT(“Форсунка холодная”);
PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT(“ШАГ %sмм”);
PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(“ШАГ 0.1мм”);
PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(“ШАГ 1мм”);
PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(“ШАГ 10мм”);
PROGMEM Language_Str MSG_SPEED = _UxGT(“Скорость”);
PROGMEM Language_Str MSG_BED_Z = _UxGT(“Z стола”);
PROGMEM Language_Str MSG_NOZZLE = _UxGT(“Форсунка”);
PROGMEM Language_Str MSG_NOZZLE_N = _UxGT(“Форсунка ~”);
PROGMEM Language_Str MSG_BED = _UxGT(“Стол”);
PROGMEM Language_Str MSG_FAN_SPEED = _UxGT(“Обдув”);
PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT(“Обдув ~”);
PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT(“Обдув доп.”);
PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT(“Обдув доп. ~”);
PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT(“Обдув платы”);
PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT(“Обороты простоя”);
PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT(“Автовключение”);
PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT(“Рабочие обороты”);
PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT(“Простой после”);
PROGMEM Language_Str MSG_FLOW = _UxGT(“Поток”);
PROGMEM Language_Str MSG_FLOW_N = _UxGT(“Поток ~”);
PROGMEM Language_Str MSG_CONTROL = _UxGT(“Настройки”);
PROGMEM Language_Str MSG_MIN = ” ” LCD_STR_THERMOMETER _UxGT(” Мин”);
PROGMEM Language_Str MSG_MAX = ” ” LCD_STR_THERMOMETER _UxGT(” Макс”);
PROGMEM Language_Str MSG_FACTOR = ” ” LCD_STR_THERMOMETER _UxGT(” Фактор”);
PROGMEM Language_Str MSG_AUTOTEMP = _UxGT(“Автотемпература”);
PROGMEM Language_Str MSG_LCD_ON = _UxGT(“Вкл”);
PROGMEM Language_Str MSG_LCD_OFF = _UxGT(“Выкл”);
PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT(“Автонастройка”);
PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT(“Автонастройка *”);
PROGMEM Language_Str MSG_SELECT = _UxGT(“Выбор”);
PROGMEM Language_Str MSG_SELECT_E = _UxGT(“Выбор *”);
PROGMEM Language_Str MSG_ACC = _UxGT(“Ускорение”);
PROGMEM Language_Str MSG_JERK = _UxGT(“Рывок”);
PROGMEM Language_Str MSG_VA_JERK = _UxGT(“V”) LCD_STR_A _UxGT(“-рывок”);
PROGMEM Language_Str MSG_VB_JERK = _UxGT(“V”) LCD_STR_B _UxGT(“-рывок”);
PROGMEM Language_Str MSG_VC_JERK = _UxGT(“V”) LCD_STR_C _UxGT(“-рывок”);
PROGMEM Language_Str MSG_VE_JERK = _UxGT(“Ve-рывок”);
PROGMEM Language_Str MSG_VELOCITY = _UxGT(“Скорость”);
PROGMEM Language_Str MSG_VMAX_A = _UxGT(“Vмакс “) LCD_STR_A;
PROGMEM Language_Str MSG_VMAX_B = _UxGT(“Vмакс “) LCD_STR_B;
PROGMEM Language_Str MSG_VMAX_C = _UxGT(“Vмакс “) LCD_STR_C;
PROGMEM Language_Str MSG_VMAX_E = _UxGT(“Vмакс “) LCD_STR_E;
PROGMEM Language_Str MSG_VMAX_EN = _UxGT(“Vмакс *”);
PROGMEM Language_Str MSG_VMIN = _UxGT(“Vмин”);
PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT(“Vперем. мин”);
PROGMEM Language_Str MSG_ACCELERATION = _UxGT(“Ускорение”);
PROGMEM Language_Str MSG_AMAX_A = _UxGT(“Aмакс “) LCD_STR_A;
PROGMEM Language_Str MSG_AMAX_B = _UxGT(“Aмакс “) LCD_STR_B;
PROGMEM Language_Str MSG_AMAX_C = _UxGT(“Aмакс “) LCD_STR_C;
PROGMEM Language_Str MSG_AMAX_E = _UxGT(“Aмакс “) LCD_STR_E;
PROGMEM Language_Str MSG_AMAX_EN = _UxGT(“Aмакс *”);
PROGMEM Language_Str MSG_A_RETRACT = _UxGT(“A-втягивание”);
PROGMEM Language_Str MSG_A_TRAVEL = _UxGT(“A-перемещ.”);
PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT(“Подача”);
PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(“шаг/мм”);
PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(“шаг/мм”);
PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(“шаг/мм”);
PROGMEM Language_Str MSG_E_STEPS = _UxGT(“Eшаг/мм”);
PROGMEM Language_Str MSG_EN_STEPS = _UxGT(“*шаг/мм”);
PROGMEM Language_Str MSG_TEMPERATURE = _UxGT(“Температура”);
PROGMEM Language_Str MSG_MOTION = _UxGT(“Движение”);
PROGMEM Language_Str MSG_FILAMENT = _UxGT(“Пластик”);
PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT(“Поток (мм3)”);
PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT(“Диаметр пластика”);
PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT(“Диаметр пластика *”);
PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT(“Загрузка (мм)”);
PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT(“Выгрузка (мм)”);
PROGMEM Language_Str MSG_ADVANCE_K = _UxGT(“K продвижения”);
PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT(“K продвижения *”);
PROGMEM Language_Str MSG_CONTRAST = _UxGT(“Контраст ЖКИ”);
PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT(“Сохранить настройки”);
PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT(“Загрузить настройки”);
PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT(“Заводские настройки”);
PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT(“Изначальный EEPROM”);
PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT(“Обновление прошивки”);
PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT(“Сброс принтера”);
PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(“Обновить”);
PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(“Главный экран”);
PROGMEM Language_Str MSG_PREPARE = _UxGT(“Подготовить”);
PROGMEM Language_Str MSG_TUNE = _UxGT(“Настроить”);
PROGMEM Language_Str MSG_START_PRINT = _UxGT(“Начало печати”);
PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT(“Дальше”);
PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT(“Инициализация”);
PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT(“Остановить”);
PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT(“Печать”);
PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT(“Сброс”);
PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT(“Отмена”);
PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT(“Готово”);
PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT(“Пауза печати”);
PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT(“Продолжить печать”);
PROGMEM Language_Str MSG_STOP_PRINT = _UxGT(“Остановить печать”);
PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT(“Восстановение сбоя”);
PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT(“Печать с карты”);
PROGMEM Language_Str MSG_NO_MEDIA = _UxGT(“Карта отсутствует”);
PROGMEM Language_Str MSG_DWELL = _UxGT(“Сон…”);
PROGMEM Language_Str MSG_USERWAIT = _UxGT(“Продолжить…”);
PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT(“Печать на паузе”);
PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT(“Печать отменена”);
PROGMEM Language_Str MSG_NO_MOVE = _UxGT(“Нет движения.”);
PROGMEM Language_Str MSG_KILLED = _UxGT(“УБИТО. “);
PROGMEM Language_Str MSG_STOPPED = _UxGT(“ОСТАНОВЛЕНО. “);
PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT(“Втягивание (мм)”);
PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT(“Втягивание смены (мм)”);
PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT(“Втягивание V”);
PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT(“Втяг. прыжка (мм)”);
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT(“Возврат (мм)”);
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT(“Возврат смены (мм)”);
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT(“Возврат V”);
PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT(“Возврат смены V”);
PROGMEM Language_Str MSG_AUTORETRACT = _UxGT(“Автовтягивание”);

// TODO: Filament Change Swap / Purge Length

PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT(“Смена форсунки”);
PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT(“Поднятие по Z”);

// TODO: Singlenozzle, nozzle standby

PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT(“Смена пластика”);
PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT(“Смена пластика *”);
PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT(“Загрузка пластика”);
PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT(“Загрузка пластика *”);
PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT(“Выгрузка пластика *”);
PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT(“Выгрузить всё”);
PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT(“Подключить карту”);
PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT(“Сменить карту”);
PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT(“Отключить карту”);
PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT(“Z-датчик вне стола”);
PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT(“Фактор наклона”);
PROGMEM Language_Str MSG_BLTOUCH = _UxGT(“BLTouch”);
PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT(“Тестирование BLTouch”);
PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT(“Сброс BLTouch”);
PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT(“Опустить BLTouch”);
PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT(“Поднять BLTouch”);

// TODO: TouchMI Probe, Manual deploy/stow

PROGMEM Language_Str MSG_HOME_FIRST = _UxGT(“Требуется парковка %s%s%s”);
PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT(“Отступы Z-датчика”);
PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT(“Смещение X”);
PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT(“Смещение Y”);
PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT(“Смещение Z”);
PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT(“Микрошаг X”);
PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT(“Микрошаг Y”);
PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT(“Микрошаг Z”);
PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT(“Сработал концевик”);
PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT(“Нагрев не удался”);
PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT(“Неудача нагрева стола”);
PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT(“Ошибка: Избыточная Т”);
PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT(“НЕТ МОЩНОСТИ”);
PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT(“НЕТ МОЩНОСТИ СТОЛА”);
// TODO: Heated chamber
PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT(“Ошибка: Т макс.”);
PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT(“Ошибка: Т мин.”);
PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT(“Ошибка: Т стола макс”);
PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT(“Ошибка: Т стола мин.”);
// TODO: Heated chamber
PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT(“Требуется парковка XY”);
PROGMEM Language_Str MSG_HALTED = _UxGT(“ПРИНТЕР ОСТАНОВЛЕН”);
PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT(“Сделайте сброс”);
PROGMEM Language_Str MSG_SHORT_DAY = _UxGT(“д”); // One character only
PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT(“ч”); // One character only
PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT(“м”); // One character only
PROGMEM Language_Str MSG_HEATING = _UxGT(“Нагрев…”);
PROGMEM Language_Str MSG_COOLING = _UxGT(“Охлаждение…”);
PROGMEM Language_Str MSG_BED_HEATING = _UxGT(“Нагрев стола…”);
PROGMEM Language_Str MSG_BED_COOLING = _UxGT(“Охлаждение стола…”);
// TODO: Heated chamber
PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT(“Калибровка Дельта”);
PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT(“Калибровать X”);
PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT(“Калибровать Y”);
PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT(“Калибровать Z”);
PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT(“Калибровать центр”);
PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT(“Настройки Дельта”);
PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT(“Авто калибровка”);
PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT(“Задать высоту Дельта”);
PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT(“Задать Z-смещение”);
PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT(“Диаг. стержень”);
PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT(“Высота”);
PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT(“Радиус”);
PROGMEM Language_Str MSG_INFO_MENU = _UxGT(“О ПРИНТЕРЕ”);
PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT(“Данные принтера”);
PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT(“Калибровка 3-х точек”);
PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT(“Калибровка линейная”);
PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT(“Калибровка билинейная”);
PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT(“Калибровка UBL”);
PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT(“Калибровка сетки”);
PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT(“Статистика принтера”);
PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT(“Контроллер”);
PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT(“Термисторы”);
PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT(“Экструдеры”);
PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT(“БОД”);
PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT(“Протокол”);
PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT(“Контроль темп.: Выкл”);
PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT(“Контроль темп.: Вкл”);

PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT(“Подсветка корпуса”);
PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT(“Яркость подсветки”);
PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT(“Неверный принтер”);

#if LCD_WIDTH >= 20
PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT(“Счётчик печати”);
PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT(“Закончено”);
PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT(“Общее время печати”);
PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT(“Наибольшая печать”);
PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT(“Длина пластика”);
#else
PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT(“Отпечатков”);
PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT(“Закончено”);
PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT(“Всего”);
PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT(“Наибольшее”);
PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT(“Выдавлено”);
#endif
PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT(“Температура мин.”);
PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT(“Температура макс”);
PROGMEM Language_Str MSG_INFO_PSU = _UxGT(“БП”);
PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT(“Сила привода”);
PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT(“X Привод %”);
PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT(“Y Привод %”);
PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT(“Z Привод %”);
PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT(“E Привод %”);
PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT(“Запись DAC EEPROM”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT(“СМЕНА ПЛАСТИКА”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT(“ПЕЧАТЬ НА ПАУЗЕ”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT(“ЗАГРУЗКА ПЛАСТИКА”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT(“ВЫГРУЗКА ПЛАСТИКА”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT(“ОПЦИИ ВОЗОБНОВЛЕНИЯ:”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT(“Чистка…”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT(“Продолжение…”);
PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(” ФОРСУНКА: “);
PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT(“Возврат не удался”);
PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT(“Не удалось прощупать”);
PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT(“M600: Низкая Т”);

// TODO: MMU2

// TODO: Mixing

PROGMEM Language_Str MSG_GAMES = _UxGT(“Игры”);
PROGMEM Language_Str MSG_BRICKOUT = _UxGT(“Кирпичи”);
PROGMEM Language_Str MSG_INVADERS = _UxGT(“Вторжение”);
PROGMEM Language_Str MSG_SNAKE = _UxGT(“Змейка”);
PROGMEM Language_Str MSG_MAZE = _UxGT(“Лабиринт”);

//
// Filament Change screens show up to 3 lines on a 4-line display
// …or up to 2 lines on a 3-line display
//
#if LCD_HEIGHT >= 4
PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE(“Ждите”, “начала замены”, “пластика”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE(“Ждите”, “выгрузки”, “фпластика”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE(“Вставьте пластик”, “нажмите кнопку”, “для продолжения”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE(“Нажмите кнопку для”, “нагрева форсунки”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE(“Нагрев форсунки”, “Ждите…”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE(“Ждите”, “загрузки пластика”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE(“Ждите”, “экструзии”, “пластика”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE(“Ждите”, “возобновления”, “печати”));
#else
PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE(“Ожидайте…”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE(“Выгрузка…”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE(“Вставь и нажми”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE(“Нагрев…”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE(“Загрузка…”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE(“Выдавливание…”));
PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE(“Возобновление…”));
#endif

PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT(“Драйвера TMC”);
PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT(“Текущие настройки”);
PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT(“Гибридный режим”);
PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT(“Режим без эндстопов”);
PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT(“Режим шага”);
PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT(“Тихий режим вкл”);

// TODO: RUNOUT SENSOR
PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT(“Датчик пластика”);
PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT(“Дистанция (мм)”);

// TODO: Service

// TODO: Backlash
}

После включения вспомогательных функций для датчика окончания пластика, заметил, что не все текстовые переменные переведены на национальный язык. В этом случае в файле “language_en.h” нужно отыскать непереведенный текст, скопировать строку с переменной в локализованный файл и прописать собственный перевод!

ЗАКЛЮЧЕНИЕ

По итогам статьи принтер полностью настроен и готов к эксплуатации. Подготовку слайсера рассмотрим в следующей статье…

При подготовке прошивке очень сильно проявился недостаток “слабых” контроллеров на платах Sanguinololu – катастрофическая нехватка памяти программ! Используйте контроллеры на базе MEGA 2560…

ВАША ПОДДЕРЖКА ПОМОЖЕТ АКТИВНЕЙ РАБОТАТЬ НАД БЛОГОМ, ПУБЛИКОВАТЬ БОЛЬШЕ СТАТЕЙ, КОТОРЫЕ, В СВОЮ ОЧЕРЕДЬ, ПОМОГУТ ВАМ РЕАЛИЗОВЫВАТЬ ИНТЕРЕСНЫЕ ПРОЕКТЫ.

СПАСИБО ЗА УЧАСТИЕ В ЖИЗНИ БЛОГА!

ЯНДЕКСWEBMONEYQIWIPAYPAL

Добавить комментарий