Skip to content

Latest commit

 

History

History
84 lines (76 loc) · 6.76 KB

RTC.md

File metadata and controls

84 lines (76 loc) · 6.76 KB

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


https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=85683&start=25
https://cdn-learn.adafruit.com/downloads/pdf/adding-a-real-time-clock-to-raspberry-pi.pdf
http://electromost.com/news/raspberry_pi_dlja_domashnej_avtomatizacii_chasy_realnogo_vremeni/2015-09-13-135
http://www.avislab.com/blog/bme280_ru/
https://github.com/avislab/sensorstest
http://www.instructables.com/id/Arduino-Shower-Monitor-2/
Часов реального времени бывает три вида: самые дешевые PCF8523, самые популярные DS1307 и наиболее точные DS3231.

Электрическое подключение

Если я правильно понял, интерфейс I2C зависит от питающего напряжения лишь в части подтягивающих резисторов, которые подтягивают обе линии к +Uпит . Поэтому, если надо к RPi с логикой 3.3 В подключить по I2C модуль с логикой 5 В, достаточно лишь проследить, чтобы все подтягивающие резисторы подключались только к напряжению 3.3 В. Такие резисторы уже есть на RPi, поэтому надо просто выпаять подтягивающие резисторы на модуле, если они подключены к 5 В.
Что касается логических уровней, то напряжения 3 В от RPi должно хватить для срабатывания логики на 5 В сторонних модулей.

Подключаем наш модуль часов к порту i2c-1, который выведен на основную клеммную колодку. Раньше я думал подключать к порту i2c-0, но его не удаётся включить на ранних этапах загрузки системы.

Проверка порта I2C

(sh) sudo apt-get update
(sh) sudo apt-get install i2c-tools
i2cdetect -y 1 - поиск адресов подключённых устройств. Здесь 1 - это номер I2C интерфейса. Вообще их два у RPi, по умолчанию доступен первый. Нулевой находится на нераспаянном разъёме и выключен.
i2cget -y 1 0x76 0xd0 - считать байт 0xD0 с устройства 0x76

Настройка синхронизации времени в Raspbian

  1. (sh) Сначала прописываем в файле /boot/config.txt одну из этих команд, в зависимости от типа модуля часов:
    dtoverlay=i2c-rtc,ds1307 или dtoverlay=i2c-rtc,pcf8523 или dtoverlay=i2c-rtc,ds3231
  2. В файле /lib/udev/hwclock-set нужно закомментировать строки
    #if [ -e /run/systemd/system ] ; then
    #    exit 0
    #fi
    а также закомментировать эти две строки:
    /sbin/hwclock --rtc=$dev --systz --badyear
    и
    /sbin/hwclock --rtc=$dev --systz
    Это, вообще-то, не самое верное решение. Но пока что единственное.
  3. (Этот пункт передумал выполнять) Может это и лишнее, но я бы отключил скрипт /etc/init.d/hwclock.sh вот этой командой:
    sudo update-rc.d hwclock.sh remove
  4. Удаление fake-hwclock.
    Если RTC будет подключён постоянно, то лучше удалить fake-hwclock чтобы не путать ничего.
    sudo update-rc.d fake-hwclock remove
    sudo apt-get remove fake-hwclock
    sudo rm /etc/cron.hourly/fake-hwclock
    sudo rm /etc/init.d/fake-hwclock
  5. Презагрузка.
  6. Если сейчас выполнить команду i2cdetect -y 1, то вместо адреса часов 68 будет UU.
    Можно посмотреть текущее время часов командой sudo hwclock -r
    Если системное время синхронизировано с интернетом, то нужно записать его в часы: sudo hwclock -w

Старый способ настройки синхронизации времени в Raspbian

  1. Проверка наличия модуля RTC
    Как было описано выше, попробуй выполнить команду i2cdetect -y 0. В ответе будет видно число 68 - адрес подключённого модуля часов.
  2. Первый запуск, проверка и установка времени
    Этот пункт можно и не выполнять. Это только единоразовая проверка.
    Добавляем модуль часов в ядро Linux, затем запускаем консоль в root-режиме и добавляем новое устройство на порт i2c-0
    sudo modprobe rtc-ds1307
    sudo bash
    echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
    exit
    Если сейчас выполнить команду i2cdetect -y 0, то вместо адреса часов 68 будет UU.
    Считываем текущее время с часов командой sudo hwclock -r или sudo hwclock -D -r
    Если системное время синхронизировано с интернетом, то нужно записать его в часы: sudo hwclock -w
  3. Добавление модуля часов в ядро Linux
    Чтобы модуль часов добавлялся в ядро Linux каждый раз при запуске, нужно прописать в файле /etc/modules новую строку rtc-ds1307
  4. Прописываем в автозапуск добавление устройства и синхронизацию времени
    Для этого в файле /etc/rc.local нужно прописать следующий код (после команды /bin/i2c0_remap, естественно)
    echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
    sudo hwclock -s

Прочее

Принудительное обновление времени из интернета прямо сейчас:

sudo /etc/init.d/ntp stop
sudo ntpd -qg
sudo /etc/init.d/ntp start