В меру Универсальное Устройство Управления на Raspberry Pi + stratum1 NTP-сервер

в 13:10, , рубрики: ds1307, DS18B20, gps, ntp, ntpd, Raspberry Pi, Сетевые технологии, метки:

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

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

Думаю, очевидно, что есть где. Основа сделана из акриловой пластины, обёрнутой в токонепроводящий антистатический пакет.

Написал пока что маленький скрипт на питоне, чтобы проверить, что всё работает. Библиотеку для работы с 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 проводка внутри и получить уже немного иное устройство.

Вот такая вот штука. Ругайте.

Автор: homecreate

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js