
今回の記事は,前回紹介したON/OFF制御から一歩進み,より滑らかな温度制御を実現するPWM制御とPI制御について解説します。
前編では温度制御システムの構成やON/OFF制御の基本的な仕組みを紹介しましたが,実際に動作させると温度が目標値の周辺で大きく振動してしまうという課題がありました。
そこで本記事では,まずPWM制御によってペルチェ素子の出力を細かく調整する方法を紹介します。
その後,目標温度との誤差に応じて出力を自動的に決定するPI制御について解説します。
これらを導入することで,より安定した温度制御が実現できるようになります。
なお本記事は,制御工学の理論を厳密に説明することを目的とするのではなく,実際にArduinoとペルチェ素子を用いた温度制御装置を製作した際の経験をもとに,できるだけ分かりやすく説明していきます。
それでは,ゆっくりしていってね!
PWM制御の導入
ON/OFF制御の欠点を改善するため,PWM(Pulse Width Modulation:パルス幅変調)制御を導入しました。
PWM制御では,
電流を流す(ON)
電流を止める(OFF)
という動作を高速に繰り返します。

このとき,1周期の中でONになっている時間の割合をDuty比(デューティ比)と呼びます。
例えば,Duty比が100%であれば常に最大出力,50%であれば半分程度の出力,0%であれば停止状態となります。

実際にはペルチェ素子へ供給する電圧を連続的に変化させているわけではありません。
しかし,人間が温度変化を観測する時間尺度に対してPWMの切り替えは非常に高速であるため,平均的な電力が変化したように振る舞います。
その結果,
強く加熱する
少しだけ加熱する
わずかに加熱する
といった細かな出力調整が可能になります。
Arduinoでは analogWrite() 関数を使用することでPWM信号を出力でき,0~255の値でDuty比を設定できます。
例えば255で最大出力,128で約50%出力,0で停止となります。
ON/OFF制御では「最大出力」か「停止」の二択しか選べませんでしたが,PWM制御では温度の状況に応じて出力を細かく変更できるため,目標温度に近づくにつれて加熱量を抑えることが可能になります。
このPWM制御によってペルチェ素子の出力を連続的に調整できるようになり,温度誤差に応じて出力を計算するPI制御を実現するための土台が整いました。
PI制御とは
PWM制御によってペルチェ素子の出力を細かく調整できるようになりました。
しかし,PWM制御だけでは「どの程度の出力を与えるべきか」を自動的に決定することができません。
そこで導入したのがPI制御です。
PI制御とは,
P(比例制御)
I(積分制御)
を組み合わせた制御手法です。
比例制御では,
「現在温度と目標温度の差が大きいほど,大きな操作量を与える」
という考え方を用います。
例えば目標温度が40℃の場合,現在温度が30℃であれば強く加熱し,39℃であれば弱く加熱します。
これにより目標温度へ素早く近づくことができます。

しかし比例制御だけでは,目標値との差が少し残る「オフセット(定常偏差)」が発生することがあります。
これは目標値に到達すると制御出力も小さくなるためで,熱損失などの外乱が存在する場合,わずかな誤差が残った状態で平衡に達してしまいます。

そこで積分制御(I制御)を加えます。
積分制御は過去から蓄積した誤差を考慮し,その誤差を打ち消す方向へ補正を行います。
例えば,目標温度より1℃低い状態が長く続くと,その誤差が徐々に蓄積されます。
すると制御出力が少しずつ増加し,目標温度へ近づく方向に働きます。
すなわち,誤差を時間とともに積算し,その積算値が大きくなるほど制御出力を増加させることで,オフセットを補正します。
このように,比例制御だけでは解消できないオフセットを補正できるため,目標温度へより正確に到達できるようになります。

比例ゲインと積分ゲイン
なお,PI制御では,「どのくらい強く制御するか」を決めるために比例ゲイン(Kp)と積分ゲイン(Ki)を設定します。
比例ゲイン(Kp) は,現在の温度と目標温度の差に対してどれだけ大きく反応するかを決める値です。
例えば目標温度が40℃で,現在温度が30℃だった場合を考えます。
Kpを大きくすると,強く加熱して素早く目標温度へ近づこうとします。
Kpを小さくすると,ゆっくり加熱するため安定しますが,目標温度へ到達するまで時間がかかります。
一方,積分ゲイン(Ki) は,過去から蓄積した誤差をどの程度補正するかを決める値です。
比例制御だけでは目標温度付近でわずかな誤差が残ることがありますが,積分制御はその誤差を少しずつ積み上げて補正します。
Kiを大きくするとオフセットは素早く解消されます。
Kiを大きくしすぎると補正が過剰となり,温度が振動しやすくなります。
Kiを小さくすると安定しますが,目標温度に到達するまで時間がかかります。
そのため,KpとKiは大きければ良いわけではなく,応答速度と安定性のバランスを考えながら調整する必要があります。
この調整は,実験系や実験環境によっても最適解が異なるため,実際に測定を重ねながら最適化することが必要です。
PI制御を用いた温度制御のプログラム
PWM制御とPI制御を用いた温度制御プログラムを以下に示します。
※今回記載しているプログラムはブログ記載のために修正を行っており,バグが出る可能性があります。
//PI制御を用いた40℃へのペルチェ素子の制御プログラム
#include “DHT.h”//温湿度系についてのパッケージ
#define DHTPIN 2 // PIN2を使用
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
// 測定開始前の準備
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(3, OUTPUT); //3pin使用
}
float target = 40.0; // 目標温度
float Kp = 〇; // 比例ゲイン。実数値は測定して決定
float Ki = △; // 積分ゲイン。実数値は測定して決定
float error;
float integral = 0.0;
float duty;
float dt = 2.0; // サンプリング周期[s]
void loop()
{
// 最初に温度センサから温度を取得
// DHT11の湿度取得
float h = dht.readHumidity();
// DHT11の温度取得
float t = dht.readTemperature();
// センサから数値が読めない場合の例外処理
if (isnan(h) || isnan(t) ) {
Serial.println(F(“Failed to read from DHT sensor!”));
return;
// 偏差(比例)
error = target – t;
// 積分
integral += error * dt;
// 積分飽和対策
integral = constrain(integral, -100, 100);
// PI制御
duty = Kp * error + Ki * integral;
// PWM範囲制限(0~255)の範囲に丸め込む
duty = constrain(duty, 0, 255);
analogWrite(3, (int)duty);
// モニタ表示
Serial.print(“Temperature: “);
Serial.print(t);
Serial.print(” Duty: “);
Serial.println(duty);
// 上記の処理を2秒に1回実施する
delay(2000);
}
今回のシステムでは,比例量と積分量を計算し,その結果からPWMのDuty比を決定することでペルチェ素子へ流す電流量を制御しました。
実は今回この記事を書くために当時のプログラムを見直していたところ,積分制御(I制御)の実装に誤りがあることを発見しました。
そのため,本記事で掲載しているプログラムは当時のコードを修正したものになります。
7年前の私は自信満々でこのシステムを発表していたので少しショックでしたが,当時の自分では気付けなかった問題点を発見できたということは,それだけ成長できたということでもあるかなと思います。
モノづくりは失敗と改善の繰り返しです。
皆さんも失敗を恐れず,ぜひさまざまなことに挑戦してみてください。
理論と実測のすり合わせ
今回の演習で特に印象に残ったのは,「理論通りには動かない」ということでした。
例えば,今回の温度センサ,DHT11で測定した温度と校正用温度計の値を比較したところ,約3.8℃の差が確認されました。
そのため,ソフトウェア側で温度補正を行い,測定精度の向上を図りました。(前述のプログラムでは簡易化のため記載なし)
また,冷却実験では時間の経過とともにヒートシンク側へ熱が蓄積し,ペルチェ素子が十分な冷却性能を発揮できなくなる現象も確認されました。
教科書の上では目標温度まで制御できるはずでも,実際のシステムではセンサ誤差や放熱性能,周囲環境の変化など,さまざまな要因が制御性能に影響します。
こうした理論と現実のギャップを観察し,原因を考え,改善を繰り返して,実際に動くものを作ることこそがエンジニアリングの面白さだと私は思います。
まとめ
今回の記事では,私が学部時代に行ったArduinoとペルチェ素子を用いて温度制御システムの構築について解説しました。
私はこの実験の過程で,
ON/OFF制御による制御の基本
サイクリングの発生原因
PWM制御による出力調整
PI制御による高精度化
など,温度制御に関するさまざまな知識を実践を通して学びました。
また,単に回路を組んでプログラムを書くのではなく,
計測する → 制御する → 評価する → 改善する
というエンジニアリングの基本的な流れを体験できたことも大きな収穫でした。
実際に目標温度へ到達しない理由を調べたり,センサ誤差を補正したり,ゲインを調整したりする作業は,現在取り組んでいる研究活動にもそのまま通じています。
この記事を書くにあたり当時のプログラムを見直したところ,PI制御の実装に誤りを発見するという思いがけない出来事もありました。
しかし,それもまたモノづくりの面白さの一つです。
当時は気付かなかった問題点を見つけられたということは,それだけ知識や経験を積み重ねてこられた証拠でもあります。
学部時代の演習を振り返ってみると,この実験は単なる電子工作ではなく,制御工学やシステム開発の考え方を実践的に学べる非常に良い題材だったと感じています。
もしこれからArduinoや温度制御に挑戦する方がいれば,本記事がその第一歩の参考になれば幸いです。
参考文献
・やさしい制御の話,https://www.compoclub.com/products/knowledge/jidou_seigyo/pdf/_jidouseigyo.pdf?download,
・ArduinoのIOポートから大電流デバイスを制御,https://daisuki-arduino.com/arduinoのioポートから大電流デバイスを制御/
・Arduinoで簡単なPID制御のプログラムを作ってみる,https://garchiving.com/pid-control-in-arduino/
・DHT11_Temperature_and_Humidity_Sensor_V2_SKU__DFR0067,https://github.com/jimaobian/DFRobotWiki/wiki/DHT11_Temperature_and_Humidity_Sensor_V2_SKU__DFR0067
・PWM と Arduino でのアナログ出力,https://iot.keicode.com/arduino/arduino-analogwrite-pwm.php
・温度制御の種類と特長,https://www.as-1.co.jp/academy/15/15-4.html
・冷却ができる電子部品「ペルチェ素子」の使い方,https://voltechno.com/blog/thermoelectric/#i-5
・『昼夜逆転』工作室 DHT11使用 温度・湿度計,http://jsdiy.webcrow.jp/hutem7seg/,
・Arduinoを始めよう第三版,Massimo Banzi,Michael Shiloh,オライリー・ジャパン,2015/2016,3版