Бюджетно снаряжаем Микротик RBM33G для «дальнего боя»

Микротик OEM RouterBoard RBM33G далеко не новинка и хорошо известна среди специалистов и пользователей Микротик. Она была создана производителем для того, чтобы дать каждому возможность самому «сконструировать» свой роутер. В настоящее время эта плата вовсе не устарела, активно используется и полна интересных «сюрпризов» для тех, кто не знает всех её возможностей.
Эта небольшая по размеру, весьма производительная плата (на борту двухядерный процессор MediaTek MT7621 880Мгц с 16Мб flash-памяти и 256Мб DDR3 RAM), имеет ещё целый ряд аппаратных возможностей к расширению — два слота mini PCI-e для установки модулей модемов и/или wifi-радиокарт), слот microSD для дополнительной карты памяти (расположен на оборотной стороне платы), M.2 слот для установки SSD, что позволяет с избытком восполнить недостаток flash-памяти на самой плате.

nxd6_uhg7oohvdbltzo80-rg-sm.jpeg
Рис. 1 RBM33G Внешний вид платы. Вверху слева направо разъемы: 2 miniPCI-e, M.2, USB.
Мне интересно было максимально использовать возможности расширения платы, в том числе установив на неё «не родные» модем и wifi-модуль.
Сама RBM33G мне досталась б/у за половину стоимости новой (5000р.). Также я приобрёл «родной» корпус Микротик CA433U за полную стоимость (3.900 р.), так как найти б/у такой корпус не получалось, а использовать иные не хотелось. «Погуглив» ещё немного Интернет я купил за копейки то, что мне было нужно на «Авито»: LTE-модем Huawey ME909s-120 (за 2000 р.) — не слишком по современным меркам скоростной (Cat4), но очень надежный и вполне достаточный для резервирования канала Интернет за городом (до сих пор не понимаю зачем в России современные модемы с агрегацией — чтобы за 3 минуты истратить весь трафик на СИМ-карте?).
C wifi-модулем оказалось немного посложнее, так как я также не хотел ставить «родной» Микротиковский модуль, на который сейчас, в условиях санкций, сильно кусается цена, а о совместимых модулях конкретно известно мало (кроме того, что имеется совместимость с семействами Atheros AR93xx, AR94xx, AR95xx, и Qulcomm QCA95xx, QCA98xx, QCA6300). Пришлось подумать и поискать. Учтя приверженность разработчиков Микротик к чипам Atheros, в результате всего за 50 р. (да, да, пятьдесят !) я купил старенький, полуразмерный Qualcomm Atheros AR5B95 c wifi 2,4 Мгц b/g/n, который идеально подошёл и сразу заработал с RBM33G. Модули wifi 5 Мгц я не пробовал, также не пробовал двухдиапазонные модули, вероятно, для меня это дело будущего.
Понятно пришлось приобрести также необходимы антенны для lte-модемов и wifi и пигтейлы к ним (для теста LTE я брал обычные штыревые антенны с небольшим коэффициентом усиления, расчитанные на работу в «городских» условиях). Всё вместе составило около 2500р.
Также была куплена промышленного типа SD-карта Metorage объемом 32GB (1.600 р.) для установки сервера Микротик Dude. Для подобных задач всегда лучше брать промышленного («industrial») стандарта SD, рассчитанные на соответствующие условия эксплуатации.

2nkvtpbmldrvrykrj6t9lupejg0.jpeg
Рис 2. Индустриальная SD-карта 32 Гб.

В качестве SSD был приобретён M.2 диск GUDGA GVX-2242 объемом 512 Гб с ключом М в размере 2242. В выборе SSD я руководствовался только физической длиной диска (42 мм) и ценой (3000р). Как заявлено производителем RBM33G, система поддерживает только SSD в формфакторе M.2 с ключом М, при этом какой бы скоростной не был диск, поддерживается только «первая» скорость –PCI-x1.

uolgwrgi0jwo4hgoofhhq9faz-m.jpeg
Рис 3. SSD GUDGA M.2 512 ГБ M key.

SSD, выполненные именно в размере 2442, отлично подходят для монтирования на RBM33G, так как под него имеется отверстие для крепления, в которое нужно вставить заклепку из K-25 набора RBM33G. SSD планировался под хранение библиотек скриптов, различных нужных программ и файлов, доступных в расшаренных папках по SMB-протоколу и по FTP. Сколько времени проживёт диск сказать сложно. Для лучшего охлаждения лучше приклеить к нему алюминиевый радиатор.
Система без проблем сразу «увидела» оба диска, и SD и SDD, в /system disk. Их пришлось разумеется переразметить в формат ext3, настроить сетевые папки в /ip smb. Тем, кто пойдет по моим стопам, совет — не берите скоростные SSD, всё равно работа будет медленной, т.к. плата поддерживает только PCI1 x. Микротик вообще не расчитан быть NAS-ом, его SSD официальное руководство советуют использовать под базы данных IP, /user manager, кеша web proxy и резервного копирования данных или хранения лога. (https://wiki.mikrotik.com/wiki/Manual: System/Disks).
У RBM33G есть приятная особенность: большинство плат Микротик отключают USB-порт при использовании обоих mini PCI-e слотов. В RBM33G можно установить один mini PCI-e модем и wifi-радиокарту не отключая USB-порт (не снимая соответствующую перемычку). Если же нужно установить два модема перемычку нужно снять, но тогда отключается только USB2 интерфейс, а USB3 всё равно остаётся подключенным. Так что даже при «полной загрузке» можно использовать USB3-порт для подключения дополнительного диска или, например, суперскоростного модема с агрегацией частот (этого я делать пока не стал).
Отдельной, очень интересной с моей точке зрения возможностью расширения, является наличие у RBM33G GPIO (интерфейса ввода/вывода), разъем которого присутствует на плате в виде 26 «штырьков» (пинов). Часть PIN-контактов разъема доступны програмно из консоли или скриптового языка RouterOS и могут быть настроены как на ввод, так и на вывод. Распиновка GPIO RBM33G описана в официальной документации help.mikrotik.com/docs/display/UM/RBM33G

4uf2djlbtkomv8horlwerqfwny8.jpeg
Рис 4. Распиновка GPIO RBM33G (26 контактов).

Интересно, что GPIO Микротик распиновкой точь в точь соответствует 26 контактному GPIN-разъему Raspberry Pi B. Не знаю это стандарт или намеренное заимствование для совместимости разработчиков Микротик.

god3rlublnth3nc2q4oiwa8dbti.jpeg
Рис 5. Схема GPIO RBM33G точно соответствует GPIO-разъему Raspberry Pi B (она есть в Интернет и её красочный вариант удобно использовать).

RBM33G имеет только цифровые (digital) GPIO. Программно доступны Pin 3, 5, 12, 13, 15 и 16. По умолчанию под GPIO на RBM33G доступны только Pin3 и Pin5:

/iot gpio digital print  

# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin3 input 0 1
1 pin5 input 0 1

Также по умолчанию, Pin 12–16 используются под последовательный порт (тоже, кстати, отдельная тема, до которой ещё не дошли руки). Чтобы использовать их под GPIO нужно выполнить команду:

/system/routerboard/settings/set gpio-function=""

,

Отключающую GPIO от serial-порта. Для вступления изменений в силу необходима перезагрузка платы:

/system reboot

Теперь под GPIO будут доступны целых шесть цифровых линий ввода/вывода:

/iot gpio digital print  

# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin3 input 0 1
1 pin5 input 0 1
2 pin15 input 0 0
3 pin13 input 0 0
4 pin12 output 1
5 pin16 output 0

У RBM33G линии ввода/вывода только цифровые (digital), аналоговых линий нет. Все линии могут быть настроены програмно как на ввод, так и на вывод:

/iot gpio digital set pin15 direction=input
/iot gpio digital set pin16 direction=output

На линиях, настроенных на вывод (output), можно программно устанавливать значение логической единицы или нуля (при этом на линии появляется напряжение соответственно от 0 до +1,4В и от +1,41 до +3,63В).

/iot gpio digital set pin16 output=1
/iot gpio digital set pin16 output=0

К линиям можно «прицеплять» скрипты репозитория или непосредственно исполняемый код:

 /iot gpio digital set pin12 script=io_test
 /iot gpio digital set pin13 script=":log warning \"Reverse line\""
 /iot gpio digital set pin15 script=":global myFunc; [$myFunc]"

Тогда при смене состояния линии будет выполняться прикрепленный скрипт или инструкция. Глобальная функция, «прикрепленная к GPIO», у меня выполнялась, почему-то только если была создана непосредственно из CLI (возможно ошибка разработчиков Микротик).
Соответственно, используя GPIO, можно подключить к RBM33G какое-либо оборудование, способное принимать и передавать цифровые сигналы. То есть можно управлять работой этого оборудования или получать данные с него, либо с него управлять работой Микротик.
Я решил подключить к GPIO Микротик свой любимый модуль мониторинга среды и управления нагрузками Laurent-5G компании KernelChip (https://kernelchip.ru/Laurent-5G.php). У этого модуля есть аналогичные, удобные для подключения, программируемые линии ввода/вывода общего назначения (8 линий IO), с той же логикой и вольтажом управления, что и GPIO RBM33G, то есть как нельзя лучше подходящие для такой задачи.
Для экперимента, я соединил линии pin3 и pin5 RBM33G, настроенные на вывод с двунаправленными дискретными линиями общего назначения IO 1 и 2, настроенными на вход.

vszcqc2iryail5bnqum5jhqvghs.jpeg
Рис. 6 Соединение GPIO RBM33G Pin3 и Pin5 и линий ввода/вывода IO1 и IO2 Laurent-5G

При подаче команды на Микротик РоутерОС:

/iot gpio digital set pin3 output=1 

на IO1 Laurent-5G подаётся напряжение +3V в допустимых пределах отклонения (логическая единица). При 


/iot gpio digital set pin3 output=0

Напряжение на IO1 не будет превышать +1,41 (логический ноль)
Появление того или иного явления на линии ввода можно обнаружить на Laurent-5G с помощью специально «запрограммированного» задания системы СAT (см. Руководство Laurent-5G kernelchip.ru/download/Laurent-5_5G/Laurent-5_Manual_v. 1.15.pdf) и по достижению этого факта выполнить то или иное действие.

Также я подключал к линиям GPIO RBM33G, настроенным на вывод блок на 4 реле 220В с низким управляющим напряжением (1,5–5В) KIT MP701 (https://masterkit.ru/shop/1327359) и непосредственно управлял работой его реле через скрипты РоутерОС.

_uk6odxh2pr4d8sz1gx-n26xjgs.jpeg
Рис. 7 Модуль реле 220В 4 канала MP701 с управляющим напряжением 1,4–5В.

Схема такого подключения проста: +5В возьмем, например, с PIN 4, а GND с PIN 6 GPIO RBM33G. Управляющие сигналы будут поступать с PIN 12, 13, 15 и 16, настроенных на вывод и физически соединенными соответственно с PIN 2–4 (на схеме IN1–4) блока MP701.

y2el6hykb7uhmysrggss86prinm.jpeg
Рис. 8 Пробное подключение MP701 к RBM33G «на коленке» «на столе». На фото видны также установленные модем Huawey и полуразмерный wifi Atheros.

_27miskxz_rln1kne1u3pqd3plc.jpeg
Рис. 9 Подключение модуля реле MP701 к GPIO RBM33G c размещением в оригинальном корпусе Микротик CA433U.

После установки компактной RBM33G в удлиненный корпус CA433U остаётся свободное место, как раз достаточное для внутренней установки модуля MP701. Обратите также внимание: на фото установлен другой SSD, более длинный (размер 2280), что не мешает установке MP701. Также установлены два модема mini-PCI-e Mikrotik R11e-LTE 4 Cat.
Настраиваем линии 12, 13, 15, 16 Микротик RBM33G на вывод:

/iot gpio digital set pin12 direction=output
/iot gpio digital set pin13 direction=output
/iot gpio digital set pin15 direction=output
/iot gpio digital set pin16 direction=output

Теперь можно переключать реле 220В блока MP701:

# включаем реле 2; /iot gpio digital set pin13 output=1
# выключаем реле 4; /iot gpio digital set pin16 output=1

Поскольку мы используем механические реле, а не оптроны, то они будут «щелкать» при переключении, для проверки работы можно не подключать нагрузку.
Как видим номерам реле 1, 2, 3, 4 соответствуют линии 12, 13, 15, 16 соответственно. Чтобы не путаться в этих цифрах, можно занести их в массив, где номер линии будет соответствовать порядковому номеру элемента массива. Тогда вызывать элементы массива можно выражением ($Array→X), где $Array — имя массива, X — номер элемента. Не забываем, что элементы массива номеруются с нуля.

:local arrayPin {12; 13; 15; 16}
:local on 1; local off 2

# работаем сразу со всеми реле массива

# - > включение
:local count 0
:foreach Xpin in=$arrayPin do={
          :set count ($count+1)
          :put «Включаем реле $count»
          /iot gpio digital set "pin$Xpin" output=$on
   }
}

# - > выключение
:set count 0
:foreach Xpin in=$arrayPin do={
          :set count ($count+1)
          :put «Выключаем реле $count»
          /iot gpio digital set "pin$Xpin" output=$off
   }
}

# или отдельно с выбранным реле
:set count 2
     /iot gpio digital set "pin$($arrayPin->2)" output=$on

А можно чуть потрудиться и написать более удобную, универсальную функцию:

# Функция работы с реле 4-х канального модуля MP701; by Sertik 03/10/2023

# $1 - действие (on/off/status/direction/info), при info всегда выдается информация по всем реле
# $2 - номер реле (если не указан действие выполняется над всеми)
# $3 - input/output, используется при $1 direction, если не задан, действие производится над всеми линиями


:global iotRele do={
:local arrayPin {12; 13; 15; 16}
:local act;

:if ($1="help") do={
         /terminal style varname
         :put ""
         :put "Function works with GPIO RBM33G"
         :put "version 1.0"
         :put "by Sertik 03/10/2023"
         :put ""
         :put "\$1-action: on/off/status/direction/info/help"
         :put "\$2-rele number, if not define - all"
         :put "\$3-input/output for direction"
         :put ""
         /terminal style none}

:do {
    :foreach Xpin in=$arrayPin do={
            /iot gpio digital set "pin$Xpin" direction=output}
             } on-error={:local gpioanswer "GPIO pin 12-16 is set on serial-port"
                              :put ("ERROR $0"."\r\n"."$gpioanswer")
                              :log error ("ERROR $0"."\r\n"."$gpioanswer")
                              :return $gpioanswer       
                   }

     if ($1="info") do={
:local gio [/iot gpio digital print as-value]
:local count 0; local name; :local dir; :local state;
:foreach i in=$gio do={
                            :set name ($gio->$count->"name")
                            :set dir ($gio->$count->"direction")
                            :set state ($gio->$count->"output")
                            :set count ($count+1)
         :put ("$count "."$name "."$dir "."$state")
         :log info ("$count "."$name "."$dir "."$state")
  }
:return $gio}

:if (($1="status") and ([:len $2]=1)) do={
do {
                  :return [/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]
} on-error={:return Error}
}

:if (($1="direction") and ([:len $3]=0)) do={
    :if (($2="input") or ($2="output")) do={
        do {
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" direction=$2
                   }
        } on-error={:return Error}
  } else={:return Error}
:return Done}

:if (($1="direction") and ([:len $2]=1) and ([:len $3]>0)) do={
     :if (($3="input") or ($3="output")) do={
            :do {
                  /iot gpio digital set "pin$($arrayPin->[:tonum $2])" direction=$3
                } on-error={:return Error}
     } else={:return Error}
:return Done}

     :if ($1="on") do={:set act 1}
     :if ($1="off") do={:set act 0}

:if ([:len $act]>0) do={

   :if ([:len $2]>0) do={
           :do {
                  :if (([:tonum $2]<=0) or ([:tonum $2]>4)) do={:return Error}
                  /iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" output=$act
                  } on-error={:return Error}
     } else={
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" output=$act
                   }
                } 

 :return "Done"} else={:return "Error"}
}


# Примеры вызова

# вывести состояние всех реле в терминал и лог
# [$iotRele info]

# запросить состояние реле 3
# :local R3 [$iotRele status 3]

# установить направление ввода/вывода линии 4
# [$iotRele direction 3 output]

# установить направление ввода/вывода всех 4-х линий на ввод:
# [$iotRele direction input]

# :log error ("Включаем реле 3 "."$[$iotRele off 3]")
# :delay 2s
# :log warning ("Выключаем реле 3 "."$[$iotRele off 3]")

# Включаем все реле
# [$iotRele on]

# Выключаем все реле
# [$iotRele off]

Можно, разумеется, вместо MP701 использовать другие совместимые по управляющему току, в том числе твердотельные, релейные модули.
Также можно установить на корпус с Микротик RBM33G небольшие симпатичные кнопки «без фиксации», соединив их с PIN +5В GPIO и одной из линий ввода/вывода, настроенной на input. Тогда, при нажатии на кнопку, на линии будет появляться «логическая 1», а при отпускании — «логический ноль». Этот факт можно зафиксировать быстро исполняемым скриптом Планировщика роутера (/system scheduler). Ну, правда придётся конпку подержать, хотя бы секунду и скрипт вызывать с той же частотой. Дальше зависит от фантазии и целей — перезагрузка роутера, переключение реле, переключение на другой wan-канал и т.д…
На этом комплектацию RBM33G можно считать завершённой.

hv_kgwpng53q20qhotvnj0kravu.jpeg
Рис. 10 Фото «законченного изделия» в корпусе CA433U.

Для универсальности можно установить один LTE-модем и двухдиапазонный wifi-модуль в mini PCI-e слоты (тогда будем иметь wifi 2,4 и 5 МГц), или два модема (один mini PCI-e, другой USB), если нужно резервировать LTE-каналы в Интернет. Дополнительный скоростной M.2 модем с USB3 адаптером, кстати, можно установить прямо в корпус CA433U, места хватит. На SD-карту можно инсталлировать DUDE-server для мониторинга сети (я это уже делал несколько раз успешно ранее и могу сказать, что SD промышленного класса более пригодны для этой цели, чем SSD), SSD использовать как хранилище скриптовых библиотек и не часто используемых файлов. Кстати в РоутерОС v7 можно использовать контейнеры, открытые на SSD.
К силовым контактам MP701 осталось подключить разъем на корпус RBM33G, с которого можно снимать фазу 4-х контактного релейного модуля. Микротик RBM33G c MP701 или другим совместимым релейным модулем может использоваться для включения/выключения дополнительного сетевого оборудования, физического подключения NAS при входе VPN-пользователей, управления элементами охлаждения/подогрева сетевого шкафа и т. д…
В целом собранный нами комбайн вполне может справиться с нагрузками и «хотелками» сети среднего офиса или загородной резиденции.
Пишите в комментариях свои варианты расширенного использования RBM33G.

© Habrahabr.ru