Подключение часов реального времени к RPi

Тема в разделе "Raspberry Pi", создана пользователем geher, 29 авг 2014.

  1. geher

    geher Гуру

    Как известно, в Raspberry Pi нет часов реального времени.
    В результате при запуске системы часы остаются в состоянии, в котором они были при остановке (по крайней мере мне так показалось).

    Конечно, если Pi подключен к сети, в которой присутствует по крайней мере один ntp сервер (например, к сети интернет), то это не проблема. Точнее почти не проблема, поскольку установка локального времени по данным ntp серверов происходит очень даже не мгновенно, и первые несколько минут система может жить по "отстающему" времени.

    Особенно неприятно это для различных систем, которым важно точное время, например, систем видеонаблюдения, видеозаписи по расписанию, различных дневников и т.д., и т.п..
    Конечно, ИБП и ДГУ спасают от кратковременного перерыва в электроснабжении, но, во-первых, перерывы могут оказаться и больше возможностей ИБП, а ДГУ может оказаться неоправданно дорогим решением. А во-вторых , по различным причинам система может работать не в постоянном режиме. Причем при отключении программ отключается и питание компьютера (в нашем случа RPi).

    В таких случаях встает в полный рост вопрос о подключении таки к RPi часов реального времени.
    Часов, выпускаемых специально для RPi (в том числе устанавливаемых непосредственно на разъем GPIO) в мире очень много всяких и разных. А инструкций по установке еще больше, как на русском, так и на английском. Да и на других языках мира имеются.
    Но, поскольку у меня валялся бесцельно вот такой модуль RTC: http://amperka.ru/product/real-time-clock , решил подключить именно его.
    Во-первых, я озаботился по поводу напряжения модуля. А он предназначен для 5В ардуины. Соответственно, вроде как надо громоздить схему преобразования уровней.
    Но встретил в сети статью http://quick2wire.com/category/raspberry-pi/ , где написано буквально следующее:
    Если коротко, то смысл сводится к тому, что раньше думали, что нужен преобразователь уровней, но сейчас поняли, что притягивающие резисторы на линиях SDA и SDL защищают линии даже в случае прямого подключения к 5В логике. Но это верно только для I2C линий. Подключение к последовательному порту все-таки требует преобразования уровней.

    И решил рискнуть.
    И оно, как ни странно, заработало и не сгорело.

    Итак. Процедура подключения к Raspberry Pi B+ следующая.
    Все делается с правами root.
    Для их получения достаточно запустить
    Код (Text):
    sudo bash
    1. Физическое подключение. Выполнять очень внимательно, при отключенном питании. В случае ошибок можно пальнуть RPi.
    Модуль подключается следующим образом.
    Контакт VCC соединяется со вторым контактом разъема GPIO (+5В).
    Контакт GND соединяется с шестым контактом разъема GPIO (земля).
    Контакт SDA соединяется с третьим контактом разъема GPIO (GPIO2).
    Контакт SCL соединяется с пятым контактом разъема GPIO (GPIO3).
    Если расположить RPi контактами сверху, то контакты нумеруются следующим образом
    Нижний ряд 1,3,5,7...
    Верхний ряд 2,4,6,8...

    2. Подключение модулей ядра.
    К файлу /etc/modules добавить следующие строки:
    Код (Text):
    i2c-bcm2708
    i2c-dev
    rtc_ds1307
     
    В файле /etc/modprobe.d/raspi-blacklist.conf
    добавить символ # в начале строки
    Код (Text):
    blacklist i2c-bcm2708
    дабы закомментировать ее.
    После перезагрузить систему.
    Если все сделано правильно, то в выдаче lsmod
    должны присутствовать строки:
    Код (Text):
    rtc_ds1307              7715  0
    i2c_dev                5277  0
    и
    Код (Text):
    i2c_bcm2708            4719  0
    3. Установка необходимых пакетов:
    Для обновления базы пакетов
    Код (Text):
    apt-get update
    apt-get -y upgrade
    Установка i2c-tools:
    Код (Text):
     apt-get install i2c-tools
    4. Настройка системы:
    Выясняем адрес модуля часов:
    Код (Text):
    i2cdetect -y 1
    Вывалится такая табличка:
    Код (Text):

         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00: -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
     
    Что означает: по адресу 0x3b присутствует какое-то устройство, для которого уже загружен драйвер, а по адресу 0x68 какое-то новое устройство. Предполагаю, что часы - это 0x68.
    Показываем системе, что это часы и есть:
    Код (Text):
    echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    Теперь можно проверить, все ли правильно работает.
    Увидеть время на часах:
    Код (Text):
    hwclock -r
    Установить время на часах из времени RPi:
    Код (Text):
    hwclock -w
    Установить системное время из часов:
    Код (Text):
    hwclock -s
    Чтобы время автоматически устанавливалось при старте системы из часов, можно добавить в файл /etc/rc.local строки
    Код (Text):
    echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    sudo hwclock -s
    перед последней строкой в файле, которая должна выглядеть так:
    Код (Text):
    exit 0
    Можно перегружаться и радоваться жизни.

    Можно автоматизировать и процесс сброса текущего системного времени в часы, добавив соответствующий всем правилам скрипт в init.d и добавить ссылку на него в rc0.d и rc6.d (скрипты, выполняемые при завершении и перезагрузке системы).
    В теории это должно делаться примерно так:
    http://tuksik.ru/auto-start-and-shutdown/
    Желающие могут попробовать и набить свои шишки.
     
    Последнее редактирование: 30 авг 2014
  2. ANV

    ANV Гуру

    Это не подтягивающие резисторы в Pi мощнее, а ток через защитные диоды небольшой, поэтому не выгорают
     
  3. geher

    geher Гуру

    Их объяснение меня как-то не очень волнует. Главное, что они перешли на прямое соединение, и, судя по всему, удачно.