ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2015年2月15日日曜日

RTCを使って時計を作りたい/I2C接続RTC(DS1307)

RTC

私たちは猿に比べればやや文明的であるので時計を作ることができる。
時計は電子工作ではRTCというチップがあり、RTCに必要なバックアップ用の電池とか、クロック用の水晶とか(これがクォーツというやつである)、そういうものをまとめたモジュールが売られている。ぼくらは時計を作るし、みんなも時計を作るのでこのモジュールは大量生産されているらしく、中国から買えばかなり安い値段で手に入れる事ができる。




たとえばこれがバックアップ用のコイン充電池までついていて約$1だ。
100円ちょっとでおもちゃとして使うには十分な年月日まで含めた時計機能が手に入る。

ある程度の機能を持ったモジュールを電子工作で使うときには、そのモジュールとの通信が必要になる。我々は知らない誰かと意思を疎通させるとき言語を使うし、ある程度の礼儀作法などの決まったやりとりを行うことにより、コミュニケーションを図る。つまり通信にはあらかじめ決められた手順があり、RTCモジュールから日時を取得するにはそれに従う必要がある。「ドーモRTC=サン、Arduinoです」

シリアル通信

電子工作においてはシリアル通信が良く利用される。シリアル通信というのは単純にデータを直列で順番に渡すような仕組みのことで、その渡し方で更にたくさんの種類に別れる。たとえばUARTというのがPCやArduinoなんかで単純にシリアル通信と呼ばれるやつだ。もっともこれは通信方式の名前ではなく通信デバイスの名前であるらしい。
よりシンプルな仕組みとしてはSPIとI2Cという方式があり、UARTと合わせてこの3つがわかっていれば電子工作ではほぼ困ることはない。SPIはマスターからスレーブ(MOSI)とスレーブからマスター(MISO)の線と通信タイミングのためのクロックのライン、通信相手を決めるためのラインの四本で構成される。I2CはSPIと違い通信はマスターから通信のたびに送信受信を指定するため片側からしか行われず、また通信相手は通信線からデータで指定する。そのためラインはクロックとデータ伝送用のラインの二本で通信できる。ArduinoではSPIはSPI、I2CはWireというクラスから簡単に使うことが出来る。

このRTCモジュールはI2Cで使う。
もちろんI2Cは単なる通信規格なので、実際に読み込むにはこのチップ独自の仕様を理解しなければならないが、これはとてもシンプルなものなので、単純に秒・分・時・曜日・日・月・å¹´・制御データというものがそれぞれ1バイトで格納されており、一番最初に書き込んだ1バイトで指定した場所から読み書きできるというだけのものだ。つまり一番最初に0を書き込めば、データを読みこめば秒が返り、書き込めば秒の値を編集できる。1なら分、2なら時だ。最初の値は単純にどこから”始まるか”というだけのことなので、たとえば0を書き込んでから8バイト読めばRTCのすべての値が読み込める(書き込める)。

二進化十進表現(BCD)

このRTCモジュールでは数値の表現にBCDが使われている(正確には符号なしのパック形式)。
これは数値の一文字を2進数4桁(4bit)で表し1バイトで2桁の数値を表すものだ。たとえば15なら2進数では1111だが、BCDで表現する場合、1バイトを使って、1(0001)と5(0101)を組み合わせて、(0001 0101)という形で表現するということだ。なんでそんなもん使うんだ、っていうとこれは8セグLEDのドライバICなんかに入力するときに、そのまま使えるという利点がある。
変換はたぶんライブラリなんかもあると思うけど、単純には4ビットずつ取り出して(シフトしたり論理積でマスクしたりして)それぞれの桁を結合していけば良い。出力するときはその逆だ。

おわりに

これだけ聞くと、難しいという感じがするかもしれないが実際に使ってみれば案外どうにかなる。特にArduinoから使うときは結線さえ間違えなければ、通信の規格を意識する必要すらないし、BCDの変換は一行で書ける。
あんまりこの記事の読者には役に立たないかもしれないが、Arduino Firmataを利用してnode.js+johnny-fiveで上記のRTCモジュールから日付を読み取ったりセットしたりするサンプルを貼っておく。

Example of DS1307RTC Read&Write

ちなみにサンプルでは触れていないが、秒の最上位ビット(秒の2桁目は最大5なので使わない)はクロックの停止フラグになっていて、ここに1が書かれると時計は止まる。もちろん普通の秒数として書き出していれば最上位ビットは常に0になるのでサンプルは普通に動く。

このRTCモジュールを扱うにあたっては下記の記事を参照した。

Arduinoでリアルタイム・クロックを使用する(2) - フィジカル・コンピューティング



買ったやつ。
5Pcs Tiny RTC I2C AT24C32 DS1307 Real Time Clock Module With Battery For Arduino Sale-Banggood.com:DS1307


サインスマート(SainSmart)I2C RTC DS1307 AT24C32 時計 モジュール for AVR ARM PIC
サインスマート(SainSmart)
売り上げランキング: 27,190
同じチップで、たぶん似たような構成のやつ(買ってない)。