PCF2129
3.3Vで動作
PCF2129は3.3Vでも動作する、リアルタイムクロックICです。I2CかSPIでマイコンと接続し、通信します。ArduinoのリアルタイムクロックICとしてはDS3231がとても有名ですが、仕様としては5Vでしか動作しません。3.3Vでもまぁ動作はするのですが仕様的には5V用です。このため3.3Vで動作するESP32には、DS3231よりはPCF2129の方が合っていると思います。
PCF2129にはパッケージの違いで、PCF2129TとPCF2129ATがあります。機能は同じなので、入手性の良いPCF2129ATを使っています。
回路
上の回路図が、I2CでESP32へ接続するための回路です。VBATにはバッテリーバックアップのための0.22Fのスパーキャパシタを使っています。バッテリーだと寿命により交換する必要があったり、サイズが大きいために基板上で面積が必要なので、交換不要で小型のスーパーキャパシタを使ってみました。
割り込み出力とCLKOUT出力には、動作の確認のためにLEDを接続しました。割り込み信号やCLKOUTがLowになるとLEDが消える仕組みです。
はんだ付け
秋月電子のピッチ変換基板に、先ほどのPCF2129の回路を実装しました。
ブレッドボードに、ESP32-DevKitCと、先ほど作ったモジュールを差し込んで、配線すれば回路が完成です。
プログラム
既存のライブラリを改造
PCF2129にはArduinoで利用できる、とっても便利なライブラリが公開されています。
このライブラリを以下のように改造しました。
- 時間を保持する構造体「struct tm」で時間の設定と取得ができるように変更しました
- CLKOUTを設定できる機能を追加しました
- 全てのレジスタの内容を表示できる機能を追加しました
こちらがテストプログラムです。
#include <Wire.h>#include "PCF2129AT.h" PCF2129AT rtc; void setup() { Serial.begin(115200); Wire.begin(); rtc.init(); Serial.println("PC2129AT Sample Program"); rtc.readAllRegister(); //Time Setting struct tm dt; dt.tm_year = 2021-1900; // year(from 1900years) dt.tm_mon = 5-1; // month(0-11) dt.tm_mday = 12; // day(1-) dt.tm_hour = 18; // hours dt.tm_min = 46; // minits dt.tm_sec = 0; // seconds rtc.setDate(&dt); // Set time to PCF2129 //Alarm Setting dt.tm_sec = 0; // seconds rtc.enableAlarmSecond(); // match second alarm rtc.setAlarm(&dt); // Set alarm to PCF2129 rtc.clearAF(); // clear all alarm flags rtc.enableInterruptAlarm(); // out alarm interrupt to INT pin rtc.setInterruptsPIN(); // set interrupt rtc.setClockOut( ClkoutFreq_1Hz ); //CLKOUT 1Hz rtc.readAllRegister(); } void loop () { struct tm dt; rtc.getDate(&dt); // get date from PCF2129 Serial.print("year :"); Serial.print(1900 + dt.tm_year, DEC); Serial.print("\t month :"); Serial.print(1 + dt.tm_mon, DEC); Serial.print("\t date :"); Serial.print(dt.tm_mday, DEC); Serial.print("\t hour :"); Serial.print(dt.tm_hour, DEC); Serial.print("\t minutes :"); Serial.print(dt.tm_min, DEC); Serial.print("\t second :"); Serial.println(dt.tm_sec, DEC); //clear alarm flag at 10 sec if( dt.tm_sec == 10 ) { rtc.clearAF(); } delay(1000); }
このプログラムは、
- PCF2129に時刻の設定をします
- 毎分0秒にアラーム割り込みが発生するように設定します
- CLKOUTに1Hzが出力されるように設定します
- 1秒毎にPCF2129内の時刻をシリアルモニタに表示します
- 毎分10秒にアラーム割り込みを解除します(アラームは解除しない)
という、流れで実行されます。
プログラム全体はこちらよりダウンロードできます。
実行
プログラムを実行すると、毎分0秒になるとアラームによる割り込みが発生し、/INTピンがLowになるために/INTのLEDが消灯します。その後10秒経過すると/INTピンがハイインピーダンスになりLEDが再点灯します。
また、CLKOUTピンにつながったLEDが1Hzで点滅します。
シリアルモニターには、1秒毎にPCF2129内の時刻が表示されます。
完成!
ESP32からPCF2129を制御し、時刻の設定や取得、アラームの設定、1Hzのクロックを得ることができるようになりました。
これを使って、VFD表示管IV-27Mをカレンダー付きの時計にしたいと思います。IV-27Mの制御に関しては、こちらをご覧ください。
2021.5.18 追加 つづきはこちら
追加終わり
コメント