Arduino UNO R4 の3回目です。
今回は、Arduino UNO R4 で追加された、RTC(Real Time Clock)の使い方です。
なお、最初に R3 用の LCD ライブラリの表示を確認し、最終的には LCD 上に RTC から読み込んだ年月日と時間を表示します。
Arduino UNO R4 の2回目の記事は、以下をクリック。
Arduino UNO R4 の RTC
以下は、「Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編」と「RA4M1 グループ データシート」からの引用などになります。
Arduino UNO R4 の RTC には、カレンダカウントモードとバイナリカウントモードの2 種類のカウントモードがあります。
カレンダカウントモードでは、RTC は 2000 年から 2099 年まで 100年間のカレンダを保持し、うるう年の日付を自動補正します。
バイナリカウントモードでは、RTC は秒をカウントし、その情報をシリアル値として保持します。バイナリカウントモードは、西暦以外のカレンダに利用可能です。
時計カウンタのカウントソースとして、サブクロック発振器または LOCO を選択できます。RTC は、カウントソースをプリスケーラで分周して得られた 128 Hz クロックを使用します。年、月、日、曜日、午前/午後(12 時間モード時)、時、分、秒、または32 ビットバイナリを 1/128 秒単位でカウントします。
RTCの入出力
(以下の各端子は MCU 内部の端子で、外部には接続されていません。)
RTC の入力は「XCIN」で、32.768 kHzを接続します。これは、MCU に内蔵された「低速オンチップオシレータ(LOCO)」が 32.768 kHzを発信します。
なお、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 端子周りです。
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 をつなぎます。
ライブラリの導入その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 しかないので試していません。
コメント