随分手こずったが、ようやく、センサモジュール(YL-40)で温度(室温)が まともに測れるようになった。量が多くてちゃんとした文章にするのが大変なので、下書きの箇条書きを少し手直しして載せる。そのほうが却って読みやすいかも知れない・・・

なお、番号の箇条書きは時間順である。

YL-40の温度センサ(サーミスタ)での温度測定(計算)の調整・較正

  1.  サーミスタの温度が合わない(おかしい)。
    • ある温度に幅広い抵抗(その逆も)が対応するため、どうしても合わない場合ができる。
    • ただ、それ以外に変な挙動があった。: 温度計と全然合わないことがある。 (例: グラフ: 13時辺りの水色の線(温度計での室温)や13:30辺りのベージュの線(センサでの温度)の凹んだところ) → 後述の「センサ(サーミスタ)と温度計がズレたまま直らない問題」だった。
      • ADCの変換誤差、温度・電源変動かと思って調べたが違うようだった。
  2. 体温計のサーミスタを試す。 → やっぱりYL-40のでもいいんじゃない?
    • 古い体温計分解してサーミスタを取り出して、YL-40に繋げてみた
    • ある程度、それらしい温度が取れるようになったが、敏感過ぎるのか変動が激しい(グラフ: 赤線)。一方、YL-40は小さいケースに入っているせいか、温度変化速度が適度な感じ(グラフ: オレンジ)。
      • 近似式のパラメタが今ひとつのせいか、不安定なこともあるようだ。
      • ただ、YL-40も、サーミスタの仕様(B, R0, T0)がわからないと、正しい温度を得るのは難しい。
    • 体温計とYL-40のサーミスタの挙動(温度変化)が近かったので、YL-40でも行けそうな気がした。
    • 室温(温度計)との差は、計算誤差以外に気流や温度計の熱容量の影響もあることが分かった。
      • 場所でも異なる。たった20cmくらいでも、0.2℃くらい違う。
    • 体温計のサーミスタと取り付け基板を見て、マジンガーZみたいなアニメの操縦機とかボスボロットを思い出した。
  3. やっぱり、YL-40のサーミスタも合わないことがある(惜しい)。
    • 24℃台が駄目(低過ぎる)。
  4. → 近似式(Steinhart-Hartの式)を止め、通常の式(B係数を使うもの)に戻した。 → 25-26℃台はなかなかいい? (→ グラフ: ベージュ)
    • ただし、係数を試行錯誤で決めた。
    • 一番の決め手は、(Bでなく)R0(一般的に25℃での抵抗値)が仕様(と思われる: 参照したページより)の4.7kΩと異なっていたこと(約5%大きい感じ)。
      • 以前は直列抵抗を変えたが、それよりもちゃんと効く。
    • この頃は寒くなってしまったので、高温での確認ができなかった(が、後に充分できた)。
      • 過去データでシミュレーションはできて、それでは悪くない結果になっている。
    • 電源on後は、サーミスタや基板やケース全体が温まる(?)まで、約30分間は温度が低目になる。 ← 実はPCやアンプやサブディスプレイの熱の影響で、それらが温まるのに時間が掛かっていたのだ。(後述)
  5. 温度分解能を上げる(温度ステップを小さくする)ため、サーミスタの直列抵抗を5.7kΩに変更したが、全く効果がなかった・・・
    • 元の抵抗1kΩの代わりに付けていた4.7kΩを元の抵抗に直列に繋いだ。
    • スプレッドシートで試算しての経験則だが、温度分解能(温度レンジでの最大・最小電圧の比に関係する)を最大にする直列抵抗は、上限と下限でのサーミスタの抵抗値の相乗平均になるようだ。
    • ただし、電圧はADCで量子化されるので、その電圧ステップ・温度ステップと区切りの電圧・温度を考慮する必要があり、その結果、分解能の変化が吸収されてしまい、効果がなかった。
    • 現状の温度ステップは15-30℃の範囲では約0.36℃で、想定される温度誤差は約±0.36℃。
      • なお、オリジナルの温度ステップは約0.65℃。
    • その後、サーミスタの非直線性による量子化誤差のバラつきを減らすため、15-30℃でリニアライズできる抵抗4.1kΩに換えた。
      • リニアライズの原理を良く理解していないし、通常の直列抵抗とどう違うのかも分からない。ただ、AD変換の出力の区切りの温度がなるべく均等になりそう(→ 量子化誤差のバラつきが減る)だと思って試した。
      • 温度ステップは約0.36℃で変わらず。
    • その後、4.1kΩを構成する2本の抵抗の片方の精度が悪くて(5%)気分が悪いので、1%の20kΩに交換して4.06kΩにした。
      • おそらく、温度を計算する時に抵抗値を補正すればそのままで良かったのだろうが、精度が悪いものは温度特性も悪いかも知れないので交換した。
      • ところが、あとで試算したら、誤差に効くのは値の小さいほう(精度1%)だったので、無駄なことだった。が、戻すのは面倒なのでそのままにした。
    • 更に温度分解能を上げたくなり、ADCの基準電圧(VREF)を5Vから3.3Vに下げて分解能を上げることを検討し、サーミスタの直列抵抗を調整することで、現在の約1.5倍の分解能の0.23℃にできそうなことが分かったが、分解能と精度は異なるので、単に無意味に細かい数字が出るだけの可能性があるので、やっぱり止めた。(でも、やってみたいw → 結局実施した(後述)。)
  6. その後、高温(最大約29℃)で測ったら温度が合わず、試行錯誤してR0を調整して5040Ωで計算するようにしたら(Bは想定される仕様どおりの3977)、なぜかうまく合うようになった。
    • 5040Ωは元の値と思われる4.7kΩ+約7%。 → その後測っていたら、27℃で4.7kΩになることが分かり、サーミスタの仕様は「R0は(通常の25℃でなく)27℃で4.7kΩ」だったのかと思っている。
      • あるいは、R0は25℃で5kΩ(上の5040Ωとほぼ同じ: 誤差0.8%)なのかも知れない。計算上は同じ特性・曲線になるはずだ。
    • それからは なかなか「いい感じ」になった。高温(最大30℃)でも問題なかった。 (→ グラフ: オレンジ, R0調整前はベージュ)
    • 合わない原因として、温度による電源電圧の変動による影響を疑い、別の電源(USB)を使って電源(VGAの5V)の電圧を測ったが、余り関係なさそうだった。 (→ グラフ: 赤の前半。後半はVGAから電源を取って測ったので余り意味がない。)
      • 基板の電源に使っているPCのVGA端子の5VはPCの他の5Vと共通だろうから、大きく変動することはなさそうだ。
  7. つい魔が差してw、上記のADCの基準電圧(VREF)を5Vから3.51Vに下げて分解能を上げた。
    • ADCは一定の段階(YL-40は256ステップ)で区切って電圧を数値に変換するので、全体に割り当てる電圧範囲を狭めれば(= VREFを下げる)、1ステップ当たりの電圧が小さくなる。一方、サーミスタの温度は抵抗の電圧から求めているので、結果として温度ステップも小さくなる(= 温度分解能が上がる)。
      • 電圧ステップは元の19.5mVから13.7mVになった。
      • 温度ステップは元の約0.36℃から約0.25℃と、約1.4倍に向上した。
        • オリジナルは約0.65℃だったので、約2.6倍にまで向上した。
    • 予想以上に大変だった。
      • サーミスタの直列抵抗を測定可能温度範囲と15-30℃での直線性と分解能で調整した。 (参考: 直列抵抗とADC出力のグラフ)
        • 測定可能温度は5Vの時(グラフ: 青実線)は0℃以下でも可能だったのが約11℃以上と狭くなった。が、そもそもPCは10℃以上で動かすべきとのことなので、大きな問題はないとした。
          • ↑ 書くまでは7℃以上だと思い込んでいたが、グラフを見て「おや」と思って再確認して約11℃と分かった(VREFが5Vの場合と取り違えていたようだ)。ちょっと気になるが、まあ、室温が11℃のまま我慢できることもないだろうから、今のところは良しとする。
            • もし、7℃くらいの低温から使うなら、直線性は低下するが、抵抗を6kΩくらいにすれば良さそうだ。
          • なお、オリジナルの抵抗1kΩは、分解能は低く、直線性も悪くて何もいいことがない、まさに「テキトーに付けた」としか思えないものだ・・・ (グラフ: 黄実線)
      • 基板の改造量が「半端なかった」。 (後述)
        • 動作確認するまで忘れて居たが、光センサ(CdS)の直列抵抗も変える必要があった。
        • ジャンパピンで元の構成(Vref= 5V, 光・温度センサの直列抵抗)に戻せるようにしたせいもある。
      • 間違って(勢い余って)切ったパターンもあって、その修正もした。
      • ソフトの対応(光・温度センサの出力レベルの変換)や再較正も手間が掛かった。
  8. 当初の設置場所の机右側はPCやアンプやサブディスプレイの熱が影響する可能性があることが分かり、新たな位置を探した。
    • PC・アンプとセンサの電源onから数十分すると、測定される温度が上がるのが証拠(上記の「約30分間は温度が低目になる」)。
      • 当初はセンサ(サーミスタ)が定常状態になったと思って居た。が、それには長過ぎる。
    • 机から少し離れた本棚辺りだと影響が少なくなり、サーミスタの抵抗値と温度との相関が高まった(移動前に比べ、移動後は抵抗値に対応する室温の幅が狭くなった)が、まだ完全ではなかった。
      • 一方、影響のない離れたところ(壁際)は机の温度と異なるので体感に合わず、実用性がない・・・
    • 机の左端にした。
      • 前に障害物がないため今までより明るいので、その補正式を作った。
        • 明るさに応じて明るさを減らす。比例ではなく、とても明るい場合は より減らす。
          • l': 補正後の明るさ, l: 明るさとすると、
            • l'= m(l) * l
            • m(l)= k * l + m0
          • 現在のパラメタ: k= -0.0025, m0= 0.95
        • 当てずっぽうで作ったのだが、結局、2次関数での補正となった。CdSの特性は対数なのに、どうしてこれでいいのかは分からないが、使ってみると悪くない。
          • 使っている明るさの範囲でのCdSの抵抗値の曲線と2次関数の形が似ているのだろうか?
          • 対数・指数関数での補正も試したが、うまく行かなかった。式が間違っていた(対数と指数の順序が逆だった?)のかも知れない。
  9. 「センサ(サーミスタ)と温度計がズレたまま直らない問題」が勃発(再発)
    • センサの温度が温度計より低い・高いままの状態がしばらく継続する。 → 例: グラフ: 13時辺りの水色の線(温度計での室温)や13:30辺りのベージュの線(センサでの温度)の凹んだところ。
      • 例えば、暑くて冷房を強くしたあと、エアコンの風が弱まった場合に起こる。
    • なぜか、温度計(センサの場合もある)内部に熱・冷気が溜まることがあるようだ。
      • (1分くらい)ファンで送風すると温度計の温度が本当の室温に合う。
        • 手であおいでも、なかなか効果が出ない。
      • センサと温度計の反応速度差(熱容量による)もあり、なかなか原因が分からなかった。
      • そういうことがあるのか まだ疑問だが(普通は、時間が経てば熱は拡散するので)、この場合は温度差が1℃未満(0.5℃など)と小さいので、温度計のケース内の空気で長く保温されてしまうのだろうか。
    • センサは通風がいいように設置することが重要そう。
      • 何か(柱など)にくっつけると良くなく、孤立させたほうが良い。 → センサを台に直接付けず、スペーサーで約1cm離した
        • スペーサーは、PCケースのスロットの未使用レールを保持する部品を加工して作った。: 適当な大きさに切ったものを上下に貼り合わせて、センサのケースと台が貼れるようにした。
      • 温度計もその必要があるが、そういう作りではない。: サーミスタは浮いているが、ケースの中なので今ひとつな気がする。
    • 調整と測定の日々・・・
      • 場所や設定を変えては、日がな室温を変えつつ※温度計とセンサの値を記録してチェック・一喜一憂していた。
        • ※室温を変えるのは冷房のoff/onでやるので、なかなか身体には悪そうだ。が、まあサウナだと思えばいいかw
      • ADCの温度特性による変動も疑い、電池の電圧の測定もした。
        • 試しにドライヤーで35℃くらいに熱して冷ましたら、一時的に電池の値が1cnt上がったが、その後戻った。温度変化でADCの出力が変動したのか たまたまかは不明だが、温度の値がずっと変わったままになる(器用な)現象とは異なると考えられる。 (→ グラフ: ベージュ: 温度, 紫: 電池(電圧ではない))
        • → 結局、通常の状態では電池(電源とは無関係に電圧がほぼ一定)の電圧値は全くと言っていいほど変動せず(→ グラフ: 紫の線)、ADCの温度特性は問題ないことが分かった。
        • 最初は、定電圧を生成する部品(ツェナーダイオードやLDO)はないので、(無意味そうな気がしつつも)電源から抵抗で2.5Vを作って測ったが、ふと、「電池でいいじゃん」と気付いた。電力を消費しなければ、数時間くらいは問題なく一定電圧を保つだろう。
    • 結局、この問題と温度計とセンサの反応速度差、それからPCなどの熱のために温度計とセンサの値がずれて、計算式を何度も変えたり体温計も諦めたようなもので、なかなか意外なところに落とし穴が いくつもあった。

YL-40基板の改造

  1. 上記の温度センサ(サーミスタ)の直列抵抗を変更した。
    • 抵抗で直線性と温度分解能が決まる。
      • ADCを使う場合、直線性がいいほうが温度ステップが均等になるので良い。
    • 最初は4.7kΩにし、次に5.7kΩにし、その後約4.1kΩにした
  2. ボリュームを外し、パスコンを交換・追加した。(それらの温度変化による、電源・ADCへの影響を疑ったためだが、そうではなかった)
    • パスコンは元のを外し、タンタルとセラミックにした。
    • タンタルは大きいので、外したボリュームのところに付けた。
    • 味気なかった基板にオレンジと青が加わって、カラフルになった。
  3. ADC/DACの基準電圧(VREF)の変更: 温度分解能を高めるため、PCF8591のVREF(ピン14)の電圧を5Vから3.51Vにした。
    •  その電圧は抵抗で電源(5V)を分圧して作った。
      • VREFピンの入力抵抗がそれほど高くないせいか、最初に大きな抵抗を使ったら電圧降下したので、1/10(2kΩ+4.7kΩ)にした。
    • 当初は3.3Vを考えていたが、3.5Vのほうが手持ちの抵抗で作りやすく、3.3Vは おぼろげに浮かんで来ただけの値でw、ぴったりにする必要はなかったのでそうした。
    • 新しいVREFに合うように温度センサ(サーミスタ)と光センサ(CdS)の直列抵抗を変更した。
      • サーミスタは5.1kΩに、CdSは7.8kΩにした。
        • CdSの抵抗を換える予定はなかったが、CdSの電圧がADCに対してオーバーフローするので変更した。
    • VREFと各センサの直列抵抗を、ジャンパピン(P4,5,6)をショートすることで元の状態に切り替えらえるようにした。
      • CdSの抵抗も換えなくてはならなくなってジャンパピン3個を全部使ってしまったので、当初の計画だった、ジャンパピンで電源LED(D2)を暗く光らせるようにするのはできなかった。
        • それ以前に、ここまでの改造で疲れて する気も起こらなかった。
    • DACの出力も小さくなるので、そのままのプログラムからの出力ではLED(D2)が光らなくなったので、出力する値を調整した。
    • 思って居たより大掛かりな改造になった。: 基板表面は余り変化が分からないものの、裏面はジャンパ線と抵抗で一杯になった。
      • ジャンパピンからのパターンを切る時、思い込みでGNDを切ったり、勢いで、切らなくていいパターンまで切ってしまったので、その修復のための線が増えた。

※参考までに、最新のハードウェア構成図と改造後のYL-40基板の回路図を載せる。

スタンドやコードをちゃんとした。 → 光・温度センサのハードが完成した。

  • センサをスタンドのポールに取り付ける延長ポール付き台を作った。
    • 延長ポールは半田のケース(丁度、スタンドのポールに嵌まる)を、ポールと台の角度を付けるのにはスピーカー保護キットで使わなかったターミナルを挟んで接着した。
    • センサを取り付ける台は猫のカレンダーのベースを使った。
  • VGAコネクタをちゃんとした。
    • シェルの前側(コネクタを囲む部分)の前半分を後ろ半分に半田付けした
      • 元々は固定ネジ用の穴の内側からハトメのように固定されていたが、分解・改造するためにそれを外したため。
    • シェル本体(後側)の上下部は結束バンドで留めた。
    • シェル本体(後側)は前側の後ろ半分に爪で引っ掛かっているだけなので、コネクタを抜く時に引っこ抜けないか心配・・・ → あとでダクトテープを巻いた。

ソフトの拡充・改良

  • 部屋の明るさ、ディスプレイ輝度、室温をsensors(改造版)(図の"YL-40"以下)やMuninで出せるようにした(→ , )。
    • 「改造版」と言っても、元々Muninのカスタマイズ用にsensorsの出力を加工して出すものを作っていて、それにYL-40の値を追加しただけである。
    • Muninでは、明るさを1/2にして、温度変化を分かりやすくした。
    • Muninのグラフを比較して、マザーボードの温度は室温に比例することが確認できた。: マザーボードの温度= 室温+約6℃。
      • ただ、マザーボードの温度は1℃ステップなので、室温計の代わりにはならない。
  • Xfceのパネルに測定した温度(室温)を出せるようにした(図の"Room"の下)。
    • つい、湿度や外気温も ずらっと出したくなる・・・
  • センサ値を読む時にADCから値を連続して数回(現在は4回)取って平均することで、精度や分解能を少し改善できるようにした。
    • 雑音的な変動の影響が減らせる。
    • いつもではないが、センサの値がADCのステップの中間で変動している場合に中間値が取れる。
      • 例: ADCのステップでの温度27.76℃と28.01℃の間の27.82℃などが出ることがある。
  • 他にもいろいろしたい細かいことはあったが、基本的にちゃんと使えるので、まあ「おいおい」とした。

仕上げ

センサのケースの蓋を、結束バンドを成形したもので閉じた。固く締めておらず、引けば横に抜けるので、メンテも容易である。また、上述のように、センサの温度追従性を高めるため、スペーサーで台と離すことにした。

それを再度ちゃんとスタンドに付け設置して完成。 ・・・ だったらいいな^^

なお、下の写真を撮影したあとに、メインディスプレイ(EIZO CX241)の熱の影響を避けるため、センサをもう少し左、机の左奥の角辺りに移動した。サブディスプレイ(同S170)と違ってメインディスプレイの側面はほとんど熱くならないが、それでもわずかに熱を持つことが分かった(気がした)ためである。

ちなみに、今日(8/29)のYL-40での室温測定結果は問題なかった。既知の「熱・冷え溜まり」による温度差は一回あった(11:30頃)ものの、全体的に良く温度計に合っていた(温度計との差は概ね±0.25℃以内だった)。

雑感

  • 最初は、サブディスプレイの輝度の自動調整がしたかったから明るさが取れればいいと思って居たのに、いつの間にか温度がメインになってしまった・・・
  • 温度は意外に細かく測る必要があり(でないと体感に合わないことがある)、今の0.25℃ステップでも不満なくらいで、0.1℃ステップにしたいくらいだ。
    • もちろん、分解能だけ高くしても駄目で、その分の精度を確保する必要はある。
  • 冬になると今は測れない低い温度になりそうなので、また確認と調整が要りそうだ・・・
  • ついでに外気温や湿度も測りたいが、全然「ついで」には行かない。測れたって、「おもしろい」以外に特にメリットはない(それでいいんだけどw)。
    • 外気温は体温計のセンサが使えるが、そもそも較正がクソ面倒なうえに、接続ケーブルが長くなるのでトラブルが起こりそうだ。 (でも、おもしろそうではある・・・)
    • 湿度はセンサがない。あっても、サーミスタと違って抵抗値で測れる訳ではない。
  • まあ、いつものように随分横道に逸れて なかなか大変で疲れはした(+暑かったw)が、おもしろかったし いろいろな知識が得られ、体験ができた(という書き方は意識高そうで嫌だ)。
    • たった数百円(新たに買ったものはYL-40基板だけ)でここまで遊べたのは、なかなか「コスパがいい」^^
    • YL-40は やっぱりいろいろ甘く、熟練者が見たら「お前、何考えてんだ! 常識ないぞ!」とか どやしそうだが、まあ、こうやって遊び・考え・苦しみながら「どうにか使える」ようにするのも一興だ(とは、余裕があるから言えるw)。

 

かくして、久し振りに再び作業机が片付いた。

 

PS. いつの間にか、シチズン小(または大)の湿度計も劣化していた。大と小の差が大きく、8%くらい違う。

  •  0
  •  0

コメントを書く / Write a comment

名前 / Name    

メール / Mail 

URL