ラズパイは時計を内蔵していないので、ネットワークにつながっていないと現在時刻が取得できない。あるプロジェクトにラズパイを使うことを考えていて、時計がないのはちょっと悲しいので、リアルタイムクロック (RTC) をつけてみた。使ったのは秋月の「DS1307 I2Cリアルタイムクロックモジュール」。SainSmart 社の製品です。秋月の他の RTC モジュールと比べると少しお高いのだが、実は電池ホルダーと充電式リチウム電池がおまけについてくるので、お買い得だし、実装スペースも節約できる。
この RTC モジュールは 5V 動作である。I2C 信号線を 3.3V でプルアップすればラズパイに直結できるのだが、モジュール内で 5V にプルアップされているので、まずその抵抗を取り外す。下の赤丸で囲んだ集合抵抗(4.7 KΩ×4)です。きれいに取り外す技術力がないので、足を傷つけて強引に折り取ってしまった。痛々しくなってしまったので、取った後の写真はナシです。
ピンヘッダをハンダ付けして、ラズパイと接続。5V (2ピン), GND (6ピン), SDA (3ピン), SCL (4ピン) の4本をつなぐ(写真撮り忘れた)。ハードウェアの設定はこれだけ。
次はソフトウェアの設定。Raspbian Jessie には DS1307 用のドライバが含まれているので、あんまり難しいところはない。まず、raspi-config で I2C を有効にする。"Advanced Options" の中にある。
リブート後、sudo apt-get install i2c-tools
とする。i2cdetect -y 1
で "68" が表示されれば OK。
$ 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: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
ドライバを読み込む。(3行とも必要なのかどうか、自信なし)
$ sudo modprobe i2c-bcm2708
$ sudo modprobe i2c-dev
$ sudo modprobe rtc-ds1307
DS1307 の在処をシステムに教えてやる。
$ sudo bash
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# exit
(sudo echo ... > ...
ではうまくいかない。リダイレクト先への書き込みが sudo 権限なしに行われるため、権限がないと言われる。)
読み出しテスト。
$ sudo hwclock -r
Sat 01 Jan 2000 09:00:10 AM JST -0.417185 seconds
年月日が 2000年1月1日になっている。今はラズパイの時計がネットワークと同期しているので、ラズパイの時計から RTC へ現在時刻を書き込む。
$ sudo hwclock -w
$ sudo hwclock -r
Sun 11 Sep 2016 01:44:47 PM JST -0.371574 seconds
/etc/rc.local
の最後 (exit 0
の前)に次のように書き込んでおくと、起動時に自動的に RTC から時刻をセットしてくれる。ただし、この方法だと、起動時のログは RTC を使わない時刻になってしまう。今回は起動ログの時刻は気にしないことにした。
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 0.5
hwclock -s
前回試した液晶と同時に使おうとすると、液晶のピンソケットで I2C のピンが隠れてしまうという問題が発生する。連結ピンソケットで2階建てにするなど、I2C 信号線を引き出す工夫が必要。