popnja’s blog

日記風からハード中心に変わりました

ラズパイ4のUbuntu ServerでRTC DS3231を使う

今回はRTCのお話。ラズパイ4はRTCを保持できませんが、それを補うHATが出ています。今回購入したのはこれ。

CR1225コイン電池を使いますので、これも購入しています。

f:id:kaias1jp:20211005092430j:plain
こんな感じのものです。

で、ラズパイ4のUbuntu Server 20.04に使いたいのですが、公式にはRaspberry pi OSにしかインストーラが対応していません。動かないわけではなく、Ubuntu Serverでも動かすのに必要なパッケージが何か説明されていないので失敗するだけです。なので、チャレンジしてみました。
まずは、OSを最新化します。

sudo apt update
sudo apt upgrade

次に、インストーラが使うパッケージのうちUbuntu Serverにデフォルトでは入っていないものをインストールします。

sudo apt install lua5.3
sudo apt install libraspberrypi-bin

これで、luaとdtparamが使えるようになります。

あとは公式のインストーラーを導入。

git clone https://github.com/Seeed-Studio/pi-hats.git
cd pi-hats/tools/
sudo ./install.sh -u rtc_ds3231

インストールが終わったら、「/boot/config.txt」の中身を見てみます。

cat /boot/config.txt

この中身を「/boot/firmware/usercfg.txt 」に入れます。「/boot/firmware/config.txt」ではないのは、usercfg.txtがconfig.txtにインクルードされておりユーザーがconfig.txtに書き込みたい場合はusercfg.txtに書いてほしいらしいので。

sudo sh -c "echo 'dtoverlay=i2c-rtc,ds3231' >> /boot/firmware/config.txt"

i2c-toolsを入れて、i2cdetectを使えるようにします。

sudo apt install i2c-tools

libi2c-devも入れるらしいです。

sudo apt install libi2c-dev

「/etc/modules」に追記。

sudo sh -c "echo 'rtc-ds1307' >> /etc/modules"

「rtc-ds1307」なのは、以下のコマンドでドライバが「rtc_ds1307」らしいので。

sudo modprobe -c | grep ds3231

ここでシャットダウンしてからDS3231を取り付けます。

sudo shutdown -h now

f:id:kaias1jp:20211005095915j:plain

再起動後、i2cdetectで状態を見てみます。

sudo i2cdetect -y 1

私の環境だとこうなります。

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --     

0x68のところがUUになっていればいいらしいですが、例えば68だとまだOSが掴んでいないらしいです。

すでに使用できるみたいだったのでhwclockコマンドが動くか確認してみます。

sudo hwclock

現在の日時を確認して、RTCに書き込んでみます。

date
sudo hwclock -w

読み込みができるか確認します。

sudo hwclock -r

これで動くようになりました。本当に動いているかは、「sudo hwclock -v」で確認してください。以下のような出力が表示されます。

hwclock from util-linux 2.34
System Time: 1633395822.903437
Trying to open: /dev/rtc0
Using the rtc interface to the clock.
Last drift adjustment done at 1633385585 seconds after 1969
Last calibration done at 1633385585 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
ioctl(4, RTC_UIE_ON, 0): Invalid argument
Waiting in loop for time from /dev/rtc0 to change
...got clock tick
Time read from Hardware Clock: 2021/10/05 01:03:44
Hw clock time : 2021/10/05 01:03:44 = 1633395824 seconds since 1969
Time since last adjustment is 10239 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2021-10-05 01:03:43.384906+00:00

あとは、systemd-timesyncdサービスとかどうするか考えてください。私は、GPSを使ったNTPサーバーに組み込みたいと思っています。

参考にしたのはこちらです。
wiki.seeedstudio.com
High Accuracy Pi RTC (DS3231) installation in Ubuntu 19.10 in Raspberry Pi 4 Model B Rev 1.1 · GitHub
ntaka206.hatenablog.jp
www.pentacreation.com
qiita.com
qiita.com
qiita.com