KREMEN Реклама
KREMEN Реклама

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

dimbas_z
Идет загрузка
Загрузка
13.02.2026
107
0
Техничка

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

3

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

Адресная лента для отображения статусов 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, так как все равно валяются без дела. Но можно сделать и по такой схеме

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

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

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

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

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

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

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

Все пресеты имею свой 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

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

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

3
Комментарии к статье
Lider 3D Реклама
Lider 3D Реклама