Управление питанием принтера

Введение

Если вы используете OctoPrint, то в вашем принтере/рядом с ним на постоянной основе установлен микрокомпьютер с debian/raspbian на борту. Мне кажется грех не воспользоваться этим, для решения некоторых факультативных задач. Например можно управлять питанием принтера, сделать возможным отключение питания по окончании печати, отключение питания при ошибках.

Логика работы

Как это реализовал я:
При подаче питания на принтер (через кнопку на задней панели или WiFi розетку), включается Raspberry Pi и после загрузки замыкает реле подавая питание на электронику принтера. Далее питание принтера можно отключать/включать через интерфейс окты, экран либо по определенному условию (например дисконнект принтера от окты или сообщение об ошибке от прошивки)

Что нам понадобится

  • Одноплатник Raspberry Pi с установленным и настроенным OctoPrint
  • Блок питания для Raspberry Pi
  • Твердотельное реле.

Комрады в чате советовали такое реле, как оно работает я сам сказать не могу т.к. оно еще ко мне едет. То что я купил в Чип и Дип работает плохо - в разомкнутом состоянии пропускает микро импульсы, так что рекомендовать его не буду.

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


Не претендую на 100% правильность, но я вижу это как-то так. Если что, прошу знающих комрадов поправить меня.
В данном варианте мы организуем дежурное питание 5В для Raspberry Pi, и один из проводов идущих от разъема питания принтера к БП - пускаем через реле. Управляющие контакты реле в свою очередь подключаем к Raspberry Pi: землю к любой свободной земляной ноге Raspberry Pi, а сигнальный провод к GPIO 26.

Программная часть

Для работы с GPIO пинами Raspberry Pi есть следующие команды:

gpio readall         // Покажет таблицу пинов Raspberry Pi
gpio mode n out      // Перевести пина 'n' в режим OUT
gpio write n 1       // Подать на пин 'n' управляющее питание
gpio write n 0       // Убрать с пина 'n' управляющее питание

При отключении питания принтера, у нас остается дежурное питание на Raspberry Pi, а следовательно и плата принтера питается от Raspberry Pi по USB. Т.е. при отключении питания принтера нам нужно гасить еще и USB порты Raspberry Pi.

Установка uhubctl

Данная утилита позволяет управлять USB портами Raspberry Pi

sudo apt-get update
sudo apt-get install libusb-1.0
cd ~
git clone https://github.com/mvp/uhubctl.git
cd uhubctl
make

Теперь можно включать или отключать USB порты при помощи команд:

sudo /home/pi/uhubctl/uhubctl -a 0 -p 2 -l 1-1 // Выключить USB
sudo /home/pi/uhubctl/uhubctl -a 1 -p 2 -l 1-1 // Включить USB

Для того что-бы система не запрашивала пароль редактируем файл sudoers

cd /etc
sudo nano sudoers

// после строки %sudo ALL=(ALL:ALL) ALL вставляем:

pi ALL=(ALL) NOPASSWD: /home/pi/uhubctl/uhubctl
pi ALL=(ALL) NOPASSWD: /sbin/shutdown

Пишем скрипты включения/отключения питания

В нашем примере мы управляем реле c 26го пина Raspberry Pi, соответственно во всех командах используем номер пина 26.

Выключение питания:

cd ~
nano poweroff.sh

#!/bin/sh
gpio mode 26 out
gpio write 26 0
sudo /home/pi/uhubctl/uhubctl -a 0 -p 2 -l 1-1

Включение питания:

nano poweron.sh

#!/bin/sh
gpio mode 26 out
gpio write 26 1
sudo /home/pi/uhubctl/uhubctl -a 1 -p 2 -l 1-1

Делаем скрипты исполняемыми и назначаем права:

chmod 755 poweroff.sh
chmod +x poweroff.sh
chmod 755 poweron.sh
chmod +x poweron.sh

Включение питания при загрузке:

sudo nano power-on-bootup.py

В файл пишем:

import RPi.GPIO as GPIO     
pin=26                      

GPIO.setmode(GPIO.BCM)      
GPIO.setup(pin, GPIO.OUT)   
GPIO.output(pin, GPIO.HIGH) 
print("Power is ON")

Для того что-бы при включении Raspberry Pi на принтер подавалось питание, добавим скрипт включения питания в автозагрузку:

sudo mv power-on-bootup.py /usr/local/bin/
sudo chmod +x /usr/local/bin/power-on-bootup.py

Для того что бы запускать наш скрипт при загрузке системы, отредактируем файл /etc/rc.local

sudo nano /etc/rc.local

Перед строкой exit 0 вставляем ссылку на скрипт включения питания:

sudo python /usr/local/bin/power-on-bootup.py &

Добавим в интерфейс окты кнопки включения/отключения питания и выключения окты

cd ~/.octoprint/
cp config.yaml config_bcp.yaml //бекап файла конфигурации!!!
nano config.yaml

вставим в конец файла строки:

system:
  actions:
  - action: power_on
    command: /home/pi/poweron.sh
    confirm: Turn on printer.
    name: Power ON
  - action: power_off
    command: /home/pi/poweroff.sh
    confirm: Turn off printer.
    name: Power OFF
  - action: power_off2
    command: sudo shutdown -h now
    confirm: Turn of PI.
    name: Power OFF PI

файл config.yaml чувствителен к пробелам и переносам! Подробнее о формате файла config.yaml можно прочитать тут.

Добавим событие потери соединения с принтером и сообщения об ошибке

вставим в конец файла который мы редактировали на прошлом шаге строки (не забываем бекапить изменяемые файлы):

events:
  enabled: true
  subscriptions:
  - command: /home/pi/poweroff.sh
    event: Disconnected
    type: system
  - command: /home/pi/poweroff.sh
    event: Error
    type: system
  - command: /home/pi/poweroff.sh
    event: PowerOff
    type: system
  - command: /home/pi/poweron.sh
    event: PowerOn
    type: system

События Disconnected и Error (во время печати) связаны чаще всего со срабатыванием защит в прошивке принтера. Когда срабатывает защита, например Thermal Runaway Protection, прошивка принтера останавливает печать, выключает нагрев и блокирует коммуникации с внешними устройствами. На этой логике можно реализовать отключение питания принтера в нештатной ситуации.

Последние два события сработают при выполнении команд M81 и M80 соответственно. Т.е. команду M81 можно добавить в конечный gcode для отключения питания по окончанию печати. (или в настройках окты в поле GCODE-Script :arrow_right: After print job completes)

Заключение

Добавленные нами в интерфейс окты кнопки будут подтягиваться так же и в мобильные клиенты и в приложение OctoScreen.
Стоит отметить что отключение питания принтера при разрыве связи с октой или получении сообщения об ошибке от прошивки принтера приведены для примера. С текущими настройками окта будет рубить питание принтера при любой не штатной ситуации и понять что именно пошло не так в последствии будет сложно. Но данное решение имеет право на жизнь, пока оставлю так и посмотрим как оно будет работать.

Источники

1 Симпатия

Хорошее решение, но подключаться к камню напрямую боязно, имхо лучше через оптику, что то типа этого:
HTB14iM9PQvoK1RjSZFwq6AiCFXat
или этого, с лампочками:
spXa3
они также пригодятся на будущие расширения

ммм, а конкретнее? между кем и кем нужна оптопара?
между малиной и реле?

да, вобще любую переферию лучше развязывать от портов

Спасибо! Надо заказать будет :slight_smile:

вот ещё как вариант с релюхами, может здесь они и логичнее будут

А зачем там нужно реле?

Силу какую то подключать, подсветку, вениляторы охдаждения, вытякжи и .т.д. и т.п.

ааа, понял )) я думал в этом конкретном случае нужно еще одно реле перед реле )))) нужно больше реле ))))

конечно нужно, всякие разные, большие и маленькие :slight_smile:
Таким же образом на малину можно и управление подсветкой подключить и всякие другие полезности, со временем всё равно что то захочется расширить.
На апельсине зеро себе добавлял в меню окты включение/выключение веб камеры
В общем аппетит приходит во время еды

Спасибо за ответы! Займусь модернизацией схемы :slight_smile:

1 Симпатия