1. 背景
Raspberry Piは、標準でRTCを搭載していないため、外部に接続されていないネットワークに繋いで使用する場合は、起動のたびに日付と時刻がリセットされてしまう。
FA用途でRaspberry Pi+Ubuntuの環境を使用することになり、RTCを採用することになったが、Ubuntuのサポートが明記されている製品が見当たらない。そのため、試しに3種類のRTCを入手し、調査することにした。
2. 環境
試した環境は以下の通り。
- Raspberry Pi 4 Model B (4GB)
- OS
- Raspberry Pi OS (32bit)
- Ubuntu Desktop 21.04 (RPi 4/400)
- RTC
- Raspberry Pi用RTCモジュール v1.1
- Raspberry Pi用RTC(DS1307)
- Raspberry Pi用高精度RTC(DS3231)
3. 動作結果
先に結論を示す。
Raspberry Pi OSとUbuntuの2種類のOSで、RTCのドライバをインストールして接続した。RTCの機能が確認できたものを ○、機能しなかったものを ×と記載している。
No. | RTC | RasPi OS | Ubuntu |
---|---|---|---|
1 | RTCモジュール v1.1 | ○ | ○ |
2 | RTC(DS1307) | ○ | × |
3 | 高精度RTC(DS3231) | ○ | × |
このように、Raspberry Pi OSならばどれもドライバが対応しているが、Ubuntuの場合はドライバが対応していないものもある。Ubuntuを採用する場合は、RTCの選択は注意した方が良い。
4. 使用したRTCについて
各RTCの情報と、インストール手順を示す。
インストール方法は製品ドキュメントに記載されているが、予めパッケージのインストールが必要なものや、手順が少し異なっていたものもあった。
4-1. Raspberry Pi用RTCモジュール v1.1
4-1-1. 製品情報
スイッチサイエンスのページ:
Raspberry Pi用RTCモジュール v1.1
2021/9/1に1,067円で購入
製品ページ:
Raspberry Pi RTC Expansion Module v1.1
技術ドキュメント:
DS1307 RTC Module with BAT for Raspberry Pi SKU: EP-0059
4-1-2. インストール手順
(1) RTCをセット
RTCに電池をセットし、電源を切った状態でRaspberry Pi のGPIOに装着する。
(2) 電源を入れて起動
(3) I2Cの有効化
Ubuntuはすでに有効化されているので、本作業は不要。
Raspberry Pi OSのみ実施する。
/boot/config.txt
に以下の行を追加する。
dtoverlay=i2c-rtc,ds1307
dtparam=i2c_arm=on
(4) fake-hwclockの削除
本作業は不要だったが、ドキュメントに記載があったので参考までに紹介する。
fake-hwclockがインストールされている場合、以下の手順で削除する。
sudo apt-get -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove
(5) I2Cドライバのロード
以下のコマンドを実行する。
sudo su -
modprobe i2c-bcm2835
modprobe rtc-ds1307
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
(6) firmware/config.txtの修正
/boot/firmware/config.txt
に以下の行を追加。
dtoverlay=i2c-rtc,ds1307
(7) hwclockの設定を変更
/lib/udev/hwclock-set
を編集して、以下のように書き換える。
1 #!/bin/sh
2 # Reset the System Clock to UTC if the hardware clock from which it
3 # was copied by the kernel was in localtime.
4
5 dev=$1
6
7 # if [ -e /run/systemd/system ] ; then
8 # exit 0
9 # fi
10
11 if [ -e /run/udev/hwclock-set ]; then
12 exit 0
13 fi
14
15 if [ -f /etc/default/rcS ]; then
16 . /etc/default/rcS
17 fi
18
19 /sbin/hwclock --rtc=$dev --systz
20 /sbin/hwclock --rtc=$dev --hctosys
- 7-8行目をコメントアウト
- 11-17行目を追加
(8) OSを再起動
(9) ドライバの確認
以下のようにコマンドを入力して、このようなメッセージが表示されていればOK。
$ sudo dmesg | grep rtc-ds1307
[ 2.430793] rtc-ds1307 1-0068: registered as rtc0
[ 2.431828] rtc-ds1307 1-0068: setting system clock to 2021-09-04T07:45:03 UTC (1630741503)
Raspberry PiからRTC本体を外して起動しまうと、手動なり時刻を設定しなおす必要があるので注意。
4-2. Raspberry Pi用RTC(DS1307)
4-2-1. 製品情報
スイッチサイエンスのページ
Raspberry Pi用RTC(DS1307)
2021/9/1に572円で購入
製品ページ
Pi RTC (DS1307)
技術ドキュメント
DS1307 RTC (Real Time Clock) for Raspberry Pi
4-2-2. インストール手順
(1) Luaのインストール
インストーラがLuaを使用しているので、インストールする。
sudo apt install -y lua5.3
(2) ドライバをインストール
以下のコマンドを実行する。
git clone https://github.com/Seeed-Studio/pi-hats.git
cd pi-hats/tools
sudo ./install.sh -u rtc_ds1307
(3) 電源を落としてRTCをセットし、再び起動する
(4) ドライバのインストールチェック
以下のコマンドを実行し、インストールされているドライバを確認する。
./install.sh -l
(5) ハードウェアクロックを表示
以下のコマンドを実行し、ハードウェアクロックの取得ができるか確認する。
sudo hwclock -r
Ubuntuでは以下のメッセージが表示され、RTCが動作していなかった。
$ sudo hwclock -r
hwclock: 既知のいずれの方法を使用しても、ハードウェアの時計にアクセスすることが
できません。
hwclock: Use the --verbose option to see the details of our search for an access method.
4-3. Raspberry Pi用高精度RTC(DS3231)
4-3-1. 製品情報
スイッチサイエンスのページ
Raspberry Pi用高精度RTC(DS3231)
2021/9/1に858円で購入
製品ページ
High Accuracy RTC (DS3231) for Raspberry Pi
技術ドキュメント
DS3231 High Accuracy RTC (Real Time Clock) for Raspberry Pi
4-3-2. インストール手順
基本的な手順は「Raspberry Pi用RTC(DS1307)」と同じ。 (2) ドライバをインストールのコマンド引数だけ異なる。
(1) Luaのインストール
インストーラがLuaを使用しているので、インストールする。
sudo apt install -y lua5.3
(2) ドライバをインストール
以下のコマンドを実行する。
git clone https://github.com/Seeed-Studio/pi-hats.git
cd pi-hats/tools
sudo ./install.sh -u rtc_ds3231
(3) 電源を落としてRTCをセットし、再び起動する
(4) ドライバのインストールチェック
以下のコマンドを実行し、インストールされているドライバを確認する。
./install.sh -l
(5) ハードウェアクロックを表示
以下のコマンドを実行し、ハードウェアクロックの取得ができるか確認する。
sudo hwclock -r
以上