低温調理器を自作する - スロークッカーはインターネットの夢を見るか? (ハードウェア編)
スロークッカーという調理器具がある。鍋ごとじっくりことこと煮てくれるもので、角煮やビーフシチューを作るのに適しており、構造の単純さゆえにとても安い。
[amazon template=wishlist&asin=B009JXQWR4]
これなど、僕が買ったときには2000円くらいだった。その代わり付属の鍋(保温性重視の土鍋)は直火にかけられず、タイマーもついていない。さすがに使いづらすぎるのでタイマー付きにしようかと思ったのだが、すると6000円くらいは出さないといけない。また、スロークッカーというのはそもそも所定の熱量(僕のは強で350W)をかけ続けるだけの機能しかないので、平衡に達する(=煮込むときの)温度は出来高でしかなく、再現性に欠ける。100度弱の温度でじっくり煮るだけならよいのだが、厳密に温度管理をしてパスチャライゼーション(詳しくは Cooking for geeksを読まれたし)をしようと思うと何の役にも立たない。
それを可能にする低温調理器的な器具として、100度未満で一定の温度を維持するような機能も欲しくなるが、そうするとパナソニックに2万円払う必要が生じてくる。
[amazon template=wishlist&asin=B002L3T0BO]
払えんわ。適当に安いのでもぽちるか、と思っていたところ
@naotaco それだと高いっすよ— ゆーだい (@s03785yh) 2015, 2月 2
@naotaco @s03785yh 作れば — oɐɥɔoɐɯ (@maochao) 2015, 2月 2
先輩から煽られた。はい。
ということで今日アキバで材料をかってきた。ちなみに折良く発売されたRaspberr Pi 2 Model Bを使うことにしたので、制御側のマシンパワーは十分である。
- 熱電対アンプモジュール
- 熱電対
- ソリッドステートリレー(SSR)キット
- その他ジャンパケーブルなど
熱電対じゃなくて温度計測モジュールでもよかったのだが、結局鍋の中に測定部を突っ込む必要性が生じたので、基板丸出しのはちょっとな、ということでリード線の先端に熱電対が付いてるものをチョイス。あとA/D変換とかキャリブレーションとか考えたくなかったので、アンプモジュールも購入。これはシリアル通信(SPI)でRaspberry Piと簡単に通信できるので、何も考える必要はない。らくちんである(当然はまった。後述)。あと、スロークッカーを制御するリレーはSSRのキットを購入。これもRaspberry PiのGPIOから3Vかけてあげれば導通する。らくちん。ちなみにRaspberry PiのGPIOは3.3V/50mAまでとのことなので、SSRの入力側がこの辺に収まっていることは確認しておく必要がある。出力側は20Aまで対応とか頼もしいことが書いてあるので、どうにでもなる。(後述するが放熱は必要)
回路図 |
短い延長ケーブルのリード線を片方剥いて、SSRキットの出力側にむりやりつなげる。
SSRを延長コードに |
こんな適当でいいのかは知らない。入力側はRPiのGPIOにつなげておしまい。あとはGPIOをHighにしてあげればスロークッカーが加熱する。このとき手前の背が高い3端子レギュレータみたいな部品が思いっきり発熱する。説明書によると、放熱板なしでいけるのは2Aまでとのことなので、放熱が必要らしい。とりあえず良い物がなかったので、モンキーレンチで金属部を挟んでおいたらいい感じである。けっこう重いしね。放熱板はIN/OUT両方から絶縁されてるらしいので安心。
即席放熱器 |
次はセンサ側である。熱電対には謎の黄色いコネクタがついてるので、それを捨てる。ただし極性はコネクタにしか書いていない上にリード線には色がついていないので、事前にどっちが+か確認しておく。で、組み立てたアンプの基板につなぐ。
アンプモジュールに熱電対をつないだところ |
あとは配線と制御である。基本的に、このサイトを参考に作業していけばOKであるが、RPiのバージョンも基板も違うので配線には注意が必要。Vinには3.3Vを入れて、GNDはGNDへ。3Voはなぜか3V吐き出してくれるが使い道はわからないので未結線。DOがData Outなのだろうか、要はMISOで、CSはChip select, CLKはClockである。そしてこのMAX31855ドライバは新しくなっていて、MISO/CS/ClockはどこのGPIOピンでも使えるようになっているっぽい。すごい。コード中で指定できるので適当につなげばOKである。ちなみにRPi.GPIOは新しめのバージョンじゃないとRaspberry Pi 2に対応していないので新しいのを使いましょう。ビルドするにはpython-dev, python3-dev が必要。
そして満を持してmax31955.pyを動かしてみるのだが、どうもまともに動かない。温度をセルシウスに指定すると0度と表示される。ぐぬぬ。どうもピンの指定が間違っているようだった。
[python title=”max31855.py”] thermocouples.append(MAX31855(cs_pin, clock_pin, data_pin, units, GPIO.BOARD))
[/python]
MAX31855のコンストラクタの最後で、ピンの指定方法を指定できる。GPIO.BOARDを指定すると、物理ピン番号(端が1で、40まで順番にあるやつ)で指定できる。GPIO.BCMを指定すると、GPIO**の番号で指定することになる。最初はデフォルトの後者で指定していたのだが、前者をつかって物理番号で指定したらうまくいった。Raspberry Pi2環境でバグがあるのか、もしくは僕が寝ぼけていたのかどっちかだろう。
すると、
[shell] tc: 13.5 and rj: 19.75 tc: 13.5 and rj: 19.75 tc: 13.75 and rj: 19.75 tc: 13.75 and rj: 19.75 tc: 13.5 and rj: 19.75 tc: 13.5 and rj: 19.8125 tc: Error: Thermocouple short to ground and rj: 19.75 tc: 13.75 and rj: 19.75 tc: 13.75 and rj: 19.75 tc: 13.75 and rj: 19.75 tc: Error: Thermocouple short to VCC and rj: 19.75 tc: Error: Thermocouple short to ground and rj: 19.75 tc: Error: Thermocouple short to ground and rj: 19.75 tc: 13.75 and rj: 19.75 tc: 13.75 and rj: 19.75 tc: 13.75 and rj: 19.75 [/shell]
と温度が出力された。1つめが温度、2つめは補償点?らしい。私の部屋、寒すぎ?詳細は不明。そして30%くらいの確率でエラーが出る。MAX31855がエラービットを立ててきてることを示しているようなのだが、詳細は不明。物理的に動かしてないのにそんな簡単にショートしてたまるかという感じなのだが。とりあえず無視することにする。
あとはGPIOを立てればよい。
https://gist.github.com/naotaco/33a55bf1ea57b3763c31
GPIO.cleanupを忘れそうなので、atexitにお任せ。引数でもらったon/offに従ってGPIOを操作することにした。GPIO.cleanupが呼ばれるとhighにしたピンもすべてlowに落ちてしまうので、とりあえず終わらないスクリプトにしておいた。onしてそのままにしておけばスクリプトが終了してもそのままでいてくれるのかもしれないが、どうしたものか。
これで温度取得とスロークッカーのon/offができるようになったので、あとは料理用タイマーと温度制御をすればよい。今日の所はおためしでビニール袋に熱電対を入れて水につっこんだ。とりあえず水を7分目くらいまで入れて20度くらいから加熱してみたが、データを途中で上書きして消してしまった。。。つらい。。終盤の記録がこちら。71度から75度まで上がるのに555秒程度かかっている。2分で1度くらいか。
温度変化 |
もうちょっと低温域ではがんがん上がるかもしれんが、制御したい肝のあたりでは2分で1度とすると、毎分みてフィードバックかける程度で済みそうである。
今後の課題としては、
- 料理に突っ込めるよう熱電対を細いステンレス管に入れてガラス蓋の穴から入れられるようにする
- Raspberry PI, リレーあたりをケースで覆う
- ちゃんとした放熱板を用意する
- フィードバック制御をちゃんとやる
- 使いやすい人とのI/Fを用意する
といったところだろうか