Команда Репки
Команда Репки
1806 просмотров4 комментариев

Часы реального времени - RTC (real time clock) на одноплатном компьютере. На примере Repka Pi 3 - аналоге Raspberry Pi 3

Содержание


Структура статьи для быстрой навигации

  1. Задача - получение и отсчёт точного времени на одноплатных компьютерах, когда нет доступа к NTP и нет встроенного RTC.

  2. Решение - внешние модули RTC на I2C шине. Варианты и примеры.

  3. Коротко о шине I2C.

  4. Подробное описание действий по подключению и использованию RTC.

  5. Результаты.

  6. Выводы, итоги и благодарности.

  7. В завершение о доступных на рынке наиболее распространённых модулях RTС.

Предыдущая статья цикла материалов о возможностях использования Repka Pi - об установке VNC сервера на Repka Pi для удаленного доступа и управления ее рабочим столом - доступна по ссылке.

Repka Pi с присоединенным модулем DS3231Repka Pi с присоединенным модулем DS3231

Задача - получение и отсчёт точного времени на одноплатных компьютерах, когда нет доступа к NTP и нет встроенного RTC

Как всем известно, на малогабаритных одноплатных компьютерах как правило нет RTC и связано чаще всего не желанием производителя сэкономить, а с нехваткой места на очень маленькой плате такого компьютера, это как раз особенно актуально для одноплатных компьютеров в ставшем популярным форм-факторе RBPi. Есть ещё одна причина - встроенные RTC не всегда являются достаточно точными для определённых видов задач и использование сверхточных внешних модулей RTC является обязательным условиям. Эта статья посвящена добавлению часов реального времени (RTC) на конкретных доступных внешних модулях для RTC (включая сверхточные варианты) и варианте подхода к реализации алгоритма работы. Материал является конкретным примером, демонстрирующим в т.ч. общий принцип, опираясь на него, Вы сможете решить свою задачу, используя и другие модули модулей RTC и свои алгоритмы работы и даже другие модели одноплатных компьютеров.

В данном материале сделаем и продемонстрируем решение задачи подключения модуля RTC на примере появившегося на Российском рынке одноплатного компьютера Repka Pi 3 Российской разработки — альтернативе Raspberry Pi 3.

И в Repka Pi и в Raspberry Pi 3 нет часов реального времени (RTC) и при выключении время сбрасывается, а при включении и подсоединении к сети и к Интернет время устанавливается синхронизацией с сервером точного времени. При этом, если в проекте нужно обеспечить закрытость сети или просто независимость от внешнего сервиса или даже того пуще — нужно какую то автономную работу устройств обеспечить с синхронизацией по времени, — то наличие RTC становится критически необходимым.

Repka Pi или Репка — Российский проект одноплатных малогабаритных компьютеров на китайских и российских комплектующих — аналогов и альтернативы британским Raspberry Pi. На момент написания данной статьи в продаже находится первая модель одноплатника — Repka Pi 3, что соответствует Raspberry Pi 3 и немножечко его превосходит (подробнее о результатах сравнения на синтетических тестах уже писали ранее другие авторы в статье на Хабре). Если интересны подробности о Российском аналоге Raspberry, то подробности лучше узнать на сайте проекта и в официальной группе Телеграм. Репка - далее так и будем называть этот одноплатник.


Решение - внешние модули RTC на I2C шине. Варианты и примеры

В этой статье мы рассматриваем подключение и взаимодействие с часами реального времени по шине I2C на чипах микроконтроллеров DS3231 и DS1307. Часы DS3231 являются более точными и для нас это важно. На фотографии представлены примеры подключенных модулей на основе таких контроллеров часов, в т. ч. модуль, который считается специализированным для Raspberry Pi (как хороший пример реальной совместимости Repka Pi и Raspberry Pi в работе с внешними модулями расширений).

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


Коротко о шине I2C

I2C — это последовательная асимметричная шина, широко применяемая для связи между интегральными схемами внутри электронных приборов, в число которых как раз и входят одноплатные компьютеры, такие, как Raspberry Pi, Repka Pi или другие подобные решения. Шина была разработана фирмой Philips Semiconductors в начале 80-х годов прошлого столетия, и за прошедшие с тех пор годы претерпела большое количество изменений и усовершенствований. В настоящее время используется 6-я версия шины.

Чтобы узнать больше о принципах работы и других особенностях данной шины, советуем прочесть довольно подробную статью в Википедии. Надеемся, что в комментариях читатели предложат полезные ссылки на статьи полезные для решения практических задач с использованием I2C шины. А мы двинемся дальше.


Подробное описание действий по подключению и использованию RTC

Для того, чтобы внешнее RTC устройство надежно работало на Репке и обеспечивало поддержание реального времени даже в условиях отсутствия подключения к Интернету, необходимо выполнить следующие шаги:

  • Подключение внешнего RTC модуля к Репке.

  • Настройка параметров работы 40 pin разъёма.

  • Установка пакета утилит i2c-tools.

  • Определение адреса RTC модуля.

  • Регистрация часов в системе.

  • Утилита командной строки Hwclock для доступа к аппаратным часам.

  • Запись времени в модуль RTC.

  • Синхронизация времени системы при запуске.

  • Отключение синхронизации системного времени через Интернет (опциональный шаг).

Разберём каждый шаг подробно.

Подключение внешнего RTC модуля к Репке

Корректное подключение компонентов является залогом успешной работы любых электронных устройств и цепей. В нашем случае все довольно просто. На фотографии ниже вы можете видеть абсолютно новый, что называется, с иголочки, модуль RTC - DS3231, еще в заводской упаковке, который необходимо извлечь и установить на Репку. Для данной задачи лучше подходит Репка в комплектации без корпуса (есть комплектация и сразу в корпусе, с вентилятором, блоком питания и всё такое - подробнее смотрите тут).

RTC подключаются на 1, 3, 5, 7 и 9 штырьковые контакты или, как часто говорят, "пины" (где 1 - 3.3V, 3 - I2C1-SDA, 5 - I2C1-SCL, 7 - пропускается, но будет закрыт модулем, 9 - GND). На рисунке ниже показано, как это выглядит непосредственно на 40 pin разъёме

И непосредственно на плате Repka Pi 3 это выглядит уже вот так

Если настройки распиновки 40 pin разъёма у Вас "из коробки", т.е. не менялись после прошивки Repka OS, то сразу после подключения модуль работать не будет! Дело в том, что в версиях прошивки Repka OS начиная с версии 1.0.6 (от 9.03.2023) по умолчанию используется распиновка по умолчанию как и в Raspberry Pi - такая где всем пинам назначены GPIO и не назначены никакие интерфейсы I2C, SPI, UART и PWM. Точнее там есть всего один UART, который совмещён с отладочным портом и в него выводится информация в терминале (если подключение отладочного терминала представляет интерес - пишите в комментариях, напишем об этот отдельный туториал) и чтобы использовать его как обычный UART нужно выключить вывод отладочной информации.

Распиновка по умолчанию абсолютно идентичная в Repka Pi и Raspberry Pi (так же есть на сайте Репки и в доступном там для скачивания руководстве пользователя) и показана на схеме ниже

Распиновка Repka Pi и Raspberry Pi по умолчанию (или базовая) - в прошивках Repka OS, начиная с версии 1.0.6 (от 9.03.2023) включительноРаспиновка Repka Pi и Raspberry Pi по умолчанию (или базовая) - в прошивках Repka OS, начиная с версии 1.0.6 (от 9.03.2023) включительно

В этом месте важно отметить, что если у Вас установлена прошивка Repka OS версии 1.0.5 (от 30.01.2023) или более ранняя, то там ещё не было полностью реализованной поддержки вариантов распиновок "как в Raspberry" и доступная по умолчанию единственная распиновка установлена такая, как показано на рисунке ниже - и с ней переключать ничего не нужно!Физически корректно подключенный модуль RTC будет работать сразу.

Распиновки портов на 40 pin разъёме на Repka PI - была доступка в прошивках Repka OS до версии 1.0.5 (от 30.01.2023) включительноРаспиновки портов на 40 pin разъёме на Repka PI - была доступна в прошивках Repka OS до версии 1.0.5 (от 30.01.2023) включительно

В этом случае Вам можно пропустить следующий пункт про переключение варианта распиновки и переходить сразу к пункту про установка пакета утилит i2c-tools, ну или обновить прошивку и сделать всё как написано далее :-) Эта распиновка может представлять интерес тем, что в ней есть сразу три UART интерфейса! В промышленных проектах это порой необходимо. Однако разработчики Репки утверждают, что в самое ближайшее время будет добавлена дополнительная распиновка №2 и в ней уже так же будет три UART, а так же ещё и аппаратный PWM (программный то мы может реализовать сами поверх любого GPIO и как раз RTC часов). Так что на момент, когда Вы будете читать эту статью есть большая вероятность, что дополнительная распиновка номер 2 уже будет доступна в новой версии прошивки Repka OS и порадует своими возможностями тех, кто Репку применяет для решения каких то промышленных задач. Но это немного другая история, мы вынужденно отвлеклись и сейчас пора двигаться дальше.

С физическим подключением мы успешно справились! Переключим распиновку 40 pin разъёма на нужную для работы нашего RTC модуля.

Настройка параметров работы 40 pin разъёма

Или, говоря простым разговорным языком, настройка распиновки GPIO. Как было сказано выше, для того чтобы наш RTC модуль заработал, нужно включить шину I2C интерфейса на пинах, куда мы только что физически подключили модуль. Для этого включим в Repka Pi дополнительную распиновку №1 (доступна в прошивках Repka OS, начиная с версии 1.0.6 (от 9.03.2023) включительно). Эта распиновка обеспечивает режим совместимости с самой популярной альтернативной распиновкой Raspberry Pi и представлена ниже

Распиновка Repka Pi в режиме совместимости с Raspberry Pi - в прошивках Repka OS, начиная с версии 1.0.6 (от 9.03.2023) включительноРаспиновка Repka Pi в режиме совместимости с Raspberry Pi - в прошивках Repka OS, начиная с версии 1.0.6 (от 9.03.2023) включительно

Процесс переключения распиновок в Repka Pi похож на то, как это делается в Raspberry Pi. С той разницей, что в "малинке" это делается включением интерфейсов по отдельности (кто плавал, тот знает, кто не знает, можете ознакомится например тут), а в Репке сейчас переключаются целиком варианты рапиновок на все пины разъёма. Это делается с помощью специальной встроенной в Repka OS утилиты - это тоже очень похоже на то, как сделано Raspberry Pi. В Raspberry Pi это делается с помощью утилиты raspi-config, а в Repka Pi это делается с помощью утилиты repka-conf. Вызвать repka-conf можно кликнув на рабочем столе на её ярлык как показано на скрине ниже. Второй способ вызова это команда

/boot/dtb.sh

и так же разработчики сообщают, что в Repka OS будет доступна команда

sudo repka-config

по аналогии с командой sudo raspi-config в Raspberry.

Рабочий стол GUI Repka OS - в прошивке по умолчанию на рабочем столе ярлык вызова утилиты repka-conf и  так же есть информация и версии и дате прошивкиРабочий стол GUI Repka OS - в прошивке по умолчанию на рабочем столе ярлык вызова утилиты repka-conf и так же есть информация и версии и дате прошивки

При запуске repka-conf мы сначала увидим интерфейс для установки максимально разрешённой частоты работы процессора, как показано на иллюстрации ниже.

Интерфейс repka-conf для установки максимально допустимого значения частоты работы процессораИнтерфейс repka-conf для установки максимально допустимого значения частоты работы процессора

Интерфейс repka-conf для установки максимально допустимого значения частоты работы процессораМаксимальная разрешённая частота работы процессора является рекомендованным параметром, который указывается на упаковке Репки и может устанавливаться пользователем в зависимости от решаемых задач и загрузки процессора, в зависимости от отсутствия или наличия дополнительного охлаждения и от требований к бесперебойности работы. В целом это отдельная тема, она активно обсуждается в группе обсуждения к официальному каналу в Телеграм. Нас же сейчас это не интересует и у нас другая задача - изменения настроек распиновки GPIO разъёма. Для этого мы выбираем значение частоты такое же как и было и двигается дальше к следущему параметру и это как раз то, что нам нужно - установка значения распиновки 40 pin разъёма, как показано на принскрине ниже

Интерфейс repka-conf для установки режима работы (или распиновки) 40 pin разъёмаИнтерфейс repka-conf для установки режима работы (или распиновки) 40 pin разъёма

Нам необходимо переключиться на вариант распиновки "Альтернативная" или дополнительная #1. При добавлении вариантов распиновки будет увеличиваться выбор в соответствующем списке (это может происходить по запросам пользователей) но все ранее имеющиеся значения вариантов прошивок будут оставаться не изменными на тех же местах.

После внесения необходимых изменений нужно перезагрузиться. Сделать это можно на показанном ниже интерфейсе утилиты repka-conf согласившись на перезагрузку или позже самостоятельно перезагрузив устройство. Тут так же можно обратить внимание, что утилита сама перезагрузит командой Shutdown. И тут могут возникнуть циклические перезагрузки в ряде случаев, тогда нудно будет выключить питание и включить устройство заново. По этой причине рекомендуем перезагружать устройство самостоятельно командой

sudo reboot

В новой прошивке разработчики обещают внести изменения в работу данной утилиты, в т.ч. в процесс применения изменений и перезагрузки и расширение вариантов распиновок, доработав для большего удобства в работе и саму утилиту repka-conf.

Интерфейс repka-conf после внесения изменений в значение варианты распиновкиИнтерфейс repka-conf после внесения изменений в значение варианты распиновки

После успешной смены распиновки и перезагрузки Репки можно смело приступать к подкючению модуля RTC и началу работы с ним.

Используемый в Repka Pi 3 процессор AllWinner H5 имеет встроенные часы реального времени, как и большинство процессоров на подобных одноплатниках, но разработчики не вывели это устройство на плату из-за ограниченности места на плате Репки (могло потребоваться вывести источник питания и его контакты, кварцевый резонатор, чего то еще и провести дополнительные трассы) и специфичностью задач - ну это опять так же как и в Raspberry Pi. И вообще - использованный нами внешний модуль RTC является сверхточным и это важно для рада задач. Но раз SoC AllWinner H5 есть встроенные часы RTC, то они будут oпoзнaваться кaк уcтpoйcтвo /dev/rtc0 и использовать их мы не будем. Источник питания есть в нашем подключенном внешнем I2C модуле RTC и поэтому мы будем использовать именно его и он будет определяться как /dev/rtc1.

Двигаемся дальше к самому главному - к настройке модуля RTC и началу его работы для определения задания времени в системе. Для этого нам сначала потребуется проверить наличие и определить адрес нужной нам шины I2C и адрес нашего устройства на этой шине.

Установка пакета утилит i2c-tools

Для работы с шиной I2C из-под терминала необходимо установить пакет i2c-tools, содержащий в себе такие полезные утилиты как i2cdetect, i2cdump, i2cget, i2cset, i2ctransfer и другие. В первую очередь нам понадобится утилита i2cdetect; в дальнейшем могут понадобиться и остальные. Для установки пакета утилит выполняем следующие команды:

apt update
apt install i2c-tools

В текущей актуальной версии Repka OS на момент написания статьи данный пакет уже был установлен, поэтому при работе с новой Репкой данный шаг можно пропустить. Проверить, установлен ли пакет утилит i2c-tools, достаточно просто: нужно просто ввести в терминал команду i2cdetect и если утилита не установлена, то в терминале появится ошибка, что команда не найдена, что бы установить данную утилиту вернитесь на шаг назад.

Определение адреса RTC модуля

После установки модуля RTC необходимо определить его адрес на I2C-шине, для чего будем использовать утилиту i2cdetect.

Для начала запросим список всех подключенных шин:

i2cdetect -l

Результат выполнения командыРезультат выполнения команды

Выполнение этой команду с параметром -l выводит список всех шин I2C системы. В выводе результатов мы видим, что в нашем случае доступно 3 шины, известные Linux. 0, 1, 2 - это номера шин, назначаемые ядром Linux. Это числа, необходимые для других командных операций. Если шины в списке нет, то стоит вернуться к шагу со сменой распиновки, так как скорее всего выбрали другой вариант рапиновки или забыли сохранить значение или перезагрузить систему.

Эта команда используется не только для обнаружения и перечисления всех шин I2C, доступных и известных системе, а также и для вывода дополнительной информации о них и об их подчиненных устройствах. Как мы видим на выбранной и нужной нам схеме распиновки у нас I2C шина 1.

Далее нам нужно узнать адрес нашего модуля на шине I2C. Для этого вводим следующую команду:

i2cdetect -y 1

Здесь параметр "1" — это номер интересующей нас шины, а ключ "-y" — это ключ команды для вывода подробной информации о подчиненных устройствах на выбранной шине. Из вывода команды мы видим, что модуль RTC имеет адрес 0x68. Запоминаем это число. Оно понадобится нам при составлении следующей команды, регистрирующей часы в системе. В данном случае у нас всего одно i2c устройство на данной шине и потому понять его адрес мы смогли безошибочно. Если бы устройств было несколько, то мы бы увидели их все и тогда определить адрес нужного нам сейчас устройства нужно было бы а) по правильному - посмотрев в datasheet нашего устройства или б) просто проверив и обращаясь к устройствам по очереди, но это такое себе (но будем честны - кто так никогда не делал? :-) ). Выглядит в нашем случае это так

А что бы мы увидели, если пробовали найти наше устройство на шине i2c не установив нужную распиновку?

Ну что же, мы проверили имеющиеся в системе i2c шины, убедились, что там есть нужная нам шина и на данной шине проверили наличие устройства I2c, узнали его адрес на шине. Мы в одном шаге от начала работы с RTC часами и для начала работы с ними нам лишь осталось зарегистрировать обнаруженное устройство в системе.

Регистрация часов в системе

Команда регистрации часов в системе будет различаться в зависимости от того, какой именно модуль реального времени мы используем. Вариант команды для модуля DS3231 выглядит следующим образом:

echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

А это уже вариант той же команды для модуля DS1307:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

Пocлe регистрации в cиcтeмe появится новое i2c уcтpoйcтвo /dev/rtc1 c aдрecoм 0x68. Чтобы убедиться, что устройство и в самом деле появилось в систме, можно выполнить следующую команду:

ls /dev/rtc*

В ее ответе должно присутствовать данное устройство:

Как можно видеть на приведенном выше скриншоте, устройство действительно появилось, соответственно, данный шаг пройден успешно и можно двигаться дальше.

Утилита командной строки Hwclock для доступа к аппаратным часам

Для работы с RTC будем использовать утилиту hwclock - это утилита командной строки для Linux и Unix-подобных операционных систем для доступа к аппаратным часам. Данная утилита установлена по умолчанию в Repka OS, но если по какой-то причине утилита не установлена, установите её командой:

apt-get install util-linux

Эта команда позволит установить весь пакет util-linux, включающий в себя и утилиту hwclock. Строго говоря, этот пакет исторически идёт в составе дистрибутивов, однако если Вы решаете системные или промышленные встраиваемые задачи (а потребность в RTC может косвенно на это указывать), то у Вас может быть легковесный дистрибутив Repka OS или вообще иной дистрибутив - тогда это актуально. Правда, в таком случае, чтобы не тащить весь пакет, можно установить только отдельно утилиту hwclock, выполнив команду:

apt-get install fake-hwclock

Рассмотрим, какие именно команды утилиты hwclock нам сейчас потребуются:

hwclock -f /dev/rtc1 -r — считать время, сохраненное в RTC;

hwclock -f /dev/rtc1  -s — синхронизировать время системы с временем RTC;

hwclock -f /dev/rtc1 -w — записать текущее системное время в RTC.

Запись времени в модуль RTC

Мы предлагаем нашим читателям на выбор два способа записи времени в модуль.

Способ № 1

Устанавливаем время напрямую в модуль RTC, используя команду hwclock:

hwclock -f /dev/rtc1 --set --date="YYYY-MM-DD hour:minute"

Например:

hwclock -f /dev/rtc1 --set --date="2023-02-26 17:57"

Чтобы реальная дата поменялась, нужно выполнить команду:

hwclock -f /dev/rtc1  -s

и таким образом синхронизировать время системы с временем RTC.

Способ №2

Запись текущего системного времени.

Перед записью проверяем установленную дату в системе командой date

Если нет доступа к Интернету или NTP не работает, то дата будет неверной. В этом случае дату можно установить командой date в следующем формате:**

date --set="YYYYMMDD hour:minute:seconds"

Например:

date --set="20230226 17:06:00"

Если есть доступ к сети интернет, то можно воспользоваться службой ntp, выполнив команду:

ntpd -gq

После установки необходимой даты и время воспользуемся командой для записи текущего времени:

hwclock -f /dev/rtc1 -w

Синхронизация времени системы при запуске

Теперь у нас есть надежный хранитель времени, но следует помнить, что модуль RTC все еще является внешним устройством для нашей системы. Чтобы при каждом запуске Репки время с модуля RTC переносилось в систему, об этом необходимо позаботиться дополнительно. Для этой цели предлагаем вариант скрипта, который необходимо добавить в автозапуск, после чего он будет отрабатываться при каждом запуске системы, обновляя системное время Репки на сохраненное в модуле RTC.

Немного дополнительной информации про автозагрузку в Linux - выбор между init.d и systemd

В качестве демона автозагрузки будет использован init.d. Большинство версий Linux предоставляет выбор между init.d и systemd для управления автозагрузками.

Демон init.d использует скрипты из каталога /etc/init.d/, в то время как systemd использует unit-файлы из /etc/systemd/system. При использовании второго способа запуск служб можно распараллелить и тем самым ускорить. Тем не менее, мы выбрали первый способ. Как думаете, почему? Пишите Ваши версии в комментариях к данной статье. И Вы можете сделать иначе, помните об этом :-)

Нам нужно создать файл скрипта, записав в него сам скрип, установить на него необходимые для запуска права и добавить скрипт для автозагрузки выбранным способом с init.d. Разберём все действия подробно:

  1. Создаем файл скрипта синхронизации
nano /etc/init.d/rtc1
  1. Вставляем в созданный файл текст скрипта
#!/bin/sh
### BEGIN INIT INFO 
# Provides: rtc1
# Required-Start:  $remote_fs $syslog
# Required-Stop:   $remote_fs $syslog
# Default-Start:   2 3 4 5
# Default-Stop:
# Short-Description: Start rtc1
### END INIT INFO 
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# Задержка на пять секунд
sleep 5  
if [ -e /dev/rtc1 ]
then
    hwclock -f /dev/rtc1 -s
fi

Подробное описание работы данного скрипта

Чтобы стало понятнее, что именно делает добавленный в автозапуск скрипт, разберем приведенный выше код скрипта подробнее

Команда/строка Объяснение
### BEGIN INIT INFO Данная строка является всего лишь меткой начала списка инструкций и не является исполняемой командой.
# Provides: rtc1 Описывает предоставляемые скриптом объекты.
# Required-Start:  $remote_fs $syslog Задаёт объекты, которые должны существовать, чтобы запустить скрипт.
# Required-Stop:   $remote_fs $syslog Задаёт объекты, используемые сервисом, предоставляемым скриптом
# Default-Start: 2 3 4 5 Задает уровни запуска, на которых скрипт должен быть запущен (остановлен) по умолчанию. Например, если сервис должен быть запущен на только уровнях 3, 4 и 5, укажите "Default-Start: 3 4 5" и "Default-Stop: 0 1 2 6".
# Short-Description: Start rtc1 Краткое описание предназначения скрипта.
### END INIT INFO Метка конца списка инструкций.
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device Регистрирует часы DS3231 в системе. Если используется DS1307, необходимо поменять в команде **ds3231 на ds1307.
sleep 5 Задержка на 5 секунд. Временной интервал подобран экспериментально, поэтому мы не рекомендуем уменьшать его. Но разобраться и поэкспериментировать уже оставим Вам :-) в процессе решения практической задачи
if [ -e /dev/rtc1 ] Данный фрагмент скрипта, включающий оператор условия, синхронизирует время с новым устройством, если оно успешно создано.
  1. Выставляем права на файл для выполнения автозапуском
chmod +x /etc/init.d/rtc1
  1. Добавляем скрипт в автозапуск системы
update-rc.d rtc1 defaults
update-rc.d rtc1 enable

Отключение синхронизации системного времени через Интернет

Данный пункт опциональный. Если вы выполните данный шаг, время в системе всегда будет устанавливаться только по часам реального времени. В противном случае система уже после отработки нашего скрипта проведет синхронизацию времени еще раз, но уже по серверам точного времени из Интернета. Причина такой ситуации состоит в том, что по умолчанию компьютеры во всем мире используют NTP (сетевой протокол времени) для синхронизации своего времени со стандартными эталонными часами через Интернет и делают это с определенноё периодичностью в соответствии с настройками (но это уже отдельная тема за рамками нашей задачи). При отсутствии внешнего модуля RTC это единственный способ обеспечить установку правильного времени в системе Репки. В нашем случае системное время устанавливается из модуля RTC и если не причин делать одну и ту же работу — установку системного времени — дважды но разными способами или Вы заранее знаете, что Ваше устройство не должно выходить в Интернет или использовать внешние сервера NTP, то тогда необходимо выполнить следующую команду для отключения в системе попыток синхронизировать время в внешними NTP серверами:

update-rc.d ntp disable

Теперь системное время будет устанавливаться только один раз — по нашему RTC модулю не зависимо от наличия интернета, работы серверов NTP и других внешних и погодных условий.

Позвольте отнять ещё одну минуты Вашего времени и подвести итоги, рассказать о проекте Репка и дать на его ресурсы полезные ссылки и выразить благодарность участникам сообщества проекта Repka Pi, на основе чьих материалов написана данная статья.

Результаты

Поставленная задача выполнена, теперь Репка оснащена возможностью сохранения реального времени в системе при любом запуске даже при отсутствии подключения к Интернету или доступа к NTP.

Загрузились без доступа в сеть, но время после запуска системы всё равно установлено верно. Внимательные читатели увидят, когда доделывалась данная статья :-)Загрузились без доступа в сеть, но время после запуска системы всё равно установлено верно. Внимательные читатели увидят, когда доделывалась данная статья :-)


Выводы, итоги и благодарности

Мы надеемся, что данная статья поможет нашим читателем в решении насущной задачи имплементации часов реального времени на одноплатных компьютерах.

Представленный подход может применяться на любых одноплатных компьютерах с возможностью подключения устройств по I2C шинам. Вместе с этим было показано, как удобно можно применить модули, специально предназначенные для установки на штырьковые разъёмы одноплатников формфактора RBPi. В данном случае мы имплементировали RTC на одноплатник такого типа Российской разработки Repka Pi, чтобы показать, как этот одноплатный компьютер успешно заменяет Raspberry Pi в проектах. Поэтому также приводим ссылки на ресурсы проекта Repka Pi

  • Официальная страница проекта Repka Pi на сайте производителя — пока по адресу repka-pi.ru происходит перенаправление страницу продукта на сайте проекта, но скоро Repka Pi обзаведется отдельным сайтом, доступным по этому же адресу и там будет куча дополнительной информации, форум, блог.

  • Официальный Телеграм канал проекта Repka Pi.

  • Группа обсуждения и комментариев к постам официального канала в Телеграм проекта Repka Pi - там можно задать актуальные вопросы и пообщаться с единомышленниками, которые тоже увлекаются одноплатными компьютерами вообще и Репкой в частности.

  • Официальное сообщество в ВК компании разработчика, где периодически появляются новости проектов разработчика проекта, в том числе и Репки.

  • Предыдущая статья о проекте, где было подробнее рассказано об установке VNC сервера на Repka Pi для удаленного доступа и управления ее рабочим столом.

  • Страница неофициального сообщества Repka Pi.

Статья написана на основании материалов, предоставленных Дмитрием Шевцовым из Калининграда по следам его постов в группе обсуждения и комментариев к постам официального Телеграм канала проекта Repka Pi. Дмитрий является автором материалов, мы выполнили редактуру, форматирование, оформление и тематическое расширение базового материала. Связываться с целью благодарности или уточнения вопросов с Дмитрием можно в его Телеграм-аккаунте, который мы приводим с его согласия. С нашей стороны мы очень признательны Дмитрию за проработку актуального вопроса и подготовку фактуры для написания полезной статьи.

Раз Вы читаете эти строки, значит статья Вас заинтересовала и Вы дочитали её до конца. Спасибо Вам!

Ставьте Ваши оценки и пишите в комментариях о чём бы Вы хотели ещё прочитать в этом цикле статей о применении и работе с одноплатным компьютером Repka Pi Российской разработки и производства, о применении с ним датчиков, исполнительных устройств и устройств ввода и вывода информации, а может и о чём то ещё.

Удачи Вам и Вашим проектам - как рабочим или образовательным, так и просто любительским!

Далее справочная информация по модулям RTC для тех, кто сразу решил сделать подобным образом запись, чтение и установку системного времени в своём проекте.


О доступных на рынке наиболее распространённых модулях RTC

Приводим cсылки на внешние RTC модули для тех, кто захочет решить аналогичную задачу используя такие же или аналогичные модули RTC.

Ссылки актуальны на момент написания статьи и что будет дальше мы не знаем, но уверены, что найти подобные модули в продаже Вы всегда сможете и самостоятельно. Ссылки приведены исключительно для удобства читателей, заинтересовавшихся описанным в статье функционалом. Авторы статьи никак не связаны с перечисленными ниже ресурсами. Для удобства вместе со ссылками приводим и цены на модули в этих магазинах - как Вы понимаете, они будут актуальны только какое то время после публикации статьи.

RTC DS3231

  • Амеркот — 220 р.

  • Робошоп — 266 р.

  • Чип и Дип — 1020 р.

  • АлиЭкспресс — 136 р.

  • АлиЭкспресс — 186 р. + доставка. Тут можно найти все модули, предназначенные как для непосредственного надевания на разъем, так и для крепления проводами. Независимо от способа крепления модуля, алгоритм подключения будет одинаковым — таким, как описано в статье.

  • OZON — 360 р. Когда надо было быстро, то брали тут, проверено, работает, доставили быстро.

RTC DS1307

И несколько фотографий примеров внешнего вида исполнения таких модулей:


Содержание поста является копией статьи с другого ресурса.  Ссылка на оригинал


Комментарии (4)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Юрий  

Сделал все по инструкции - заработало.
Модуль RTC DS3231 купил в Амперкот.
Единственно, что плохо, данный модуль не позволяет использовать стандартный корпус для Репки, или надо выносить модуль на проводах.

arsbond
arsbond  

Добрый день. Делал все по инструкции. Затык происходит после регистрации часов в системе. Правда я использую часы PCF8523T
Вот лог из терминала
root@Repka-Pi:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@Repka-Pi:~# echo pcf8523 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
root@Repka-Pi:~# hwclock -f /dev/rtc1 -r
hwclock: ioctl(RTC_RD_TIME) to /dev/rtc1 to read the time failed: Недопустимый аргумент

Прошу помощи

ejsanyo
ejsanyo  

Наверно уже не актуально, но вдруг ещё кому поможет: https://github.com/raspberrypi/firmware/issues/1065
Если в двух словах: драйвер проверяет флаг REG_SECONDS_OS в чипе, показывающий, что был сбой в работе кварца, и вываливает ошибку, если флаг стоит. А выставиться он может, если а) кварц и правда не работает, б) схема конкретного модуля не учитывает, что основное питание на чип надо подавать и снимать плавно, через RC-цепочку. И это, пожалуй, более вероятный сценарий для неведомых модулей с Ali. Для решения проблемы по ссылке предлагают либо доработать схему, либо поставить каким-то образом патченный драйвер, в котором убрана проверка флага.

ejsanyo
ejsanyo  

Сварганил "шилду" на основе чипа DS3232. Так понимаю, это тот же DS3231+немного батарейного ОЗУ. Прописал его как "ds3232", благо нужные драйвера в системе явно есть. И что (не)удивительно, всё заработало нормально! Если кому вдруг надо, вот проект платы в Altium Designer 10: https://drive.google.com/file/d/1UNV4Gn9OZtM9yTyLoRf6L0RU-W5LIyyD/view?usp=sharing Разведено не совсем по рекомендациям даташита, но тем не менее сбоев в работе вроде нет.

Темы

Навигация

ВойтиРегистрация