YouTubeでよみやさんの動画を見ていたら、格安のRTC(リアルタイムクロック)モジュールの紹介があったので、私もAmazonから購入してみました。1個なんと118円です。ただし、並行輸入品なので、届くまで2週間ほどかかりました。
このモジュールには、RTC DS1307とEEPROM:AT24C32(32Kb) が搭載されています。また、バックアップ電源用のボタン電池フォルダーがついています。(電池はついてきません)
ブレッドボードで実験をするために、ヘッダーピンを取り付けました。
最初、部品面が上にくるように取り付けたのですが、電池フォルダーに厚みがあり、うまくいきません。そこで、電池フォルダーが上にくるように取り付けました。
まず、I2Cアドレスを調べてみます。ArduinoとRTCモジュールの接続回路図です。
I2Cのプルアップ抵抗は、モジュールに内蔵されているようなのでつけませんでした。
実際の接続の様子です。Arduinoをパソコンに接続します。
Arduino IDEを立ち上げ、ファイル→スケッチ例→Wire→i2c_scannerと進み、i2c_scannerのスケッチを書き込み実行します。
シリアルモニタに、0x50と0x68が表示されました。Web上にも書いてありますが、0x50がEEPROM、0x68がRTC(DS1307)のI2Cアドレスです。
では、次にRTCのプログラミングに進みます。
まず、DS1307の構造です。(説明書より)
I2Cでコントロールします。SQW/OUTに1Hz~32.768KHzの方形波を出力することができます。
次にコントロール方法です。
Timekeeper Registerの内容です。
ADDRESS 00h~06hに秒、分、時、週、日、、月、年のデータが格納されています。ここにアクセスして時刻のデータを読み書きします。
07hで、SQW/OUT(方形波出力)の設定を行います。
I2Cの書き込み及び読み込みのフォーマットです。
RTCの動作テストを行います。スケッチは、よみやさんのものとプチモンテさんのサイトのものを参考にしました。
年月日曜のデータは、本日(2021年6月3日木曜日)にして、時分秒のデータは、12時から13時への繰上りを確認できるようにセットしました。
-------------------------------------------------------------------------------
#include <Wire.h>
#define RTC_address 0x68
char *week[] = {"日","月","火","水","木","金","土"};
uint8_t REG_table[7];
void setup() {
Wire.begin();
Serial.begin(115200);
//RTCにデータを書き込む
Wire.beginTransmission(RTC_address);
Wire.write(0x00);//Register 先頭アドレス
Wire.write(0x30);//second
Wire.write(0x59);//minute
Wire.write(0x12);//hour
Wire.write(0x04);//week
Wire.write(0x03);//day
Wire.write(0x06);//month
Wire.write(0x21);//year
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(RTC_address);
Wire.write(0x00);//Register 先頭アドレス
Wire.endTransmission();
//RTCデータの読み込み
Wire.requestFrom(RTC_address,7);
for(int i=0;i<=7;i++){
REG_table[i]=Wire.read();
}
//RTCデータ表示
Serial.print("20");
Serial.print(REG_table[6],HEX);//year
Serial.print("/");
Serial.print(REG_table[5],HEX);//month
Serial.print("/");
Serial.print(REG_table[4],HEX);//day
Serial.print("(");
Serial.print(week[REG_table[3]]);//week
Serial.print(") ");
Serial.print(REG_table[2],HEX);//hour
Serial.print(":");
Serial.print(REG_table[1],HEX);//minute
Serial.print(":");
Serial.print(REG_table[0],HEX);//second
Serial.println();
delay(1000);
}
-------------------------------------------------------------------------------
#define RTC_address 0x68
char *week[] = {"日","月","火","水","木","金","土"};
uint8_t REG_table[7];
void setup() {
Wire.begin();
Serial.begin(115200);
//RTCにデータを書き込む
Wire.beginTransmission(RTC_address);
Wire.write(0x00);//Register 先頭アドレス
Wire.write(0x30);//second
Wire.write(0x59);//minute
Wire.write(0x12);//hour
Wire.write(0x04);//week
Wire.write(0x03);//day
Wire.write(0x06);//month
Wire.write(0x21);//year
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(RTC_address);
Wire.write(0x00);//Register 先頭アドレス
Wire.endTransmission();
//RTCデータの読み込み
Wire.requestFrom(RTC_address,7);
for(int i=0;i<=7;i++){
REG_table[i]=Wire.read();
}
//RTCデータ表示
Serial.print("20");
Serial.print(REG_table[6],HEX);//year
Serial.print("/");
Serial.print(REG_table[5],HEX);//month
Serial.print("/");
Serial.print(REG_table[4],HEX);//day
Serial.print("(");
Serial.print(week[REG_table[3]]);//week
Serial.print(") ");
Serial.print(REG_table[2],HEX);//hour
Serial.print(":");
Serial.print(REG_table[1],HEX);//minute
Serial.print(":");
Serial.print(REG_table[0],HEX);//second
Serial.println();
delay(1000);
}
-------------------------------------------------------------------------------
シリアルモニタに次のように表示されました。
1secごとに、年月日曜日時分秒が表示され、RTCの動作が確認できました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます