湿度センサー HS15P と LMC555 を組み合わせてみた

ボクのArduino工作ノート (鈴木哲哉さん著)を参考に、mbed への移植を試す Notebook です。

上記の本では、湿度センサー、抵抗、コンデンサーおよび 555 を組み合わせて発振させ、Arduino に入力している。

調べてみると、mbed NXP LPC1769 でも周波数を計測できるらしい。じゃぁやってみようということでまずは発振回路を検討してみた。

  • ちなみに図では R2 を一つ書いていますが、もし本当に必要な場合には、R2 の半分の値の抵抗を2本用意して R1 と HS15P の並列部分を両側からはさむほうが HS15P に対してやさしいはず。

/media/uploads/strysd/hs_15p.png

「ボクのArduino工作ノート」から下記を変えてみることにした。

  • 広い範囲を計るのではなく、機器制御用に、ある程度絞った範囲を計ることを目的とする
  • HS15P と並列の抵抗 R1 だけではなく、必要に応じて直列の抵抗 R2 も入れてみることにした。湿度が高くなると HS15P の抵抗値は下がるらしいので、もしかしたら発振周波数が高くなりすぎるのでは?と危惧した。
  • C の容量として 0.1μF 以外を試す
  • LMC555 の 7番ピン(Disch) をそのまま mbed につないで、ソフトウェア的にプルアップできるか試す。できないときは 3.3V から抵抗を物理的に接続する。

まずは、対象とする湿度の範囲を考えてみよう。 年間相対湿度のグラフを見ると、( http://todo-ran.com/t/kiji/13690 ) 日本各地の湿度はおおむね40から 90に入るようだ。マイコンで湿度を測定する目的を考えると次の3つかとおもう。

  • 湿度が高いので除湿したい。真夏とか
  • 湿度が低いので加湿したい。乾燥すると肌やのどが荒れますね
  • 湿度を一定に保ちたい。 上記2つの動作の組み合わせ。たとえば味噌とかしょうゆとか、はたまた日本酒の製造に必要なコウジ作りとか、農業関係では必要ですよね。多分この湿度センサーの本来の目的。

今書いているのが5月下旬で、これから暑くて蒸す時期なので、ここではまず、「どのくらい湿度が高いのか調べる」ことを目的としよう。温度は25℃から35℃くらい、湿度は60 から 90% の間をターゲットにすればよいかな?60%よりも低い湿度(乾燥度合い)の測定についてはまた後記

つぎに HS15P と R1 と R2 の合成抵抗を R としたときに、湿度センサー HS15P のデータシートの周波数 50Hz ~ 1kHz を満たせるような R と C の組み合わせを調べてみた。

有効数字は2桁です

C(μF)0.10.150.220.330.470.681
R(kΩ) for 50Hz140966644312114
R for 1KHz7.24.83.32.21.51.10.72

周波数の計算式 f = 1/(R * C * 約1.386) = 1/ (R * C * ln(2) * 2)

  • ln(2) は、2 の自然対数の値。 充電および放電にかかる時間が、上記の回路例ではそれぞれ R * C * ln(2) で決まるから、両方を足して逆数を取ると周波数になる、という理屈らしい。 

例 1/((3.28kΩ * 1000) * (0.22μF * 0.001 * 0.001) * 1.386) = 約1000

それでは R1 と R2 をそれぞれ決めてみよう。 HS15P のデータとして出回っているグラフを見ると、温度35℃ 湿度90% という「不快」な状態だと約900Ω、温度35℃で湿度が60%だと約10kΩ、25度で湿度が60%だと約20kΩらしい。 ってことは、R1に 62kΩ を使用すれば、R2 がなくても合成抵抗 R は 約15kΩから 約 0.88kΩの間を変化するので C に 1μFを使って組み合わせればうまくいきそうな気がする。

次に低い湿度のときはどうだろう?温度は15から25℃で、湿度は50%以下をターゲットにすればよいかな。日本国内で温度45度 湿度20%とかの高温低湿な状態は考慮から省いても良いはず。それから 温度15度以下も湿度を問題にするよりも先にまず暖房入れましょうという状態だよね。 25度で湿度が50%だと約60kΩらしい。湿度が10%違うとこんなに変わるんだね。 湿度が低いほうは20%のあたりで線が止まっていて、15度で湿度が20%だと約20MΩを超えるらしい。 この場合は、C は 0.01μF かな。R2 として10kΩを入れると、約20MΩ(誤差の範囲に収まっちゃう)から約70kΩの間を変動。さらに R1 として 1.5MΩを入れると、約1.4MΩから約70kΩの間を変動。 R2 は実際には2つに分割するので、 5.1kΩを2本用意して HS15P と 1.5MΩをはさんでみよう。

まずは、下記の回路を組んで、いくつか測定。

  • 使用した電池の電圧は 1.55V 。
  • HS15P の両端をテスターの直流電圧10V レンジで計ると 0V 。
    • ここが 0V 以外だと HS15P が劣化していくはず。
  • 同じく交流電圧10V レンジで計ると、約 0.4V 。
  • HS15P に息を吹きかけると、圧電ブザーから聞こえる音の音程が高くなる。
    • しばらく放置すると徐々に低くなる。
  • C1 のコンデンサを取り替えると、圧電ブザーの音の音程が変わる。
    • 0.1μ、0.22μ、0.47μ、1μ を入れ替え

/media/uploads/strysd/hs_15p_try1.png

/media/uploads/strysd/situdo_buzzar_test.jpg

次に、Neel さんの Frequency_counter プログラムを Fork して、割り込みによって HS15P の抵抗値 を出してみることにしました。プログラムはこちら

https://mbed.org/users/strysd/code/Frequency_counter/

回路図はこちら

/media/uploads/strysd/hs_15p_try3a.png

C 容量ごとに、割り込み間隔(μS)を何倍すると HS15P の抵抗値になるか早見表がこちら。 割り込み間隔は R * C * 約1.386、なので R = T / (C * 1.386)、 例えば C = 0.1 μF とすると、R = t_period(μS) / 0.1386、すなわち R(ohm) = t_period(μS) * 7.2 。

有効数字は2桁です

C(μF)0.10.150.220.330.470.681
倍数7.24.83.32.21.51.10.72
  • LMC555 を発振させ、 割り込みを一定の回数数えたら、mbed の P9 を 0 にして、LMC555 に リセットをかけます。約 300Hz で 20回割り込みを数えると、発振開始から停止まで 約66 ミリ秒(= 1sec/300Hz * 20回) です。 28℃で発振中の実測値で LMC555 の VDD には約 2.6V の電圧がかかり、約120μA (0.12mA)流れます。 LMC555 の発振を小刻みに止めるよりも、LPC1769 のクロックを下げるほうが一桁以上の節電になりそうですね。
    • 最初は LMC555 の VDD を P9 につないで ON/OFF していましたが、節電効果がさほどあるわけではないので、代わりにリセット端子を P9 につなぐことにしました。リセット中 (P9=0) は、LMC555 の VDD には 約90μA (0.09mA)流れました。
  • 最初は発振が安定していないと仮定して、最後の数回のみ割り込み間隔の値を読み込みます。
  • しばらく待ってから、割り込み間隔をもとに抵抗値を計算します。ただし、コンデンサー自体の誤差が大きいのであくまでも目安です。ちなみに C1 には積層セラミックではなくて、誤差が比較的小さいフィルム・コンデンサーの 0.1μF を使ってみました。
  • クロック数を変えたときは、それに応じて各種のミリ秒やマイクロ秒の定義値変更が必要です
    • 5分くらいすると LPC1769 部分が熱くなってきます。(触れないほどではない) クロック数を 96MHz から 48MHz に下げると若干緩和します。
  • 発振中の HS15P の両端には、実測値で約 1.0V の交流電圧がかかります。 リセット中は 0V でした。( mV 単位での直流成分はあるようです)
    • mbed の Vout に接続する部分にダイオードを追加して電圧降下させました。 電圧降下前は、LMC555 の VDD には約 3.1 Vの電圧がかかって、HS15P の両端には約 1.2V の交流電圧がかかっていました。 ダイオードは電圧を約0.5V下げる目的なので、汎用小信号のものでかまいません。(1N4148 とか) たまたま 1S1588 という製造中止品が若干入手できた (2013/6/5) のでそれを使いました。 リード線が最初から折り曲げてあるのでブレッドボードに挿すときに便利でした。
    • mbed の P9 から LMC555 の RES にかかる電圧が、VDD にかかる電圧を超えるとまずいかなと思い、同じくダイオードを追加しました。 P9 が L レベルのときにも RES に L レベルが伝わるように逆方向のダイオードもいれてあります。
  • 点線で示した位置に圧電ブザーを接続すると、動作しているかどうか音で確認できます。

(9月21日追記)

両電源用のオペアンプを単電源で使用したい場合に、レール・スプリッタを使うそうですが、そのレール・スプリッタの回路例から着想して、約1.6V の電源をオペアンプで作って LMC555 を動かしてみました。

/media/uploads/strysd/hs_15p_try4a.png

/media/uploads/strysd/hs15p_0925.jpg

  • 300kΩと 150kΩ で VU (約5V) を3分の一に分圧して、LM358N に入力しています。
    • 手持ちのカーボン抵抗の中から1:2の比率になるものを探して使いました。抵抗の誤差が5%あると、比率は 1.05 : 1.90 から 0.95 : 2.10 の範囲内のどこかになります。分圧結果は 1.78 (= 5 × 0.356)~ 1.55 (= 5 × 0.311)V の範囲と予測されます。 LMC555 が 1.5V で動作保障されているので、ぎりぎり大丈夫でしょう。
    • 22Ωと 470μF 2個の接続点の電圧実測値は、約1.55V でした。おおむね計算とおりです。
  • LMC555 の RES 端子は、抵抗で 1.55V に、ダイオードで mbed の P9 に接続しています。必要なときだけリセットを解除 (P9=1) して、LMC555を発振させます。
    • RES 端子をダイオードの代わりに 300Ωで P9 に接続すると、うまくコントロールできませんでした。
    • ダイオードに 1N4148 を使った場合、P9 に流れ込む電流の実測値は約 0.12mA、抵抗とダイオードの接続点の電圧実測値は 約 0.5V でした。もしかしてリセットの上限ぎりぎり?
  • 回路全体の消費電流は、約1mA 弱です。
    • オペアンプを追加したので、HMC555 だけのとき(約 0.09 - 0.12mA)よりもやや大きくなりました。
  • 発振中の HS15P の両端には、実測値で約 0.4V の交流電圧がかかります。 リセット中は 0V でした。
    • 前作では、何もしないでも徐々に抵抗値が上がる傾向がありました。今回の回路では、その傾向が少なくなったように見えます。

ここで回路の話の区切りとして、使用した部品をまとめておきます。

部品名個数購入場所その他
ミニブレッドボード BB-6011-9月21日追記の回路の場合、もうちょっと大き目のものが作業しやすいかも
オペアンプ LM358N1秋月電子手持ちの片電源用オペアンプの中から安価なものを使用。下記のCMOS 版タイマー IC の消費電力は微小なので、他でも広く代用可能と思われます。「Arduino工作ノート」の電源ICの代わりです
タイマー IC HMC5551秋月電子CMOS 版です
湿度センサー HS15P1秋月電子交流必須の素子です。部品単価が一番高いです。この素子にかかる電圧をできるだけ下げるためだけに、オペアンプを追加したようなものです
1N41481-1S1588や、ショットキーバリアダイオード の BAT43(千石通商2階) でも代用できることを確認済です
22Ω 1/2 W1千石通商私の好みで板状の金属皮膜抵抗を使いました。もし万が一 VU (5V) と 1.55V との間がショートすると、3.45V * 3.45V / 22Ω = 0.54 W になります
5.1KΩ1千石通商カーボン抵抗で可。10kΩでもかまいません
150KΩ1千石通商抵抗値の比が重要です。分圧結果として 1.5V 以上が得られれば良いので、誤差5%のカーボン抵抗でも大丈夫でしょう
300KΩ1千石通商同上
積層セラミックコンデンサー 0.1μF1秋月電子VU と GND との間に 470μF が直列で入っているので不要な気もしますが念のため使用
フィルム・コンデンサー 0.1μF1千石通商誤差の少ない種類を使ってみました。誤差5%とのこと
電解コンデンサー 470μF2千石通商耐圧は低くても大丈夫でしょう。16Vのものを使いました
はんだ--少々
ジャンパー14-ブレッドボード実験用のジャンパーセットなどから流用。うち4本は、mbed との接続用


Please log in to post comments.