Programming, electronics, lifestyle

04 Jan 2022

Настройка Marlin под 3D‑принтер UlTi‑Steel (BigTreeTech SKR 1.3)

Привет! Необходимость собрать прошивку для UlTi-Steel у меня возникла по нескольким причинам:

  1. Потому что сами ребята из Ivilol больше не обновляют прошивку для первой версии UlTi-Steel.
  2. Если посмотреть в их репозиторий у меня кровь из глаз идет и возникает много вопросов.
  3. У меня есть необходимость добавить в прошивку свои настройки.
  4. Полный бардак происходит в истории и коде самого Marlin. Учитывая это, я бы не хотел обновлять прошивку с использованием операции Merge, а делать Rebase небольшого количества своих коммитов (учитывая, что это не изменения к Marlin, а лишь ограниченный набор настроек для конкретного принтера, я позволю себе это).

Собственно идея следующая – написать небольшое руководство, по которому любой легко сможет изменить актуальную версию Marlin под свой UlTi-Steel, не опираясь на разработчиков самого принтера или какие-то другие репозитории.

Я буду рассказывать все на примере своего ульти с драйверами подключенными по UART, с контроллером RepRap SmartController с дисплеем LCD2004.

image

Добавление всяких ништяков будет в отдельной статьях, например Подключение BTT Smart Filament Sensor к SKR v1.3.

За основу я возьму последний на сегодняшний день тег 2.0.9.2 из мастер ветки (2.0.x) в upstream (Marlin). И буду добавлять коммиты сверху. Моя ветка urpylka_ultisteel будет располагаться в моём репозитории. Базовые настройки я возьму из официального репозитория Ivilol.

Версия 2.0.9.3 получилась битой – на ней не работает дисплей.

Настройка прошивки

  1. Определяем информацию о вашей прошивке

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

    /Marlin/src/inc/Version.h

    #define SOURCE_CODE_URL "github.com/urpylka/Marlin"
    ...
    #define WEBSITE_URL "urpylka.com/posts/post-56"
    

    Однако, я понял, что даже это лишнее и отказался от этого тк:

    1. Я не меняю логики прошивки, а лишь конфигурационные файлы.
    2. В разделе меню информация о принтере отображается только WEBSITE_URL и не полностью.
    3. Получается я вношу изменения в дополнительные файлы во вне конфигурации которые должен потом таскать.

    Менять MACHINE_NAME в этом файле также не стоит, тк переопределить его можно в основном конфигурационном файле, о чем пойдет речь в следующем пункте.

  2. Меняем название машины, которое высвечивается на экране после загрузки

    Configuration.h

    #define CUSTOM_MACHINE_NAME "UlTi-Steel"
    
  3. Определяем автора конфигурации

    Configuration.h

    #define STRING_CONFIG_H_AUTHOR "(urpylka, UlTi-Steel)" // Who made the changes.
    
  4. Изменяем микроконтроллер для сборки

    platformio.ini

    default_envs = LPC1768
    
  5. Определяем используемую плату принтера

    Configuration.h

    #ifndef MOTHERBOARD
      #define MOTHERBOARD BOARD_BTT_SKR_V1_3
    #endif
    
  6. Определяем режим работы 2го Serial порта

    Configuration.h

    #define SERIAL_PORT_2 -1
    
  7. Определяем порт МК для управления вентилятором (E0_AUTO_FAN_PIN)

    Configuration_adv.h

    #define E0_AUTO_FAN_PIN P2_04
    
  8. Определяем драйвера двигателей

    Для TMC2208 есть два варианта подключения:

    1. TMC2208 – по UART
    2. TMC2208_STANDALONE – через пины STP и DIR

    Configuration.h

    #define X_DRIVER_TYPE TMC2208
    #define Y_DRIVER_TYPE TMC2208
    #define Z_DRIVER_TYPE TMC2208
    #define E0_DRIVER_TYPE TMC2208
    
  9. Включаем мониторинг состояния драйверов

    Configuration_adv.h

    #define MONITOR_DRIVER_STATUS
    
  10. Включаем вывод отладочной информации для драйвера

    Configuration_adv.h

    #define TMC_DEBUG
    
  11. Меняем разрешение осей

    Это количество шагов шагового двигателя на 1мм. Значение рассчитаны Ivilol.

    Configuration.h

    #define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 1600, 148.50 }
    
  12. Меняем фидрейт для осей

    Значение рассчитаны Ivilol.

    Configuration.h

    #define DEFAULT_MAX_FEEDRATE          { 300, 300, 5, 100 }
    
  13. Задаем лимит по оси Z

    Configuration.h

    #define Z_MAX_POS 270
    
  14. Включаем работу EEPROM

    Configuration.h

    #define EEPROM_SETTINGS
    ...
    #define EEPROM_AUTO_INIT
    
  15. Выбираем контроллер управления

    Configuration.h

    На моей версии принтера установлен RepRap Smart Controller

    #define REPRAP_DISCOUNT_SMART_CONTROLLER
    

    На обновленной версии принтера используется контроллер FYSETC_MINI_12864

    #define FYSETC_MINI_12864_2_1
    
  16. Включаем звуковую индикацию при нажатии

    Configuration.h

    #define SPEAKER
    #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100
    #define LCD_FEEDBACK_FREQUENCY_HZ 5000
    

    А также позволяем отключать её из меню:

    Configuration_adv.h

    #define SOUND_MENU_ITEM
    
  17. Изменяем сторону вращения энкодера

    Если требуется, раскомментируем нужные строки. В моём случае понадобилось раскомментировать параметр REVERSE_ENCODER_DIRECTION Configuration.h

    #define REVERSE_ENCODER_DIRECTION
    ...
    // #define REVERSE_MENU_DIRECTION
    ...
    // #define REVERSE_SELECT_DIRECTION
    
  18. Настраиваем кодировку для LCD дисплея

    В прошивке от Ivilol параметры в файле Configuration.h заданы следующим образом:

    #define LCD_LANGUAGE ru
    ...
    #define DISPLAY_CHARSET_HD44780 CYRILLIC
    

    Я не планирую использовать русский язык и буду использовать стандартные настройки

    #define LCD_LANGUAGE en
    ...
    #define DISPLAY_CHARSET_HD44780 JAPANESE
    
  19. Определяем цвет и яркость подсветки дисплея

    По умолчанию в файле Configuration_adv.h заданы такие настройки:

    #define LED_USER_PRESET_RED        255  // User defined RED value
    #define LED_USER_PRESET_GREEN      128  // User defined GREEN value
    #define LED_USER_PRESET_BLUE         0  // User defined BLUE value
    #define LED_USER_PRESET_WHITE      255  // User defined WHITE value
    #define LED_USER_PRESET_BRIGHTNESS 255  // User defined intensity
    //#define LED_USER_PRESET_STARTUP       // Have the printer display the user preset color on startup
    

    Ivilol изменил их на такие:

    #define LED_USER_PRESET_RED        0    // User defined RED value
    #define LED_USER_PRESET_GREEN      255  // User defined GREEN value
    #define LED_USER_PRESET_BLUE       255  // User defined BLUE value
    #define LED_USER_PRESET_WHITE      0    // User defined WHITE value
    #define LED_USER_PRESET_BRIGHTNESS 150  // User defined intensity
    #define LED_USER_PRESET_STARTUP         // Have the printer display the user preset color on startup
    

    Тк у меня используется RepRap Smart Controller, я оставлю стандартные настройки.

  20. Включаем поддержку SD карт

    Configuration.h

    #define SDSUPPORT
    
  21. Проверка контрольных сумм для файлов на карте

    Configuration.h

    #define SD_CHECK_AND_RETRY
    
  22. Включаем работу с SD картой из RepRap Smart Controller

    Configuration_adv.h

    #define SDCARD_CONNECTION LCD
    
  23. Определяем толщину используемого пластика

    Configuration.h

    #define DEFAULT_NOMINAL_FILAMENT_DIA 1.75
    
  24. Включаем работу нагревательного стола

    Configuration.h

    #define TEMP_SENSOR_BED 1
    
  25. Определяем конфигурацию нагрева стола

    В первую очередь, нужно включить ПИД регулятор, что это можете прочитать Википедии.

    Configuration.h

    #define PIDTEMPBED
    

    И изменим дефолтные значения на рассчитанные компанией Ivilol:

    #define DEFAULT_bedKp 97.56
    #define DEFAULT_bedKi 8.51
    #define DEFAULT_bedKd 279.73
    
  26. Задаём минимальную температуру при которой разрешаем выдавливание пластика

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

    В прошивке от Ivilol задана температура 80 градусов Цельсия. Однако я не планирую это и оставлю дефолтное значение в 170 градусов. Для защиты механизма фидера и фитингов.

    Configuration.h

    #define EXTRUDE_MINTEMP 170
    
  27. Задаём максимальную длину пластика в мм, которую можно выдавить одной командой

    Сделано для безопасности, чтобы по ошибке принтер не выдавил всё что есть. В процессе печати это не страшно, тк слайсер делает много небольших выдавливаний. А вот при загрузке пластика – актуально. Тк у меня боуден, то меняю параметр с 200мм на 1000мм.

    Configuration.h

    #define EXTRUDE_MAXLENGTH 1000
    
  28. Меняем температуру экструдера и стола для операции преднагрева

    Ivilol прелагает использовать для этого следующие температуры:

    Configuration.h

    #define PREHEAT_1_TEMP_HOTEND = 190
    ...
    #define PREHEAT_2_TEMP_HOTEND = 230
    #define PREHEAT_2_TEMP_BED = 90
    

    Я не понимаю зачем это было сделано, поэтому я оставлю значения по умолчанию:

    • для PLA – 180/70 градусов
    • для ABS – 240/110 градусов
  29. Задаём клиренс при калибровке стола

    Ivilol задали его равным нулю. Для меня это спорный вопрос, с одной стороны хорошо что экструдер пойдет по столу до следующей точки. С другой стороны, если стол будет задран, то экструдер упрется или прокорябает по нему.

    Я думаю что дефолтное значение в 5мм вполне объективно.

    Configuration.h

    #define Z_CLEARANCE_BETWEEN_PROBES  5
    
  30. Включаем автоматическую парковку

    Configuration.h

    #define NOZZLE_PARK_FEATURE
    
  31. Настраиваем работу ADVANCED_PAUSE_FEATURE

    Такие параметры заданы Ivilol, я сделаю также.

    Configuration_adv.h

    #define FILAMENT_CHANGE_UNLOAD_FEEDRATE     300   // (mm/s) Unload filament feedrate. This can be pretty fast.
    ...
    #define FILAMENT_CHANGE_UNLOAD_LENGTH      800    // (mm) The length of filament for a complete unload.
                                                      //   For Bowden, the full length of the tube and nozzle.
                                                      //   For direct drive, the full length of the nozzle.
                                                      //   Set to 0 for manual unloading.
    ...
    #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE   300  // (mm/s) Load filament feedrate. This can be pretty fast.
    ...
    #define FILAMENT_CHANGE_FAST_LOAD_LENGTH     800  // (mm) Load length of filament, from extruder gear to nozzle.
                                                      //   For Bowden, the full length of the tube and nozzle.
                                                      //   For direct drive, the full length of the nozzle.
    ...
    #define ADVANCED_PAUSE_CONTINUOUS_PURGE           // Purge continuously up to the purge length until interrupted.
    ...
    #define PARK_HEAD_ON_PAUSE                        // Park the nozzle during pause and filament change.
    
  32. Включаем сбор статистики принтера

    Configuration.h

    #define PRINTCOUNTER
    
  33. Включаем вывод информации о принтере

    Configuration_adv.h

    #define LCD_INFO_MENU
    
  34. Добавляем кастомные в команды в главное меню (CUSTOM_MENU_MAIN)

    Вы можете добавить в главное меню до 25 кастомных команд. Я этого делать не стал, тк все, что мне нужно у меня и так есть. Однако если вам это нужно обратите внимание на секцию Custom Menu: Main Menu в файле Configuration_adv.h.

Дополнительный алгоритм калибровки стола

Обычная калибровка включается раскомментированием опции LEVEL_BED_CORNERS в Configuration.h. Я не вижу в этом необходимости, однако мб кому-то это мб полезно, учитывая, что Ivilol заморочились и добавили алгоритм калибровки по трём точкам.

Для этого они в Configuration.h внесли новый дефайн:

#define LEVEL_CORNERS_3POINT

А также заменили:

#define LEVEL_CORNERS_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets

на

#define LEVEL_CORNERS_INSET_LFRB { 5, 5, 5, 5 } // (mm) Left, Front, Right, Back insets

чтобы калибровка снизить общую ошибку при калибровке по трём точкам.

А также внесли изменения в файл с логикой калибровки /Marlin/src/lcd/menu/menu_bed_corners.cpp:

Было:

    line_to_z(LEVEL_CORNERS_Z_HOP);
    switch (bed_corner) {
    case 0: current_position   = lf;   break; // copy xy
    case 1: current_position.x = rb.x; break;
    case 2: current_position.y = rb.y; break;
    case 3: current_position.x = lf.x; break;
    #if ENABLED(LEVEL_CENTER_TOO)
        case 4: current_position.set(X_CENTER, Y_CENTER); break;
    #endif
    }

Стало:

    line_to_z(LEVEL_CORNERS_Z_HOP);
    switch (bed_corner) {
    case 0: current_position   = lf;   break; // copy xy
    case 1: current_position.x = rb.x; break;
    #if ENABLED(LEVEL_CORNERS_3POINT)
        case 2: current_position.set(X_CENTER, rb.y); break;
    #else
        case 2: current_position.y = rb.y; break;
        case 3: current_position.x = lf.x; break;
        #if ENABLED(LEVEL_CENTER_TOO)
        case 4: current_position.set(X_CENTER, Y_CENTER); break;
        #endif
    #endif
    }

Также этот алгоритм менял DeZepTup, ветка main коммиты bb9ad1fc6a02e290b30cf57b7e401b10b675026a и b048505a395452af94f228470fb653eac1ba1877, добавив туда работы с BLtouch.

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

Сборка прошивки

Я работаю с исходным кодом в VScode. Для сборки использую плагин Platformio. Как установить плагин и собрать прошивку хорошо изложено в официальной документации Marlin.


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