Как известно, в 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/ Желающие могут попробовать и набить свои шишки.
Это не подтягивающие резисторы в Pi мощнее, а ток через защитные диоды небольшой, поэтому не выгорают
Их объяснение меня как-то не очень волнует. Главное, что они перешли на прямое соединение, и, судя по всему, удачно.