В меру Универсальное Устройство Управления на Raspberry Pi + stratum1 NTP-сервер
Всем привет.
$(любая картинка с баяном)
Disclaimer: я в курсе, что уже существует 1000+1 реализация stratum1 NTP-серверов на RasPi. Моя будет тысячевторой. Но всё равно очень хочется о ней поведать, тем более что в результате получилось устройство, которое (а) можно смонтировать в стойку, (б) выполняет чуть больше задач, нежели просто NTP-сервер, (в) потребовало некоторых затрат труда, который вполне может быть оценен публикой
Итак, задача ставилась (мною себе же) следующим образом: хочу, чтобы…
- некое устройство могло быть NTP-сервером даже в условиях отсутствия связи с интернетом;
- это же устройство могло выступать в качестве терминального сервера либо в качестве устройства сбора данных с UPS по USB;
- это же устройство могло монтироваться в стандартную стойку 19";
- это же устройство имело проводное подключение к сети ethernet (скорость не принципиальна — всё равно консольные порты настроены в 9600);
- это же устройство могло измерять температуру в стойке.
Хочу особо отметить, что критерий минимальной цены не ставится, запчасти приобретались исходя из некоей эмпирической приемлемости цены.
Так как по профессии я (даже не знаю, как это сформулировать точнее) несколько далёк от разработки электроники, но зато очень близок к построению систем на линуксе, мой выбор пал на Raspberry Pi (ну и плюс уже имелся опыт построения подобного устройства на RasPi же, только фишек было чуть меньше, а убогости — чуть больше). Были закуплены следующие компоненты:
- собственно Raspberry Pi Model B+ (RasPi2 — оверхед по ресурсам, да и дороже);
- «блок питания» MeanWell PS-05-5 (проверил ранее, что 1А достаточно для питания всей немудрёной схемы);
- GPS-модуль от Adafruit на плате (не голый, ибо паять ещё только учусь, не до SMD и BGA);
- RTC-модуль от Adafruit на плате, на базе DS1307 (негоже NTP-серверу при каждой перезагрузке часы сбрасывать);
- Perma-proto HAT для RasPi от Adafruit;
- символьный LCD-дисплей 16х2 (в наличии монохромного не было, пришлось брать с RGB-подсветкой, в итоге пригодилось);
- I2C GPIO-расширитель для дисплея;
- цифровые датчики температуры DS18B20;
- пластиковый корпус 19" 1U;
- всякая рассыпуха по вкусу.
Соединять всё к RasPi было решено так:
- GPS-модуль — по UART (консоль с /dev/ttyAMA0 была убрана);
- RTC-модуль — по I2C;
- дисплей (через GPIO-расширитель) — по I2C;
- датчики температуры — по 1-Wire (очевидно);
- всё остальное — на свободные GPIO по вкусу.
Для вывода датчиков температуры наружу использовал разъём DB9 — мне нужно 3 датчика, у каждого по 3 ноги. Сами датчики подключены обычным телефонным 4-жильным проводом.
В итоге получилась неплохая штуковина!
Вид спереди (выключенная):
Корпус резал дремелем, думаю, подойдёт любая модель. Использовал абразивный отрезной диск для черновой резки отверстий (ну и что, что пластик плавится), для доводки использовал диск-шкурку с зернистостью 180. Пробовал использовать также тонкую шлифовочную пику, но она хорошо «прошлифовывает» круглые дыры в мягком пластике, совершенно не желая аккуратно закруглять углы. Диск-шкурка много лучше и может даже использоваться для аккуратной резки (естественно, резать им так, как отрезным диском, не получится). Ну и также дремелем получал из проставок высотой 6 мм проставки высотой 3 мм, но, думаю, это не особый фокус.
Вид спереди (включенная):
Жёлтый светодиод справа моргает по-разному в зависимости от того, видит ли GPS-модуль спутники или нет (светодиод посажен на вывод FIX модуля)
Вид изнутри:
Снизу слева — RTC-модуль, сверху справа — GPS-модуль, сверху слева — собственно RasPi, в центре — «блок питания». Основа сделана из акриловой пластины, обёрнутой в токонепроводящий антистатический пакет.
Написал пока что маленький скрипт на питоне, чтобы проверить, что всё работает. Библиотеку для работы с GPIO-расширителем взял тут. Подсветка экрана управляется 3 пинами, один из них под управлением GPIO-расширителя, два других я вывел на отдельные GPIO на RasPi. Вот, например, светло-синий экранчик:
На экран выводится время, дата и температура с одного из датчиков температуры.
А вот жёлтый экранчик:
Оранжевая кнопка, как понятно из схемы включения, является нормально замкнутой и по нажатию прерывает питание (reset, короче). А вот что будет, если нажать синюю кнопку:
С синей кнопкой я немного маху дал. Во-первых, она нормально замкнутая, про что я успешно забыл. В итоге ловить приходится появление падающего фронта, а не восходящего. А во-вторых, эти кнопки, как оказалось, страшно дребезжат. Благо, в библиотеке rpi.GPIO это уже предусмотрено и можно задать время, в течение которого callback-функция вызывать не будет.
Пришлось немного повозиться с ntpd и пересобрать его из исходников, ибо в дистрибутивном пакете из Raspbian нет поддержки источника PPS, что для крутого stratum1 ntp-сервера как-то несерьёзно. Ну и заодно собрал с поддержкой JSON-протокола gpsd, хотя смысла большого в этом нет — только задержка вырастает, через SHM получается (очевидно) сильно быстрее данные гонять. В любом случае, устройство требует наличия уличной либо очень близко к улице расположенной антенны, иначе джиттер вырастает до неприличных значений и использовать GPS в качестве источника времени становится невозможно. PPS поддерживается модулем из Raspbian pps-gpio.
Датчики температуры также поддерживаются стандартным модулем w1-therm. После его загрузки в /sys/bus/w1/devices появляются каталоги с id каждого из датчиков. В каждом каталоге есть файл w1_slave, чтение из которого даёт нам показание температуры. Красота.
Из коробки устройство в состоянии выполнять функции NTP-сервера и удалённого терминала. RasPi достаточно стабильна, не падает внезапно и беспричинно, что позволяет использовать её для ООВ-управления и сбора данных с UPSов. Для работы с экраном, кнопкой и датчиками температуры в планах накатать небольшое приложение, которое будет сообщать эти данные Zabbix'у, либо обеспечивать Zabbix'у возможность читать эти данные. Из сумасшедших идей — можно динамически обновлять записи с географическим положением в DNS, если это кому-то надо.
Чисто теоретически вместо 3-х датчиков температуры можно подключить любые другие устройства 1-Wire, если схема включения их устроит. К сожалению, на RasPi только одна шина 1-Wire, поэтому все три датчика сидят на одном и том же пине, что делает невозможной простое расширение функциональности. Однако всегда можно перепаять 3 проводка внутри и получить уже немного иное устройство.
Вот такая вот штука. Ругайте.