●ラズベリーパイにRTCを付ける

DS3231というRTC(リアルタイムクロック)モジュールをラズベリーパイに接続しました。
EasyWordMall DC 3.3-5.5V DS3231 AT24C32 高精度リアルタイムクロックモジュール [並行輸入品]
他のRTCでもほぼ同じです。




■ハードウエアの設定

まずはラズベリーパイのGPIOとRTCを接続します。

ラズベリーパイのピン番号01 : 3.3V と RTCの Vcc
ラズベリーパイのピン番号03 : GPIO 02(SDA1) と RTCの SDA
ラズベリーパイのピン番号05 : GPIO 03(SCL1) と RTCの SCL
ラズベリーパイのピン番号09 : Ground と RTCの GND

以上の4本の線を接続します。
リアルタイムクロックモジュールとラズベリーパイはI2Cというシリアル通信で通信して時刻を書き込んだり読み出したりします。
そのため、電源(Vcc・GND)とシリアルデータ(SDA)とシリアルクロック(SCL)の4本で動作するそうです。


■ソフトウエアの設定

▼必要なツールのインストール

ハードウエアをセットしたら次はソフトウエアです
まずは、I2Cで通信するために必要なツールをインストールする必要があります。

コマンドを実行してインストールします。
sudo apt-get install i2c-tools

▼I2Cをラズベリーパイで有効にする

ラズベリーパイでは最初はI2Cが無効になっていますので有効にする必要があります。
コマンドで設定ツールを開きます
sudo raspi-config

interfacing Optionsを選択して


I2Cを選択して


I2Cをenabled(有効)にする


設定後再起動します。


▼I2C デバイスが正常に接続されているかどうかを確認

コマンドを実行して接続状態を確認します。
sudo i2cdetect -y 1



リアルタイムクロックモジュールは68になりますので、ここで68が表示されなかった場合にはクロックモジュールとの配線の接続を確認してください。
68以外はRTCの操作とあまり関係ありません。

68が表示されたということは、RTCとの接続がうまく行きました。
もしくはもうすでにモジュールをロードしてカーネルドライバーで使用されているときは68の位置がUUと表示されます。


▼モジュールをカーネルにロードして動くようにする

モジュールをロードして有効にします。
この2つのコマンドによる操作は保存される事は無いため、起動毎に毎回同じ操作を行う必要があります。

#モジュールをロードする、すでにロードされている場合に警告を出す(ds3232となっているがds3231の誤記ではなくてこの名前で登録されているため)
sudo modprobe --first-time rtc-ds3232

#I2Cデバイスとしてds3231を有効にするため書き込む(保存されるワケではない)
sudo sh -c "echo 'ds3231 0x68' > /sys/class/i2c-adapter/i2c-1/new_device"

もし、DS1307を使う場合には rtc-ds3232 を rtc-ds1307 に、 ds3231 を ds1307 に、読み替えてください。

以上で準備完了です。


▼RTCの読み書き

hwclockを使い、RTCの読み書き更新ができます。
次の事をやってRTCとOSのシステムクロックを変更してみます。

現在の時間をRTCに書き込む
sudo hwclock -w

RTCから読み出し
sudo hwclock -r

デタラメな時間にシステムクロックを変更(インターネットを切断しないと正しい時間に修正されてしまいます)
sudo date --set='2011/11/11 11:11:11'

現在の時刻を表示
date

システムクロックをRTCで更新
sudo hwclock -s

現在の時刻を表示
date



システムクロック(OSの時計)がRTCにより更新される様子がわかります。


▲トップページ > マイコンなど