趣味のページ

●雑記のメニューに戻る


■HS15P 湿度センサーの簡易動作実験■ 2010年2月20日

  ※Arduino版も追加しました→こちら。

●HS15って知ってるかい?
結構昔から存在する湿度センサーでございまして、単体(周辺回路を含まない、センサーそのもの)としては定番っぽい製品。
トラ技なんかでもたまに記事が載ったりするらしい(未確認)。
とりあえず秋月電子とかでも\500で売ってたりします

 データシートより

んで。
定番などと言っておいてナンだけども、実はオイラ、このHS15を使った事がない。

というのもコイツは動作させるのが少々手間で、
「電源を繋げるだけで、湿度に比例した電圧が出力されます」みたいなシロモノではなくて
自分でぐちゃぐちゃと回路を組まなくちゃいけないのだ、面倒なのだ。

…いや、面倒でも良いのだけども、その「面倒くささ」を上回るくらいのネタ成分が無いと組むのが辛かったりするわけだ、モチベーション的に。
ありがちな既知の回路を組んで動かしても、ときめきもヘッタクレも無いわけだよな。

そんなわけで今回のネタは、
HS15を手抜き回路でインチキ動作させてみよう
という実験でございます。

※なお、あくまで実験なので、この雑記の内容は自己満足の範囲でしかないですぜ、念のため。
というか、本文中でも断ってるけども、良く分からないでやってる部分も多々あるんだぜ(汗)。


※↑何もないと寂しいので恒例のラクガキなど。
※なお、「湿度センサー」で検索してこられる方が多いようですが
単純に完成品のセンサーが必要なだけであれば、TDKのCHSシリーズを買えばそれで済みますぜ。

●さてこのHS15というセンサ、基本的には「湿度によって抵抗が変化する」ってだけなので、
「なんだ、抵抗ならテスターで測ればいいじゃん」という話ではあるのですが、
いくつかクセとか制約があるわけですな、本題ですな。

まずはその特性を見ていただきますがー

データシートより抜粋

…お判り頂けただろうか?

単純に言えば「湿度が上がると抵抗が小さくなる」だけなのだけども、
嫌われる要因もいくつかあるので列挙してみる。

・抵抗値の変化が(湿度に対して)指数関数
もうね、見るからに片対数グラフだしね。
と言う事は、湿度を求めるためには対数演算が必要になるので
ログアンプなどを用意するハメになる。面倒である。
しかもアナログ回路だから手を抜くと精度が出ない。
なお、「A/D変換してからソフトウェアでlogすれば?」という手は使えない。その理由が次項。

・抵抗値が変化しすぎ。
まぁ、指数関数だからな、そうなるわな。
例えば高湿度では数百Ωであっても、乾燥時には軽く10MΩを超えやがるので
必要なダイナミックレンジは概ね6桁程度、単純計算で20bit以上のA/D相当。無理。
よって先の「A/Dしてからソフトで対数計算」案は非現実的ということになる。
だから先にアナログでログアンプを通して圧縮しないとA/Dできない。

・などといいながら、実は指数関数ではない
このグラフを見ての通り、HS15は指数関数「のようなもの」ではあるが、リニアリティはかなり悪い。
一生懸命に高精度のログアンプを組んで調整しても虚しい。
気分もグラフもぐんにょり。

・温度補償必須。
湿度が1%変化した時も、温度が1℃変化した時も、HS15の抵抗値は同じくらい変化する。
ぶっちゃけ、そのままでは「湿度計だか温度計だか判んない」くらい酷い。

・直流はダメよ
HS15は直流厳禁。直流を加え続けるとブッ壊れるらしい。
よって測定は直流じゃなく交流で、ということになるので、発振器などが必要となる。
※当然、普通のテスターでHS15の抵抗を測るのはNG、という事になる。

そんなこんなで、いろいろと面倒な制約が多く、それ故に回路も面倒くさくなってしまう。
たとえば、わりとありがちな回路構成の例でもこれくらい↓

この図の出所自体は秋月のキットあたりなのだけども(たぶん)、
構成自体はごく普通というか、どこかに元ネタがあるのかもしれない。
まあ、動作は見ての通りで、

  発振回路で交流を生成 → HS15 → 対数圧縮 → 整流して直流に → 温度補正 → オフセットとゲイン調整 → 出力

そんな流れ。
よく見るとリニアリティ補正が省略されていて、いわゆる簡易な回路例なのだけども(それ故、この回路の特性はかなり悪いと思う、確認してないけども)
それでも配線は面倒そうであるわけだ。
とても労力に見合う結果が得られそうにないわけなので(=つまらなそうなので)、個人的にはこの方式を試した事は無いです。
…いや、単純に根性がないだけと言われればその通りなのですが。


●で、どこまで回路を簡略化できるか
…などと一言で言っても、いろいろな攻め方があるはずなのですが、
今回はネタ成分重視なので(?)マイコンにぶら下げる部品が3つだけ、という方法を試してみた。

コンデンサー1個でHS15の抵抗値を測定、温度補償用にはLM35温度センサーICを使ってる。

…たかが湿度計なのでLM35は大袈裟ではあるのだけども(汗)、たまたま手元にあったから使った。
実際とのところ、こんな精度は不要。

ちなみに↑この図は、何かのシステムの片隅におまけで載せるような意図なのだけども、
マイコン側はA/D入力が2つと出力ポートが1つあればよいのだけども、
今回は8pinのAVRで単独の湿度計として動かしてみた。
こんなかんじ↓

なお、出力は
 ・PWMで湿度をアナログ電圧っぽく出力しているのでテスターとかで値を読める
 ・温度と湿度をシリアルポートに送信(垂れ流し)しているのでPCで値を読める
なんて事にしてますが、その辺はわりとどうでも良いというか、AVRのデータシートでも見てくれ的なハナシなので略。

 

動作原理自体は簡単で、なんか学校の電気回路の教科書の一番最初の方に出てくるような話になります。

まずコンデンサCが空(放電している状態)であるとします。
ここから湿度センサーHS15(抵抗R)を通して時間Tだけ充電を行うと、Cの電圧は下図のようになりますな。

 

つまり、このコンデンサの電圧Etを測定すれば、Rの値(つまりHS15の抵抗)を逆算できるわけです(もちろんCとTは判っているとして)。

「そりゃそうだ、それがどうした?」って感じなのだけども、ここで大事なのは
この方式が測定レンジの切り換えが容易、と言う事です。

というか、先にも書いたけども、A/Dコンバーターの分解能が足りないわけだ、そのままじゃ。
今回使用したAVRに限らず、大抵のワンチップマイコンのA/Dコンバーターは
せいぜい10〜12bit程度の分解能しかないのだけど、
そもそも↑の写真のような「手軽な電子工作」レベルで実現出来るのはその程度だし、
別に工作に限らず、むやみやたらに高分解能A/Dを使う設計というのもアレだったりする。

そんなわけで、「低分解能A/Dコンバータ + レンジ切り換え」により
低抵抗から高抵抗までの広いレンジを測定しようというハナシ。
で、この回路でどうやって測定レンジを切り換えるかと言えば
充電時間Tを変えればよいわけだ。

充電と言っても実際にはI/OポートのON/OFFをソフトでタイミングをとって行っているだけなので、
つまり「充電時間の切り換え」なんてのはソフトウェアだけでどうとでも出来るぜ、というのが、回路が単純で済む理由。

具体的には。

今回の例だと、まず充電時間T=10[uSec]でEtの測定を試みる。
もしそのEtが低すぎてマトモに電圧を読めない場合には、充電時間を10倍の100[uSec]にして測定リトライ、
それでもダメなら順に1000,10000,100000[uSec]と高抵抗レンジに切り換えていく、と。
勿論リトライの前にはCを一旦リセット(放電)させる必要があって面倒なんだけど、そんなシーケンスも全然おk、だってマイコンだし。

そんな基本原理。
ちなみに今回の設計では、その測定範囲を102.5Ω〜107.5Ω(≒316Ω〜31.6MΩ)あたりにしてみたけども、
適当にHS15の特性グラフを眺めて決めただけなので、必ずしもこの範囲がベストというわけではないです。

なお回路図を見ての通り、HS15にはCが直列で入っているので、「HS15に厳禁の直流電流」は流れません。
※厳密にはAVRのADC入力ピンからチョロチョロと流れてくるのだけども、その辺を言い出すと
先のアナログ式回路の場合もHS15には数mVの直流(OPアンプの入力オフセット電圧分)が常時印加されている。


●原理は以上の通りなので、 あとはそのまま指数計算とかバリバリ処理すればよいだけ。
ただし、安価なATtiny13A用に詰めるためには若干の工夫が必要となります、というのがここからのお話し。
まずはコレをみてくれ。これをどう思う?

  すごく…小さ(ry

もうね、見るからに浮動小数点なんて無理な雰囲気でございますが
実際ROMが512ワードしかないので、 本来はちょっとしたシーケンスをこなすあたりが目的な製品。
ちなみに秋月で120円(汗)。
間違っても浮動小数点で指数関数云々なんてシロモノではない。
  ※ただし処理速度的には全然問題ない。つか、速いぜ?

さて、最初に確認しておくけど、まず我々が欲しいのは「抵抗の対数値」である。
温度補正とかリニアリティ補正はその後だ。
で、ここでは31.6MΩ(低湿度)〜316Ω(高湿度)という抵抗値に対応した対数値として40〜240を得る事を最初の目標とする。
まあ、普通なら31.6MΩ〜316Ωというのはレンジとして5桁なのだから、(10を底とした)対数値は、例えば0.00〜5.00とかになるのだけども
そこはホレ、浮動小数点とか無理だから、 今回は0.025を1LSBとする固定小数点で表現している。言い方を換えれば、抵抗1桁あたり40だね。
なのでレンジ5桁の抵抗値の対数を0〜200という値で表現した。
…と思ったのだが、AVRの特性に余裕がありそうなので、つまり30MΩよりさらに高抵抗も測定出来るかも知れないので、
とりあえず1桁分だけキープして40〜240に割り当てたのでした。


んで、処理を簡略化するためは指数演算等をテーブルで済ませることになるのだけども、 その前に、
コンデンサに実際に充電される電圧を計算してみる。
0.022uFのCへ5Vで10uSecだけ充電した場合だが

例えば316Ωで充電すると、先の式からCの電圧は3.81Vとなるし、
これが3.16KΩならば0.67Vだ(もし0.67Vに達していなければ、今度は充電時間を100uSecに伸ばしてリトライとなる)。

同様に各レンジでは以下の表の通りになる。
なお、実際の充電時間はぴったり10uSecではなく、(ソフトのループのクロック数の端数などにより)9.4uSecくらいとなるので
ここではそれを元に算出している。
測定レンジ 充電時間(実際の時間) コンデンサ電圧 Et A/D結果(8bit値) テーブルで換算 オフセット 加算後
316〜3.16KΩ 9.4uSec 3.71〜0.63V 190〜32 40〜0 200 240〜200
3.16K〜31.6KΩ 94uSec 160 200〜160
31.6K〜316KΩ 940uSec 120 160〜120
316K〜3.16MΩ 9400uSec 80 120〜80
3.16M〜31.6MΩ 94000uSec 40 80〜40
当たり前だけども、どのレンジでもEtは3.71〜0.63Vである、というか
そのために充電時間を変えてレンジ切り換えしてるわけだから。
で、コレをA/D変換すると(実は10bitのADCなんだけども、そこまで分解能は要らないので下位2bitを捨てて8bit値にすると
190〜32となる。

で、ホントならこのEtから指数関数で抵抗値を算出し、さらに対数値をとって湿度を求める事になる。
   Et → 抵抗値 → 対数値(湿度)

こんな感じ。
が、今回はここを一気にEtから(抵抗値を経由しないで)テーブルで対数値を求めている。
なお、「テーブルで換算」した結果が40〜0となっているが、これは0.025を1LSBとする固定小数点で表現している、というのは先に説明した通り。

で、測定レンジが5つあるのだから、換算テーブルも5つ用意すればよいし、それで動作もする。
が、そこで各テーブルを見比べてみると、40ずつオフセットしただけの、全く平行な値のテーブルでしかない事に気付くはず。
だって対数だもんな。
なので、適当に40を加減算することで換算テーブルを共用できるわけだ、全測定レンジで。
そんな流れ。


なお、失敗したのが、テーブルとオフセット、見ての通りこれらに×-1しちゃってるんだけども(だから並びが降順になっている)
普通に抵抗値の対数を求めた後で×-1したほうが素直でよかったな(汗)。

そんなわけで、微妙に電気回路とソフトウェアと数学が絡んでるあたりが面白いところかもしれん。


そんな理屈で、貧弱なATtinyと外付け部品のコンデンサ1つでも
数百Ω〜数十MΩの抵抗値の測定+対数計算が可能なはず。

…という皮算用(笑)。
ちょいと不安なので、ここらで実際に回路を作って、素性の知れた固定抵抗で実測してみます。
埋められる外堀は速攻で埋めておけ戦法。

こんなかんじ。定規で描いたような直線だけど、これでも実測値です、5桁という広いレンジにおいてかなり良好。
…まぁ、実際にデータをよーくみると
レンジが切り替わる「つなぎ目」部分ではミスコードが発生してたりとか、
目盛りが対数だから凸凹が目立たないだけ、とか
そんな感じではあるのだけども、それでも湿度計用としては十分でございます。

一方、絶対精度はあまり良くないはず。
コンデンサの容量には誤差があるし、充電時間を決めるクロックがCR発振だしするので
普通に数%程度の誤差が見込まれる…のだけども、実はわりとどうでも良い。

というか、、HS15自体の抵抗値のバラツキが「±50%(25℃50%RH時)」などという、とても工業製品とは思えないようなレベルなので、
その他の部品のバラツキなんて気にするだけ無駄だったりする。
あ、0.022uFは普通のフィルムコンデンサを使いました(たぶんニッセイのAMZ)。

なお±50%というと絶望的に大きな誤差に見えますが、
実際にはコレの対数をとるので、湿度としての誤差ははるかに小さいです。


さて。
HS15の抵抗を測定して、そんで目出度く対数を得たのだから、これで「湿度ゲットだぜ!」です。
…のはずなのですがー、

まずリニアリティな。
HS15の特性って、どうみてもまっすぐじゃないわけだ、冒頭でも書いたけども。
だから「対数をとっただけ」だと、このグラフのひん曲がり分だけがモロに誤差となってしまう。
それはもう、さっきまで誤差がン%だとかリニアリティだとか言ってたのが
バカバカしくなるくらいの、桁違いな誤差である。

あと、温度ね。同じ「10KΩ」でも気温によって補正が必要となる。例えば
  5℃なら湿度は85%
  45℃なら湿度は50%
そんな感じだったりする。もう全然である。
しかも温度の分を単純にシフトしただけだと、結構誤差が大きくなる。

で、これらの対策をアナログでやろうとすると結構回路が面倒な上に調整が大変で、おまけに精度も安定性も悪い事が多いのだけども
そこは天下のマイクロプロセッサなのだから、全てソフトで処理してしまえばOK。

…えー、具体的にどう処理すればよいか、という話はストーリーがダレるので詳細は省略。
まぁ、原則データシートの特性通りに補正すればよいという、極めて事務的・デジタル的な話なので適当に。


ちなみに自分の場合、近似式はExcelで求めました。
もう、グラフから値をひろってExcelに打ち込んでいく地道な作業でございました。
Excelに入力したHS15の特性
たぶん温度補正もリニアリティ補正も
(補正マップまで作らずとも)1次式とか2次式での近似で十分。
適当な値をEXCELのソルバーで見つけて、
16bit整数で処理しやすいように適当に丸めただけ。 わりと適当。
それでも丸め誤差+近似誤差は、おおむね±1%前後かと。

なお、これはあくまで「デバイスがデータシート通り」である場合の話。
データシート通りではない部分は、また後で。

※なお、web上のデータシートでは記述が見つからないのだけど、
どうもHS15には2%程度のヒステリシスがあるらしいというか、
そんな特性グラフがどっかの本に載ってたのだが、出所がよくわからん。


●ここまでの話だと

ちゃんと抵抗値も測定出来たしー
補正の計算式も準備出来たしー

むう、このまま完成すれば完璧な湿度計が…!




●疑問点もある。
そもそもHS15のデータシートに載っている特性って、1KHzのACでの値なんですが、
それを守らない場合にはどうなるのか?
つーか、今回の回路は明らかに守っていない(汗)。

まぁ、別に「1KHz」を守らないとブッ壊れるという意味ではなくて
たぶん単に特性が良好な周波数を記載したとか、
たまたまキリの良い数字でデータを採っただけとか、
そんなオチじゃないかとは思うのだけども、
じゃあ、実際のところ1KHz以外での特性はどうなのか?

さあ、ネットで検索してみよう!

   :
   :
   :
   :

ねーよ!

だれも調べてないのかよっ!

…そりゃそうだよな(汗)。
仕方ないので、自分で調べる事に。
と言っても、我が家にはスゲェ測定器とかは無いし、何より相手が得体の知れないデバイスなので
ここは地道にホイートストン・ブリッジを組んで、ちまちまと値を拾う事にしてみます。

…正直、かなり手間である。
なんでこんなコトまでしてるんだ?と思うぞ、
わりと本気で(汗)。オレの正月を返せ的な意味で。

    *    *    *


まずは湿度100%付近の測定結果。
※ちなみに測定精度は「雑記のネタ相当」なのでご了承ください。

結構周波数依存性があるように見えるけど、先にも書いたように、実際にはコレの対数値が湿度になるので、
例えば5%とか10%の違いはあまり問題とはならない。
いや、問題なくはないのだが、少なくても支配的でない。
その意味では、高周波側で使用する分にはさほど問題は無さそうだけども
低周波側だと相当に顕著な誤差が生じる事になる。
まぁ、誤差と言うよりも「データシート通りにならない」って意味なんだけども、
しかしまあ、特性の「肩」の部分で使用するというのは一般に避けたほうが吉だと言えます。
とりあえず、この(高湿度)領域では低周波側は地雷の可能性が高い。

ちなみにこのような特徴は高湿度領域のみのようで、例えば湿度50%付近では
周波数依存性はかなり小さくなってくるようです。
理由はわからない。

というか、測定誤差かもしれないレベル。

で、さらに湿度が低い領域に入ると↓こんな特性に。

高周波側で、ややインピーダンスが上昇する傾向が見られたのだけど、
正直、あんまりアテにならないんだよなぁ。

というか、そもそものインピーダンスが高い領域なんで、
周波数が高くなってくると、容量の影響が大きくなってくる恐れがある。
冗談じゃない。
抵抗値だけで既にウンザリしているのに、この上、容量の面倒などまで見たくないのである。
 「HS15のCは温度と湿度の変化に対してどのように振る舞うか」なんてことまで関わりたくないのである。

つーか、単純に周波数を下げれば逃げられるのだから、
ここは素直に逃げるべきだ。オレの人生はオレ自身で決めさせてもらうぜ!


そんなのが図に書き入れた「地雷」表記なわけです。
こうしてみると、データシートの1KHzという周波数は、
確かに高湿度から低湿度まで測れる無難な数値にも見えてきたりします。もちろん真意は不明。

なお、今回の方式では
高湿度(インピーダンスが低い)状態では、充電時間は短く、周波数成分は高周波寄りであり、
低湿度(インピーダンスが高い)状態では、充電時間は長く、周波数成分は低周波寄りとなるので、
偶然にも地雷を避けていることにはなります。
※なお、TDKの湿度センサCHS-GSSは、積極的に周波数を変える事で地雷を避けている模様。

そんなわけで、今回の回路でホントにHS15の抵抗値が測定出来るのか実測してみる。
いくつかの温度・湿度にて、ホイートストンブリッジでの測定値との相関をプロット。

データを見る限りは大きな問題は無さげ。
まぁ、サンプル数が多くないのがアレだけども、これだけでも結構タイヘン。
金と時間があるならともかく、今回はこのへんで勘弁って感じなのでございます。

●あと、見ての通り定格外動作なのですが。
とりあえず、仕様書にはこんな感じで書かれている。

いわゆる絶対最大定格(absolute maximum ratings)という表現ではないのだけど、
どう解釈すれば良いのか、微妙。
今回の方式だと数秒に1回とか、散発的にしか電流を流さないから
平均消費電力的なストレスは非常に小さいはずなのだけども、なんとも謎デバイスなのでよくわからない。
まぁ、大電力な回路でもないから、何かあっても事故にはならんだろう、と5Vをそのまま印加してたりします。

もしなんだったら、ATtiny13Aを1.8Vで動作させれば、
ほぼ定格動作できるんじゃないかな、実験はしていないけど。


●さあ、実験ですぜ。
…実はコレが一番むずかしい。
というか、湿度センサの試験なのだから、基準となる正確で信頼出来る湿度計が必要となります、当然ながら。

まぁ、湿度計と称するモノは世の中にいくつもあるし、我が家にもあるのですがー、

 ←こんなのとか

コイツは精度±2%とか謳っていたりしますが、
よく見れば「35〜75%・常温」等と但し書きがあったりして、しかも「常温」の定義が良くわからん。
適当に実測しただけなのでアレなのだけど、どうもコイツは湿度計のクセに温度にも敏感に反応する(笑)。
要するに温度補償が甘い感じがするのだが、
そもそも(冷暖房が効いているなら温度が一定の範囲内であろう)屋内を想定した製品なのだろうから、そんなもんなのかもしんない。
少なくても気象観測用じゃないし、
それ以前に民生品なのだから、カタログのスペックをアテにする方が間違いでもある。
ちなみにコレ、誤差はおおむね10〜20%程度もあり、かなりアレな感じであった。
特に低温時に著しく低い湿度を表示する傾向がある模様。
ウチの個体だけの問題なのかは不明。

んで、次の候補がコイツ。
TDKのCHS-GSS。なぜか手元に有ったぜ。
たしか\2,000くらいするんだぜ?

5V電源に繋ぐだけで、湿度に比例した電圧が出力される。
だから何も考えずに、そのままマイコンのA/Dに繋げばOK。
正直、(湿度計を作るのが目的でなくて)湿度を測りたいだけとか、電気回路には興味ないという人は、素直にコイツを使えばいいと思うよ?
なお、中身のセンサー部分はHS15と同じ高分子電気抵抗式。

ただし、残念ながら精度は±5%(5〜90%・25℃)。
むう、この子も25℃オンリー。
というか、±5%というのも微妙な精度。

ああ、どこかに正確な湿度のリファレンスないかなぁ…!


●リファレンス〜(例の声でポケットから取り出す)
…あー、そろそろ「オレは何をやってるんだろう」的な心境になってまいりましたが、正気に戻ったら負けかな、と。

さて、キミは飽和塩法ってしってるかい?(オイラは知らなかった)
例えば、塩水を入れたビンの中って、正確に湿度75%なんだ。

厳密には、NaClの飽和水溶液を密閉容器に入れる必要がある。
とは言え、台所にある食塩と水とタッパーウェアでOKってことになる。
細かい事を言うと温度の影響を若干受けるのだが、NaClの場合には、その影響はかなり小さい。

なんかずいぶんお手軽っぽいノリだけども、これが結構侮れないというか、
詳しくは日本工業規格(JIS) B 7920 「湿度計 - 性能試験方法」を参照してくれ、ってくらいには
由緒正しい方法らしいです。
  ※正直自分も詳しくないので正確なところは検索して調べてください。

しかし、食塩にそんな性質があったのか、正直、オイラは知らなかったよ?
なんか意味もなく試してみたくなるじゃないか。

なお、NaClだと湿度は75%になるわけですが
他の塩(塩化物)では別の湿度になります。
たとえば

  塩化マグネシウム 湿度33%
  塩化カリウム 湿度84%

そのあたりが校正用の塩としてポピュラーなようです。





…って、買っちゃいましたけどね!
もうね、オトナは財力にモノを言わせてやりたい放題だね!




えーと、わざわざ通販で購入したんですよ、楽天とかで探して。
もうね、出費で国がひとつ傾きますよ。
つーか、ホント、何やってるんだろうオレ…


まぁいいさ。


ちなみに実験機材はこんな感じ↓。

タッパーの中にHS15と(比較用の)TDK CHS-GSS、温度監視用にLM35、
それと今回は中の空気を攪拌するための小型ファンを入れた。
水溶液の水面に向けて空気を送り込むようなカタチで、
まぁ、少しでも確実に湿度が平衡してくれればと思ったのですが、
注意深く実験すれば、どうもファンまでは必要なさそうな気はするけど、念のためと言う事で。

あと見ての通り、ケーブル類は細めのポリウレタン線を使用。ゴムパッキンの密閉を妨げないように、です。
密閉は重要、かなり重要。

それと、飽和水溶液を用意するわけですが、これはもう完璧に正確に飽和させたほうが良いので
塩を多めに入れます。
もう、徹底的に多目というか、
水溶液と言うよりもどろり濃厚ピーチ味くらいが良いらしい。

 こんなです。水溶液というより濡れた塩。


で、早速今回製作したHS15+AVRの湿度計のテスト。

3種の塩、つまり3種類の湿度に対して、
それぞれ10℃、25℃、35℃、45℃の温度で測定したのがこれ↓

 

…測定ポイントが12点しかないのだけども、これでも測定に丸一日かかったんだぜ?

さて、このグラフを見る限り全体に値が高めです。んで、よく見ると
「温度が高いほど値が低め」になってる傾向が結構キレイにでています。
これでもデータシート通りに温度補償は行っているのだから、それはつまり
現物の温度係数がデータシート通りではないらしい、という事ですな。

ちなみに、温度係数を変更するのは簡単です、ソフトだからね。

例えば↑こんな感じ。
まぁ、デジタルなんだから当然だけども、補正した分が正確に補正されるのだから(笑)、ほぼぴったりになる。
なので、これは素晴らしい特性と言うよりも、ぶっちゃけ単なるインチキに近い。
実際にはもっと広範なデータを採らないと、判断は出来ないです。
つーか、湿度50%付近のデータも欲しいよなぁ。

ついでにTDKのCHS-GSSも見てみましたが↓。

丸で囲んだ二つのポイント、10℃75%と45℃85%の値が大きく落ち込んでいますが、
データシート記載の代表値もそのようになっているので、たぶん製品としてのクセじゃないかと↓。

 値が落ち込む領域があるらしい。

あと、低温高湿度時に出力がかなり大きめに出る傾向もあるみたいに見える。
とは言え、このCHS-GSSというヤツはTDKの湿度センサーとしては廉価版。
ガンダムで言うところのGM。
上位にはCHS-UPS(誤差±3%以下)という製品が控えているらしいのでございます。
もちろん価格も全然違うみたいだけど。

そういえばTDKのコイツは個体ごとの調整とかやってるんだろうか。
というわけでCHS-GSSを即分解。



↓分解 ※ツメを外すだけですが。

 
安価なセンサ(\2000以下)だから無調整かな?とも思ってたんだけど、
ちゃんと基板のど真ん中に半固定抵抗がいらっしゃいます。
そいえば
今回の実験途中で、友達からかなり古いHS15を譲ってもらいました。
 旧型。現在販売されているモノとリード線が違う。
で、手元の新品と、どのくらい特性が違うかチェックしてみたのですが、
偶然なのか、ほぼ同じような(データシートの特性に対して)傾向が見られました。

そんなわけで。

温度補正とリニアリティ補正に関して、
とりあえずは無調整で(つまりデータシートの特性通り、そのまま代表値を鵜呑みにしたようなソフトウェアで)
動作させたわけですが、
若干温度係数がアレだけど、まずまずの精度では動作してくれた模様。
まぁ、サンプル数が少ないので何とも言えないのだけども、
HS15のデータシートによれば「25℃50%RH下で誤差±5%」なのだから、無調整でもそのくらいの精度は出る、とも言える。

考えようによっては普通に室内で遊ぶ程度ならば(屋外での真面目な気象観測用とか環境モニタとかでなければ)、
無調整でも十分だろうとも思う。

一方、AVRはEEPROMまで付いているマイコン様なので、
補正値の格納も書き換えも演算も簡単なのだから、ヒマな人はやってみればいいと思うよ。
とりあえず食塩とタッパーがあれば75%RHは校正できるし、冷蔵庫があれば温度補正もやれるし。
※公開している参考コードはEEPROM補正無し版です。

さて、その温度係数とオフセットの補正とやらを行ったバージョンを作って、1週間ほど連続テストしてみた。
先のTDKセンサー(CHS GSS)と一緒に屋外へ放置して、ログを比較したのがこれ↓
(ただし個々のセンサの短周期の変動(ノイズ)は除去している。また、CHS GSSは先の飽和塩法を参考に値を若干補正してある)

↑この時の気温は8〜18℃くらい。
で、こっちは↓もう一段寒い季節、気温2〜10℃という、動作範囲をオーバーしてるような領域でのデータ。

…とまぁ、結構きれいに一致してて、ああ、めでたしめでたしって感じなのですが、
実際にはこんな分かり易いストーリーでストレートにココまでたどり着いているわけもなく
それ相当にドロドロな苦労とかしてます(笑)。
しかも手持ちのたった2つのHS15でしか動作確認してないから、ホントにこれでいいのかもよくわからん(汗)。

参考までに、東京管区気象台(大手町?)のデータとも比較してみた。ただしこちらは1時間間隔。

ウチから大手町までは10Kmほど離れていたりするのだけども、
それにあっちは海に近いとか、付近の環境が違ってたりとかするのだけども
意外に似たような挙動だなぁ、という感想。

なお、現状は抵抗の測定レンジを30MΩ付近までとしているので、低温かつ低湿度だとレンジ外となってしまっているけども、
AVRの電気的特性にはまだ余力があるようなので、もう少しくらいだったら
(精度が徐々に悪化しながらも)それなりに測定可能だと思う。
もっとも、HS15のデータシート(の特性グラフ)自体が20MΩ付近で切れているので、
無理に測定しても意味があるかというと、それはもう目安程度にしかならないことになるのだけどさ。


しかし、湿度って言うのは随分とダイナミックに変動するものなのだな、というのが
一番の収穫かも知れない。
短時間にガクンと変わる。
しかも単純に「雨が降れば湿度が高い」というモノでもない。
なんつーか、オレ自身が一回りデカイ男になった気がするぜ(気のせいです)。

●今回の実験の手順メモ。

・AVRへの書き込み

AVR自体の使い方とかは略。
とりあえず「プログラム用フラッシュメモリー」と「ヒューズ」への、計2カ所への書き込みが必要。
何れも後述のライターで書き込み可能。
プログラムのHEXファイルはここ→
ヒューズの設定は以下の通り
    Low: -0111010
         ||||||++-- CKSEL[1:0] システムクロック選択
         ||||++-- SUT[1:0] 起動時間
         |||+-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)
         ||+-- WDTON (WDT 0:常時ON, 1:通常)
         |+-- EESAVE (Chip消去でEEPROMを 0:保持, 1:消去)
         +-- SPIEN (1:ISP禁止, 0:ISP許可) ※HVS時のみ

    High:---11111
            ||||+-- RSTDISBL (RESETピン 1:有効, 0:無効(PB5))
            ||++-- BODLEVEL[1:0] (11:Off, 10:1.8V, 01:2.7V, 00:4.3V)
            |+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
            +-- SPMEN (SPM命令 1:無効, 0:有効)

・PWM出力は湿度0〜100%に対しておおよそ0〜2V(つまり100[%]/256×Vcc)相当が出力されます。

・シリアル出力

8DataBit・1ストップビット・パリティ無し・9600bpsで、
カンマ区切りで
  抵抗の対数値(動作確認用)、温度、湿度、デリミタのCR(=0x0d)
の順に送信されるはずですが、見ての通り回路が手抜きなので注意。
あと、そもそものクロックが内蔵発振器なので、例えばウチの試作品はクロック微調値(CAL)が出荷時のまま放置なのだけども、
氷点下で文字化けが起きたりする。

※ちなみに、あくまで「今回こんな感じで実験したらこんな結果でした」というだけの内容なので、
他所で動作するかどうかは関知しないし、フォローもしないです。
一応、ソースコードはここ
開発環境のAVR Studio4 とWinAVRは、どちらもフリーで入手可だけども、
先にも書いた通りタイミング生成をソフトウェアのループで行ってるので、コンパイラのコード吐き方とかには注意が必要。
つーか、オイラのヘッポコなコードなんて無視して自分でアセンブラとかで書き直せばいいと思うよ?

※あと、HS15には関係ないけども、LM35とAVRの直結について。
コードでは温度測定時にLM35の出力を2回A/Dしてるけども、これは0V近傍のLM35のシンク能力が低下する領域において
どうもAVRのS/HのCを充電(つか放電)しきれない現象が起きてるみたいなので、その対策。
実はオシロを持っていないのでちゃんと確認出来たわけではないのだけどさ(汗)。オシロ欲しいなぁ。
というか、H8とかでも同じなんだけども、
この手のタイプのA/D入力端子って、入力インピーダンスが高いわけじゃないから結構面倒。
なお、AVRのA/D入力端子にCをぶら下げても解決するのだけども、そうするとLM35が(たぶん)不安定になるし、
部品が増えるのがイヤだし(←結局そこかよ)。

●「AVRはあんまり知らない」という人へ、簡単な紹介
今回使ったATtiny13Aは、見ての通り(写真右)足が8pinしかないのですが、
CR発信器を内蔵しているおかげで(水晶発振子を外部にぶら下げるためのピンが不要なので)
電源とRESET端子(←ISPに使う)を除く5つの端子がI/Oに使えます。

…えーと、5本です。
普通は「5本しか」と言うべきですね。
しかし、この5本という微妙な制約が自分的にはツボなわけだ。
単に無理矢理エクストリームスポーツ化してるだけじゃね?と言われると、
まさにその通りなので、あえて何も主張はしませんが!

逆に写真左の巨大な(?)mega168ならば、なんにも考えなくても大抵の事はこなせるわけで、
悩む必要が少ないぶんだけ、面白みも少ないかもしれないわけでございます(USARTも付くし、ROMも16kbyteまで増えたりする)。

参考までにtiny13Aは秋月で\120だった。

あと、今回使用した書き込み器はこんな感じ↓。ChaN様のとこのコレを使わせていただいております。

PCのシリアルポートに繋いで使います。
見ての通り、部品代は\500もかからないくらいで、むしろ組む手間の分だけ遠回りなのがイヤな人もいるかもだけど、
まあ、あまり短気にならずに、このくらいはのんびり作った方が人生は吉じゃないかと。

そんなわけで、なんかAVRをプッシュしてるように見えるかも知れないけど、そんな事はないですぜ?
H8とかも好きでっせ?

…って、ああPIC、おまえじゃねえ、座ってろ

例えば「PICの入門書を書いてくれ」などという依頼があった場合に、
書ける書けないとか、売れる売れない以前に
そもそも入門者にPICを紹介することが道義的にどうか?みたいな事を最初に悩んでしまうぜ(汗)。

●おまけ
というか、良く考えたらAVRの消費電力ごときは
シリアルポートからでも十分に供給出来る事に気が付いたので
電源不要版を作ってみた。

回路は何の変哲もなく、こんな感じ。

見ての通り、DTRから電源をいただく事になるので、
PC側でDTRをEnableする必要がありますが、
なんかTeraTermとかはデフォでEnableしてるみたいで、そのまま動くなぁ。

XC6202P502というのはCMOSの3端子レギュレータで、低ドロップ&低消費電力。
以前に秋月でゲットしたものが偶然手元に有ったので使ってみたけども、
相手が普通の真っ当なCOMポートならば(出力電圧が6V程度しか出ないようなCOMポートでなければ)
普通の78L05とかでも動いちゃうと思う。

●んで、まとめ
…と言っても、何をやっていたんだろうオレ(笑)。
つか、いろいろやったなぁ。
段ボール箱とドライヤーで恒温槽つくったけどダメだったりとか
PCのオーディオ出力を冷蔵庫まで引っ張っていって、冷えたHS15にホイートストンブリッジしたりとか。

いろいろやる中でちょいと思ったのは、
もしこれを仕事で請けたのならば、どの分野の人間に担当させるべきかという事。
温湿度・アナログ回路・ソフトウェアどれも大事なのだけども、
誰に担当させても「○○の部分はオレの分野じゃないッス」というセリフを聞く事になるんじゃないだろうか。
特に組み上がった後だな、どうやって評価すんのとか、それでうまく動かないなら誰が原因を調べたり対策したりするの、みたいな。
同じ理由で、分野を跨いだようなアイディアって出づらくなっているんじゃあないだろうか、近頃は。

単一分野の専門屋というのは、割合に教育も容易だし求人も楽なのだけども
こういった「なんかよくわからんモノをまとめる」専門家ってのも必要になる事がある。

ただ、この「なんかよくわからんモノをまとめる」専門家というのは
ガッコとかで「なんかよくわからんモノをまとめる学科」を修めたらOK、という類のモノじゃないあたりが
厄介なんだけども、実はそんなに難しい事じゃなくて、
要するに雑用係なんじゃないかと思うわけなのだが、どうだろうか。