ラズベリーパイで熱電対を使った温度測定の始め方|MAX31855による高精度計測

はじめに

温度センサーにはさまざまな種類がありますが、高温環境や工業用途で広く使われているのが「熱電対(Thermocouple)」です。この記事では、ラズベリーパイと熱電対モジュールを使って、高精度な温度計測を実現する方法を解説します。さらに、複数の熱電対を同時に使う方法についても紹介します。

熱電対とは?

熱電対は、2種類の金属を接合して作られた温度センサーです。この接点に温度差が生じると、熱起電力(ゼーベック効果)が発生します。この電圧を測定することで温度を推定できます。

ポイント

・金属の種類によって「K型」「T型」「J型」などの分類があり、最も一般的なのがK型熱電対
・高温測定(-200℃~+1350℃)に対応
・電圧値は非常に小さく(数十μV/℃)、専用の増幅・補償回路が必要(センサーモジュールで実現可)

熱電対モジュール(MAX31855)

手持ちはMAX31855というチップを搭載したモジュールです。
MAX31856という上位モジュールもあります。こちらのほうが精度が高く、できることも豊富です。余裕のある方はこちらをおすすめします。
センサーICの内部の設定(設定レジスタ)を変更できるかどうかの違いがあります。
熱電対タイプの設定、ノイズフィルタの切り替え、サンプリングレートの変更、アラーム機能設定、1回だけ計測or常時計測の切り替えなどができます。

項目MAX31855MAX31856
サポート熱電対 K型のみK,J,N,R,S,T,E,B型 全対応
入力チャンネル1
接続方法SPI
温度分解能0.25℃最大 0.078125℃
冷接点補償あり(内蔵)あり(高精度)
計測精度±2℃±0.15℃(熱電対タイプによる)
ノイズ除去無し50/60Hzノッチフィルタ内蔵
高速読み出し無しあり(変換レート設定可)
内部温度センサあり
電源電圧3.0~3.6V2.7~3.6V
価格安価(~500円)やや高価(1000円~)

配線

ラズベリーパイを使用します

RaspberryPiMAX31855MAX31856別呼称など
3.3V(1)VinVin
GND(9)GNDGND
GPIO11(CLK) (23)CLKSCKクロック
GPIO9(MISO) (21)DOSDOデータ出力 MISO
GPIO10(MOSI) (19)MOSIデータ入力 SDI
マスターからスレーブへの書き込み端子
GPIO5 (29)CSCSチップセレクト
FLTアラーム出力
DRDYデータ準備完了通知
()内はピン番号

温度を計測する

ライブラリがありますので、活用させてもらいます。MAX31855とMAX31856両方あります

sudo pip3 install adafruit-circuitpython-max31855
sudo pip3 install adafruit-circuitpython-max31856

MAX31855は設定できることがありませんのでシンプルです。

import time
import board
import busio
import digitalio
import adafruit_max31855

spi = busio.SPI(clock=board.SCK, MISO=board.MISO)

cs = digitalio.DigitalInOut(board.D5) #GPIO5
sensor = adafruit_max31855.MAX31855(spi, cs)

while True:
    print(f'Temperature:{sensor.temperature:.2f}degC')
    time.sleep(1)

MAX31856であれば以下です。

import time
import board
import busio
import digitalio
import adafruit_max31856

# SPIとチップセレクト設定
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D5)  # 例:GPIO5
sensor = adafruit_max31856.MAX31856(spi, cs)

# 熱電対の種類設定(例:K型)
sensor.thermocouple_type = adafruit_max31856.ThermocoupleType.K

# ===============================
# ✅ サンプリング周期(変換レート)
# ===============================
# デフォルト: 1Hz(1秒に1回)
# 倍速にする:sensor.conversion_mode = CONTINUOUS(既定)
# ※ライブラリでは細かな変換レート設定は未公開ですが、連続変換モードをONにしておけばOKです
sensor.conversion_mode = adafruit_max31856.CONVERSION_MODE_CONTINUOUS  # 常時測定

# ===============================
# ✅ ノイズ除去フィルターの設定
# ===============================
# 60Hzの電源ノイズが多い地域(日本や北米)ではこれをTrueに
sensor.noise_rejection = adafruit_max31856.NOISE_REJECTION_60HZ  # または _50HZ

# ===============================
# ✅ アラーム設定
# ===============================
# アラームは内部で設定され、センサから `sensor.fault` で読み取れる

sensor.high_threshold = 100.0  # 上限温度(例:100℃)
sensor.low_threshold = 0.0     # 下限温度(例:0℃)

# アラーム有効化
sensor.high_threshold_enabled = True
sensor.low_threshold_enabled = True

# ===============================
# 📈 温度モニタ+アラーム判定
# ===============================
while True:
    temp = sensor.temperature
    print(f"Temperature: {temp:.2f} °C")

    if sensor.fault:
        print("⚠️ Fault detected!")
        if sensor.fault & adafruit_max31856.FAULT_OPEN_CIRCUIT:
            print("  → 熱電対が外れています")
        if sensor.fault & adafruit_max31856.FAULT_HIGH_THRESHOLD:
            print("  → 温度が上限を超えました!")
        if sensor.fault & adafruit_max31856.FAULT_LOW_THRESHOLD:
            print("  → 温度が下限を下回りました!")

    time.sleep(1)

複数の熱電対を使いたい場合は、以下のようにCSを任意のGPIOに割り当てることで実現できます。

# CS:GPIO5
cs1 = digitalio.DigitalInOut(board.D5)
sensor1 = adafruit_max31855.MAX31855(spi, cs1)

# CS:GPIO6
cs2 = digitalio.DigitalInOut(board.D6)
sensor2 = adafruit_max31855.MAX31855(spi, cs1)

temp1 = sensor1.temperature
temp2 = sensor2.temperature

まとめ

機械系の仕事をされている方や理系の学生は熱電対を使って温度を計測することはよくあることかと思います。高価な計測器を購入せずとも自分で作ることも可能です。計測結果を自由に加工できますので効率も上がるかもしれません。是非チャレンジしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする