Добавить в корзинуПозвонить
Найти в Дзене
3DTODAY

Адресная лента для отображения статусов 3Д принтера

Адресная лента для отображения статусов 3Д принтера, прогресса печати, ошибок и т.д. Вобщем увидел тут в одном из обзоров на Bambulab H2D, что на их принтерах используется светодиодная лента на передней части стола принтера, которая светится разными цветами в зависимости от состояния принтера и отображает прогресс печати. И захотелось сделать такую же. Делается все на адресной ленте типа WS2812B. Ленты бывают с разным количеством светодиодов на метр. Я взял пожирнее 72св/м Вообще для этого есть проект на GitHub klipper-led_effect, но он требует подключения ленты к свободному пину на материнской плате. На моем QIDI Q1 был только один такой пин, но подключение к нему эффекта не дало. Лента как то криво управлялась. Поэтому на просторах интернета был найден проект WLED. Адресная лента здесь подключается к внешенему контроллеру ESP8266/ESP32 и полностью ей управляет. Есть веб интерфейс где можно настроить ленту и на лету менять эффекты. Так же можно управляеть лентой по различным протокола

Адресная лента для отображения статусов 3Д принтера, прогресса печати, ошибок и т.д.

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

Делается все на адресной ленте типа WS2812B. Ленты бывают с разным количеством светодиодов на метр. Я взял пожирнее 72св/м

Вообще для этого есть проект на GitHub klipper-led_effect, но он требует подключения ленты к свободному пину на материнской плате. На моем QIDI Q1 был только один такой пин, но подключение к нему эффекта не дало. Лента как то криво управлялась.

Поэтому на просторах интернета был найден проект WLED. Адресная лента здесь подключается к внешенему контроллеру ESP8266/ESP32 и полностью ей управляет. Есть веб интерфейс где можно настроить ленту и на лету менять эффекты. Так же можно управляеть лентой по различным протоколам HTTP, MQTT и т.д. И Moonraker принтера под клиппером тоже может управлять этой лентой

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

Реализация

И так по порядку как все реализуется. Я взял ESP8266 в виде модуля WEMOS D1 MINI. Для ее питания от 24В БП принтера поставил понижайку с 24В до 5В. Для согласования уровня с ESP (3.3V) и ленты (5V) я поставил два инвентора микросхемы К155ЛН1, так как все равно валяются без дела. Но можно сделать и по такой схеме

-2

Идем на сайт онлайн установщика WLED https://wled-install.github.io/ или https://install.wled.me/ ( уменя сработал первый, второй почему то не захотел). Выбираем тип своей платы (wemos d1 mini), подключаем ее к компьютеру, выбираем COM порт под которым определилась плата. И прошиваем.

После перезагрузки плата создасть точку доступа WLED-AP. Необходимо к ней подключиться, через браузер зайти в веб интерфейс платы. Перейти в настройки WIFI и подключить ее к своей сети. Там же в настройках перейти в раздел LED и настроить свою ленту. Нужно выбрать тип светодиодов, номер пина ESP к которому вы ее подключили и количество светодиодов в вашем отрезке. Вот мои настройки

-3

Теперь в основном окне уже можно потыкать в радугу и лента должна светиться выбраным цветом. там же можно выбирать эффекты. С правой стороны будут отображаться ваши сохраненные пресеты.

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

Вот мои пресеты

-4

Все пресеты имею свой ID именно по нему мы и будем их активировать из клиппера. Персет с именем BOOT со звездочкой. Это означает, что он будт включаться при включении ESP, а значит и при включении принтера. Для него есть эффект Loading. Будет бегущий цвет на фоне другого цвета на подобие полосы загрузки. Как на этом видео Включение принтера

После настройки желаемых эфектов переходим к настройки принтера

Настройка принтера

Через браузер заходим на наш принтер. Переходим в раздел "Система". Нам нужно отредактировать конфиг moonraker.conf. Открываем его и добавляем следующее:

[wled wled_bed] type: http address: 192.168.1.93 #IP адрес вашей ESP в сети initial_red: 0.0 initial_green: 1.0 initial_blue: 0.0 chain_count: 37 #количество светодиодов в ленте

Теперь нужно добавить макросы для управления лентой. Я рекомендую создать отдельный файл в папке конфигов и там делать все манипуляции, что бы ваши макросы не мешались с основными макросами системы. Да и банально проще так оринетироваться. Я создал файл wled.conf. Что бы Клиппер его подтянул, добавте в ваш printer.cfg следущие строки

[include wled.cfg]

Теперь открываем наш wled.cfg и создаем макросы. Можно сделать макросы как рекомендуют на Moonraker и макросом SET_WLED вы уже из консоли принтера можете управлять лентой

[gcode_macro SET_WLED] description: SET_LED like functionality for WLED, applies to all active segments gcode: {% set strip = params.STRIP|string %} {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set index = params.INDEX|default(-1)|int %} {% set transmit = params.TRANSMIT|default(1)|int %} {action_call_remote_method("set_wled", strip=strip, red=red, green=green, blue=blue, white=white, index=index, transmit=transmit)}

Например если отдадите команду

SET_WLED GREEN=1 RED=1 BLUE=1 TRANSMIT=1

То ваша лента вся загорится белым цветом. Парметры GREEN, RED, BLUE принимают значения от 0.0 до 1.0. 0 соответствует выключенному состоянию, 1 - включенному на максимальную яркость.

Макрос WLED_ON включает выбраный пресет

По команде:

WLED_ON PRESET=1

Включится пресет с ID=1

Ниже я привожу свои макросы которые сделал я для отображения нужных мне эфеектов

Макрос управления светодиодами по их индексу[gcode_macro WLED_SET] description: SET_LED like functionality for WLED, applies to all active segments gcode: {% set strip = params.STRIP|default('wled_bed')|string %} {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set index = params.INDEX|default(-1)|int %} {% set transmit = params.TRANSMIT|default(1)|int %} #{% set preset = params.PRESET|default(2)|int %} {action_call_remote_method("set_wled", strip=strip, red=red, green=green, blue=blue, white=white, index=index, transmit=transmit)}Макрос включения выбранного пресета[gcode_macro UPDATE_WLED]description: update wled stategcode: {% set PRESET = params.PRESET | default(None) | string %} {% if PRESET == 'HEATING' %} {% set PRESET_NUM = 25 | int %} #25 и цифры далее это ID пресета.Здесь ID=25 соответствует пресету с именем HEATING {% elif PRESET == 'HEATING_HOT' %} {% set PRESET_NUM = 9 | int %} {% elif PRESET == 'HEATING_LEVEL1' %} {% set PRESET_NUM = 7 | int %} {% elif PRESET == 'HEATING_LEVEL2' %} {% set PRESET_NUM = 8 | int %} {% elif PRESET == 'HEATING_COLD' %} {% set PRESET_NUM = 6 | int %} {% elif PRESET == 'PAUSE' %} {% set PRESET_NUM = 1 | int %} {% elif PRESET == 'CANCEL' %} {% set PRESET_NUM = 2 | int %} {% elif PRESET == 'COMPLETE' %} {% set PRESET_NUM = 5 | int %} {% elif PRESET == 'HOMING' %} {% set PRESET_NUM = 3 | int %} {% elif PRESET == 'IDLE' %} {% set PRESET_NUM = 4 | int %} {% elif PRESET == 'RESUME' %} {% set PRESET_NUM = 20 | int %} {% elif PRESET == 'READY' %} {% set PRESET_NUM = 22 | int %} {% elif PRESET == 'ERROR' %} {% set PRESET_NUM = 23 | int %} {% endif %} {action_call_remote_method("set_wled_state", strip='wled_bed', state=True, preset=PRESET_NUM)}Макрос отвечающий за отображения прогресса печати#Update WLED preset based on print progress[gcode_macro _WLED_PROGRESS]gcode: {% set progress = (printer.display_status.progress * 100) | int %} {% set green = (printer.display_status.progress * 37) | round | int %} {% set white_beginning = (green + 1) | int %} {% set white_end = 37 | int %} {% if green == 37 %} WLED_SET GREEN=1 {% else %} WLED_SET GREEN=1 RED=1 BLUE=1 TRANSMIT=0 {% for index in range(green|int) %} {% if (green-1) > index %} WLED_SET GREEN=1 INDEX={(index+1)} TRANSMIT=0 {% else %} WLED_SET GREEN=1 INDEX={(index+1)} TRANSMIT=1 {% endif %} {% endfor %} {% endif %} M118 Прогресс печати: {progress} % Для переодического обновления ленты используется отложенный макрос который сам себя перезапускает#Update WLED preset based on heating [delayed_gcode WLED_STATUS] initial_duration: 5 gcode: {% set CURRENT_TEMP = printer.heater_bed.temperature|float %} {% set SET_TEMP = printer['heater_bed'].target|float %} {% set STATUS = printer.print_stats.state|string %} {% if SET_TEMP == 0 and STATUS == 'standby' %} #В режиме простоя принтер будет включать пресеты в зависимости от нагрева стола. Тем самым сигнализируя, что стол еще горячий {% if CURRENT_TEMP > 60 %} UPDATE_WLED PRESET=HEATING_HOT {% elif 60 > CURRENT_TEMP > 40 %} UPDATE_WLED PRESET=HEATING_LEVEL2 {% else %} UPDATE_WLED PRESET=IDLE {% endif %} {% elif STATUS == 'standby' %} #Если будет задана температура нагрева стола будут поочери в зависимости от заданной температуры по мере прогрева включатся пресеты холодного стола, горячего стола и два уровня прормежуточных {% if CURRENT_TEMP >= (SET_TEMP - 1) %} UPDATE_WLED PRESET=HEATING_HOT {% elif CURRENT_TEMP > 3 * (SET_TEMP / 4) %} UPDATE_WLED PRESET=HEATING_LEVEL2 {% elif CURRENT_TEMP > 2 * (SET_TEMP / 4) %} UPDATE_WLED PRESET=HEATING_LEVEL1 {% elif CURRENT_TEMP < 2 * (SET_TEMP / 4) %} UPDATE_WLED PRESET=HEATING_COLD {% endif %} {% elif STATUS == 'printing' %} #В процессе печати запускается макрос прогресса печати _WLED_PROGRESS {% elif STATUS == 'paused' %} #Запуск пресета паузы UPDATE_WLED PRESET=PAUSE {% elif STATUS == 'error' %} UPDATE_WLED PRESET=ERROR #Запуск пресета ошибки {% elif STATUS == 'complete' %} UPDATE_WLED PRESET=COMPLETE {% endif %} UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=5 # Перезапуск макроса каждые 5сек

Теперь нужно в файл macros.cfg добавить строки для запуска тех пересетов которые не отрабатываются переодическим макросом

Команда G28 (HOME). В начале секции добавить:

[gcode_macro G28]gcode: UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=0 # Эта команда останавливает наш переодический макрос, что бы он не переключал на пресет который включается ниже UPDATE_WLED PRESET=HOMING

В конце:

UPDATE_WLED PRESET=READY UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=1 # Тут мы опять запускаем наш переодический макрос

В конце секции PRINT_START вставить

UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=5

В начале секции RESUME

UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=0 UPDATE_WLED PRESET=RESUME

В конце секции

UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=1

В начале секции CANCEL_PRINT

UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=0 UPDATE_WLED PRESET=CANCEL

В конце секции

UPDATE_DELAYED_GCODE ID=WLED_STATUS DURATION=1

Ну и в конце немного видео с некоторыми эфектами Нагрев, Прогресс печати, Загрузка, Парковка осей