$(любая картинка с баяном)
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 проводка внутри и получить уже немного иное устройство.
Вот такая вот штука. Ругайте.
Комментарии (16)
chemtech
08.04.2015 06:14Добавьте, пожалуйста, цены на компоненты. Заранее спасибо.
homecreate Автор
08.04.2015 10:44Ничего, если я тут напишу? Без стоимости доставки и таможенного сбора (часть заказана из Америки — соответственно, +24% при ввозе, ну и +почта. Из Европы почтовая пересылка обошлась в 7.90 евро)
- Raspberry Pi Model B+ — 39.95$ (+кабели для вывода USB и Ethernet на панель ~20$)
- MeanWell PS-05-5 — 5.3 евро
- Adafruit Ultimate GPS Breakout — 39.95$ (+антенна с переходником ~17$)
- DS1307 Real Time Clock breakout board kit — 9$
- Adafruit Perma-Proto HAT — 4.95$
- RGB backlight positive LCD 16x2 — 12.95$
- i2c / SPI character LCD backpack — 10$
- DS18B20 — 1.1 евро
- корпус — что-то около 20-25 евро
- рассыпуха типа резисторов, светодиодов, винтиков-шурупчиков — ну пусть 20 евро суммарно где-то, и то слишком большая цифра. Акриловую пластину покупал ранее, что-то вроде 2х2 метра размером, так что здесь её не считаю
В целом, Adafruit — это плата за лень. Зато Plug&Play почти
r00tGER
08.04.2015 08:50Ругайте.
Трудно ругать, когда видишь готовое работающее устройство.
Хотя, GPS можно было воткнуть в любой сервак, через USB <-> UART переходник, и на этом получить 90% профита этого девайса.
Надо нарашивать функционал — места в корпусе ещё полно :)Alexeyslav
08.04.2015 09:54Соединение по USB не позволит ему называться STRATUM-1. Непрогнозируемая задержка передачи данных тому виной.
homecreate Автор
08.04.2015 10:29На самом деле, оно и в таком-то виде не сильно stratum-1, скорее, stratum-1.5 :) Антенна слабенькая => датчику кажется, что он постоянно куда-то едет (но можно исправить уличной), используется сокет для получения JSON от gpsd вместо SHM => задержки на сетевой стек и парсинг JSON (но это легко отключить). Ну и в целом RasPi не выглядит устройством с самым стабильным внутренним таймером. Не SecureSync получился, конечно, но в целом весьма похоже, если немного доработать напильником :)
nikitosk
08.04.2015 09:43Зачем было картинки на какой-то говнохостинг ложить?
У меня их вообще не видно.
xHellKern
08.04.2015 14:31Затея необыкновенно хороша, но все более-менее приличные серверные не распологают к приему данных с GPS, ибо нет окон. А «более нормальные» еще и экранированы. Да и стойки\шкафы должны быть заземлены.
З.Ы. это я написал увидев что устройство предназначено для монтажа в стойку(либо 19" монтажный шкаф)homecreate Автор
08.04.2015 14:38+1В «более нормальных» серверных на крышу выведены антенны, от которых внутрь заведён нормальный такой коаксиальный кабель. Так что GPS как источник для времени для серверной — это нормально.
А вот с заземлением вопрос интересный. С одной стороны, корпус пластиковый, да и не касается корпуса ничто, то есть отводить нечего. С другой стороны, «блок питания» заземлён по приложенной схеме. А вот с третьей стороны, я так и не понял, как RasPi заземляется. Так что земля вроде есть, а вроде и нет
click0
09.04.2015 03:58homecreate Автор
09.04.2015 07:05Я ж говорю — много их. Мой вариант за номером 1002 :) Обладает своими достоинствами и своими недостатками
beho1der
А где взяли такой корпус?
homecreate Автор
Брал на ebay по запросу plastic abs 1U case — вариантов много. Есть и на амазоне, и прямо от китайцев. Есть варианты 1-3U