2016年09月12日

ラズパイにリアルタイムクロックをつける

 ラズパイは時計を内蔵していないので、ネットワークにつながっていないと現在時刻が取得できない。あるプロジェクトにラズパイを使うことを考えていて、時計がないのはちょっと悲しいので、リアルタイムクロック (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 信号線を引き出す工夫が必要。

タグ:Raspberry Pi
posted by toshinagata at 00:37| 日記