Задача — сделать из USB-принтера сетевой. Ну и т. к. нам лень каждый раз включать принтер перед печатью, а после выключать, сделаем автоматическое включение/выключение принтера.
И так, имеется принтер без Ethernet интерфейса. Также в наличии Raspberry PI первого поколения, которая для ресурсоемких задач не подходит, а в качестве принт-сервера можно использовать в самый раз.
После установки Raspbian, ставим необходимый софт для работы принт-сервера.
sudo apt-get update
sudo apt-get upgrade
sudo apt install cups cups-tea4cups samba
Разрешаем пользователю pi управление принтерами:
sudo usermod -a -G lpadmin pi
Настройка принтера
1. Отрываем в браузере адрес https://IP_адрес_raspberry:631/ и устанавливаем принтер.
2. Устанавливаем принтер на клиентах, проверяем, что печать работает.
3. Настраиваем печать через tea4cups.
Зачем нужен tea4cups? С помощью tea4cups мы сможем выполнить скрипт для включения принтера перед печатью (prehook) и скрипт выключения после окончания печати (posthook).
Для того чтобы задания печати проходило через tea4cups отредактируем конфигурационный файл /etc/cups/printer.conf.
Находим строку DeviceURI
и перед usb://
добавляем tea4cups://
.
Например, у нас такая строка:
DeviceURI usb://Xerox/WorkCentre%20PE16e?serial=1771-04021415481
добавляем tea4cups://
, чтобы получилось так:
DeviceURI tea4cups://usb://Xerox/WorkCentre%20PE16e?serial=1771-04021415481
Перезапускаем cups и проверяем работает ли печать. Если все в порядке, то переходим к аппаратной части.
Управление электропитанием принтера
Управлять включением принтера мы будем через реле, которое включено в разрыв кабеля питания принтера. Я использовал готовый модуль реле для arduino.
Удобно подключить управление реле к 14 пину GPIO, т. к. рядом есть GND и 5V для запитки модуля реле.
Проверим, что реле работает и принтер включается и выключается.
Активируем 14 пин, назначаем его выходом и присваиваем низкий уровень.
echo "14" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio14/direction
echo "0" > /sys/class/gpio/gpio14/value
Эти же 3 строки необходимо добавить в скрипт /etc/rc.local
для, того чтобы после перезагрузки присваивался нужный статус GPIO. Добавить команды надо перед строкой
exit 0
.
Для включения реле выполняем:
echo "1" > /sys/class/gpio/gpio14/value
После этого реле должно замкнуть контакты и на принтер пойдет питание.
Проверим выключение:
echo "0" > /sys/class/gpio/gpio14/value
Приступаем к настройке tea4cups
Теперь нам необходимо, чтобы команда на включение реле подавалась при получении документа на печать, а через 5 минут выполнялась команда на отключение реле. Для этого укажем команды для prehook и posthook в файле /etc/cups/tea4cups.conf
.
prehook_0 : echo "1" > /sys/class/gpio/gpio14/value
posthook_0: echo "$(date +%M' '%H -d '+5 min') * * * echo \"0\" > /sys/class/gpio/gpio14/value" > /etc/cron.d/printer_off | crontab /etc/cron.d/printer_off
С командой prehook все понятно, posthook чуть сложнее. Все дело в том, что если мы в posthook просто укажем echo "0" > /sys/class/gpio/gpio14/value
, то принтер отключится еще в процессе печати первого листа, так как posthook выполняется сразу, как данные отправлены на принтер. Также у лазерных принтеров после печати некоторое время работает вентилятор для охлаждения фьюзера. Таким образом, нам необходимо выключать через некоторое время после того, как принтер получил данные на печать (например, через 5 минут). Для этого мы и используем пользовательский cron. Командой в posthook создается задание cron, в котором время увеличивается на 5 минут от времени выполнения команды.
Если все настроено верно, то при получении документа на печать принтер должен включиться, а через 5 минут после последнего задания выключиться.