ねこにコベイン

にゃーにゃーにゃー

SFX電源の温度を測る話

致命的な問題(現時点)

arduinoPWM制御の前提となる温度測定ですが、現時点では致命的な問題あり。
温度を試しに測定しようと、センサ部分を手で握って測ると、7セグに出るようにした温度表示がパタパタ変わって、1分間ほど観察してみた結果、私の手の温度は21℃~41℃の間らしいことが分かってしまった!
…うん、それほぼ測ってる意味ねえじゃん。ていうか手で持ったから、静電気とか?の影響を受けて、測定結果がよくなかったのか…
f:id:nyarinkopv:20200506145923j:plain

問題の解決を試みる

センサーが悪いのか

まずは秋月のホームページで代替の温度センサ、アナログじゃなくてI2Cなら精度上がるかなあと思って探してみたけど、また秋月と配達のヒト煩わせるのも忍びない。
あと思いのほかI2Cのセンサは高い。今使ってるのがアナログセンサだとすると30円くらいからあるのに対し、I2Cは最安のやつが250円~キット品500円*1
出せない金額じゃないけど、それで精度が上がる保証もない*2
…そもそも温度てどこで測るんだコレ?「気温」測るって、センサ部分に何かくっつけて測る感じで使うもんではないんではなかろうか。
何となく暗雲が立ち込めてきたので、考えるのを止そう…

ほかの手?

この際ファンをフル転で使う前提で静音ファン探してこようかと思ったけど、ファン買うともっと金が要るし、付属のファン、実は性能が良くて、手持ちの薄型ファンより音が静かだったりもする。ファン交換の方が博打要素が強い…

f:id:nyarinkopv:20200506150407j:plain
Scytheェ…と書いてサイテェ、と読む?

何とかならんか

このまま予備のセンサで作り直すか、何とかお直しできないかなあ、などとArduinoのプログラムのソースを読んでみたよ。
Arduinoあるあるですが自分でプログラム組むわけじゃなくてコピペで動くもんデッチ上げてるもんだから、どんなプログラム組んだか全然覚えてない。
「5日後(3時間後?)の自分は別人と思え」(時間はうろ覚えだけど、まあ意味は変わらんからいいか)みたいなマーフィーの法則を久々に思い出したよ*3
でも今回は(都合のいいことにその辺の自覚があったわけだ。)、プログラム組んだ頃は何か変な方向に凝っていたのか、コメントにコピペのネタ元のブログを貼り付けてたのね。
あとピンの意味とか。
だもんで何となく元ネタブログ界隈を徘徊して、分かってきたことなんだけど、

  • 未来の俺に教えてやるけど、お前が使ってるセンサってたぶんMCP9700てやつな。秋月で30円*4
  • 気づいてると思うけど9700、チップの印字が細かすぎて老眼鏡掛けても今の俺がお道具箱からスペア探すのチョイ無理ゲー。あるもん直す方が断然楽だよ。
  • MCP9700はArduino側で補正計算すると、ある程度精度が上がる。でもそれは校正の面であって、上下にぶれるかはちょっと分かんない。
  • 上下にぶれるというのは…こういうのってとにもかくにも電圧の安定性に左右されるんでねえか?
  • USBから電源取ってるの、どうもそれは電圧不安定の一因みたいだぞ。
  • あと入れる電圧は低い方が精度が保てる。
  • 外から+3.3V入れたくなってきた頃合いだと思うけど、それソースコード変えないといけないからね。

うーん…Arduinoへの入力電圧を安定した値に張り付くソースから取ることと、リファレンス電源を3.3Vにすることは、ATX電源を使うから同時に実現できるとして、それでビシっと指す温度が安定するかなあ?
(後述のとおり、しないんだけど。)

明日に向かって

3V3いただきます

f:id:nyarinkopv:20200506161949j:plain
まずやるのはSFX電源のマザー行きのコネクタから+3.3V、元ネタブログ風の表記をするなら3V3を分岐させること。
ちなみに+3.3Vのケーブルカラーはオレンジ色ね。
Arduinoの主電源にする赤(+5V)も分岐させるか、
こないだの紫(+5V、standby)を使うか。
ついでに黒(GND)ももう一本。

3V3どうでしょう

では電源オンして3V3の電圧のブレ具合をみてみます。まあ、こいつが激しく動くような電源だったらそもそも自作PCには使いたくない訳では、あるのですが…
f:id:nyarinkopv:20200506160251j:plain
ハイ、無負荷状態では3.443Vで張り付いて値は揺れません。PCの電源ってすごいねえ。

次に計測中にいったん12Vに負荷を掛けて、3V3の針の値をみてみましょう。白色LEDのアレイを繋げているので、2.5Aくらい消費しています。
f:id:nyarinkopv:20200506160420j:plain
面白いことに無負荷状態と比べて3.501~3.503V付近と、0.05V位上ぶれした値を指します。調整なりで3.3Vがずいぶん上ずっちゃうみたいですね。
負荷状態によって2.5Aで0.05Vだから、最大でも0.1V位の値ぶれはありそうです。
でも大事なのは、値が固まったらそこからは10mVもぶれない、ということの方ではないか、と。
これで温度が安定しない問題が、電圧の不安定さかセンサの使い方誤り等か、切り分けができるんでは、ないでしょうか…
(ちなみに5Vもテスター読み5.3Vで負荷時に安定してました。)

でもね

f:id:nyarinkopv:20200506171226j:plain
AREFに3.3V入れて+にATX電源5Vを繋ぎ、安定した電圧というヤツで測定してみたんだけど…温度はぜんぜんぶれまくるね。しかもまあ中間・最頻ゾーンの数値が平均的に健康なヒトの体温より2度ほど高い。さすがに38℃は無えよ…ヒートシンク普通に冷たいもん。
温度計付きデジタル時計を排気口に当てて温度表示と見比べても、なんか変にずれてるし。うーむ…

あと、何故か(これまた都合よく)MCP9700を買った時の部品袋が出てきて(スペアが7個と日本語解説書が出てきた)、何個か入れ替えてみたけど、どれも似たような挙動を示す。
これは9700の値がもともと安定しないもんだという事なのか、あるいは使い方を根本的に間違っているのか…

発想の転換

Arduinoのソースを見ていて、1024段階の入力値に掛け算して電圧値に直す段があるんですが、どうせ電圧は安定しているものの3V3ピッタンというわけでもないので、ここを現在の温度に合うように、入力値の中央値目算に掛ける係数をデッチ上げればいいんではないか、と。つまりこんな感じ。Arduinoからシリアル出力をプロットで取ったやつをジーっと睨んで、元の3300から調整した2670という値が、実機合わせの係数となる*5。…アレ?本来の入力電圧は3.45V位のハズじゃないのかよ?なんで低くなってんだ…?ホントにテキトーだなあ…

  // put your main code here, to run repeatedly:
  int reading = analogRead(voutPin);  // 0 ~ 1023
  // Analog -> mV
  float voltage = ((long)reading * 2670) / 1024;
//  float voltage = ((long)reading * 3300) / 1024;
//  float voltage = ((long)reading * 5000) / 1024;

かくして

無理やり温度計の値読みを合わせたけど、PWM制御するのに実は温度読みはあんまり関係ないというか、シリアル入力の読み値がここを超えるとヤバいんでねえの?、という値をプロットで眺めてエイヤーで制御すればいいんでないかな、なんぞと。
ファンがフル転以上には冷えないんだから、フル転時のはずれ値をトバしたおおよそのMaxをプロットをジーっと睨んで決め打ちして、それを超えたらフル転、超えるまではお好みの静かさ迄dutyを下げてやればいいだけなんだもん。
というわけで次回に続く。

オマケ

更にボロボロ剥がれる塗装…
でもブラックライトで光るのは男のロマンだから、これはサフ打ちからやり直しをしたいところではあるね。

*1:ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール: センサ一般 秋月電子通商-電子部品・ネット通販

*2:500円の部品に600円の送料出すか、というのもある。こないだは140円の部品におんなじ送料出したわけだけど。

*3:真夜中は別の顔アカデミー出版、なんていう小説があったけど、概ね同じく、真夜中くらいには別のヒトが書いたコードかと思えてしまうわけだ。

*4:温度センサーIC MCP9700A−E/TO: センサ一般 秋月電子通商-電子部品・ネット通販

*5:本当は1000個くらい値をストアして移動平均を取ろうかと思ったんだけど、メモリ食いそうだったから止めた。