Arduino UNO R4で時計(RTCとLCD)

Arduino UNO R4の3回目です。
今回は、Arduino UNO R4で追加された、RTC(Real Time Clock)の使い方です。
なお、最初にR3用のLCDライブラリの表示を確認し、最終的にはLCD上にRTCから読み込んだ年月日と時間を表示します。

2回目の記事は、以下をクリック。

Arduino UNO R4のRTC

以下は、「Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編」と「RA4M1 グループ データシート」からの引用などになります。

Arduino UNO R4のRTC には、カレンダカウントモードとバイナリカウントモードの2 種類のカウントモードがあります。
カレンダカウントモードでは、RTC は2000 年から2099 年まで100年間のカレンダを保持し、うるう年の日付を自動補正します。
バイナリカウントモードでは、RTC は秒をカウントし、その情報をシリアル値として保持します。バイナリカウントモードは、西暦以外のカレンダに利用可能です。
時計カウンタのカウントソースとして、サブクロック発振器またはLOCO を選択できます。RTC は、カウントソースをプリスケーラで分周して得られた128Hz クロックを使用します。年、月、日、曜日、午前/午後(12 時間モード時)、時、分、秒、または32 ビットバイナリを1/128 秒単位でカウントします。

RTCの入出力

(以下の各端子はMCU内部の端子で、外部には接続されていません。)

RTCの入力は「XCIN」で、32.768 kHzを接続します。これは、MCUに内蔵された「低速オンチップオシレータ(LOCO)」が32.768kHzを発信します。
なお、LOCOの発信周波数は、「LOCO ユーザトリミングコントロールレジスタ(LOCOUTCR)」でユーザが(ある程度)調整できます。(現在のところ、このレジスタでどの程度補正できるかの情報が有りません。)

RTCの出力は「RTCOUT」で、1 Hz/64 Hz波形出力を出力します。この周波数を確認できれば、ある程度の補正の確認ができると思うのですが、外部に出ていないので現在のところ使用方法がわかりません。

RTCの(電源の)バックアップ

RTCには、VBATT端子(MCUの4番ピン)が備えられており、外部バッテリを接続することでバックアップすることが出来ます。
VBATTの定格電圧は -0.5~+6.5 V、動作推奨電圧は1.6 ~ 3.6 Vです。
RTCを使用した場合の動作電流は、データシートではVCC = 3.3 Vの場合で サブクロック発振器の増加分を含んで 1.2 uAになります。(本当にこの値ならば、3.3 Vのボタン電池で十分ですね。)

なお、Arduino UNO R4 WiFiにはRTCのバックアップ用に、POWER端子の左側に「VRTC」と「GND」端子が追加されています。
自宅にあるArduino UNO R4 Minimaには、バックアップ端子は有りません。(残念)
下図はArduino UNO R4 WiFiのVBATT端子周り

Arduino UNO R4 WiFiのVBATT端子

LCDの接続

今回、LCDは、秋月電子の16文字✕2行の「AQM1602Y」(通販コード P-11916)を使いました。
部品箱にもある、制御チップに「HD44780」を使用した定番LCDの使用も考えたのですが、配線数が多くなるので使いませんでした。また、少し大型で見やすい「AQM1602XA」(通販コード P-08779)もありますが、ピッチ変換基盤のハンダ付けが面倒だったのでやめました。

このLCDは、I2Cで制御できて動作電圧は3.3 Vと5 V両用です。
制御チップは「ST7032」が使われています。

本来ならば、電源電圧が5 VのArduinoで使用するには「I2Cバス用双方向電圧レベル変換モジュール」(通販コード M-05825)などを使用しますが、今回は接続試験なので省力します。
電源電圧が5 Vのときはチャージポンプ用のキャパシタを省略しても動作するようですが、今回は取り付けました。
Arduino UNO R4側のI2Cのプルアップ抵抗は取り付けられていないそうなので、SCLとSDAの10 kΩ抵抗も取り付けています。

秋月電子の接続資料

ブレッド・ボードでArduino UNO R4とLCDをつなぎます。

「fritzing」用に追加したArduino UNO R4ボードの図は、USB端子の部分が間違っているような?

ライブラリの導入その1

Arduino UNO R4をUSBケーブルでパソコンと接続して、Arduino IDEを起動します。
LCDのライブラリは、ライブラリマネージャで「ST7032」で検索した1番目の「LCD_ST7032」を選びました。
ライブラリ内の「Hello World」をコンパイルします。

このライブラリは、MCUに対応していないとメッセージが出ましたが、コンパイルは終了しました。

プログラムを書き込みました。
LCDが真っ黒です。
コントラストを変更しても変わりません。

ライブラリの導入その2

他のST7032のライブラリを探します。
「ST7032_asukiaaa」です。
「あすき」さんが作成されたライブラリで、「ST7032が載ったLCDをArduinoで動かしてみた」で紹介しています。

ライブラリマネージャーの検索欄に「ST7032」と入力して検索すると「ST7032_asukiaaa」が出てくるので簡単にインストール出来ます。

ライブラリ内のサンプルを書き込みました。
先程と同様にLCDが真っ黒になりましたが、コントラストを「15」にすると良い感じで表示できました。
2行目のカウントも正常に動作しています。

RTCで時計

ArduinoのHPにある「Arduino UNO R4 WiFi Real-Time Clock」のサンプルを参考にしました。
Arduino UNO R3とは異なり、R4はRTCが内蔵されているので何もつなぐ必要がありません。
RTCを使うのも簡単です。

RTCの開始

RTCの開始と初期設定の例です。

RTC.begin();
RTCTime startTime(30, Month::JUNE, 2023, 13, 37, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE);
RTC.setTime(startTime);

RTCからの時刻情報の取得

現在時刻を取得するのも簡単です。
RTC.getTime(currentTime);

RTCから個別情報の取得

年の取得:getYear()
月の取得:getMonth()
日の取得:getDayOfMonth()
時間の取得:getHour()
分の取得:getMinutes()
秒の取得:getSeconds()
(曜日の取得機能は、今回は使用していません。)

HPのサンプルをコンパイルして、シリアルモニタで動作を確認できました。
次に、「Serial.print(currentTime.getHour());」などの部分を「icd.print(currentTime.getHour());」などと書き換えて、シリアルへの出力をLCDにするだけで年月日と時間を表示出来ました。
(サンプルを動作させてみたら、日付や分などが1桁だと十の位が省略されてしまうので、常に「0」を表示するように修正しています。)
問題なく動作しました。

動作確認

電源をダイソーのモバイルバッテリにつないで翌日まで動作させました。
(普通にパソコン・ショップで購入した小型モバイルバッテリーでは、Arduino UNO R4は低消費電力過ぎた様で数分で電源供給が停止してしまいました。)
翌日に確認すると、たった1日で8分30秒ほど進みました。

他の情報をネットで探してみると、Arduino UNO R4 Minimaは1日で10分以上ずれることもあるようです。
対策としては、
1 外部水晶振動子を増設する
2 「LOCO ユーザトリミングコントロールレジスタ(LOCOUTCR)」で修正する
などが考えられます。

2024年1月23日 訂正
対策としては、
1 外部サブ水晶振動子(32.768 kHz)を増設する。
2 「RTC.cpp」の「define RTC_CLOCK_SOURCE RTC_CLOCK_SOURCE_LOCO」を「define RTC_CLOCK_SOURCE RTC_CLOCK_SOURCE_SUBCLK」と書き換える。
(「RADJ」レジスタによる自動補正は、LOCO(内蔵サブクロック)では使用できない。)
RTCの詳細については、以下をクリック。

なお、WiFi付きならネットで同期を取り自動的に修正する事ができますが、自宅にはMinimaしかないので試していません。

コメント