arduinoでつくる 低温調理器具 6/全7回
前回までで、低温調理器具の制御のためのハードウェアが完成しました。今回は、これをグリル鍋につなぎ、制御用のプログラムを書きます。
必要な部品
組み立てる
はじめに目標としていた装置は、以下のようなものでした。ここに書かれている装置のうち、Arduino, LCD, SSR, 温度センサーはすでに準備ができているので、あとはSSRにグリル鍋をつなぐだけです。
つまり、前回スマホ充電器を繋いでいたところに、グリル鍋の電源を繋ぎ、温度センサーを鍋に張った水の中に投げ込むだけです。
P制御を実装
一方、プログラムの方では、
- 温度センサーから現在の温度を取ってくる
- 目標温度と現在温度の差を計算する
- 差に応じて、グリル鍋の出力を変える
という処理が必要になります。この「目標と現在値を比較して出力を変える」という処理は、「制御理論」として確立されているらしいです。その中にPID制御という方式があり、これのarduino用のライブラリを作成し公開してくださっている方がいます。
Arduino Playground - PIDLibrary
今回は、このライブラリを利用しました。ただし、実際にはPID制御よりも簡単なP制御できれいな温度制御ができたので、ライブラリの性能のほんの一部しか利用していません。
PIDライブラリのインストール
こちらにあるリンクから、PIDライブラリがダウンロードできます。ダウンロードしたzipファイルを、Sketch>Include Library>Add .ZIP Library... から指定すると、インストールが完了します。
参考 : Arduino - Libraries
プログラムの処理の流れ
- 現在温度を読み込む
- 現在温度と目標温度を、PIDライブラリに与える
- PIDライブラリから、次の"時間window"(今回は1000ミリ秒)のうち何ミリ秒間ONにすれば良いかが返ってくる(output)
- outputの時間だけON、あとはOFFにする
以上を繰り返します。
PIDライブラリの関数はあまり多くなく、#include <PID_v1.h> でPID制御用のライブラリを読み込み、PID myPID(&Input, &Output, &Setpoint,80,0,0, DIRECT) で、入出力に使う変数へ参照し、myPID.SetOutputLimits() でOutputの最大値を指定し、myPID.SetMode(AUTOMATIC) でPID制御の処理を開始するまでが前処理です。
Outputの最大値というのは、例えば1000ミリ秒ごとに繰り返すループの中で何ミリ秒間ONにするのか、といった状況なら、出力が1000ミリ秒超えては困るので、最大値は1000ミリ秒となります。
あとはループごとに myPID.Compute() でライブラリに計算させれば、Outputの変数の中には自動的に適切な出力値が入っています。
余談
現在温度の経時変化と、SSRのON/OFFの履歴をリアルタイムでグラフ化する方法があります。はじめ、PID制御にすべきか、P制御にすべきか、係数はどのような値にすればよいか、全くわからなかったので、履歴を見ながら最適な方法を探していました。
このためには、パソコンにProcessingという環境をインストールし、arduinoからのデータを処理させてグラフを描きます。詳しい話は省きますが、以下に参考文献と私が使ったコードを挙げます。以下のリンクから、登録するとダウンロードできるpdfが、非常に参考になりました。
Aruduinoコード
Processingコード