Как уменьшить лаги из-за сенсорных дисплеев

Откуда берутся лаги при использовании сенсорных экранов?

Почему такие лаги возникают? Когда экран управляется непосредственно платой 3д принтера, прошивка в этой плате сама интерпретирует G-код файл с флешки и, в случае быстрого выполнения команд, начинает быстрее читать файл. Когда экран обладает своим микроконтроллером и своей прошивкой, то уже китайская прошивка внутри экрана читает файл, бьёт по отдельным командам и засылает их в прошивку управляющей платы. Там эти команды складываются в буфер и берутся оттуда на выполнение по мере необходимости. Если случается такой момент, что команды начинают выполняться очень-очень быстро, то буфер пустеет и прошивке остаётся нечего исполнять. Она останавливает или притормаживает перемещения в ожидании новых команд от прошивки экрана, но та недостаточно умна чтобы замечать пустой буфер прошивки в плате и продолжает слать их медленно. Лаги продолжаются до выхода на простую геометрию, где в единицу времени выполняется мало команд и буфер успевает наполниться.

Для каких дисплеев это актуально?

Для тех, которые имеют свой отдельный микроконтроллер и свою отдельную прошивку, и в которые подключаются флешки (не важно, SD-карточки или USB-флешки). К примеру, это экраны серии MKS TFT, частично экраны BIQU TFT.

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

Как исправить?

У экранов от фирмы BIQU. обычно, есть два режима работы: сенсорный и эмуляция экрана 12864. Следует пользоваться только режимом эмуляции экрана 12864 и запускать печать через него.

У экранов фирмы MKS и других, где эмуляции 12864 экрана нет, вариант решить проблемы один — удалить экран из принтера, заменив обычным 12864 или 2004 экраном. С ними таких лагов не наблюдается так как они поддерживаются прошивкой Marlin нативно, без костылей.

Что делать, если экран вызывает лаги, но поменять никак?

Желательно, конечно, не оставлять в своём 3д-принтере косячную электронику. Но на момент ожидания доставки нормального дисплея можно немного сгладить лаги.

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

  • В Cura за разрешение нарезки отвечает параметр Experimental → Minimum Polygon Circumference
  • В Prusaslicer за разрешение нарезки отвечает параметр Print Settings → Advanced → Resolution

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

Также можно попробовать увеличить буфер в прошивке. В Marlin это делается в файле Configuration_adv.h:

#if ENABLED(SDSUPPORT)
  #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller
#else
  #define BLOCK_BUFFER_SIZE 16 // maximize block buffer
#endif

В этом блоке можно увеличить размер буфера линейных движений в нижнем параметре BLOCK_BUFFER_SIZE. Это как раз тот параметр, который больше всего влияет на устранение лагов — его надо крутить в первую очередь. Для 8-битных плат редко когда можно поставить больше 32, для 32-битных можно поставить и очень много.

// The ASCII buffer for serial input
#define MAX_CMD_SIZE 96
#define BUFSIZE 4

MAX_CMD_SIZE менять смысла нет. А вот BUFSIZE — это тоже хороший для устранения лагов параметр. Крутим его во вторую очередь. Для 8-битных плат предел, обычно, около 16. Для 32-битных можно и больше поставить.

// Transmission to Host Buffer Size
// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0.
// To buffer a simple "ok" you need 4 bytes.
// For ADVANCED_OK (M105) you need 32 bytes.
// For debug-echo: 128 bytes for the optimal speed.
// Other output doesn't need to be that speedy.
// :[0, 2, 4, 8, 16, 32, 64, 128, 256]
#define TX_BUFFER_SIZE 0

TX_BUFFER_SIZE здесь стоит тоже поставить настолько большим, насколько это возможно. Для 8-битных плат, обычно, получается выставить 4-8, редко 16. Для 32-битных, опять же, больше. Если хотите использовать OctoPrint, то следует выставить не менее 32.

// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary.
//#define ADVANCED_OK

Для OctoPrint следует раскомментировать этот параметр. Для сенсорных экранов он не работает, можно не включать. Также ADVANCED_OK работает для печати через Repetier-host. Про другое ПО пока данных нет.

Выводы

Указанные выше действия помогают уменьшить лаги от сенсорных экранов, но не устранить их полностью. Если вам обязательно нужен сенсорный экран и никак иначе, то лучше купите комплекс плата + экран, которые сделаны нормально и не лагают. Пример: платы Lerdge. Если же вы пользуетесь платами под прошивку Marlin, то выбора у вас нет: печатать нормально можно только с 12864 или 2004 экранами, так как другие либо нативно не поддерживаются марлином, либо поддерживаются только в режиме эмуляции этих.