ガス冷却ペルチェ方式霧箱 その27 熱電対温度計

その他のプロジェクト

外出自粛期間中のGW、しかも天気も比較的良いということで家の中でやきもきしている方もいらっしゃるかと思います。今はまだ我慢です。おとなしくしておきましょう。

ということで、みら太な日々のGWも自宅敷地内のみでの活動であります。
いろいろ雑多に進めてしまったので、五連休の最終日は投稿に充てたいと考えております。まず一件目は温度計の作製であります。
「君、温度計好きやな」と思われる方もいらっしゃるかも。これまでに温度計は何度か作ってきました。このあたりとか
今まで作ってきた温度計はすべて温度センサICを使ったものでした。このあたり

これらのセンサは基板が置かれている環境温度の計測なんかに使われることが多いのかな。サーミスタと演算回路を持っていて、測定した温度をリニアスケールの電圧で出力してくれます。測定範囲も-40~125℃といかにも電気製品が使われそうな温度範囲であります。このセンサ、お手軽に使えて便利ですが、私の用途、特に今回の霧箱のような用途では使いにくい側面があります。
まずでかい。そして厚いというか太い。霧箱ではペルチェ素子の冷却面と放熱面など面の温度を測定したい場合が多いです。このセンサは雰囲気温度を測定するには向いていますが、特定の点や面を測定するには不向きです。一応「このあたりで温度測っていますよ」という情報はありますが、なんせTOパッケージですから外乱を受ける側の面積が広いです。穴開けて埋め込むにも埋め込む側に厚さが必要です。なんともこのあたり扱いにくいのです。そしてその結果とも言えますが、レスポンスがいまいちです。急激な温度変化に追従しません。
さらに温度範囲も問題です。とりあえず-40℃あれば十分ではあるのですが、測定範囲の端っこの方はどうしても誤差が大きくなります。特に低温側は出力電圧が下がる方向ですのでA/Dのばらつきの影響も心配です。
といったことで今回検討するガス冷却ペルチェ方式霧箱では熱電対方式で行くことにしました。
熱電対についてはGoogle先生に聞いてください。たくさん教えてくれます。一般に異種金属の接合面には電位差が発生しますが、この接点を二つ使って閉回路とし、さらにその二点を異なる温度にすると温度差に依存した電位差が生じます。これはゼーベック効果として知られているものであります。二接点のうちの一方を基準温度において、他方の接点の電位を測定することで、他接点の温度を算出することができます。
ちなみに、ペルチェ素子はペルチェ効果というゼーベック効果の真逆の物理現象を使って温度差を発生させるデバイスです。

さて、その熱電対ですが、前述の通り異種金属を接続させればできてしまうので実にさまざまな種類のものが提案されています。代表的なものにはType**といった名称がついており、K型とかT型とかであれば使ったことがある方も多いのではないでしょうか。温度範囲とか、温度に対する電位変化の大きさとか、その温度範囲依存性とか、リニアリティとか、様々な都合で使い分けられております。
今回使う熱電対はTypeKであります。TypeK熱電対はアロメル/クロメルというニッケル合金とクロム合金を使っています。一般に外被覆が青、心線が赤と白で被覆されています。
熱電対の温度に対する電位変化は線形ではないので、温度を算出するためには結構面倒な計算が必要です。さらに基準点(氷水を使うことが多いですよね)を作るのも面倒であります。が、世の中にはそのあたりを解決したソリューション(笑)が提供されております。それが今回使用するIC,マキシムのMAX31855であります。(さらには、今回使う熱電対がTypeKなので、MAX31855Kということになります)
MAX31855は上記した熱電対を使うにあたっての面倒な事柄を全部解決してくれてます。熱電対繋いで電源供給してやれば、SPIから温度を14bit精度で吐き出します。
さらにさらに、このMAX31855をArduinoと組み合わせて使うにあたっては、Adafruitからモジュールとライブラリが提供されており、これらを用いればほぼ何も考えずに温度測定ができるようになっています。素晴らしい世の中ですね。
さらにさらにさらに、このMAX31855モジュールには互換品が安く大量に出回っております。このあたり。

このモジュールは安くて素晴らしいのですが、Arduinoで使うにはひとつだけ注意点があります。それは電源も出力ロジックも3.3Vなのです。ご存知の通りほとんどの種類のArduinoは5V系で動いておりますのでそのままでは接続することができません。
Adafruitのモジュールはそのあたりまで考えた設計になっておりまして、5V電源が接続可能です。ただし値段は数倍します。
ということで、節約をモットーとする(笑)みら太な日々では当然互換品を選択します。で、3.3V問題は、電源についてはArduino nanoに供えられている3.3V供給端子を使い、ロジックについては外付けのレベルコンバータモジュールを使うことにします。
「レベルコンバータモジュール追加で買うんかよ」というなかれ、これめっちゃ安いんです。たとえばこれ。

送料考えても一つ50円しません。ということで合計しても正規モジュールよりずっと安いのです。

では作っていきます。みら太な日々としては久々のガチ電子工作の投稿となります。
あ、その前にもう一つ(笑) こて先を変えました。これがなかなか良いのでご紹介。

これです。

AliExpress.com Product – SZBFT 10 piece Black 900M-T-B Series Horseshoe type iron head Welding tip Soldering iron tip free shipping

いままではこて先の細いものを使っていたのですが、やはりある程度太くないと熱の伝わりが悪いようです。交換して非常に快適になりました。

のっけから脱線で失礼。
では材料を引っ張り出してきます。レベルコンバータとMAX31855モジュール。

MAX31855モジュール。ピンヘッダと熱電対接続するフェニックスコンタクトでいいのかな、が付属しています。これをハンダ付けするだけです。

レベルコンバータ。モジュールあたり4chあります。左右できっちり電圧が分かれるのでわかりやすいです。

ピンヘッダハンダ付けするときはブレッドボード使うと曲がらなくていいですよ。

こうやって乗せておいてからはんだ付けします。

Arduino も同様。

モジュール群を乗せる基板を検討。今回はMAX31855モジュールを4機乗せようと思っていますので、レベルコンバータも合わせるとそこそこのサイズが必要です。

手持ちの基板ではやや面積不足ということで、一枚に乗せることは諦め、3分割することにしました。小基板ならいっぱい持っています。

基板間はコネクタ接続になります。使うのは若松通商の末広町にあった店が閉まるときに投げ売りされていたこれを使います。6Pポストとハーネス付きハウジングが10組入って一袋10円でした(笑)400本くらい買って使いまくっております。

こんな風に配置しようとしましたが、考えてみると、電圧変換するSPIのLogicはクロックとデバイスセレクト、データアウト(MAX31855→Arduino)の3種類で、これが4機ですから12chです。あとは5Vと3.3Vの共通電源です。ということで、6Pコネクタは二つで良いですね。

スズメッキ線使って裏面を配線していきます。

最初は電源線から。

 

2電源ありますので二本引き回します。

これでモジュールに5Vと3.3Vを供給します。

ここで念のためにポリイミドテープで、スズメッキ線を這わせる部分を絶縁しておきます。スルーホール基板で適当に裸線を引き回していると表裏で短絡することがあるので注意です。

配線開始。コネクタに接続するだけの部分がほとんどなので楽です。

ロジック部分の接続が出来ました。

ロジックの12chぶんなのでコネクタは二つづつになっています。

足付けておきましょう。
この基板の固定穴は2.5mmなので、M2で固定することにします。

Aitendoで買ったM2用金属スペーサ。

M2のネジはマジで山ほど持っています。

お次は電源コネクタ。

XHの3P(5V、3.3V、GND)を使います。

GNDをジュンフロン線で接続。

楽しいコネクタ作り。

XHは中華プライヤを購入して以来ノーミスです。持つべきものは道具であります。

ちなみにこれ。1000えんちょっとでめっちゃ幸せになれます。
日圧の正規品とか買ってた日には数万円飛んでいきますからねえ。仕上がりも遜色ないです。

6P側はハーネス付きですから挿せば終わりです。ということでレベル変換基板は完成。

お次は表示部。たくさん持っている16x2のキャラクタ液晶を使います。Arduinoとの相性は抜群です。繋いでモジュールリンクしてピン設定すればすぐに動きます。昔PICで苦労していたのがうそのようであります。改めてみたら2012年の投稿ですね。これから少ししてArduinoが電子工作界を席巻していきました。よい時代になったものです。

使っている液晶はこのあたり。

ピンヘッダをハンダ付けしていますので、デュポンコネクタ(Qiコネクタ?)で接続します。

 

確かジャンク配線箱の中にフラットケーブルが入ってたはず。

 

ありました。

デュポンコネクタ便利なんですが、カシメ工具がいまいち合わないのが玉にキズ。
しゃーないのでエンジニアのこれで地道にカシメていきます。

こんな感じで、

コントロール部とデータ部の配線を分けておきましょう。

お次はいよいよMAX31855モジュールです。

ピンヘッダをハンダ付けする前に、一考してLタイプに変更することにしました。

こうしたほうが配線を薄く仕上げることができますからね。

4機使用します。

これも基板に乗せようとおもってましたが、考え直して、ほかの基板とまとめてアクリル板のベースに乗せることにしました。
一体型にして熱電対温度計としておけば後々使いまわしもできそうです。

 

fusiona360でサクッとモデリングして、

 

 

吐き出したdxfからGコードを作り、

3mmtのクリアアクリルをレーザ加工機で切り出します。
何度も何度も何度も言っていますが、強調してもしきれないのがレーザ加工機の便利さであります。「そうだ、基板を一つにまとめてアクリル板に固定しよう」と思い立ってから、切り出しが終わるまでに1時間くらいしかかからないのです。まことに素晴らしい。

ちゃちゃっと切って、

保護紙を剥げば、

完成です。

スペーサ入れて、

液晶乗せて、

ねじどめすれば表パネル完成。

MAX31855モジュールはM2のネジで止めていきます。
液晶もMAX31855モジュールもスペーサーに使っているのはアイロンビーズです(笑
安いのなんのって。M3ネジまでならこれ使わない手はないですよ。

どんどん乗せて、

レベルコンバータ基板を乗せたら配線をしていきます。

ここでもデュポンコネクタを使用。

コンタクトカシメて、

ハウジングに挿して、

接続していきます。

面倒がらずに美しく配線していけばあとからのメンテがやりやすいですし、何よりも愛着ひとしおです。どうせ外出自粛で時間はたっぷりありますから丁寧にやればよいのです。

電源線は共通ですので、こんな感じにコンタクトをカシメていきます。

ハウジングに追加して、

完成。

レベル変換基板の3.3Vを分けてもらうことにします。2PXHポストを増設。

接続完了しました。

お次はArduino部分ですが、ここで高さの余裕を調べておきます。
Arduinoはピンソケットを使って着脱できるようにしたいのですが、そうするとピンソケット分だけ背が高くなります。手元にあるスペーサの最大長さは30mmですので、これを使った状態でArduinoが表側板に当たらないか調べます。

仮止めして、

Arduino基板おいて、

高さ見てみます。
この余裕ならピンソケット使っても全く問題ありません。OKです。

ではArduino基板作っていきます。
最終的には熱電対温度測定器として独立して動作させたいので、ACアダプタを繋げるようソケットを実装しておきます。

ここで小ネタというか、Twitterで見かけて非常に感動した実装方法をパクります(笑
確かとにーさんが紹介していた方法じゃなかったかな。
まずピンヘッダをこんな感じに実装します。

そこにこのようにソケットを横に倒して置きます。するとソケットの端子がピンヘッダのピン位置とぴったり合うのです。

この状態でハンダ付けすればソケットはがっちり固定されます。こうすれば基板に板電極差し込むための長穴を開ける必要が無く、固定の強度も十分、この後の配線も裏のピンヘッダハンダ面から行えばいいので楽です。これは実に実に賢い実装方法です。もう一生これで行きたいくらい感心&感動した次第。

コネクタ実装していきます。レベル変換基板の5V側と接続します。

液晶のコネクタとコントラスト調整のための半固定はこんな感じに実装します。
込み入っていますが、一部を空けておくことで後日機能を追加したいときの実装部分を確保しておきます。LEDのインジゲータやスイッチをつけたくなるかもしれないからです。

裏面。汚い….

最後に3Vと5Vの電圧供給用3Pポストを実装。

裏側。液晶コントロールの配線が追加されましてますます汚くなりました….

ではベースに乗せていきます。

完成予想はこんな感じです。手作り感満載でいいですね。

今回の熱電対温度計は二日間かけてのんびりと作りました。
電子工作も含めモノづくりというものはまことに良い趣味であります。

さて、基板間の配線を続けます。

Arduinoとレベルコンバータ基板の間もこの激安若松コネクタでつなぐのですが、こ奴の問題はコンタクトが無いということでした。ポストとハーネス付きハウジングなので、今回の様に双方の基板にポストをハンダ付けする場合、双方から出てくるハーネスを空中接続しなければなりません。それはそれで粛々とやればよいだけですが、接続部分に熱収縮チューブをかぶせるといかにも「接続しました」感が出てしまっていまいち美しくありません。せっかくここまで配線をきれいにまとめていますので見栄えにはこだわりたいところ。

 

ということで、しばしこの若松コネクタを眺め、コンタクトを外してよくよく観察してみると、「これPHのコンタクトで代替できるんじゃね」と思い当たりました。
PHコンタクトはXHコンタクトより一回り小さなもので、非常によく使われるものの一つであります。
みら太な日々ではXHとSM、そしてデュポンコネクタを標準的に使っており、PHは常備部品には入っておりません。が、コネクタの引き出しを見てみるとそれなりに入っているものであります。100個くらいはありました(笑
ということで、ハーネスの他端にPHコンタクトをカシメて、ハーネスを抜いたハウジングに挿してみたところ、思惑通りにこれがピッタリでありました。

ポストに挿すときにやや硬いものの、接続性は十分です。これはいいですね。
抜いたハーネスがPHのハウジングに刺さることも確認できました。これは常備部品にPHシリーズを加えよというお告げでしょうきっと(笑

Arduino 乗せて、電源のXHコネクタカシメて接続します。

途中端折りますが、液晶との接続部分もこの若松コネクタというか若松ハーネスを使うことにしました。フラットケーブルは硬くて引き回しがしにくかったのです。

ということで、完成であります。

横は開き開きですが、まあいいでしょう。そのうち壁を追加してちゃんとした箱にします。

配線を最終確認して通電。無事に豆腐(笑)が確認できました。

ここからはArduino のスケッチ作製です。
まずは液晶を動かします。これはLCDモジュールをリンクすればよいので簡単です。
ちなみに、今回はピンを結構たくさん使いましたので、液晶接続用にArduinoのアナログピンA0をデジタルIOとして使っています。Arduino nanoのアナログピンは8本(A0~A7)ありますが、A6,A7はデジタルIOとしては使用できませんのでご注意を。
毎度これを忘れていて余計な時間を使います。今回もコネクタに近いというだけの理由でA7を使ってしまい30分くらいロスしました。

MAX31855モジュールを駆動するための(ソフトウェア)モジュールはAdafruitから公開されていてArduinoIDE環境からインストールすることができます。やり方はGoogle先生が教えてくれます。しなぷすさんのこのあたりとかが分かりやすいです。
今回はMAX31855モジュールを4機使っていますので、これらから順次データを得るための部分を書き換えています。私が変更した汚いスケッチはこの下に載せています。ポイントは、4機のモジュールにそれぞれインスタンスを宣言しているところ、SPIバスにぶら下がっている4機を識別するためにデバイスセレクトのピンを4本(D10,9,8,7)確保し、それらを順次呼び出しているところですかね。べたべたですが(笑

*******************ここから**********************
//SPI,MAX31855,LCD駆動のライブラリをインクルード
#include <SPI.h>
#include “Adafruit_MAX31855.h”
#include <LiquidCrystal.h>

//LCD配線、自分の接続に合わせて変更が必要
const int rs = 5, en = 6, d4 = 2, d5 = 3, d6 = 4, d7 = A0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//熱電対モジュール4機の使用を宣言、クロックD13、MISO D12
Adafruit_MAX31855 thermocouple1(13, 10, 12);
Adafruit_MAX31855 thermocouple2(13, 9, 12);
Adafruit_MAX31855 thermocouple3(13, 8, 12);
Adafruit_MAX31855 thermocouple4(13, 7, 12);

void setup() {
//Serial.begin(9600); //シリアル使うかも
//見出し
lcd.begin(16, 2);
lcd.print(“ThermoCouple”);
lcd.setCursor(0, 1);
lcd.print(”          Meter”);
delay(2000);
}
void loop() {
lcd.clear();

//熱電対1温度を読み出して液晶に書き出し
double c = thermocouple1.readCelsius();
lcd.setCursor(1, 0);
if (isnan(c))
{
lcd.print(“XX.XX”);
}
else
{
lcd.print(c);
}

//熱電対2温度を読み出して液晶に書き出し
double d = thermocouple2.readCelsius();
lcd.setCursor(9, 0);
if (isnan(d))
{
lcd.print(“XX.XX”);
}
else
{
lcd.print(d);
}

//熱電対3温度を読み出して液晶に書き出し
double e = thermocouple3.readCelsius();
lcd.setCursor(1, 1);
if (isnan(e))
{
lcd.print(“XX.XX”);
}
else
{
lcd.print(e);
}

//熱電対4温度を読み出して液晶に書き出し
double f = thermocouple4.readCelsius();
lcd.setCursor(9, 1);
if (isnan(f))
{
lcd.print(“XX.XX”);
}
else
{
lcd.print(f);
}
delay(1000);
}
*******************ここまで**********************

で、これを動かしましたところ、どうも動作がおかしいです。MAX31855モジュールの一つが-299℃とか-500℃とかといったとんでもない温度を返してくるのです。
SPI周りのノイズや信号の衝突を疑って調べていきました。

ですが、件のMAX31855モジュールへのSPIクロック信号はきれいに入っているし、出力も詳細不明ですが波形はきれいです。

改めて問題があるMAX31855モジュールの内部温度を出力させてみると、これまた280℃とかとんでもない温度を返してきます。
ということで、どうやら問題はこのモジュールそのものにあるようです。ハンダ接続はきれいなのでクラックとかの問題ではなく、内部のADあたりに問題があるようです。
これは諦めるほかないですね。

手元のMAX31855モジュールは4つしかありませんでしたので、とりあえず実装したままで使い始めることにします。

中国の方が一足先に新型コロナウイルス禍から脱しつつありますので、Aliexpressにリピート注文を出しておきたいと思います。

コメント