Кремень КД Реклама
Кремень КМ Реклама

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

Artvel
Идет загрузка
Загрузка
07.12.2024
3218
14
Техничка

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

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

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

17

Хочу поделиться способом, который позволяет управлять питанием 3D-принтера: включать и выключать его, как дистанционно, так и с помощью физической кнопки. Я использовал Bigtreetech Relay v1.2 и принтер под управлением прошивки Klipper.

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

Принцип работы BTT Relay

Реле имеет 2 основных управляющих пина: PowerDetect и Reset.

  • PowerDetect - Сигнал от MCU, с помощью которого реле понимает, работает ли сейчас принтер. Высокий сигнал говорит о том, что необходимо оставить реле замкнутым. После обнаружения низкого уровня и по истечении таймаута (около 10 секунд) реле разомкнет цепь.
  • Reset - Сброс реле. После сброса реле замыкается, дальше все зависит от уровня на PowerDetect. Либо цепь останется замкнутой, либо разомкнется по истечении таймаута.

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

Два основных способа, которые я нашел в интернете, работали следующим образом:

  1. К Reset подключается физическая кнопка, при нажатии на которую реле будет замыкать цепь. PowerDetect подключается к MCU. Тогда выключение будет происходить после подачи низкого уровня на этот пин. Например, после выполнения макроса или с помощью специального пункта в меню.
  2. Reset подключается к пину хоста. Тогда включать принтер можно будет дистанционно, например, переключателем в веб-интерфейсе. PowerDetect подключается так же, как в первом способе.

Схема подключения

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

Еще один пин хоста (Host_In) в режиме входа будет отслеживать нажатие этой физической кнопки. С помощью него можно будет реагировать на нажатие кнопки при включенном принтере и подать сигнал на выключение.

В итоге получилась такая схема подключения. Резистор добавлен, чтобы избежать короткого замыкания. Например, Host_Out установлен в 0, тогда при нажатии кнопки происходит КЗ между Relay_5V и Host_Out.

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

Сначала я проверил схему на прототипе :) Все работает!

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

Конфигурация прошивки

Выходной пин PowerDetect и макрос для выключения принтера настраиваются так.

[output_pin power_detect]
pin: PE1
value: 1
shutdown_value: 0

[gcode_macro SHUTDOWN_PRINTER]
gcode:
  SET_PIN PIN=power_detect VALUE=0

Пин Host_Out нужно добавить в файл moonraker.conf. После этого в меню питания в веб-интерфейсе появится новый переключатель.

[power Reset relay]
type: gpio
pin: gpiochip1/gpio11
off_when_shutdown: True
locked_while_printing: True

Пин Host_In настроил как кнопку. Указанный G-Code будет вызываться, когда нажимаем физическую кнопку или Reset relay в веб-интерфейсе. В обработчике нажатия перевожу переключатель в веб-интерфейсе в выключенное состояние и вызываю макрос отключения принтера.

[gcode_button power_button]
pin: host:gpiochip1/gpio9
press_gcode:
  {action_call_remote_method("set_device_power",device="Reset relay",state="off")}
  SHUTDOWN_PRINTER

Важно, что положение переключателя Reset relay в веб-интерфейсе не говорит, подается ли сейчас питание на принтер. Этот переключатель соединен именно с пином сброса реле. То есть для включения принтера необходимо кратковременно замкнуть его. Очень легко забыть вернуть переключатель в выключенное состояние, да и вообще это не удобно. Поэтому я добавил G-Code, который будет делать это автоматически.

Макрос запускается при инициализации Klipper. В нем переключатель питания переводится в выключенное состояние. Также при включении Klipper будет срабатывать G-Code для кнопки, потому что на Host_In подается высокий сигнал. Из-за этого в обработчике нажатия на кнопку PowerDetect установиться в ноль - нужно вернуть его в единицу.

[delayed_gcode init_reset_relay]
initial_duration: 1
gcode:
  {action_call_remote_method("set_device_power",device="Reset relay",state="off")}
  SET_PIN PIN=power_detect VALUE=1

Автовыключение в состоянии простоя

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

Для этого я использовал встроенный в Klipper механизм idle_timeout. Принтер может находиться в одном из трех состояний: Idle, Printing, Ready. В конфигурации можно задать время, по истечении которого будет осуществлен переход из состояния Ready в Idle, при этом также вызовется пользовательский G-Code.

Можно просто выключать принтер при переходе в состояние Idle. В стандартной конфигурации выключаются нагреватели (TURN_OFF_HEATERS) и моторы (M84).

[idle_timeout]
timeout: 600
gcode:
  TURN_OFF_HEATERS
  M84
  SHUTDOWN_PRINTER

Но я решил немного улучшить механизм - выключать питание, только если температура экструдера меньше 80 градусов. Для этого используется delayed_gcode - специальный макрос, который выполняется не сразу, а через указанное время.

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

[delayed_gcode check_need_shutdown]
gcode:
  {% if (printer.idle_timeout.state == "Idle") %}
    {% if (printer.extruder.temperature < 80) %}
      SHUTDOWN_PRINTER
    {% else %}
      UPDATE_DELAYED_GCODE ID=check_need_shutdown DURATION=60
    {% endif %}
  {% endif %}

По истечении idle_timeout запускается алгоритм проверки температуры экструдера. В DURATION нельзя указывать 0, потому что это значение используется для удаления указанного макроса из очереди.

[idle_timeout]
timeout: 600
gcode:
  TURN_OFF_HEATERS
  M84
  UPDATE_DELAYED_GCODE ID=check_need_shutdown DURATION=1

Telegram-бот

Принтер можно включать и выключать через Telegram-бота. Название Device для сброса реле (из moonraker.conf) необходимо добавить в конфигурацию.

[bot]
power_device: Reset relay

В чате нужно будет использовать команду /power для включения. Для выключения - название соответствующего макроса. Можно добавить их в клавиатуру с командами бота.

[telegram_ui]
buttons: <какие-то другие команды>,[power,shutdown_printer]

Установка модуля в принтер

Для модуля реле я смоделировал и напечатал простой корпус. Спаял на макетную плату разъемы и резистор.

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

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

Дистанционное управление питанием 3D-принтера. Настройка Klipper и BTT Relay

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

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

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

17
Комментарии к статье