Всем привет.
$(любая картинка с баяном)

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-жильным проводом.

В итоге получилась неплохая штуковина!

Вид спереди (выключенная):

image

Корпус резал дремелем, думаю, подойдёт любая модель. Использовал абразивный отрезной диск для черновой резки отверстий (ну и что, что пластик плавится), для доводки использовал диск-шкурку с зернистостью 180. Пробовал использовать также тонкую шлифовочную пику, но она хорошо «прошлифовывает» круглые дыры в мягком пластике, совершенно не желая аккуратно закруглять углы. Диск-шкурка много лучше и может даже использоваться для аккуратной резки (естественно, резать им так, как отрезным диском, не получится). Ну и также дремелем получал из проставок высотой 6 мм проставки высотой 3 мм, но, думаю, это не особый фокус.

Вид спереди (включенная):

image

Жёлтый светодиод справа моргает по-разному в зависимости от того, видит ли GPS-модуль спутники или нет (светодиод посажен на вывод FIX модуля)

Вид изнутри:

image

Снизу слева — RTC-модуль, сверху справа — GPS-модуль, сверху слева — собственно RasPi, в центре — «блок питания». Основа сделана из акриловой пластины, обёрнутой в токонепроводящий антистатический пакет.

Написал пока что маленький скрипт на питоне, чтобы проверить, что всё работает. Библиотеку для работы с GPIO-расширителем взял тут. Подсветка экрана управляется 3 пинами, один из них под управлением GPIO-расширителя, два других я вывел на отдельные GPIO на RasPi. Вот, например, светло-синий экранчик:

image

На экран выводится время, дата и температура с одного из датчиков температуры.

А вот жёлтый экранчик:

image

Оранжевая кнопка, как понятно из схемы включения, является нормально замкнутой и по нажатию прерывает питание (reset, короче). А вот что будет, если нажать синюю кнопку:

image

С синей кнопкой я немного маху дал. Во-первых, она нормально замкнутая, про что я успешно забыл. В итоге ловить приходится появление падающего фронта, а не восходящего. А во-вторых, эти кнопки, как оказалось, страшно дребезжат. Благо, в библиотеке 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)


  1. beho1der
    07.04.2015 18:15
    +1

    А где взяли такой корпус?


    1. homecreate Автор
      07.04.2015 20:23

      Брал на ebay по запросу plastic abs 1U case — вариантов много. Есть и на амазоне, и прямо от китайцев. Есть варианты 1-3U


  1. hardex
    07.04.2015 20:06

    Почти
    image


    1. homecreate Автор
      07.04.2015 20:25

      Гугл подсказывает, что это из сериала Fringe. Он прав? :)


  1. chemtech
    08.04.2015 06:14

    Добавьте, пожалуйста, цены на компоненты. Заранее спасибо.


    1. 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 почти


  1. r00tGER
    08.04.2015 08:50

    Ругайте.

    Трудно ругать, когда видишь готовое работающее устройство.
    Хотя, GPS можно было воткнуть в любой сервак, через USB <-> UART переходник, и на этом получить 90% профита этого девайса.

    Надо нарашивать функционал — места в корпусе ещё полно :)


    1. Alexeyslav
      08.04.2015 09:54

      Соединение по USB не позволит ему называться STRATUM-1. Непрогнозируемая задержка передачи данных тому виной.


      1. homecreate Автор
        08.04.2015 10:29

        На самом деле, оно и в таком-то виде не сильно stratum-1, скорее, stratum-1.5 :) Антенна слабенькая => датчику кажется, что он постоянно куда-то едет (но можно исправить уличной), используется сокет для получения JSON от gpsd вместо SHM => задержки на сетевой стек и парсинг JSON (но это легко отключить). Ну и в целом RasPi не выглядит устройством с самым стабильным внутренним таймером. Не SecureSync получился, конечно, но в целом весьма похоже, если немного доработать напильником :)


      1. r00tGER
        09.04.2015 09:32

        Да и распбиан тоже не реал-тайм ОС…


  1. nikitosk
    08.04.2015 09:43

    Зачем было картинки на какой-то говнохостинг ложить?
    У меня их вообще не видно.


    1. homecreate Автор
      08.04.2015 10:25

      Когда писал статью, hsto не открывался. Перезалил сейчас


  1. xHellKern
    08.04.2015 14:31

    Затея необыкновенно хороша, но все более-менее приличные серверные не распологают к приему данных с GPS, ибо нет окон. А «более нормальные» еще и экранированы. Да и стойки\шкафы должны быть заземлены.
    З.Ы. это я написал увидев что устройство предназначено для монтажа в стойку(либо 19" монтажный шкаф)


    1. homecreate Автор
      08.04.2015 14:38
      +1

      В «более нормальных» серверных на крышу выведены антенны, от которых внутрь заведён нормальный такой коаксиальный кабель. Так что GPS как источник для времени для серверной — это нормально.

      А вот с заземлением вопрос интересный. С одной стороны, корпус пластиковый, да и не касается корпуса ничто, то есть отводить нечего. С другой стороны, «блок питания» заземлён по приложенной схеме. А вот с третьей стороны, я так и не понял, как RasPi заземляется. Так что земля вроде есть, а вроде и нет


  1. click0
    09.04.2015 03:58

    1. homecreate Автор
      09.04.2015 07:05

      Я ж говорю — много их. Мой вариант за номером 1002 :) Обладает своими достоинствами и своими недостатками