● 実験テーマ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へ →