Сверхточный Raspberry PI Stratum 1 NTP сервер
В этой статье я расскажу, как собрать Stratum 1 NTP сервер на Raspberry PI для синхронизации времени за скромную сумму и навсегда забыть о проблемах, связанных с не совпадающим временем на всех ваших устройствах. А самое главное, он будет давать результат на два порядка точнее, чем обычный сервер.
В предыдущей статье, посвященной синхронизации времени по радио и СРНС (системы радионавигационной связи), я не успел рассказать про выбор приёмника GPS / ГЛОНАСС с выходом PPS. Между тем от этого зависит точность приёма сигнала, величина может составить от одной миллисекунды до нескольких микросекунд и зачастую это имеет решающее значение.
Для самого точного приема сигнала времени нужен приёмник GPS / ГЛОНАСС с выходом PPS. Дело однако в том, что на российском рынке не просто раздобыть устройство с такими характеристиками по доступной цене. Много таких моделей давно уже перестали выпускать, а в заброшенных интернет магазинах с версткой 1990-х остались лишь их описания с предложением подписаться на уведомление при поступлении товара.
Полный список протестированного GPS оборудования можно найти на GitLab ресурсе NTPSec. Не трудно заметить, что незначительное число представленных в списке устройств имеют отметку 3-4 звезды и опцию PPS. Таким образом, в шорт-лист попадают следующие приёмники.
- Garmin GPS-18, не USB *** (приблизительная цена 10 тыс. р.)
- GlobalSat MR-350P ****
- Jackson Labs FireFly-II ***
- Magellan Thales AC12 ***
- Motorola Oncore GT+ ***
- Navisys GR601-W ****
- SkyTraq SKG16B ****
- Trimble Lassen IQ ***
- u-blox ANTARIS LEA-4T ***
- u-blox EVK 6H ****
- u-blox LEA SQ ****
4* Отличная производительность: gpsd распознает приёмник быстро и надежно, а отчеты сформировано полностью и правильно.
3* Хорошая производительность: gpsd с незначительными проблемами или задержкой распознаёт устройства, но отчеты сформировано полностью и правильно.
Если вас пугает цена этих моделей, а также нет большого желания возиться с железками, можете не читать дальше. Приемник, подключенный к серверу по USB, или RS232 интерфейсу обеспечит гораздо большую точность определения времени, чем NTP сервер, работающий по tcp/ip. Но если путь самурая вам не чужд, тогда давайте собирать свой Raspberry PI NTP сервер с GPS синхронизацией времени.
Собираем Raspberry PI
Итак: берем следующие компоненты для нашего микро сервера.
- Плата Raspberry Pi 4 Model B, 4 GiB ОЗУ (6200 руб.);
- Корпус, например такой (890 руб.);
- Micro SD карта на 32 GiB, можно и 16 GiB; (540 руб.)
- GPS модуль на чипе u-blox NEO-M8 (1700 руб. с антенной);
- GPS антенна на 15 dB;
- Паяльник.
Вообще-то, u-blox NEO-M8 оснащен UART интерфейсом, но для PPS выхода необходимо припаять pin-3 на GPS модуле к соответствующему GPIO коннектору на плате Raspberri Pi. Модуль швейцарской компании завоевал популярность у специалистов и это не случайно, характеристики говорят сами за себя.
- Поддерживаемые СРНС: BeiDou, Galileo, GNSS; GPS/QZSS, GLONASS;
- Напряжение питания: 2.7. 3.6 В;
- Интерфейсы: UART, USB, SPI, DDC, I2C;
- Поддерживаемые протоколы: NMEA 0.183 version 4.0, UBX (binary), RTCM 2.3;
- Чувствительность при обнаружении: -167 дБм;
- Чувствительность при слежении: -160 дБм;
- Время холодного старта: 26 с;
- Время горячего старта: 1.5 с;
- Потребляемая мощность: 35 мВт;
- Рабочая температура: -40. +85 °С;
- Размеры: 16х12.2х2.4 мм
В такой конфигурации с новейшим оборудованием примерная общая цена Raspberry PI в собранном виде составит 9330 руб. Можно сэкономить, купив Raspberry PI 3, или четверку с 2 GiB ОЗУ. Можно еще сэкономить на GPS чипе, u-blox NEO-6M с антенной стоит около 650 руб. Тогда цена NTP сервера упадет до 5500 руб.
GPS/Глонасс модуль UBLOX NEO 8M
Может возникнуть вопрос, для чего нужны все эти капиталовложения и какую точность обеспечивает тот, или иной способ синхронизации времени. Небольшая сводная табличка для справки.
Источник сигнала времени | Погрешность | |||||||||||||||||||||||||||||
GPS с атомными часами | ±50 nSec | |||||||||||||||||||||||||||||
KPPS | ±1 μSec | |||||||||||||||||||||||||||||
PPS | ±5 μSec | |||||||||||||||||||||||||||||
Интерфейс USB 1.1 | ±1 mSec | |||||||||||||||||||||||||||||
Интерфейс USB 2.0 | ±100 μSec (100000 nSec) | |||||||||||||||||||||||||||||
NTP по сети |
Название | Тип | Устройство | Назначение |
UART0 | PLO11 | /dev/ttyAMA0 | вторичный (Bluetooth) |
UART1 | mini UART | /dev/ttyS0 | основной |
UART2 | PLO11 | ||
UART3 | PLO11 | ||
UART4 | PLO11 | ||
UART4 | PLO11 |
По умолчанию UART2-5 выключены.
Как видно из названия, UART0 — полноценный серийный порт и он имеет более высокую производительность, чем обрезанный UART1, он же mini UART. Поэтому будет не лишним перевести Bluetooth на UART1 с тем, чтобы основной поток данных шел через UART0. Для этого в /etc/default/grub, или /boot/config.txt ставим enable_uart=1.
В файле /etc/defaults/gpsd следует выставить.
Запустите, или перезапустите gpsd.
Проверка работы модуля GPS.
Отредактируем файл /etc/ntp.conf.
Все строки, содержащие сетевые публичные Stratum 1, 2 NTP сервера (такие, как pool [0-9].subdomain.pool.ntp.org) следует закомментировать, чтобы использовать лишь GPS/PPS источники данных.
Верхняя запись NTP0 указывает на универсальный источник времени, доступный почти на всех устройствах GPS. Нижняя запись NTP1 определяет гораздо более точный PPS источник.
Перезапустите ntpd
Controlling the Raspberry Pi RTC Module – I2C Real Time Clock
The Raspberry Pi does not save the date permanently. With the help of the Raspberry Pi RTC (Real Time Clock) module DS1307 you have a real-time clock – regardless of an existing internet connection. This is an advantage in many applications that require a timestamp but cannot be connected to the Internet. Especially for outdoor Pi’s and logging systems, it is important to know the exact date and time.
This tutorial is about installing a real-time clock (RTC) and synchronizing the system time of Linux/Raspbian.
Required Hardware Parts
Alternatively, the RTC DS3231 module should also work, but I have not (yet) tested this with it.
Preparation
The Tiny RTC modules are actually made for the Arduino, whose IO pins work at 5V. Since the GPIOs of the Raspberry Pi only work at 3.3V and a higher voltage can damage them, we have to remove two resistors from the board.
On the back are the two resistors (R2 and R3) which are removed. To do this, we heat the fastenings with the soldering tip. In addition, pin strips can be soldered, which are usually included. We only need the side with 7 pins (right):
The resistors R2 and R3 must be removed not to damage the Raspberry Pi with a too high voltage.
Alternatively, a Logic Level Converter (like here) could be interposed.
Connection of the Raspberry Pi RTC I2C Module
The module is connected via I²C interface. For this, we use the right pin side (which has 7 pins), because in the offline mode of the Raspberry the current is to be drawn from the battery so that the clock does not stop. Other modules may only have a pin strip. The assignment is as follows:
RTC Module | Raspberry Pi |
---|---|
SCL | GPIO 3 / SCL (Pin 5) |
SDA | GPIO 2 / SDA (Pin 3) |
VCC / 5V | 5V (Pin 2) |
GND | GND (Pin 6) |
The RTC Modules differ slightly from the structure, so the following picture should only be taken as a guide. It is important that the connected pins are correct:
Raspberry Pi RTC Software
Before we can really get started, it must be ensured that all packages and package sources are up to date, so we update them first and then install the I2C software:
Afterwards, the I2C bus has to be activated, if that’s not already done:
Activate everything under “Advanced Options”> “I2C” (simply confirm with Yes). A restart may be necessary.
Now we edit the modules file
and add the missing entries at the end:
You save and exit with CTRL + O, CTRL + X.
To activate the modules, they must be loaded:
We can now see whether the RTC module was recognized by I2C (the parameter -y 1 indicates that it is Rev.2. Only that the first Raspberry Pi corresponds to Revision 1):
You should see the following output:
The module is therefore recognized and can be queried using i2cget -y 1 0x68 . Since a hex code is difficult to read, we enter the module as a new I2C device:
Then we can simply read the time using sudo hwclock -r . You can get the local time of the system with date .
For me, the real-time clock was not set correctly (January 1, 2000), which is why I had to set it first. Since the local system time is correct (automatically accessed via an NTP server), I have synchronized it as follows (by the way, all commands can be found in the hwclock documentation):
If you want to change the system time (and time zone!), You should do this using sudo raspi-config , before you synchronize the times.
In order to set the system time automatically with every restart, we have to write a set command in the autostart. To do this, we edit the file:
The following two lines are added before exit 0 :
After a restart, the correct time should now be read and set from the Raspberry Pi RTC module – without any internet connection.
Raspberry Pi для домашней автоматизации. Часы реального времени
У Raspberry Pi нет собственных часов реального времени, поэтому его синхронизация происходит из интернета через NTP-сервер точного времени. С одной стороны ничего страшного в этом нет, если Raspberry Pi постоянно находится online. Однако при работе в закрытой или локальной сети, где нет NTP-серверов, системное время будет некорректным.
А собственно для чего нужно точное время в подобных устройствах? Дело в том, что в автоматике, особенно промышленной, синхронизации времени является одной из приоритетных задач. Точное время необходимо для ведения ретроспективы событий, фиксации моментов аварийных процессов, построения графиков параметров.
Синхронизация времени, кроме NTP-сервера, может выполняться с помощью сигналов точного времени, транслируемых через радиостанции или спутниковые навигационные системы. Например, на современных электрических подстанциях, где фактически вся релейная защита, автоматика, телемеханика сейчас построена с применением микропроцессорных средств, завязанных в единую сеть, синхронизация времени выполняется обычно с помощью спутников GPS-навигации, обеспечивающих высокую точность (погрешность не хуже 90-340 нс для системы «Navstar» и 700 нс для системы «Глонасс»).
Но в нашей системе домашней автоматизации такая точность будет излишней, поэтому мы обойдемся без спутниковых систем и применим более простой способ – подключим к Raspberry Pi модуль часов реального времени RTC (Real Time Clock), выполненный на широко распространенном чипе DS1307.
В качестве такого модуля была выбрана компактная плата Tiny RTC (рис.1).
Рис.1
Однако оказалось, что данный модуль работает с напряжением, и, соответственно, уровнями на шине I2C 5В (напомню, что у Raspberry Pi уровни 3,3В). Поэтому из схемы необходимо исключить подтягивающие резисторы R2 и R3 с шины I2C. Функцию этих резисторов будут выполнять подтягивающие резисторы, уже установленные непосредственно в самом Raspberry Pi и подключенные к шине питания 3,3В. Что касается напряжения питания самого модуля Tiny RTC, то оно должно быть 5В.
Так как в нашей системе домашней автоматизации становится все больше различных датчиков и устройств, подключаемых к портам GPIO Raspberry Pi, то имеет смысл изготовить переходную плату для их подключения. На рис.2 показан вариант такой платы с подключенным датчиком давления BMP085, модулем Tiny RTC и разъемом для шины 1-wire.
Рис.2
Будьте очень внимательны при изготовлении переходной платы. Ещё раз обращаю ваше внимание, что питание Tiny RTC выполняется от источника 5В, а всех остальных датчиков от источника 3,3В.
Да, и еще один очень важный момент, который касается всей системы в целом. Если вы отключаете какие-либо датчики, которые устанавливали на шины I2C или 1-wire ранее, то обязательно закомментируйте их в конфигурационном файле WebIOPi. Иначе web-страницы системы станут недоступны.
Итак, считаем что модуль Tiny RTC доработан и подключен к питанию и шине I2C, можно приступать к его настройке и интегрированию в нашу систему.
Открываем файл sudo nano /etc/modules, добавляем к имеющемуся тексту и сохраняем следующие строки:
i2c-bcm2708
i2c-dev
rtc-ds1307 (рис.3)
Рис.3
Открываем файл sudo nano /etc/modprobe.d/raspi—blacklist.conf и закомментируем в нем все строки (рис.4)
Рис.4
Устанавливаем i2c-tools:
sudo apt-get install i2c-tools
Перезапускаем систему командой sudo reboot
Далее необходимо выяснить адрес Tiny RTC, а точнее часов DS1307 на шине I2C. Сделать это можно командой
sudo i2cdetect -y 1
Должна появиться вот такая табличка (рис.5)
Рис.5
С высокой вероятностью могу утверждать, что у DS1307 будет адрес 68. Хотя возможны исключения. На приведенном выше рисунке адрес 50 – это ППЗУ 24С32 которая так же установлена в модуле Tiny RTC, 68 – DS1307, а 77 – датчик давления BMP085.
Зная адрес часов, их можно прописать в систему. Для этого необходимо зайти в систему обязательно с правами суперпользователя:
sudo -s
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
root@raspberrypi: exit
Теперь можно прочитать время из часов командой sudo hwclock –r, а так же записать в часы системное время командой sudo hwclock –w. (рис.6)
Рис.6
Чтобы время автоматически устанавливалось при старте системы из часов DS1307, необходимо добавить в файл
sudo nano /etc/rc.local
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock –s
Располагать указанные строки в файле rc.local нужно до строки exit 0 (рис.7)
Рис.7
Осталось перезапустить систему командой sudo reboot и мы получим автономную синхронизацию системных часов Raspberry Pi из модуля Tiny RTC.
Категория: | Просмотров: 13337 | Добавил: Admin | Теги: | Рейтинг: 5.0/1 |
Всего комментариев: 10
# sudo apt-get install i2c-tools
Pakketlijsten worden ingelezen. Klaar
Boom van vereisten wordt opgebouwd
De status informatie wordt gelezen. Klaar
i2c-tools is reeds de nieuwste versie.
0 pakketten opgewaardeerd, 0 pakketten nieuw geц╞nstalleerd, 0 te verwijderen en 37 niet opgewaardeerd.
root@raspberrypi:
# sudo i2cdetect -y 1
Error: Could not open file `/dev/i2c-1′ or `/dev/i2c/1′: No such file or directory
detector