新しいものづくりがわかるメディア

RSS


「土日で完成! 趣味のラズパイ」

土日で完成! 趣味のラズパイ ラズパイをNTPサーバーにする

第5回ではSSD1306をコントローラーに使った有機ELディスプレイに時計を表示させるところまで完成しました。今回はラズパイでNTPサーバーを起動させ、利用できるようにします。

NTPサーバーの役割は、正確な日付と時刻情報を配信することにあります。NTPとは「Network Time Protocol」の略で、時刻情報を同期するための通信の手順や約束事を定めた規格のことです。Windows PCやMacといったパソコンで動作している時計の場合、定期的に「time.windows.com」などのNTPサーバーを参照して、マシン内の時計を正確に表示しています。有名なNTPサーバーには以下のようなものがあります。

  • ntp.nict.jp(情報通信研究機構)
  • time-nw.nist.gov(アメリカ標準技術局)
  • ntp.nasa.gov(アメリカ航空宇宙局)
  • pool.ntp.org

最後のpool.ntp.orgですが、NTPサーバーを管理している個人または組織の集合体で、接続した際に適切なサーバーに割り振られてNTPの機能を果たすというものです。日本のサーバーのみを参照したい場合は「jp.pool.ntp.org」となります。

一般的にはこのような公開NTPサーバーを利用するのが便利です。しかしせっかくラズパイを持っているのであれば、ホビー目的としてNTPサーバーを設置してみるのも悪くありません。ついでに家庭内にあるパソコンのNTPサーバーを、ラズパイに変更してみるのはいかがでしょうか。次項から設置方法について解説していきます。

Chronyを設定する

Linux系OSでNTPサーバーとしてよく使われてきたのが「ntpd」ですが、最近ではntpdよりも効率よく、正確な時刻同期が可能という理由で「Chrony(クローニー)」が使われるようになってきました。CentOS 7やRed Hat Enterprise Linux 7以降ではChronyがNTPサーバーの標準となっています。このため今回の導入に当たってもChronyを使うことにします。

まずはChronyをインストールします。

$ sudo apt install chrony

このインストールの際に「systemd-timesyncd」という、NTPサーバーを参照してシステムの時刻を合わせていたデーモンが削除されます。続いてChronyの設定ファイルを変更します。下記のようにコマンドを入力すると「/etc/chrony/chrony.conf」が表示されます。

$ sudo nano /etc/chrony/chrony.conf

以下が設定ファイルの内容です。矢印の所を変更してください。

# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usable directives.

# Include configuration files found in /etc/chrony/conf.d.
confdir /etc/chrony/conf.d

# Use Debian vendor zone.
#pool 2.debian.pool.ntp.org iburst # ←※「#」でコメントアウト
server ntp.nict.jp iburst # ←※この項目を追加
allow 192.168/16 # ←※この項目を追加

# Use time sources from DHCP.
sourcedir /run/chrony-dhcp

# Use NTP sources found in /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d

# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys

# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift

# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony

# Uncomment the following line to turn logging on.
#log tracking measurements statistics

# Log files location.
logdir /var/log/chrony

# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0

# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync

# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3

# Get TAI-UTC offset and leap seconds from the system tz database.
# This directive must be commented out when using time sources serving
# leap-smeared time.
leapsectz right/UTC

変更した項目は以下のような内容です。

・#pool 2.debian.pool.ntp.org iburst
先ほども挙げたpool.ntp.orgへのアクセスを止めました。

・pool ntp.nict.jp iburst
その代わりに日本標準時のNTPサーバーへ変更しました。

・allow 192.168/16
家庭内LANで使われている「192.168」アドレスのみNTPとして参照するように設定しました。

設定が終了したらChronyを再起動します。

$ sudo systemctl restart chrony

再起動した後、Chronyが動作しているか、以下のコマンドで確かめましょう。

$ chronyc sources -v

以下のように表示されれば、設定は終了です。

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                ¥     |          |  zzzz = estimated error.
||                                 |    |           ¥
MS Name/IP address         Stratum Poll Reach LastRx Last sample
=========================================================
====================== ^* ntp-a3.nict.go.jp 1 10 377 347 +55us[ +73us] +/- 2641us----- ^- ntp-b3.nict.go.jp 1 10 377 27m -696us[ -719us] +/- 2219us ^- ntp-a2.nict.go.jp 1 10 377 80 -152us[ -151us] +/- 2719us ^- ntp-k1.nict.jp 1 10 377 59 -529us[ -528us] +/- 6710us

最後の行の先頭に「*」が表示されていれば、そのサーバーを参照しているということになります。なお、その行に「2001:ce8:78::2」と表示されるかもしれませんが、これはntp.nict.jpのIPv6アドレスですのでアクセスには成功しています。

リアルタイムクロックを導入する

Chronyの設定が終了した後は、リアルタイムクロック(RTC)を導入します。RTCはマシンの電源を落とした後でも時を刻み続ける仕組みのことで、パソコンなどでもボタン電池を実装していて、この電源を元に時計が動作しています。ただ、見ても分かるように、ラズパイにはRTCの機能がありませんので、電池を備えた外部デバイスを取り付けて利用します。

RTCにもいろいろなコントローラーを使ったものがありますが、今回はAmazonで購入できる「DS1307」というコントローラーを積んでいるデバイスを利用します。このRTCはI2Cの仕組みを使って通信できますので、ディスプレイで利用しているSDAとSCL、VCCとGNDにRTCを接続すればOKです。

なおこのRTCですが、秋月電子通商で販売している「細ピンヘッダ 1×20」を利用してはんだ付けをする必要がありますので注意が必要です。はんだ付けは、「DS」「SCL」「SDA」「VCC」「GND」と5端子が用意されている側に端子を接続します。

Amazonで購入したRTC。 Amazonで購入したRTC。
ディスプレイと合わせて接続したところ。 ディスプレイと合わせて接続したところ。

まず、取り付けたRTCを認識しているか、以下のコマンドで調べます。

$ i2cdetect -y 1

その後、以下のように0x50と0x68に表示があれば認識しています。0x3cはディスプレイのアドレスです。

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

続いてラズパイ側で利用するため、「/boot/config.txt」に「dtoverlay=i2c-rtc,ds1307」という記述を追加します。

$ sudo nano /boot/config.txt

ファイルの最後に記述しましょう。

(略)
[pi4]
# Run as fast as firmware / board allows
arm_boost=1

[all]
dtoverlay=i2c-rtc,ds1307

記述が終わったら「sudo reboot」でラズパイを再起動します。再起動したら先ほどのi2cdetectコマンドでアドレスを確認します。

$ i2cdetect -y 1

すると以下のように0x68の表示が変わります。

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

このように0x68が「UU」に変わって表示されていればOKです。なおRTC自体も正確な時を刻む必要がありますので、インターネットに存在するNTPと同期する必要がありますが、Chronyでは11分おきにRTCへ書き込むように設定されていますので、特に気にする必要はありません。その設定は先ほど掲載したchrony.confの最後の方にあります。該当するのは以下の箇所です。

# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync

ここまでで一通りの設定は終了です。これでラズパイの電源を落としても、起動時には正確な時刻が表示されるようになりました。次回はGPSを利用して、インターネットにつながらない場合でも正確な時刻が得られるようにします。

ニュース

編集部のおすすめ

連載・シリーズ

注目のキーワード

もっと見る