レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

RTCでアラームクロックを作ってみる

2020年03月07日 | 電子工作

すこし前のことですが、秋月電子でRX-8025NBのリアルタイムクロックモジュールを購入しました。アラームクロックを自作したかったからです。
机の上にはダイソーのアラームクロックが置いてあるのですが、精度が低く数日で1、2分は進んでしまいます。この時計は1.5V動作なので、乾電池をつなげられるようにして使い古しの乾電池を更に使い込むために購入したものです。
また、1時間ごとにビープ音で時間を知らせてくれてるのも気に入っていて、頻繁な時刻合わせが必要でも使い続けています。もう少し時計としてまともなら良かったのですが…

そこで、ダイソー時計の替わりに自分でアラームクロックを作ってしまおうと考えた次第です。

RTCの制御に使うのは、前回動作確認を行ったATtiny861Aです。秋月電子のお楽しみ袋のPICだけでなく、AVRも消費していきます。表示には秋月電子で200円で購入した16桁(内部8桁×2行)のLCDを、操作にはタクトスイッチを使用します。
RTCのRX-8025NBですが、日本語のデータシートやネットの情報もたくさんあるので使い方はすぐに分かります。I2C接続なので配線は簡単ですが、今回はLCDなどの制御のため配線が多くなってしまったので、基板に半田付けするときにチェック出来るよう図にしてみました。





ATtiny861Aで組んでいますが、他のAVRやArduinoに置き換えるのは簡単だと思います。

RX-8025NBはモジュール上のジャンパー接続でプルアップを有効に出来ますが、ネットの情報でバックアップ電源がリークするようなことも書いてあったので外部抵抗でプルアップするようにしてみました。
Arduino IDEのWireライブラリは内部プルアップを有効にしていると思っていたので、当初、外部プルアップなしで動くと考えていたのですがATtiny861Aでは動きませんでした。

電子ブザー(圧電スピーカーじゃないよ)には秋月電子のUDB-05LFPNを使いました。このブザーの消費電流が最大30mAなので167Ω位の抵抗がほしく、手持ちの抵抗を組み合わせて一番近かったのが上図の151Ωでした。ATtiny861Aが1ピンで出力できる最大電流は40mAなので、125Ω以上の抵抗なら何でもいいでしょう(電子ブザーの消費電流が少ない瞬間にピンに大量の電流が流れるかもしれないから)。ただし200Ωにしたときは電流が少し足りないためか、たまにひずんだビープ音になることがありました。

RX-8025NBに3Vのバックアップ電池をつなぐために、電源周りにスイッチング・ダイオード(1N4148)を入れました。普段使用しているときにバックアップはなくても構いませんが、5V電源交換のときにバックアップ電池をつなげておけば日時の再設定を行う手間が省けます。
このアラームクロックの電源には、こんなふうに使い古しの乾電池から5Vを取り出して使ったりするつもりなので、頻繁に電池交換が必要になると思いバックアップ回路をつけることにしました。

次はスケッチです。LCDの制御はライブラリを使わずに自前で行っているので、スケッチが大きくなってしまいました。(今回利用していない制御ルーチンも含まれています。部分削除するのが面倒で…)コンパイルにはATTinycoreを使っています。内部クロックは8MHzにしました。

ATtiny861RTC.ino

電源を投入すると、初回の起動ではRTCの日時を設定します。日時はスケッチに記述していますので、必要なら変更して下さい。バックアップ電池がつながっている状態から電源を投入すると、日時の設定は行いません。

起動後は時刻の表示画面になります。



タクトスイッチを左からスイッチ1・スイッチ2…としたとき、操作方法は以下のようになります。

■スイッチ1を押すと日時・アラームの設定画面に切り替わります。アラームにはアラームDとアラームWがあり、アラームDのは時・分指定のアラームでアラームWは曜日・時・分で指定するアラームです。

 時間設定
         ↓
 日付設定
         ↓
 アラームD
         ↓
 アラームW
         ↓
     時刻表示画面に戻る

設定画面の詳細は後ほど説明します。

■スイッチ2を押すとアラームのオン・オフを設定できます。画面左側のインジケータでアラームのオン・オフが分かります。

最初に押したときはアラームDが有効になります。



2回目に押したときはアラームWが有効になります。



3回目に押したときはアラームD、Wどちらも有効になります。



もう一度押すとアラームD、W両方とも無効になります。以後、押すたびにこの繰り返しです。電源投入直後は全てのアラームが無効となっています。

■スイッチ3を押すと一時間ごとにBEEP音で時刻を知らせる時報機能のオン・オフを切り替えます。スイッチを押すたびに有効・無効と切り替わります。

画面右側のインジケータで時報の有無が分かります。

 時報オン
         ↓↑
 時報オフ

電源投入直後は時報が有効となっています。

■スイッチ4を押すと日付・アラーム時間を確認することが出来ます。

 日付
         ↓
 アラームD
         ↓
 アラームW
         ↓
     時刻表示画面に戻る

■日時・アラームの設定

スイッチ1を押した直後は時間設定画面になります。



スイッチ2を押すとカーソルが時・分・秒と移動していきます。スイッチ3を押している間、時・分・秒それぞれの数値を増加させます。数値が時間なら23、分・秒なら59を超えると0に戻ります。
スイッチ4を押すとBEEP音がして、画面に表示されている時・分・秒の値をRTCにセットします。スイッチ4を押さずにスイッチ1を押すと、時間設定はせずに日付設定に進みます。



日付設定では年・月・日の設定が行えます。設定方法は上記の時間設定と同じです。曜日は自動的に設定されます。スイッチ4で設定をRTCにセットするか、スイッチ1で設定をキャンセルすると次のアラームD設定に進みます。



アラームD設定ではアラームをならす時・分を設定することが出来ます。設定方法は上記の時間設定と同じです。スイッチ4で設定をRTCにセットするか、スイッチ1で設定をキャンセルすると次のアラームW設定に進みます。



アラームW設定ではアラームをならす曜日・時・分を設定することが出来ます。スイッチ2を押すとカーソルが曜日の設定、時・分の設定と移動していきます。曜日の設定はカーソルを各曜日の位置に移動して、スイッチ3で有効・無効を切り替えます。曜日が全て選択されていないときはアラームは無効です。



カーソルを時刻の位置に移動すると時・分を設定することが出来ます。設定方法は上記のアラームDと同じです。スイッチ4で設定をRTCにセットするか、スイッチ1で設定をキャンセルすると時刻表示画面に戻ります。


RTCのレジスタに設定されているアラーム時刻はバックアップ電源がつながれていればAVRの電源がオフになっても残っていますが、時報とアラームオン・オフの情報はAVRで管理していて、AVRの電源をオフにするとデフォルトの状態に戻ってしまいます。すぐに再設定できる内容なので何もしていませんが、どうしても設定を残したいなら内臓のEEPROMを使うといいでしょう。

使用したRX-8025NBは時刻を12時間制、24時間制のどちらでも扱えるようになっています。でも12時間制のときは時間と一緒にAM・PMの情報を扱うことになり、ちょっと面倒なので24時間制のみにしてしまいました。

RX-8025NBは色々なタイミングで割り込みを発生させることが出来ます。今回は1秒ごとに割り込みを発生させ、割り込み処理の中で時刻表示の更新を行うようにしてみました。ところが、割り込み処理中はdelayやmillis等の割り込みに依存する関数が正しく機能しないので、アラームに使うBEEP音のオン・オフの間隔をコントロールするのが難しくなってしましました。そのため、アラーム音は1秒おきにBEEPのオン・オフを行う単調なものとなっています。この辺はもうひと工夫したいところです。



上記の配線図にはありませんが、スケッチのアップデートのためにICSP接続のソケットもつけました。



バックアップ電池は3Vのボタン電池にしました。



これで、自分好みのアラームクロックの完成です。ダイソーのアラームクロックはもういらないので、分解してクリスタルとか使えそうな部品だけ取っておきましょう。




最新の画像もっと見る

コメントを投稿