【孔明の】K熱電対温度モジュールで高温を測ろうと(MAX31855 搭載モジュール)【罠】

2021年4月29日Arduino/ESP32K熱電対,MAX31855,ノイズ,バイパスコンデンサ,パスコン

これまた随分投稿の期間が開いてしまいましたが、、、

温度調節機能付きのはんだごてに憧れておりまして、とりあえず手持ちのはんだごてがどの位の時どの位の温度なのかを知りたいと思いまして。

K熱電対という何やら耐熱温度が非常に高い温度センサが使える温度測定モジュールを注文いたしました。

MAX31855 K型熱電対温度センサモジュール

MAX31855_01

MAX31855というチップが乗っているもので、各種温度センサーに接続してデジタル信号で温度を取得出来るんだとか。

PDF:MAX31855 Cold-Junction CompensatedThermocouple-to-Digital Converter

最高で+1800℃、最低-270℃までの広いレンジで、最高で0.25℃の精度で測定できるとの事。

今回使うのはK熱電対センサーですので、スペックシート通りなら-200℃~+1350℃までの範囲で測定が出来そうです。

・・・

本当か・・・?

このモジュールは3.3V駆動の様で、見事なまでにスッキリとした配線。

ボードに付けられているのは容量不明なコンデンサ一個だけです。

アルェ、、、なんかadafruitのモジュールだと、このチップコンデンサの他にいくつか抵抗が入っていた筈なんですがん?

このボードは見事にデータシートのまんま、MAX31855とチップコンデンサ一個だけ。

実に漢らしい作りになっています。

大丈夫なんか?と一瞬思ったのですが、、

adafruit等のモジュールの基板をよく見れば、

Vinにレギュレータとコンデンサ → 電源降圧
センサーとICの間にコンデンサとフェライトビーズ(インダクタ) → ノイズフィルタ
SPIのクロックとチップセレクトに抵抗とダイオード → レベルシフタ

SPIのDO(信号線)には何もついていませんが、Arduinoボードは2.57V以上あればHighですので3.3Vでも大丈夫という事なのでしょう。

つまり、ノイズ対策と5Vでも動作する様にしただけのものでした。

参考

他に私の手元にあるモジュールボードとの違いは、フェライトビーズの有無くらいか。

という訳であまり心配しない事に。

部品も無いですしノイズの有無とか確認できる測定器も無いですしおすし・・・( ノД`)

K型熱電対温度センサープローブ

そして、今回使うのはこちらのK熱電対センサープローブ。

MAX31855_02

説明書きに嘘が無ければ・・・

ステンレス管に溶接チップが入ったタイプの様で、管は200mm、700℃くらい迄測れるそうです。

持ち手の部分は樹脂製でしょうしケーブルの皮膜も樹脂っぽいですので、高温に長時間付けていると溶けてしまいそうな

本当は露出型の方が反応速度が速くて良さそうでしたが、揚げ油を測りたくなるかもと思いステンレス管入りにしてみました。

はんだ付け、接続

ひとまずモジュールに足付けと、付属の端子台も折角なので取り付けます。

MAX31855_03

プローブの方はメスコネクタが無いのでパカっと開けまして、オスコネクタを取り外し、ケーブルを直接端子台に接続します。

MAX31855_04

コネクタに+と-が刻印されており、センサーには極性がある様ですので覚えておいてください。

尚、逆に接続してしまっても、室温程度なら特に問題無くマイナスの結果が取得できるだけの様です。

MAX31855_05

しかしこれ、、、ショートしてまいか・・・?(´・ω・`)

・・・チャイナクオリティ

ちょっとアレなので、少し剥きますねコシコシ

MAX31855_06

このくらい剥けば端子台に挿してケーブルが捻られてもショートする事もないでしょう多分

ESP32との接続

さてこれらをSPIでマイコンと接続します。

進歩が無くてアレですが、今回使うのもNodeMCU-32s(ESP32)です。

いつも酷使されるESP32。

SPI接続は電源とGNDのほか、MISO、MOSI、CLK、CSの4つの線を接続します。

が、このMAX31855のボードには入力を受け付ける端子は無い様ですので、信号線は3つだけ。

VINとGNDは言うに及ばず、

VSPI MISO(GPIO19)→DO
VSPI SS(GPIO5)→CS
VSPI CLK(GPIO18)→CLK

といった感じにザクザク挿していきます。

そうそう、ミソ(MISO)とモシ(MOSI)はなんか変な言い回しで脳が浸食されますが、

それぞれ Master In Slave Out(MISO)、Master Out Slave In(MOSI)らしいですん

MAX31855_07

しかし毎度の事ながら、テキトーな・・・

なんかESP32のSPIはプルアップする必要があるそうなので、一応10kΩでプルアップしておきます。

今回はMISOとCLKだけなので少なくて助かりますね。

やった気がしないので、内臓プルアップは使わず抵抗を挟みました。

ほら、ESP32では無いマイコンを使う時忘れそうですし

回路図

MAX31855_14

回路図はこんな感じで。

だいぶテキトーな感じですが、、

MAX31855 Arduinoプログラム

さてではコードを。

Arduinoでやりますから呼称はスケッチか。

PlatformIOで「MAX31855 ESP32」でライブラリを検索すると、「MAX31855 by Rob Tillaart」というのが出て来ます。

今回はこのライブラリを使わせていただきます。

PlatformIO:MAX31855 by Rob Tillaart

スケッチはExamplesを見ながらこんな感じに。

#include <Arduino.h>
#include "MAX31855.h"

const int csPin = 5;  // VSPI SS
const int clPin = 18; // VSPI CLK
const int doPin = 19; // VSPI MISO

// インスタンス
//	今回はハードウェアSPIモードではなくソフトウェアSPIモードでテスト
MAX31855 tc(clPin, csPin, doPin);

// ハードウェアSPIならこれだけ。
//MAX31855 tc(csPin);

void setup()
{
	// シリアルスタート
	Serial.begin(115200);
	delay(1000);

	Serial.print("Start max31855: ");
	Serial.println(MAX31855_VERSION);
	Serial.println();

	// モジュール通信開始
	tc.begin();

	// 熱電対センサープローブ設定
	//	デフォルトはKらしいので特に設定しなくても大丈夫の模様
	//tc.setSeebeckCoefficient(K_TC);

	// 起動時熱電対センサープローブ係数表示
	float tcf = tc.getSeebeckCoefficient();
	Serial.print("SeebeckCoefficient:\t");
	Serial.println(tcf, 4);

	// とりあえず一回目取得
	tc.read();

	float t1 = tc.getTemperature();
	Serial.print("    temp before:\t");
	Serial.println(t1, 2);

	float t2 = tc.getInternal();
	Serial.print("    temp Internal before:\t");
	Serial.println(t2, 2);

	// 熱電対センサープローブを変更するなら
	/*
	Serial.println("\nChange default K-type to J-type ThermoCouple");
	tc.setSeebeckCoefficient(J_TC);
	tcf = tc.getSeebeckCoefficient();
	Serial.print(" SeebeckCoefficient after:\t");
	Serial.println(tcf, 4);

	// 二回目取得
	tc.read();
	float t2 = tc.getTemperature();
	Serial.print("     temp after:\t");
	Serial.println(t2, 2);

	Serial.print("     temp delta:\t");
	Serial.println(abs(t1 - t2), 2);

	Serial.println("\ndone...");
	*/
}

void loop()
{
	// ステータスチェック
	int status = tc.read();
	if (status != 0)
	{
		Serial.print("stat:\t\t");
		Serial.println(status);
	}
	// 温度表示
	Serial.print("Current Temp: ");
	Serial.println(tc.getTemperature(), 2);
	Serial.print("Internal Temp: ");
	Serial.println(tc.getInternal(), 2);
	Serial.println();

	vTaskDelay(1000);	// 1秒毎
}

が、、、

アルェ・・・?

MAX31855_08

なんか-999.00とか出て温度が取れません。

なんかよく判らないので、examplesに入ってたテストスケッチも試してみましたが

MAX31855_09

「SHORT TO GROUND」・・・?

はんだ付け失敗したかな・・・?

基板をよーく見ても、特に何処もおかしくないんですよぬ

とりあえずライブラリを変えてみようと、adafruitのライブラリを使ってみるも

MAX31855_10

「Something wrong with thermocouple!」

クマったンゴねぇ・・・

中国産:MAX31855モジュールの問題点

なんじゃらほいって事で調べてみますと、

げえっ 孔明!

・・・

Adafruit-MAX31855-libraryのプルリクエストにこんなのがありました。

adafruit / Adafruit-MAX31855-library:Thermocouple fault masking for dodgy breakout modules #31

読み進めていくと、最後に決定的なコメントが。

どうやらこのモジュールのボード、「MAX6675」用のPCBボードの模様。

要約すると、MAX6675のパターンにそのままMAX31855を載せているので、結線が違う。

このパターンではGNDである1番ピンとプローブのマイナス側の2番ピンを結線してしまっていて、MAX31855では動作しない模様。

MAX31855_16

回路図でいえばココ。

MAX31855_15

プローブを通る電流の抵抗値から温度をわりだすのに、GNDに堕としてしまっては全く抵抗値が判らないのは当たり前です罠

デスワナ。

対処法は、エラーを無視するか、パターンをカットしろ!

そして不安定ならT+とT-の間にパスコンを入れろ!(47~100nF位)

との事。

ひとまずT-がGNDに堕とされてしまっているのをカットします。

ほっそい隙間ですが、カッターナイフでおもむろに

Attack! Attack! Attack!

老眼にはきついンゴねぇ・・・

MAX31855_11

ふぅ、今日はこの位にしといてやるか

そしておもむろに電源ON

お、、

出てきますたょ? なんか-10℃とかおかしいですけど。

とにかく一応動作している感じです。

ライターであぶってみるとちゃんと100℃とか超えていくので、なんとなくはちゃんと動いている様子。

やっとMAX31855を動かし始める事ができました。

しかし問題が。ノイズっぽいのでバイパスコンデンサを

k熱電対プローブを素手で触ると温度が下がる・・・?

ガツっと10℃~20℃くらい下がります。

MAX31855_12

しかも指で温めたくらいでは温度が上がっていきません。

はて・・・

これは多分ノイズを拾っているのかな?

という訳で件の情報の中にあった、T+~T-の間にパスコンを入れてみます。

電解コンデンサは極性があるのと、今回使うのは小容量の為セラミックコンデンサを使ってみる事にします。

なんかセラミックコンデンサの方が周波数特性が良いらしいので・・・

知らんけど

ワールドのパイセンの方々が言うには、47uF~100uFを入れるとイイヨとか書いてあったのでとりあえず100uFを投入すると、少し数字が暴れなくなりました。

という事は、やはりプローブにノイズが乗っているので正解なのでしょうなぁ。

「触ると変化する」ケースは、ノイズって覚えとくといいです。多分。

しかし相変わらずプローブを素手で触った時に、温度が下がる現象は起こります。

バイパスコンデンサの選定は、ノイズの振幅と周辺回路の周波数に合わせた容量を選ぶんだとか何だとか何処かで見ました。

知らんけど。

今回のこれはパスコンの容量が大き過ぎるのではないかと思い、今度は1/10の容量の10nFを突っ込んでみますと、、、

内部の温度とプローブの温度差が殆ど無くなり、途端に数値が暴れなくなりますた。(´・ω・`)

そしてプローブを触っても温度が下がる事は無い。

バイパスコンデンサ、スげぇっス!

1nF、0.1nFと試していくとこんな感じに。

100nF暴れる触った時の温度低下あり
47nFやや暴れない触った時の温度低下あり
10nF暴れない触った時の温度低下なし
4.7nF暴れない触った時の温度低下なし
1nF暴れない触った時の温度低下なし
0.47nF僅かに暴れる触った時の温度低下が僅かにあり
0.1nFやや暴れない触った時の温度低下が少し

どうやら1nF~10nF辺りが一番効果がある領域の様子。

オシロスコープでもあれば、どんなノイズがどのくらい乗っているのか丸わかりなのでしょうけれど

生憎私は持っておりませんので、指センサーと数字で判断する実践派(ぇ

今回は私の神の指を信じて、4.7nFを入れておきます。

頻繁に変える必要も無いでしょうから、はんだ付けしてしまうま

問題が起きたらまた付け替えます。

MAX31855_13

尚、一応元のはんだは除去して付け直しました。

こういう時、芯線に触れる様にはんだ付けしないとたまに鬼抵抗になってしまいますので、はんだ除去後にコンデンサの足を芯線にクルっとひと巻きしてはんだ付けしてあります。

そして再び電源を入れてみると、計測される温度もかなり安定し全く乱高下しなくなりました。

勿論K熱電対プローブを触っても温度が下がったりはしません。

MAX31855_17

ノイズってこんなにも出るものなんですね。

もしかしたら先日テストしたINA226で測れば、ノイズがどの位の帯域なのか判るかもしれませんが、、、

なんだか計算とか小難しい感じがしましたので「大体で。」

初めてバイパスコンデンサの効果と意味を体験できますた。

まとめ?

そんなわけで一応MAX31855が使えるようになりました。

さて、この温度表示は果たして合っているのだろうか

私の人体センサーでは室温と計測値は大体あっている感じですが、、、

今度沸騰したお湯にでも突っ込んでみます(´・ω・`)

そういえば以前INA226で見たブレッドボード用5V電源とか、ひどいノイズが乗っていましたが、、

パスコン入れたら綺麗になるんだろうか。

オシロスコープはまだ私には早いかもしれませんが、こんな時にはあると便利なのかもしか。

何となくパイセンの方々に言われるがままに入れているプルアップやプルダウンの効果も多分見れるのでしょうな。

いやしかし、覚える事が沢山あり過ぎてビビります。

電子工作って楽しいですねぇ( ノД`)