Raspberry PiのRTCを試す

# 1. 背景

Raspberry Piは、標準でRTCを搭載していないため、外部に接続されていないネットワークに繋いで使用する場合は、起動のたびに日付と時刻がリセットされてしまう。

FA用途でRaspberry Pi+Ubuntuの環境を使用することになり、RTCを採用することになったが、Ubuntuのサポートが明記されている製品が見当たらない。そのため、試しに３種類の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の２種類の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](https://www.switch-science.com/catalog/2857/)
2021/9/1に1,067円で購入

製品ページ：
[Raspberry Pi RTC Expansion Module v1.1
](https://www.seeedstudio.com/Raspberry-Pi-RTC-Expansion-Module-v1-1.html)

技術ドキュメント：
[DS1307 RTC Module with BAT for Raspberry Pi SKU: EP-0059](https://wiki.52pi.com/index.php/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）](https://www.switch-science.com/catalog/5334/)
2021/9/1に572円で購入

製品ページ
[Pi RTC (DS1307)](https://www.seeedstudio.com/Pi-RTC-DS1307.html)

技術ドキュメント
[DS1307 RTC (Real Time Clock) for Raspberry Pi](https://wiki.seeedstudio.com/Pi_RTC-DS1307/)

### 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）](https://www.switch-science.com/catalog/5335/)
2021/9/1に858円で購入

製品ページ
[High Accuracy RTC (DS3231) for Raspberry Pi](https://www.seeedstudio.com/High-Accuracy-Pi-RTC-DS3231.html)

技術ドキュメント
[DS3231 High Accuracy RTC (Real Time Clock) for Raspberry Pi](https://wiki.seeedstudio.com/High_Accuracy_Pi_RTC-DS3231/)

### 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
```

以上