はじめに
温度センサーにはさまざまな種類がありますが、高温環境や工業用途で広く使われているのが「熱電対(Thermocouple)」です。この記事では、ラズベリーパイと熱電対モジュールを使って、高精度な温度計測を実現する方法を解説します。さらに、複数の熱電対を同時に使う方法についても紹介します。
Bnineteenteam
Kタイプ熱電対モジュール Kタイプ熱電対温度センサーモジュール‑200℃〜+1350℃SPIポートデジタル出力MAX31855耐久長時間使用
Bnineteenteam3ncg1vsg6i84
熱電対とは?
熱電対は、2種類の金属を接合して作られた温度センサーです。この接点に温度差が生じると、熱起電力(ゼーベック効果)が発生します。この電圧を測定することで温度を推定できます。
ポイント
・金属の種類によって「K型」「T型」「J型」などの分類があり、最も一般的なのがK型熱電対
・高温測定(-200℃~+1350℃)に対応
・電圧値は非常に小さく(数十μV/℃)、専用の増幅・補償回路が必要(センサーモジュールで実現可)
熱電対モジュール(MAX31855)
手持ちはMAX31855というチップを搭載したモジュールです。
MAX31856という上位モジュールもあります。こちらのほうが精度が高く、できることも豊富です。余裕のある方はこちらをおすすめします。
センサーICの内部の設定(設定レジスタ)を変更できるかどうかの違いがあります。
熱電対タイプの設定、ノイズフィルタの切り替え、サンプリングレートの変更、アラーム機能設定、1回だけ計測or常時計測の切り替えなどができます。
項目 | MAX31855 | MAX31856 |
サポート熱電対 | K型のみ | K,J,N,R,S,T,E,B型 全対応 |
入力チャンネル | 1 | ← |
接続方法 | SPI | ← |
温度分解能 | 0.25℃ | 最大 0.078125℃ |
冷接点補償 | あり(内蔵) | あり(高精度) |
計測精度 | ±2℃ | ±0.15℃(熱電対タイプによる) |
ノイズ除去 | 無し | 50/60Hzノッチフィルタ内蔵 |
高速読み出し | 無し | あり(変換レート設定可) |
内部温度センサ | あり | ← |
電源電圧 | 3.0~3.6V | 2.7~3.6V |
価格 | 安価(~500円) | やや高価(1000円~) |
配線
ラズベリーパイを使用します
RaspberryPi | MAX31855 | MAX31856 | 別呼称など |
3.3V(1) | Vin | Vin | |
GND(9) | GND | GND | |
GPIO11(CLK) (23) | CLK | SCK | クロック |
GPIO9(MISO) (21) | DO | SDO | データ出力 MISO |
GPIO10(MOSI) (19) | ー | MOSI | データ入力 SDI マスターからスレーブへの書き込み端子 |
GPIO5 (29) | CS | CS | チップセレクト |
ー | ー | 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
まとめ
機械系の仕事をされている方や理系の学生は熱電対を使って温度を計測することはよくあることかと思います。高価な計測器を購入せずとも自分で作ることも可能です。計測結果を自由に加工できますので効率も上がるかもしれません。是非チャレンジしてみてください。
コメント