MAX31865、温度センサーPT1000、RaspberryPiで温度ロガーを作ってみた
温度を精度良く(±0.5°C)計測する必要があったので、MAX31865というRTD専用のアナログ・フロントエンド+デジタル変換ICを入手。これをラズパイに繋いで温度ロガーを作った。これが結構な地獄編だったので、備忘録も兼ねて失敗談をQiitaに投稿することにした。
Amazonで購入したMAX31865は紫の基盤。
リファレンス抵抗Rrefは431と表記あり。テスターで測ったところ400前後の値だった。
つまりRrefは430Ωということ。本当は4300Ωが欲しかったのだが仕方ない。4300Ωの抵抗は付属していなかった。
MAX31685組み立て
組み立て方法については公式に詳しく記載あり。純正は青色基盤。
付属で付いていたピンをハンダ付けし、組み立て完了。
手持ちのセンサーはPT1000(1000Ω)
高級感あふれるクラスA!これを使いたい。
ただし、PT1000を使うには、Rrefは4300Ωでないといけない。
今回、サンプル間の温度の差分を測定することが目的であったため、イレギュラーではあるが基盤に実装されている430Ωをこのまま使用することにした。
センサーのリード線は2本。とりあえずリード線をRTD+/RTD-にねじ込む。
配線
これも公式に記載あり。
公式の配線に従ってMAXとラズパイをジャンパーワイヤー(メスーメス)で接続。
ラズパイの設定
ラズパイで以下。
sudo raspi-config
Interface Options → SPI → Enable → Reboot
sudo pip3 install adafruit-circuitpython-max31865
エラー出る。Externally managed environment
以下を試す。
sudo pip3 install adafruit-circuitpython-max31865 --break-system-packages
いけたっぽい。次はpython。
以下を実行して温度を出力。
import board
import digitalio
import adafruit_max31865
spi = board.SPI()
cs = digitalio.DigitalInOut(board.D5) # GPIO5 (Pin 29)
sensor = adafruit_max31865.MAX31865(spi, cs, rtd_nominal=1000.0, ref_resistor=430.0)
print(sensor.temperature)
-242.02と出た。
この数値、RTD入力がオープン/異常状態のときに変換結果として出やすい値らしく、
配線ミス or 設定ミス or センサー未検出らしい。
配線:合ってると思う
設定:合ってると思うがPT1000とRref430の組み合わせがそもそもNGかも?
センサー未検出:あやしい?
センサーリード線ねじ込み直し。何回か測ってみる。
-239.8298380940204、-240.12214812352659、-240.7065022269303
変な値だがちょっと動いてる。センサー未検出が原因か。
pythonちょっと追記。
import board
import busio
import digitalio
import adafruit_max31865
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(board.D5)
sensor = adafruit_max31865.MAX31865(
spi,
cs,
rtd_nominal=1000.0,
ref_resistor=430.0,
wires=2, # 明示的に2線指定しておく
)
print("temp:", sensor.temperature)
print("fault_raw:", sensor.fault) #faultの中身を見る
結果
temp: -234.5326031655652
fault_raw: (False, False, False, False, False, False)
配線はOK、温度がおかしい。やはりセンサー未検出か。
以下のようにpython追記。抵抗値も読んでみる。ついでに10秒連続測定。
import board
import busio
import digitalio
import adafruit_max31865
import time
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(board.D5)
sensor = adafruit_max31865.MAX31865(
spi,
cs,
rtd_nominal=1000.0,
ref_resistor=430.0,
wires=2,
)
for i in range(10): #10sec連続測定
print(i, "R_measured:", sensor.resistance, #抵抗値測定
"temp:", sensor.temperature,
"fault:", sensor.fault)
time.sleep(1)
結果
0 R_measured: 0.0 temp: -225.31 fault: (False, False, False, False, False, False)
1 R_measured: 0.0 temp: 9.39 fault: (False, False, False, False, False, False)
2 R_measured: 1717.61 temp: -242.02 fault: (False, True, False, False, False, False)
3 R_measured: 0.0 temp: -234.99 fault: (False, False, False, False, False, False)
4 R_measured: 0.0 temp: -242.02 fault: (False, True, False, False, False, False)
5 R_measured: 0.0 temp: -239.83 fault: (False, False, False, False, False, False)
6 R_measured: 427.27 temp: -242.02 fault: (False, True, False, False, False, False)
7 R_measured: 0.0 temp: -242.02 fault: (False, True, False, False, False, True)
8 R_measured: 0.0 temp: -242.02 fault: (False, True, False, False, False, False)
9 R_measured: 0.0 temp: -213.25 fault: (False, False, False, False, False, False)
抵抗値がゼロ!たまに読む。温度おかしい。センサー未検出確定。
ねじ込み直しを何度か試みるがだめ。このねじ込みターミナルそのものの接触不良かも?
ハンダやり直し
ここでねじ込みターミナルを外すことにした。
ニッパーでプラスチック部分を割りながら引っ張って取り外す。
ピン部分はハンダごてで温めて穴の中のハンダ吸い取り、暖かいうちにニッパーでピンを引き抜く。
途中ピンが1本折れてスルーホールの中に残ってしまったので、ハンダを溶かしてピンセットで取り除く。
さて、大変だったがターミナルを外し、スルーホールにセンサーのリード線を直接ハンダづけ。テスト測定してみる。
0 R_measured: 2907.171630859375 temp: -233.6415537192387 fault: (False, False, False, False, False, False)
1 R_measured: 30.8380126953125 temp: 785.5563399363994 fault: (False, False, False, False, False, False)
2 R_measured: 840.36865234375 temp: 502.333583675224 fault: (False, False, False, False, False, False)
3 R_measured: 0.0 temp: 53.49103488875352 fault: (False, False, False, False, False, False)
4 R_measured: 1007.6812744140625 temp: -242.02 fault: (False, True, False, False, False, False)
5 R_measured: 0.0 temp: 48.03703307489716 fault: (False, False, False, False, False, False)
6 R_measured: 0.0 temp: 20.156518317691912 fault: (False, False, False, False, False, False)
7 R_measured: 115.6097412109375 temp: -241.29050127968563 fault: (False, False, False, False, False, False)
8 R_measured: 3049.945068359375 temp: -215.77507267363762 fault: (False, False, False, False, False, False)
9 R_measured: 2805.340576171875 temp: -98.79521879015631 fault: (False, False, False, False, False, False)
抵抗値、温度めちゃくちゃ、まだ接触不良っぽい。ハンダやり直し再測定。
0 R_measured: 4266.2750244140625 temp: 955.5785055295 fault: (False, False, False, False, False, False)
1 R_measured: 4274.9359130859375 temp: 968.6209571494029 fault: (False, False, False, False, False, False)
2 R_measured: 4273.6236572265625 temp: 947.9171468275332 fault: (False, False, False, False, False, False)
3 R_measured: 4086.7584228515625 temp: 942.0473099216135 fault: (False, False, False, False, False, False)
4 R_measured: 4212.2100830078125 temp: 987.8909550398926 fault: (False, False, False, False, False, False)
5 R_measured: 3883.6212158203125 temp: 982.5384376484839 fault: (False, False, False, False, False, False)
6 R_measured: 4140.5609130859375 temp: 985.0000595674494 fault: (False, False, False, False, False, False)
7 R_measured: 4256.8267822265625 temp: 985.6632356503567 fault: (False, False, False, False, False, False)
8 R_measured: 4194.8883056640625 temp: 986.3265951766977 fault: (False, False, False, False, False, False)
9 R_measured: 4245.41015625 temp: 977.3394577302881 fault: (False, False, False, False, False, False)
温度おかしいけど、抵抗値は読んでる?
rtd_nominalとref_resistorの数値をいじってみる。
応急処置的に
rtd_nominal=925.0,
ref_resistor=1000.0,
にしてみると
0 R_measured: 964.29443359375 temp: 13.708086853643483 fault: (False, False, False, False, False, False)
1 R_measured: 983.856201171875 temp: 18.644648400662984 fault: (False, False, False, False, False, False)
2 R_measured: 998.199462890625 temp: 10.963028709743279 fault: (False, False, False, False, False, False)
3 R_measured: 983.428955078125 temp: 15.429124299076705 fault: (False, False, False, False, False, False)
4 R_measured: 987.1826171875 temp: 18.899306614395712 fault: (False, False, False, False, False, False)
5 R_measured: 998.779296875 temp: 19.49358407561761 fault: (False, False, False, False, False, False)
6 R_measured: 997.6806640625 temp: 20.274794136471805 fault: (False, False, False, False, False, False)
7 R_measured: 997.98583984375 temp: 20.461632121476374 fault: (False, False, False, False, False, False)
8 R_measured: 995.452880859375 temp: 16.353591091494298 fault: (False, False, False, False, False, False)
9 R_measured: 977.264404296875 temp: 20.3597192066692 fault: (False, False, False, False, False, False)
ふらつくが、抵抗値、温度、読んでるかも?ただし現実として室温が5度以上ふらつくことはないので、接触不良がまだ治っていないと判断。
暫定値の
rtd_nominal=925.0,
ref_resistor=1000.0,
これらはこのままキープ。またセンサーのハンダをやり直してみる。
0 R_measured: 998.4130859375 temp: 20.67396061288686 fault: (False, False, False, False, False, False)
1 R_measured: 999.45068359375 temp: 20.308763907237655 fault: (False, False, False, False, False, False)
2 R_measured: 999.603271484375 temp: 20.597520811739134 fault: (False, False, False, False, False, False)
3 R_measured: 999.57275390625 temp: 20.34273402108562 fault: (False, False, False, False, False, False)
4 R_measured: 999.267578125 temp: 20.478617907507825 fault: (False, False, False, False, False, False)
5 R_measured: 999.359130859375 temp: 20.623000552415863 fault: (False, False, False, False, False, False)
6 R_measured: 999.603271484375 temp: 20.38519714587127 fault: (False, False, False, False, False, False)
7 R_measured: 998.59619140625 temp: 20.67396061288686 fault: (False, False, False, False, False, False)
8 R_measured: 999.481201171875 temp: 20.563548124443535 fault: (False, False, False, False, False, False)
9 R_measured: 999.6337890625 temp: 20.70793441552442 fault: (False, False, False, False, False, False)
キターーーーーー!!!
これでOK!!!!!
に思われた。
翌日、再測定してみると
0 R_measured: 720.27587890625 temp: -10.47245162225795 fault: (False, False, False, False, False, False)
1 R_measured: 865.478515625 temp: -36.837882024836986 fault: (False, False, False, False, False, False)
2 R_measured: 401.153564453125 temp: -82.51020141406873 fault: (False, False, False, False, False, False)
3 R_measured: 419.61669921875 temp: -92.68510203337651 fault: (False, False, False, False, False, False)
4 R_measured: 126.678466796875 temp: -0.3504641524097212 fault: (False, False, False, False, False, False)
5 R_measured: 624.908447265625 temp: -5.006515629102894 fault: (False, False, False, False, False, False)
6 R_measured: 899.23095703125 temp: -4.382710275869177 fault: (False, False, False, False, False, False)
7 R_measured: 340.14892578125 temp: -88.6549429500292 fault: (False, False, False, False, False, False)
8 R_measured: 856.292724609375 temp: -35.16002795788009 fault: (False, False, False, False, False, False)
9 R_measured: 350.7080078125 temp: -95.69682067596833 fault: (False, False, False, False, False, False)
ぎゃあああああああ!!!温度が、温度がああああああ!!!
これはいかん、ハンダか、ハンダなのか・・・またやり直し????
と、ここで基盤のwire設定を忘れていたことに気付く。
MAX31865ライブラリはデフォルトで4線想定になっており、実基板側でも2-wire / 3-wireのジャンパ設定を物理的にハンダで切り替える必要がある。
2線なら、2 Wireのところをハンダでショートさせなければならない。以下の写真の赤丸部分。
そこでこの2 Wireの部分にハンダを盛りショートさせる。
測定。しかし温度がまだ暴れる。
結局センサーのハンダをやり直し。
すると以下のように落ち着いた。
20.275, 20.598, 20.190, 20.113, 19.986, 20.190, 19.935, 19.901, 20.631, 20.156
しばらく様子を見る。
この状態は数日間安定していた。ハンダの付け方がよかったようだ。
ハンダ、ハンダ、そしてハンダ
数日後、温度をチェックすると、また-242祭り。
はいはい、センサーのハンダね、わかってますよ。
やり直すと今度は、
20.801, 20.801, 20.801, 20.801, 20.801, 20.801, 20.801, 20.801, 20.801, 20.801
微動だにしない。センサーを触ってもビシィーーーーッと20.801。これはおかしい。
テスター確認
RTD+ ↔ RTD- 1080前後でふらつく
RTD− ↔ F− が低抵抗(ショート)
RTD+ ↔ F+ が導通なし
どうやら2 Wireのショートが中途半端らしい。2 Wireのハンダやり直し。
ハンダやり直しの時に気付いたが、ハンダが異様に弾く。原因はこれか?基盤は4 Wireだと認識しているのか?
ダメ元でセンサーのリード線に2本ずつAWG28線をハンダして4本足にしてみた。

そしてこの4本をF+, RTD+, RTD-, F-のスルーホールにハンダ。
測定したが、まだ20.801祭りのまま。
4本足を外し、念のため何もつけていない状態で測定。
0 rtd: 32767 temp: 20.801364142456332 fault: (False, False, False, False, False, False)
1 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
2 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
3 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
4 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
5 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
6 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
7 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
8 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
9 rtd: 32767 temp: 20.801364142456332 fault: (True, False, False, False, False, False)
rtd=32767 はADCフルスケール張り付きで、RTD入力がオープン or 無効な測定状態を示している。
つまり抵抗ついてないよと言ってる。それはOK。
温度はここでも20.801。これで20.801が意味のない値だと確定。−242ぐらい変な値ならすぐ気付くのに!
予備で買っていた同じPT1000(新品)をハンダでRTD+/-につけて測定。
0 10196 -164.5352026140331 (False, False, False, False, False, False)
1 4726 -206.75324315423157 (False, False, False, False, False, False)
2 4726 -206.75324315423157 (False, False, False, False, False, False)
3 4726 -206.75324315423157 (False, False, False, False, False, False)
4 4726 -206.75324315423157 (False, False, False, False, False, False)
5 4726 -206.75324315423157 (False, False, False, False, False, False)
6 4726 -206.75324315423157 (False, False, False, False, False, False)
7 4726 -206.75324315423157 (False, False, False, False, False, False)
8 4726 -206.75324315423157 (False, False, False, False, False, False)
9 4726 -206.75324315423157 (False, False, False, False, False, False)
ん?ちょっと動いた?温度読んでる?
抵抗設定値変えてみる。実測値通りの値を入れてみる。
ref_nominal=1000,
ref_resistor=430.0,
で測定。
0 1156 -238.6421503775905 (False, False, False, False, False, False)
1 32767 -242.02 (False, True, False, False, False, False)
2 0 -238.0916933601573 (False, False, False, False, False, False)
3 1344 -238.0916933601573 (False, False, False, False, False, False)
4 1344 -238.0916933601573 (False, False, False, False, False, False)
5 1344 -238.0916933601573 (False, False, False, False, False, False)
6 1344 -238.0916933601573 (False, False, False, False, False, False)
7 1344 -238.0916933601573 (False, False, False, False, False, False)
8 1344 -238.0916933601573 (False, False, False, False, False, False)
9 1344 -238.0916933601573 (False, False, False, False, False, False)
うーん、これはいつもの-242っぽい・・・
-242と20.801を延々と繰り返しているだけ・・・
そもそもの間違い
この基盤のRrefは430Ω。手持ちの抵抗はPT1000。
本来ならPT100(100Ω)用の基盤。
差分測定なら使えるんじゃ?と思ってここにPT1000をつけたのがそもそも間違いだったようだ。
MAX31865はRrefとRTDの比で測定レンジとSNRが決まる。
差分を取ってもノイズや見かけ上の非線形、オフセットは消えず、特にRrefが10倍ずれるとSNRが著しく低下する。
差分測定であっても、RrefとRTDの設計点がズレているとノイズが支配的になり、安定測定はできなかった。
実は最初の-242祭り時点で、このMAX31865、PT1000と根本的に合っていないのでは?という違和感はあったものの、センサーのハンダを付け直すと、つかの間ではあったが「いい値」が出てしまったため、その違和感を脇に置いたまま実験を進めてしまった。
結果的に、この判断が後半の混乱の原因だった。
Amazonで購入するMAX31865は、430と4300のどちらの抵抗が実装されているかわからない。
PT100, PT1000のどちらでも使えるように付け替え用の抵抗が付属されていることもあるようだが、私が購入したMAX31865には入っていなかった。安かったからかな・・・
純正基盤はPT100用かPT1000用を選べる。
ここは仕方ない。改めて純正品を購入してリベンジする。
この紫のMAXは、ネジターミナル引き剥がしと度重なるハンダ熱地獄に耐え、よく頑張った。フラックスの焦げが物語っている。ごめんね、ありがとう。
そして本件本当に勉強になった。次の純正品ではうまくやれるかも!
つづく
