arduinoでつくる 低温調理器具 6/全7回

 

前回までで、低温調理器具の制御のためのハードウェアが完成しました。今回は、これをグリル鍋につなぎ、制御用のプログラムを書きます。

必要な部品

組み立てる

はじめに目標としていた装置は、以下のようなものでした。ここに書かれている装置のうち、Arduino, LCD, SSR, 温度センサーはすでに準備ができているので、あとはSSRにグリル鍋をつなぐだけです。

f:id:RyoSaitoOp3:20151018195931p:plain

 

つまり、前回スマホ充電器を繋いでいたところに、グリル鍋の電源を繋ぎ、温度センサーを鍋に張った水の中に投げ込むだけです。

f:id:RyoSaitoOp3:20151018172508j:plain

 

P制御を実装 

一方、プログラムの方では、

  1. 温度センサーから現在の温度を取ってくる
  2. 目標温度と現在温度の差を計算する
  3. 差に応じて、グリル鍋の出力を変える

という処理が必要になります。この「目標と現在値を比較して出力を変える」という処理は、「制御理論」として確立されているらしいです。その中にPID制御という方式があり、これのarduino用のライブラリを作成し公開してくださっている方がいます。

Arduino Playground - PIDLibrary

今回は、このライブラリを利用しました。ただし、実際にはPID制御よりも簡単なP制御できれいな温度制御ができたので、ライブラリの性能のほんの一部しか利用していません。

PIDライブラリのインストール

こちらにあるリンクから、PIDライブラリがダウンロードできます。ダウンロードしたzipファイルを、Sketch>Include Library>Add .ZIP Library... から指定すると、インストールが完了します。

参考 : Arduino - Libraries

プログラムの処理の流れ

  1. 現在温度を読み込む
  2. 現在温度と目標温度を、PIDライブラリに与える
  3. PIDライブラリから、次の"時間window"(今回は1000ミリ秒)のうち何ミリ秒間ONにすれば良いかが返ってくる(output)
  4. 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の変数の中には自動的に適切な出力値が入っています。

gist48476c3dd470d0725af6

余談

現在温度の経時変化と、SSRのON/OFFの履歴をリアルタイムでグラフ化する方法があります。はじめ、PID制御にすべきか、P制御にすべきか、係数はどのような値にすればよいか、全くわからなかったので、履歴を見ながら最適な方法を探していました。

このためには、パソコンにProcessingという環境をインストールし、arduinoからのデータを処理させてグラフを描きます。詳しい話は省きますが、以下に参考文献と私が使ったコードを挙げます。以下のリンクから、登録するとダウンロードできるpdfが、非常に参考になりました。

www.cloudsquare.info

Aruduinoコード

gist128108922943fd5366f2

 

Processingコード

 

gistb75aec85e5c348789297