● 実験テーマ82
「PIC18F_温度表示付カレンダ時計の実験と製作」
(PIC内蔵のRTCCと、高精度温度センサモジュール:ADT7410を使って小型の温度表示付カレンダ時計を作ってみました。)
※ 161104:
→ 電池を単4から、単3エネループに変更してみました。
これで、約1ヶ月は持つと思います。
以下、この実験の顛末記です。
■ 2016.9.8
・実は、実験テーマ48「ARM事始め」の時に、
トラ技2014/2月号付録の8pin32bitARMマイコン(LPC810)とI2C実験基板で
記事にないカレンダIC:RTC8564の実験を行っていて、そこまでの記事は公開して
いましたが、その後、電池駆動が出来ないかと思い、単4電池(エネループ)2本と
秋月のHT7733AによるDC/DCモジュールの組み合わせで電源基板をユニバーサル
で組み、トラ技のI2C実験基板とスタック接続して暫く机上で使っていました。
この時計の最大の欠点は、8pin32bitARMマイコン(LPC810)ではポート不足で
時計合わせ機能を追加できず、時刻合わせ機能が無いことです。
電池切れの都度、ファームの設定値を書き替え、再ビルドして使っていましたが、
電池も丁度1週間程しか持たず、非常に手間でした。
以下に、この時、使っていたカレンダ時計の簡単な資料(DC/DCテストメモ)
を参考までに貼り付けておきます。
■ 2016.9.9
・PIC18F26J50の内蔵RTCCを使った時刻合わせ機能付きのカレンダ時計の記事が、
「はじめてのPIC」さんのサイトに載っていたので、それを参考に、机上に置いて使える、
電池駆動の、小型カレンダ時計を作ってみることにした。(最初は温度表示無しで進める。)
また、電源基板はこの時の物を流用することにした。
そのまま作るのでは芸がないので、以下のように変えてみました。
<オリジナルとの相違点>
@ 表示フォーマットの変更
曜日を追加した。
表題表示は省略し、年月日(曜日)+時刻表示のみとした。
A @に伴い、時計合わせのソフトを変更した。
■ 2016.9.10
・まずオリジナルのソースを一通り見てみた。
私が不慣れな、PRINT文を使って、液晶へ書式制御付きで表示していたり、
時刻合わせの方法を効率的に2つのSWのみで行っているところのソフト上の動きを
理解していった。
■ 2016.9.12〜 2016.9.13
・水魚堂にて回路図を作成し、ソフトを書きだした。
・一応、ソフト書き上げ、コンパイルOK〜HEXまで用意出来た。
■ 2016.9.16
・基板構成を検討した。
幸い、流用する電源基板(トラ技I2C実験基板で使用してたもの)のサイズが、
秋月で販売している、最小サイズの両面スルーホール基板(P-03231
サイズ:72x47mm)と
同じサイズなので、これを使うことにした。
ただ、このユニバーサル基板は、4隅にある取り付け穴付近の、上下スペースにスルーホールが
無いタイプだったので、この位置に電源供給コネクタのある電源基板と合わせるために、
PIC基板だけは、通常の片面スルーホール(フルにホールがある状態に加工)にして、
コネクタはアロンで固定することにした。
液晶+SW/LED基板のみに、この両面スルーホール基板を使うことにした。
パーツを手配した。
■ 2016.9.20
・基板の部品実装が済んだ。
・まず、電源チェックを行う。
充電完了済みの、エネループを電池フォルダに挿入し、単体で電池電圧を確認→ 2.63Vであった。
無負荷での、DC/DC出力は、3.29Vで、まずはOK
この時点で、PIC実装し、PIC基板と合体→ この時の、VCC=
3.29V
ここで、PICkit2にて、HEX書き込みを行った→ デバイス認識〜 HEX書き込みまでOK
最後に、液晶基板とも合体し、VCC確認→ 3.29VでOK
・とりあえず動いてはいるが、時計動作NG
@ 時刻合わせが済むと、時と秒が同時に動いてしまう。
→ RTCPTRについての理解不足が原因だった。
落ち着いて見直しOKになる。
A 時刻合わせで、週設定を追加したところ、週設定項目(0〜6)まで送っていった時の初期カーソル位置が、
1位桁になってしまう等
→ オリジナルの関数が、各項目、2桁としていて、初期位置は10位桁となっているので
週の最大値は、6で、2桁になることはないが、この関数をそのまま活かしたいので、週項目も
00〜06の、2桁と考え、カーソル初期位置を、10位桁に修正した。
週の10位桁は、数値設定SWを押しても、06(週のみ最大値:6にソフト変更した)がMAXと判断してくれるので、
0から変化せずこれでOKになる。
・動いたところで、電流測定をしてみた。
時刻表示画面にて、負荷電流= 1.58mA/ BAT電流= 2.4mA
(VCC= 3.29V)
という結果になった。
尚、毎秒間隔で点滅するLEDは、常時消灯としています。
トラ技付属のI2C実験基板(LPC810)の時と比較すると、消費電流は約半分に減少しています。
たぶんこれで、2週間程はもってくれると思います。
以下に時刻表示のみの動作時写真をアップしました。
■ 2016.9.21
・Step2として、高精度温度センサモジュール:ADT7410を増設して、液晶の空スペースに温度表示させる
ことにする。
このセンサモジュールも、I2C動作なので、増設は簡単である。
小数点以下1位までの表示でよいので、13bit分解能(0℃を基準にした温度分解能:0.00625℃)で使うことにする。
また、このデバイスの測定温度範囲は、-55℃〜 +150℃なので、実数部は、最大で符号付(+の時はブランク)3桁表示とした。
動作モードに関しては、出来る限り、電池を長持ちさせるために、ワンショット動作モードに設定しました。
(このモードに設定するとただちに測定、変換を実行し、完了後にシャットダウン状態に移行する。)
ADT7410の使い方については、このサイトの説明が非常に解り易かったです。→ 「wasnakのプログ」
・今回ソースを書くに当たっては、「マニアの為の園芸教室」さんのページを参考にしました。
PICは、PIC12Fを使っており、プログラムはMikroCで作成されておられます。
また、液晶ライブラリ等も、独自に書かれたものを使っておられます。
この辺を加味して、C18に適応するように、移植しました。
■ 2016.9.24
・最初、温度の上位データ(bit8〜bit15)が上手く読み取れず、例えば、室温が17.2℃のところ
1.2℃と、少数点以下の下位データは正しく表示しているが、上位側が'1'としか表示されなかった。
これは、オリジナルソースの
温度値の読み取り関数:tRead()の中で上位データの読み取り記述を、
tdata= ReadI2C() << 8;
と記述しているが、これを、C18でコンパイルすると意図通りのコードを落としてくれないようである。
あくまでも、MikroCで許される書き方と思われる。
次のように、2ステップの記述にしたら、正しく温度表示するようになった。
tdata= ReadI2C();
tdata <<= 8;
■ 2016.9.25
・最後に、時刻表示画面にて、電流測定をしてみた。
一応、ノーマル時と、センサースリーブ時の電流を測ったが、テスターでの測定
で応答性は良くないので、スリーブ時の電流は参考程度に見てください。
@ ノーマル時
負荷電流= 1.78mA/ BAT電流= 2.63mA
(VCC= 3.29V)
A センサスリーブ時
負荷電流= 1.56mA/ BAT電流= 2.32mA
(VCC= 3.29V)
・センサモジュールを追加しても殆ど、消費電流は増えてないので、これでも電池は2週間程
持つと思われます。
<最終回路図>
・こちらから、どうぞ→ 「PIC18F_温度表示付カレンダ時計_V1」 (回路図アップを忘れていました。
161104:回路図アップ)
<最終ソース>
・こちらから、どうぞ→ @ 「PIC18F_RTCC_CLOCK_V1.c」 (年/月/日(曜日)+時刻表示のみ)
A 「PC18F_RTCC_CLOCK_V1a.c」 (温度表示追加版)
※ この他に、「はじめてのPIC」岩本さん作成の液晶ライブラリ
L_i2c1_LCD.c
L_i2c1_LCD.h
が必要です。
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ83へ →