Pull to refresh

Подключаем Arduino к Mikrotik. Дешевое и сердитое удаленное управление нагрузками

Reading time 4 min
Views 30K
Хочу рассказать вам об одной интеграции «на коленке», которая тем не менее работает в моей домашней лаборатории уже несколько месяцев без каких-либо проблем.

Есть у меня один самосборный железный сервер, назовем его условно NAS, который имеет одну странную особенность. Периодически при штатной перезагрузке он останавливается на какой-то завершающей стадии подготовки к выключению и не доходит до сброса. Так и остается включенным и неуправляемым. Перезагружаю я его нечасто, но «глюк» имеет место быть. Искать причину мне, честно говоря, пока немного лень. Может быть когда-нибудь обновлю BIOS или дождусь каких-нибудь исправлений в ОС с очередным апдейтом. Но, с другой стороны, мне все-таки хотелось бы иметь контроль над своей инфраструктурой, поэтому я решил пойти альтернативным путем. Да, сразу сообщаю, что сервер не поддерживает HP iLO, Intel vPro и другие подобные фишки, которые были бы полезны, но «не шмогли».

Итак, если сервер сам не может выключаться, то нужно подключить к цепям управления питанием какое-то автономное устройство с реле и портом для управления по сети. Таких устройств существует множество с разными возможностями, вплоть до промышленных контроллеров, и за разные деньги. Но можно собрать подобное самостоятельно с минимальными затратами времени и денег на базе того, что есть. Я использовал следующие компоненты:
1. Маршрутизатор Mikrotik RB951G-2HnD со свободными портом USB, активно используемый в моей сети.
2. Плата для самоделкиных Arduino Mega 2560
3. Оптопара 4N35 для эмуляции нажатия кнопки Power сервера (ATX).
Соединяем. Схема управления готова!

Mikrotik RB951G-2HnD <--USBSerial--> Arduino Mega 2560 <--оптопара--> Power Button NAS

А теперь подробнее о том, как это заставить работать.

Что может Mikrotik


Поиск по документации Mikrotik (http://wiki.mikrotik.com/wiki/Supported_Hardware) выдал список поддерживаемых в RouterOS USBSerial устройств и производителей, ими оказались чипы от FTDI и Prolific. Это внушает надежду на положительный результат. В моем распоряжении были плата Arduino Mega 2560 с чипом ATmega8U2 и ограниченно доступная Arduino Mega 1280 c FTDI FT232RL. В возможности подключения последней я особо не сомневался, но больший интерес представляла первая плата. USB порт у Arduino Mega 2560 заведен в микроконтроллер ATmega8U2, в котором «крутится» USBSerial прошивка, которую можно при желании заменить на USB HID Keyboard прошивку. В общем определится ли USBSerial ATmega8U2 в Mikrotik, было не ясно, но оказалось, что RouterOS прекрасно видит подключенную Arduino с ATmega8U2 и устанавливает USBSerial порт.



А что может Arduino


Размышлял над несколькими вариантами программного интерфейса управления Arduino и периферией. Сначала думал зашить какой-нибудь Master-Slave протокол для удаленного управления, например, Modbus RTU. Но для него понадобилось бы пробрасывать виртуальный порт на рабочую станцию администратора (на сайте Mikrotik есть описание подключения такого виртуального порта) и писать кроме прошивки Arduino еще клиентское Modbus приложение для управления или пользоваться программами типа Modbus Poll для прямой правки регистров Modbus. Такой вариант мне не сильно нравился из-за за излишней сложности в эксплуатации. Поэтому довольно быстро я пришел к идеи текстовой командной оболочки для Arduino, по типу Bash в Linux. И оказалось, что такой командный процессор уже написан добрыми людьми. Им я и решил воспользоваться. Сайт проекта: bitlash.net
bitlash here! v2.0 (c) 2012 Bill Roy -type HELP- 942 bytes free
> print "Hello, world!", millis()
Hello, world! 11939
>

Командная оболочка bitlash оказалась вполне развитой, мою задачу она покрывала с лихвой. В ней можно создавать макросы команд и стартовый макрос, которые будут записаны в энергонезависимый EEPROM. Вот как выглядит мой набор для управления кнопкой Power сервера, вывод по команде ls:
> ls
function off12 {d12=1;delay(8000);d12=0;};
function startup {pinmode(12,1);};
function on12 {d12=1;delay(250);d12=0;};
>

При старте Arduino настраивается дискретный вывод 12 на запись (макрос startup). Администратор может писать в командную строку короткие команды «on12», «off12» для включения и «жесткого» выключения сервера, а также редактировать и создавать новые макросы.

В своем проекте я использовал Arduino Mega, только потому, что она была у меня в наличии, но я уверен, можно заменить ее на Arduino Due, или Nano с FTDI FT232RL, или ATmega16U2 c прошивкой usbserial.

Периферия Arduino. Оптопара


С аппаратной частью управления все довольно просто. Можно подключить релейный модуль, который обеспечит гальваническую развязку и возможность управлять мощной нагрузкой, это наиболее универсальный вариант.
Но для себя я сделал по-другому: т.к. мне требовалось просто включать и выключать сервер (иметь возможность гарантированно это сделать), то я просто параллельно кнопке включения/выключения Power на клеммах подсоединил выход оптопары 4N35, что дало гальваническую развязку.
Схема приблизительно следующая:


Output подключаем параллельно серверной кнопки питания. Полярность имеет значение, можно просто подобрать «методом тыка». Между выводом 12 Arduino и оптопарой установлено сопротивление порядка 500 Ом.

Проброс последовательного порта на Mikrotik в Telnet


Заключительный штрих. Организуем консоль пробросом последовательного порта на какой-нибудь порт TCP микротика. Я не использую telnet как службу самого микротика, поэтому с чистой совестью отдаю этот порт под консоль Arduino. Разрешим доступ только с адресов локальной сети. Возможно еще пара запрещающих правил в firewall.
Настройки порта:


На видео процесс подключения по Telnet и выполнение макро-команд:


Заключение


Оптопара с резистором в термоусадке:


Контроллер в контейнере:


При каждом открытие соединения Arduino перезапускается, т.к. переоткрывается последовательный порт, что теоретически даже положительно влияет на стабильность работы. Управлять можно в перспективе множеством нагрузок. Можно прикрутить датчик температуры и написать команду вывода этой температуры, можно мониторить аналоговые и дискретные сигналы. Команды вводятся в обычной терминальной программе (Putty, TeraTerm) в соединение типа Telnet (или Raw). Кроме того можно, в принципе, слать команды в Arduino-терминал и из скриптов RouterOS Mikrotik.
Можно пойти еще дальше. Если взять отдельный USB<->UART преобразователь и подключить его к другому UART(2) Arduino и к Mikrotik, а во встроенный контроллер USB ATmega16U2 (8U2) залить HID прошивку клавиатуры, то можно получить подобие KVM, только без V и M :), т.е. эмулятор аппаратной клавиатуры с удаленным доступом. В общем, при желании можно сделать еще много чего.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+6
Comments 16
Comments Comments 16

Articles