USB-watchdog на tiny85

Проект не мой, просто реализация найденного в сети.

USB-watchdog служит для перезагрузки (или других подобных действий) системы в случае, если та перестала откликаться и сбрасывать таймер в watchdog’e – в общем-то, принцип как и у других watchdog’ов. Цепляется с одной стороны на USB-порт и распознается как устройство в системе, с другой – на пин reset на гребенке передней панели на материнской плате.

Готовые варианты продаются от 100 грн и выше, решил попробовать собрать из подручных средств. В сети нашел проект USB-watchdog на базе tiny85, его и стал реализовывать.

Tiny85 у меня остались еще с прошлых заказов в виде готовых плат от Digispark. Прошивка в проекте есть уже готовая, в виде hex-файла, которую надо заливать с помощью программатора. Тут бы пригодился купленный недавно переходник для программирования и отладки tiny13 (и подобных 8-ножек, в том числе и tiny85), но – незадача: в цепочке “программатор usbasp -> переходник 10 pin – 6 pin -> упомянутая плата -> переходник DIP-8 – разъем 8 pin -> прищепка” переходник 10pin -> 6pin не давал вставить в панельку платы переходник на прищепку. Как вариант – можно было бы перепаять разъем на другую сторону платы – или собрать новый переходник и исключить плату вообще. Пошел по второму варианту; через некоторое время нужный переходник был собран на базе куска макетной платы и набора пинов. Теперь можно было подключать прищепку напрямую к usbasp с распиновкой под микроконтроллеры.

Заливка прошивки проблемы не составила, hex-файл находится по пути usb-wdt/tiny45/default/cdctiny85.hex. Примеры команд для заливки находятся в файле main.c на уровень выше. Шьем фьюзы:

avrdude -c usbasp -P /dev/ttyUSB0 -p attiny85 -v -U lfuse:w:0xe1:m

Шьем прошивку:

avrdude -c usbasp -P /dev/ttyUSB0 -p attiny85 -v -U flash:w:cdctiny85.hex

Дальше можно подключать устройство в USB-порт и ставить эксперименты. В документации предлагается подключать выход в ATX-разъем на сигнал power good, я же решил использовать reset. Для использования доступны 2 пина – 0 и 1, в общем случае сигналы между ними инверсны и можно использовать оба, но в коде предусмотрена проверка коммуникации с устройством – т.е., зажигание набортного светодиода без, собственно, reset’а. Соответственно, при использовании P0, на котором висит этот светодиод, данными функциями нельзя будет пользоваться. В моем случае так и вышло – на P0 держится высокий уровень и в момент срабатывания вывод притягивается к земле, что мне и было нужно. В идеале между выходом и пином reset поставить маломощный диод анодом к пину – это защитит контроллер от случайного подключения “не к тому” пину, а также от возможной разницы уровней между контроллером и материнской платой.

В процессе использования заметил, что контроллер не всегда реагирует с первого раза на посылаемые в /dev/ttyACM0 команды. Глюк? Недоработка? Не знаю; но в целом, для использования на майнинг-ригах сойдет и так. Добавляем в crontab:

* * * * * echo 8 > /dev/ttyACM0

Убеждаемся, что у пользователя есть права на запись в устройство. “8” означает установку таймера на 255 (2^8-1) секунд, за это время cron успеет неоднократно отправить новую команду и это сбросит таймер. С помощью мультиметра выясняем, где у reset’а материнки сигнальная нога, туда и подключаем P0.

Конечный вариант исполнения – припаянный на плату 4-пиновый коннектор (для подключения к внутренним USB-гребенкам на материнке) и обрезок провода с дюпон-коннектором для подключения к пину reset:

Итоговая стоимость – 59 грн за контроллер (уж не знаю, почему вариант с печатным разъемом дороже, чем с microusb – еще и на 4 грн) + 3 грн за 4 pin коннектор.

usb-wdt.tar

Добавить комментарий