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

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

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

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

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

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

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

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

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

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


Задача - получение и отсчёт точного времени на одноплатных компьютерах, когда нет доступа к 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 на базе DS3231 - ссылки на модель в конце статьи
Ещё не распечатанный модель 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

# Default-Stop:

Задает уровни запуска, на которых скрипт должен быть запущен (остановлен) по умолчанию. Например, если сервис должен быть запущен на только уровнях 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 ]

then

    hwclock -f /dev/rtc1 -s

fi

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

  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

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


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


  1. Borjomy
    00.00.0000 00:00
    +6

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


    1. Fox_exe
      00.00.0000 00:00
      +9

      Да, и это у подавляющего большинства одноплатников так.

      Подразумевается, что одноплатники всегда имеют доступ в интернет и работают 24/7, а значит и часы им не нужны (NTP хватает).


    1. zatim
      00.00.0000 00:00
      +3

      Нет, там еще кварц нужен на 32.768 кГц.


      1. GennPen
        00.00.0000 00:00
        +2

        Но судя по фотографии, он там есть.

        Hidden text


        1. RyabovA Автор
          00.00.0000 00:00

          Так это же вроде антистатик.....


          1. GennPen
            00.00.0000 00:00
            +1

            Это кварцевый резонатор. Первые буквы EA - говорят о том, что на 99% это резонатор на 32768Гц. Можно ткнуться осциллографом на выводы(которые ближе к процессору), чтобы убедиться в этом, по идее он должен сразу запускаться вместе с питанием процессора.


          1. GennPen
            00.00.0000 00:00

            В прошлогодней статье (за вашим авторством) есть фото верхнего слоя: Проект Repka Pi — переклеивание этикеток или реальная разработка? / Хабр (habr.com)
            И судя по нему, вывод K6 по которому идет внешнее питание на RTC (если верить даташиту на процессор) разведен и уходит во внутренние слои. Если он разведен на обвязку, то возможно ее найти и модифицировать для использования батарейки/ионистора, и тогда не нужны будут костыли в виде отдельного RTC-модуля.

            Hidden text


            1. RyabovA Автор
              00.00.0000 00:00

              Это не костыли. Просто нужно немного под другим углом посмотреть - и вот почему, причин несколько:

              1) Места на плате мало и доработки по трассировке будут сложными. Помимо этого расположение элемента питания и его разъёма может оказаться мешающим в текущих проектах уже заточенных конкретно под данную модель и форм-фактор платы.

              2) 90% пользователей устройства в RTC не будут нуждаться и для них это будет ненужно удорожание и усложнение.

              3) RTC во встраиваемых решениях могут требоваться сверх-точные и тогда встроенные часы всё равно не подойдут и нужно ставить точный внешний модуль.

              4) Сам проект Repka Pi является идеологически именно аналогом и альтернативой RBPi и потому обеспечивается в данный момент точное соответствие - нет часов в RBPi 3, значит и недолжно быть и в Repka Pi 3.

              5) Задача Repka Pi в т.ч. применение в образовании и в этом случае подключение модуля RTC ещё один полезный учебный кейс.


              1. GennPen
                00.00.0000 00:00
                +4

                1) Места на плате мало и доработки по трассировке будут сложными. Помимо этого расположение элемента питания и его разъёма может оказаться мешающим в текущих проектах уже заточенных конкретно под данную модель и форм-фактор платы.

                Места под малюсенький ионистор более чем хватает.

                RTC во встраиваемых решениях могут требоваться сверх-точные и тогда встроенные часы всё равно не подойдут и нужно ставить точный внешний модуль.

                Встроенный RTC имеет абсолютно такую же точность что и внешний. Да и китайский модуль думаете будет сверх-точный?


                1. RyabovA Автор
                  00.00.0000 00:00
                  +2

                  Ниже эта тема уже раскрыта коллегой в комментах прекрасно - и про то, что DS3231M не просто точный, он ещё и термокомпенсированный, и про то, что модули они на то и модули, чтобы их устанавливали только те, кому они нужны и только там где нужно для расширения базового функционала. Сама концепция данного формфактора с 40pin разъёмом универсальным такова, что предназначена для быстрой кастомизации под конкретные задачи. А когда на эту чёткую концепцию начинают все свои конкретные "хотелки" нацеплять, то это уже получается другой тип устройств - специализированных, заточенных под конкретный набор задач и со своим формфактором и в таких специальных платах, как правило, уже от разработчиков идёт и нужный набор функционала и всё настроено на уровне DT и есть конкретные руковдства пользователя по работе с устройством и там уже никто ничего не кастомизирует, а втыкает куда надо провода и включает в какой то программе что то нужное и оно работает "из коробки" и потому такие материалы и не нужны, а кому нужны, так на другом уровне и скорее для Embedded Linux. И то и другое не Хорошо и не плохо - это разные инструменты и разные формфакторы и разные концепции. И вот эта концепция формактора "а-ля Raspberry" - она такая - для модульной недорогой быстрой кастомизации, расширения и настройки под свой набор задач, по доступным, массовым и быстрым для повторения инструкциям.

                  Так что тут спорить и критиковать что то и смысла лишено, а то будет что то типа разговора про то, что же лучше - легковая машина седан или пикап - и вот будут водитель такси и курьер доставки спорить "до усрачки", одному нужно коробки возить удобно и побольше, а другому людей в комфорте и тепле везти. И что, кто то прав будет? Нет! Ибо оба и правы, но каждый по своему. Просто задачи у них разные. Вот так и тут - кому то батарейку "ага, уроды, зажали и это Успех?", кому то PWM на X портов надо, кому то вообще GSM или GPS и пошло поехало да понеслось - и половину из этого "просто добавить" и "копейки стоит" и "легко было предусмотреть". А всё проще - смотрим, что за Идея, какой концепт - для чего, когда, кому и почему это нужно и всё становится на свои места :-)

                  Это я всё подробно раскрыл скорее для автора самого первого комментария к данной статье. Но там, простите, диалог вести даже не хочется, всё понятно, тяжёлый случай. Но суть то примерно такая, как написано. И это важно понимать и помнить! Так что лучше давайте что то по сути материала - что вот там то не так подано, что и где раскрыть подробнее или иначе нужно и т.п.

                  Если что не так или резковато получилось, прошу извинить :-) Просто хочется, чтобы материал и комментарии были максимально по существу и полезны для читателей, которым именно этот подход и именно на устройствах с такой концепцией может оказаться нужным и интересным в рамках своих задач.


            1. evgeny_boger
              00.00.0000 00:00
              +2

              Встроенный RTC в оллвиннерах жрёт как не в себя, работает от 3.0В, и вообще рассчитан на работу от li-ion аккумулятора, а не от часовой батарейки. Всё-таки планшетное прошлое этих чипов даёт о себе знать.

              А "часовой" кварц в этих процессорах неожиданно используется не только собственно для часов. В A40i (aka R40), который у нас, от него тактуется блок внешних прерываний. У коллег на V3s, по слухам, вообще bootrom без него не стартует. Так что убирать его не стоит.


  1. osmanpasha
    00.00.0000 00:00
    +2

    Вообще по-моему правильно загружать драйвер устройства не в init-скрипте, а через device tree.


    1. dima_sh87
      00.00.0000 00:00
      +1

      Да рассматривал такой вариант. И позже рассмотрим и подключение через device tree


  1. evgeny_boger
    00.00.0000 00:00
    +1

    Привет!

    Если кто вдруг захочет воспользоваться описанным в статье:

    1) От онанизма мероприятий с i2c-tools и скриптами можно избавиться, если просто прописать внешний RTC в device tree. Обычно в расширяемых одноплатниках есть какой-то механизм для этого, работающий вокруг device tree overlays. Но даже если нет, то можно просто разобрать DT из dtb или работающей системы с помощью вызова dtc, добавить туда три строчки, и собрать обратно

    2) DS3231M не просто точный, он термокомпенсированный. Другие RTC из списка на краях температурного диапазона будут отставать на 120-150ppm, т.е. на 5 минут в месяц.

    3) На RTC с отдельным кварцем тикают плохо, если там стоит случайный кварц и конденсаторы. Порядок величин: кварц с неправильной нагрузочной ёмкостью даёт 3мин/месяц ошибки, 1пФ паразитного сопротивления - 25 секунд/месяц.

    4) Чип DS3231M стоит $6@1000pcs на западе, $2.5@1000pcs в приличном месте в Китае. Что именно стоит в платке с алиэкспресса за $2 - одна из величайших загадок современности. Скорее всего это отпайка.


    1. RyabovA Автор
      00.00.0000 00:00

      Евгений, очень грамотные и интересные у вас замечания, хотелось бы немного по ним дополнить.

      1) DT конечно можно использовать и в ряде случаев нужно! При этом важно помнить, что не все могут и нуждаются в декомпиляции dtb и даже при наличии dts и dtsi не все с ними умеют или жаждут работать, особенно если там оверлеи. "Три строчки" (и не будем придираться, что их будет пять :-), понятно, что это такой речевой оборот, чтобы показать как для Вас это просто) добавить в DT и потом скомпилировать - и правда, кому важен порог вхождения для решаемой задачи у большинства читателей. Но Вы уж тогда сразу бы критиковали требовали дальше - чтобы назначение пинов на разъёме тоже не встроенной утилитой менялось, ибо она может переписать изменения внесенные вручную в DT, а сразу нужную распиновку в DT пусть вносят - олдскул и хардкор и баста! :-) Тут же важно - что предложенный способ должен подойти широкой аудитории и быть простым, быстрым и сохранять универсальность одноплатника - а то с изменениями в DT снял модуль, чтобы подключить что то другое, и вот снова нужно DT править и пересобирать. Так что предложенный и описанный способ это не онанизм, как вы язвительно изволили выразится, а вариант, причём оптимальный вариант при использовании именно внешних модулей, так как в DT настраивают, как правило, то, что на самом устройстве стационарно размещается, а модули они на то и модули, чтобы расширять базовый функционал и подключаться и настраиваться дополнительно и более высокоуровнево. Тут главное - это назначение каждого материала - на какую аудиторию, с какими задачами и уровнем подготовки он рассчитан. Обращаю ваше внимание, что у статьи осознанно установлен уровень сложности - средний! Любопытно, что вариант с использованием DT запланирован для написания в качестве продолжения данной статьи, но уже с уклоном на другие задачи и другой уровень подготовки и уровень сложности будет установлен высокий. Вопросы все и способы решения задач нужно раскрывать последовательно и системно, а не валить в кучу. Каждому инструменту своя задача, а каждой задаче свои инструменты и свои подходы, да вы это и сами наверняка отлично понимаете.

      2, 3 и 4) Тут Вы всё очень грамотно раскрыли, супер, Спасибо! Это наверняка многим реально может оказаться полезным. Но суть статьи какая и про что она? А такая суть, что модуль он на то и модуль - какого качества и почём выберете и поставите, такой и будет, это уже от Вас зависит и Вам решать от бюджета и задачи. А когда прототипируете или изучаете, то делаете всё равно на том, что в рознице купили да побыстрее. А вот когда ставите в продакт - то уже выбираете и покупаете соразмерно задаче - качественный и дорогой или вообще сами что то собираете под свои задачи компоновки и сами все параметры компонентов перепроверяете, когда реально нужны высокая точность и контроль качества. Сути то это не поменяет - устройство как было i2c устройством так и им и останется и протокол его работы останется прежним. И даже более того, Вы вполне можете развить задачу и поставить другие устройства с другми адресами или вообще дублировать их и как то даже синхронизировать - принцип работы всё равно останется прежним, будут только другие компоненты и частные алгоритмы взаимодействия. Статья же не про цены и не про качество контроллеров для конкретного проекта, а про общий принцип подключения и работы.

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

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


  1. slog2
    00.00.0000 00:00
    +1

    DS3231 всё, что из Китая это 100% какие-то подделки, перешлифованные и перемаркированные. Что там на самом деле не известно.


    1. RyabovA Автор
      00.00.0000 00:00

      Какой модуль выберете и приобретёте - тот и Ваш будет :-) Большое дело - выбор! А i2c устройство так и останется при этом i2c устройством с теми же принципами подключения и применения. Может быть Вы это ещё к тому, что нужно дополнить, что конкретные модули приведены лишь как частные примеры и можно выбрать любые другие варианты? Если это из материала не очевидно, то тогда и правда лучше доработать.


  1. Mike-M
    00.00.0000 00:00
    +3

    Дмитрий является автором материалов, мы выполнили редактуру

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


    1. RyabovA Автор
      00.00.0000 00:00
      +2

      Но это так..... Спасибо за замечание, исправим. Будем стараться получше выправлять грамматику. Если в диалогах укажите на ошибки - будем очень благодарны! :-) Извините за причинённые неудобства.