電気ケトルを改造して高コスパな低温調理器を自作してみた
低温調理器を買おうかなと思っていたのですが、電気ケトルを一定温度になるように制御すれば激安で作れるんじゃね?
ってことで作ってみました。
電気ケトルをラズパイPicoでPID制御して温度を一定に保つようにしています。
PID制御って何?って方は、こちらの記事もチェックしてみてください。
システム構成
ラズパイのGPIOの信号で直接電気ケトルを制御できればベストでしたが、3.3Vの信号を突っ込めるような箇所がなかったので、SSR(ソリッドステートリレー)をオン・オフさせて電気ケトルの根本の電源を制御することにしました。
イメージはこちら
ケトル内の水温を温度センサーで測定して、ラズパイで狙った温度になるようにPID制御します。
ソリッドステートリレーとは
ソリッドステートリレー(SSR)とは、電気信号を使って電気回路を制御するスイッチのようなものです。
機械的なリレーとは違い半導体を使用しているため、摩耗や接触不良のリスクが少ないのが特徴です。
また、高速にオン・オフさせることができるので、今回のようなPWM信号で制御するような用途に向いています。
今回購入したのは秋月電子のSSRキットです。
内部は制御用のフォトトライアック(フォトカプラ)とドライブ部のトライアックから構成されています。
フォトトライアックで絶縁しているので、ラズパイからの制御信号を入力することができます。
それを受けてドライブ側のトライアックをオン・オフさせることで電気ケトルに加わるAC電源の導通/切断を切り替えます。
回路図
今回のシステムの全体回路図です。
フォトトライアックの一次側は赤外のLEDです。
ラズパイからHighが入力されると赤外光が二次側に伝わり、トライアックがオンします。
フォトトライアックがオンして、ドライブ用トライアックのゲートに電流を流し込むと、ドライブ用のトライアックがオンして電気ケトルに電源が導通するという仕組みです。
したがって、ラズパイのGPIOを制御することで、電気ケトルのオン・オフを切り替えることができます。
温度が上がりすぎるとオフし、下がりすぎるとオンするというフィードバック制御を行うことで、ケトル内の水温を一定に保ちます。
組み立て
SSRから組み立ていきます。
キットなので、基板の指定位置に部品をはんだ付けしていくだけなので簡単です。
ヘタレなので、ドライブ用のトライアックには大きめのヒートシンクを付けています。
これにラズパイと温度センサを接続。
電気ケトルと接続して完成!
制御プログラム
microPythonのコード全体です。
from machine import Pin, PWM
import onewire, ds18x20
import utime
#PID setup
Kp = 0.2
Ki = 0.05
Kd = 1
dt = 1
integral = 0
ePre = 0
target = 60
fbVal = 10
#オン/オフ制御ピン設定
onOff = Pin(20, Pin.OUT)
onOff.value(1)
#DS18B20ドライバ設定
ow = onewire.OneWire(Pin(21))
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
while True:
currentTime = utime.ticks_ms()
ds.convert_temp()
e = target - fbVal
integral += (ePre + e) * dt
if integral < -0.1 / Ki:
integral = -0.1 / Ki
if integral > 0.1 / Ki:
integral = 0.1 / Ki
differential = (ePre - e) / dt
ePre = e
U = Kp * e + Ki * integral + Kd * differential #UはDUTY
if U < 0:
U = 0
if U > 1:
U = 1
ton = 1000 * U
toff = 1000 - ton
onOff.value(0)
utime.sleep_ms(int(ton))
onOff.value(1)
utime.sleep_ms(int(toff))
print('温度: %-3.1f℃' % fbVal, end=' ')
print('DUTY: %-1.2f%' % U, end=' ')
print('inte: %-2.2f' % integral, end=' ')
print('diff: %-1.2f' % differential)
for rom in roms:
fbVal = ds.read_temp(rom) #温度取得
温度センサはDS18B20を使った防水温度センサを使っています。
このICは1-wireという信号線1本で通信できる独自規格を採用しています。
Pythonのライブラリがあるので、2行目でインポートしています。
設定温度は12行目で設定しており、牛肉の低温調理に最適な60度にしています。
読み取った温度センサの値をfbvalとしてtarget温度との差が0に近づくように制御しています。
PID制御の各パラメータは実際の温度変化を見ながら調整しました。
外部の影響が大きすぎるので、あまり深く考えずに調整していくでOKです。
PIDの各パラメータの傾向くらいは理解しておきましょう。
動作確認
制御温度は60℃ -0.7℃ / +1.2℃ となっていて、十分使える範囲です。
低温調理したローストビーフ。
ちょうどいい感じに加熱具合で、厚めに切っても柔らかかったです。
費用
部材費は以下の通りです。
部品名 | 単価(円) |
---|---|
電気ケトル | 2,000 |
SSRキット | 400 |
放熱板 | 260 |
温度センサ | 100 |
ラズパイPico | 570 |
ブレッドボード | 220 |
合計 | 3,550 |