低温調理用のコントローラを作る5
概要
調理コントローラのプログラムの雑な設計と実装を紹介します。
設計
低温調理に求められるのは、温度管理と時間管理です。この内時間管理については、プログラムでやる必要が無いかなと思います。調理終了時には、加熱槽からパックを取り出さなければならないのですが、これに関してはコントローラは何もできません。せいぜいアラーム音をならすぐらいでしょう。
ここでは割り切って、温度管理のみを行うコントローラを実装します。
制御方法
制御方法は、いろいろなものがありますが今回は簡単なヒステリシス制御と、熱容量による制御の二種類を実装します。
ヒステリシス制御
ヒステリシス制御は簡単な制御で、ヒータがONになる温度とOFFになる温度を設定し、現在の温度によってヒータのON-OFFを切り替えます。
閾値が1つのときとくらべてノイズに強く、制御対象の詳細がわからなくてもある程度の制御ができますが、オーバーシュート(加熱しすぎ)が発生するという弱点もあります。
今回使用している熱源は、150Wのヒータなのでオーバーシュートはそれほど気にしなくてもいいでしょう。これを一つ目の制御方法として採用します。
熱容量による制御
今回の制御対象は水温です。一般に、物質の温度とエネルギーの関係は、以下の式で求めることができます。
熱量Q[J] = 熱容量C[J/K] * 温度差⊿T[K]
そして、ヒータが発生する熱量は以下の式で求めることができます。
熱量Q[J] = 電力P[W] * 時間t[sec]
さらに、ヒータの電力と熱容量は調理中に変わることはありません。つまり、有る時間加熱したときの温度変化は以下の式で求めることができます。
温度差⊿T[K] = 係数 * 時間t[sec]
ここで係数は水の量や食材によって、調理毎に異なるため以下の2ステップをおこなえば水温が制御できます。
- 一定の時間加熱し、その間の上昇温度によって係数を算出する。
- 目標値と現在値の差(と係数)から、必要な加熱時間を算出する。
このうち2を、一定時間ごとに行うことにより目標の温度にすることができます。時間は水晶発振子によって取得できるので、簡単に実現できそうです。これを二つ目の制御方法として実装します。
PID制御
これも実装したいのですが、今回は見送り。(上の2つで調理ができてしまったので)
実装
実装は特に書くこともありません。Cでサクサク書くだけです。
機能紹介・操作
というわけで、完成したコントローラの紹介です。基本操作はエンコーダで選択、Aで決定、Bでキャンセルです。
電源を入れるとメインメニューが表示され、以下の4メニューがでます。それぞれを選んでAで決定します。
- Temp Monitor
- Heat Control
- Hysteretic
- Settings
モード紹介
Temp Monitor
温度計です。温度センサーの現在値を表示します。
Bでメインメニューに戻ります。
Heat Control
熱容量による制御をします。目標値を設定すると、係数の計算後、目標温度になるまで加熱を行います。目標温度に到達したら、以降その温度を維持します。
Bでメインメニューに戻ります。
Hysteretic
ヒステリシス制御をします。ヒーターをONにする温度(lower)とヒーターをOFFにする温度(upper)を指定すると、温度に応じてヒーターのON-OFFをおこないます。
Bでメインメニューに戻ります。
Settings
各種設定を行います。
今はパイロットランプ(ヒータON時と、センサー読み取り時のインジケーター)の有効無効のみが設定できます。
(そのうちPIDのパラメータとかを設定できるようになるはず)
HEX
ここに置きます。
ThermostaticCooker - Google ドライブ
書き込みはISPMK2をつかっている場合は以下のコマンドで
avrdude.exe -pm328p -cavrispmkII -Pusb -u -Uflash:w:cooker_v010.hex:a -Ulfuse:w:0xd2:m