温度記録装置の製作 2013.3.7


    1.はじめに

     2年程前のこと。ジャンクのDVDプレーヤーを分解した時に、その制御基板に、8ピンのDIP-ICがソケットに差さっているのをみつけた。 それは、大きなICの横に配置されていたのだが、一体何に使うICなんだろうかと、そのICの型番をネットで調べてみた。

     それは、EN25T80という型番で、 Eon(イーオン)というメーカの8Mbit(1MB)のSPI-ROMであった。 プレーヤーのプログラムなどが格納されていたものと思われる。捨ててしまうには惜しいROMであり、この時期は、PICマイコンの電子工作に取り組みだした頃でもあり、 このROMを使った電子工作が出来ないものかと考えた。

     ちょうど、マイコンのAD変換モジュールの使い方を勉強するために、温度センサーを購入して温度を測定する簡単なプログラムを作っていたので、 測定した温度をROMに連続して記憶できれば面白いと思った。

     私の部屋の窓は西に向いており、窓際の温度は、真夏の午後には西日の影響で40度を超え、真冬には、山の中の住宅地なので0度近くまで下がる。 これを一年以上に渡って記録すれば、面白い結果が得られるはず。そんな思いで、温度記録装置を作った。

     この装置は、一度電池を交換したが、今もちゃんと動いている。温度記録装置なんて、電子工作ネタとしては別にめずらしくもなんともないが、 マイコン初心者の方の参考になればと思い公開してみた。


    2.設計と製作

     2−1.使用部品

     マイコンは、dsPIC30F3012を使った。温度センサーには、LM61BZを採用した。 このセンサーは、単一正電源で動作し、-30度〜+100度まで測定可能で、一度あたり+10mVのリニアな出力が得られる。 0度の時に+600mVのオフセット電圧が出力され、測定範囲全体では、+300mV〜+1600mVとなる。

     温度記録には、測定温度だけでなく、その測定日時も必要となる。日時を知るためにマイコンで時計プログラムを組んでもいいが、これでは精度が保てない。 そこで、セイコーエプソンのリアルタイムクロックモジュール「RTC8564」を採用することにした。このモジュールは、最近「アラームクロックの製作」でも採用したが、 実はこの時に初めて使ったモジュールである。


     2−2.設 計

    図1 温度記録装置

     設計といっても大したことは何もない。各部品を決められたインタフェースで接続するだけだ。設計した回路を図1に示す。

     EN25T80はSPIで、リアルタイムクロックモジュールはI2Cで接続した。温度センサーは、出力をアナログ入力に直接接続した。

     dsPIC30F3012では、I2CインタフェースのSCL、SDAピンが、SPIインタフェースのSDI、SDOと共用となっており、 I2C、あるいはSPIのいずれか一方しか使用できないのではと思ったが、同時アクセスさえしなければ、I2CデバイスとSPIデバイスを共用接続しても問題ないはずだ。

     このためには、接続するデバイスが、非アクティブな時に入出力ピンがハイインピーダンスになるものでなければならない。I2CデバイスのSCL、SDAピンは、その仕様上、アクティブでない時には、 ハイインピーダンスであることから、マイコンとSPIデバイスとの通信動作に影響を与えることはない。

     一方、SPIデバイスが、選択状態でない時に、SDIやSDOピンをロウレベルやハイレベルに保つものでは、マイコンとI2Cデバイスとの通信動作を妨げることになるので問題となる。 幸い、EN25T80は非選択状態の時、入出力ピンをハイインピーダンスに保つ仕様となっているので問題が無い。

     時計の初期設定や、ROMからの温度記録の読み出し操作は、UARTによりパソコンのターミナルウィンドウから行えるようにした。このためにTX、RXピンを設けた。

     電池動作時の消費電力低減のために、マイコンは常時はスリープ状態にしておき、リアルタイムクロックモジュールからの1分毎の割り込みで起床し動作するようにした。 また、読出操作などを行う時のために、ボタン操作によるもう一つの割り込みを設け、手動操作でマイコンを起床できるようにした。

     電源電圧は3.3Vとし、定電圧電源ICを使った。ICは、150mAの小容量の物を採用した。電池とACアダプターの両方が使えるように、電源ICの入力側には、ダイオードOR回路を設けた。


     2−3.製作
    製作した温度測定記録装置

     ユニバーサル基板で製作した。マイコンなどのICは全てICソケットを取り付けた。温度センサーも別のものに交換できるようにピンソケットを取り付けた。 特にケースなどには収納せず、基板のまま使用している。


    3.プログラムの作成

     MPLABの上で、C言語で開発した。

     プロジェクトに含まれるソースファイルは次のとおり。

      温度記録動作

     マイコンは、通常はスリープ状態にあり、リアルタイムクロックモジュールからの1分毎の割り込みにより起床する。

     起床すると、現在時刻を読み取って、0分、5分、10分、... の毎5分毎に温度を測定し、RAM上のワークメモリに5分毎の温度を記録する。 時刻が毎時55分となった時には、ワークメモリ上の一時間分の測定データをSPI-ROMに書き込み保存する。

     書き込むデータフォーマットは、次のとおりで、毎時あたり、32バイトのデータとなっている。

     年下2バイト+月2バイト+日2バイト+時2バイト+(毎5分毎の測定データ2バイトx12個)=32バイト

     温度測定データは、小数点以下1桁までを有効とし、10倍した値をバイナリ2バイトで格納している。

     SPI-ROMは、1MBの容量なので、(1024*1024)/32/24/365=3.7年 分の温度データを記録できる。

     測定精度については、学術的なデータを取得するものではないため、特に何も考慮していない。またリアルタイムクロックモジュールの時刻精度についても考慮していない。 実際の所、1年以上も連続稼働させて見たところ、数十分以上の時刻ずれを起こしていた。


    4.操作方法

     UARTでパソコンと接続し、電源を投入すると、次のような操作メインメニューがターミナルに表示される。

      **** Temperature auto logger ************************************
      F: flash memory mentenance.
      T: display now temperature.
      C: real time clock mentenance.
      L: logging temperature.
      R: log read.
      Input Command=>

      F を入力するとSPI-ROMのメンテナンスメニューが表示される。ROMの消去や任意アドレスの読み書きが出来る。
      T を入力すると現在の温度を測定し表示する。
      C を入力するとリアルタイムクロックモジュールのメンテナンスメニューが表示される。日時の設定や読み出し、割り込みインターバルの設定が出来る。
      L を入力すると、温度測定と記録を開始する。
      R を入力すると温度記録データを表示する。記録されている最初から最後までをテキスト表示する。

     Lを入力して自動測定を開始するとターミナルには何も出力されなくなるので、パソコンとの接続を切り離し、温度測定をしたい場所に基板を設置する。

     測定結果の読み出しは、基板上のボタンを押してメインメニューを表示させるか、一度電源を切ってメインメニューを表示させることで行える。

     測定結果は、一時間分のデータが一行で表示される。カンマ区切りのCSV形式であるので、エクセルなどの表計算ソフトで簡単に処理が出来る。

      年 月 日 時  0    5   10   15   20   25   30   35   40   45   50   55(分)
      ------------------------------------------------------------------------
      2012020300, 9.0, 6.9, 6.3, 5.7, 5.5, 5.7, 5.6, 5.5, 5.2, 5.2, 4.9, 4.8
      2012020301, 4.5, 4.4, 4.2, 4.2, 4.1, 4.1, 3.9, 4.0, 3.9, 3.8, 3.6, 3.6
      2012020302, 3.6, 3.6, 3.4, 3.1, 3.2, 3.1, 3.2, 3.0, 3.0, 2.8, 2.9, 2.8
      2012020303, 2.7, 2.5, 2.6, 2.5, 2.6, 2.5, 2.4, 2.4, 2.4, 2.1, 2.1, 2.0
      2012020304, 2.2, 2.0, 2.0, 1.9, 1.8, 1.6, 1.7, 1.8, 1.7, 1.8, 1.6, 1.6
      2012020305, 1.6, 1.3, 1.2, 1.2, 1.1, 1.1, 1.0, 1.1, 1.0,  .9,  .9,  .8
      2012020306,  .7,  .9, 1.1, 1.1, 1.1,  .9, 1.0,  .9,  .8,  .7,  .8,  .7
      2012020307,  .7,  .6,  .6,  .5,  .6,  .9, 1.2, 1.2, 1.4, 1.5, 1.5, 1.7
      2012020308, 1.8, 1.9, 1.8, 2.0, 2.0, 2.1, 2.3, 2.4, 2.6, 2.8, 2.9, 2.8
      2012020309,  .0,  .0,  .0,  .0,  .0,  .0,  .0,  .0, 6.6, 5.3, 5.7, 6.1
      2012020310, 6.5, 6.8, 6.5, 5.9, 6.4, 7.2, 7.7, 8.1, 8.6, 8.5, 8.8, 9.2
      2012020311, 9.1, 9.0, 9.0, 9.1, 8.2, 7.8, 7.8, 7.5, 7.7, 7.8, 8.0, 8.1
      2012020312, 8.5, 8.2, 8.2, 7.7, 7.9, 7.9, 8.2, 8.7, 8.9, 8.8, 8.4, 8.2
      2012020313, 8.2, 8.6, 8.7, 9.0, 9.0, 9.0, 9.4, 9.3, 8.7, 8.6, 8.9, 8.4
      2012020314, 8.7, 9.0, 9.5, 9.9,10.8,14.0,15.3,12.0,11.1,10.6,12.2,13.6
      2012020315,11.5,11.5,13.0,17.7,17.6,14.4,16.1,20.0,21.1,20.4,17.7,15.2
      2012020316,13.5,12.2,11.5,11.9,12.2,12.1,11.9,11.9,11.1,11.2,11.5,11.3
      2012020317,11.2,11.4,11.5,11.9,11.9,11.2,11.0,11.4,11.5,11.4,11.1,11.1
      2012020318,10.8,10.6,10.7,10.9,10.1, 9.2, 8.8, 8.6, 8.8, 8.8, 8.7, 8.7
      2012020319, 8.6, 8.4, 8.5, 8.4, 8.3, 8.1, 8.1, 7.8, 7.8, 7.7, 9.9,10.7
      2012020320,11.1,11.3,11.8,11.5,10.8,10.7,10.7,11.0,11.1,11.2,10.9,11.2
      2012020321,11.4,11.5,11.5,11.7,11.5,11.5,11.6,11.6,11.7,11.7,11.8,11.5
      2012020322,11.3,10.2, 9.5, 9.5, 9.5, 9.6, 9.5, 9.4, 9.4, 9.2, 8.9, 8.9
      2012020323, 8.6, 8.6, 8.6, 8.3, 8.2, 8.4, 8.5, 8.6, 9.0,10.9,11.5,11.7