低温調理用のコントローラを作る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
低温調理用のコントローラを作る4
概要
完成した基板に部品を実装して、低温調理用のコントローラを作成します。
コントローラを組み立てる
基板が届きました
基板が届きました。発注から到着まではわりと早かったです。これに部品を実装してコントローラを完成させます。
使用する部品の調達
使用するパーツは、設計時にすでに選定しています。以下のパーツを使います。いろいろ忙しかったこともあり、秋月電子の通信販売で部品の調達を行いました。別に秋月じゃなくてもいいですが、私は秋月大好きマンなので贔屓にしています。
部品番号 | 数量 | 部品名 | 通販コード |
---|---|---|---|
IC | 1 | ATMEGA328P-PU | I-03142 |
Q1 | 1 | 水晶発振子 32.768KHz | P-04005 |
LCD | 1 | LCDモジュールAQM1602A-RN-GBW | P-08779 |
J1 | 1 | 2.1mm標準CDジャック 基板取付用 | C-00077 |
X_TEMP1 | 1 | ターミナルブロック 3ピン | P-01307 |
X_HEATER | 1 | ターミナルブロック 2ピン | P-01306 |
S1,S2 | 2 | タクトスイッチ | P-03647 |
ENC | 1 | ロータリーエンコーダ | P-06357 |
LED1~3 | 3 | 5mm LED | |
R1,R3,R7 | 3 | 470Ω カーボン抵抗 1/6W | |
R2,R4~6 | 4 | 10KΩ カーボン抵抗 1/6W | |
R8~11 | 4 | 100Ω カーボン抵抗 1/6W | |
C1~3 | 3 | 1μF 積層セラミックコンデンサ | |
C4~8 | 5 | 0.1μF 積層セラミックコンデンサ | |
JP | 1 | 2×2ピン 2.54mmピッチ ピンヘッダ | |
- | 2 | ジャンパピン 2.54mmピッチ | |
CON1 | 1 | 2×3ピン 2.54mmピッチ ピンヘッダ | |
CON2 | 1 | 1×6ピン 2.54mmピッチ ピンヘッダ |
はんだ付け
特段いうことも無いです。背が低くて、熱に強い部品から実装していきます。一号機は色々する予定なので、AVRは直接はんだ付けせずにICソケットを噛ませます。LCDと水晶発振子は、はんだだけだと固定強度に不安があるので、別途ホットボンドで固定しました。
はんだ付けがおわるとこんな感じ。温度センサも接続しています。
はんだ付けの確認
検図済みですし、特に検証はしなくていいでしょう。はんだ付けが失敗していないかだけ確認します。
動作確認
ジャンパの設定
ACアダプタの極性がどちらでもいいようにジャンパを設けました。センタープラスのアダプタを使うときは1-2、3-4と接続します。
温度センサの接続
Amazonで買った温度センサを接続します。左のコネクタにそれぞれ接続します。大体黒がGND、赤がVCCです。
プログラムの書き込み
ここまできたら、プログラムを書き込みます。CON1にAVRライタを接続してPCからプログラムを焼きます。
これでコントローラの完成です。
プログラムの実装と中身については別途紹介します。
Elecrow での穴加工
概要
Eleclowでの穴の指定方法まとめ。
長穴
DCコネクタとかの取付用に、長穴を開けたい場合があります。EagleではMillingレイヤに書き込むことで実現できます。最小1mm幅の穴が作成できます。
この方法で指定した穴は、特に指定しないとメッキ加工されます。メッキ加工が不要ならば、その旨をNOTE.TXT等適当な名前のファイルに書き込んで、ZIPに忍ばせておけばよいと思います。
スルーホール・普通の穴
Eagleでのレイヤは、Drills/Holesレイヤです。スルーホールだけならば、*.TXTを提出します。
普通の穴も開ける場合は、ファイルをスルホール用のデータ(*-PTH.TXT)と、非スルホールのデータ(*-NPTH.TXT)の2つを提出します。
*.TXTの提出だけでも、データを見てスルホール/非スルホールをElecrowの中の人が判断してくれている説もありますが、分けておいたほうが無難です。
Elecrowのサイトで入手できるCAMファイルは、スルーホールだけの設定になっています。普通の穴も開ける場合は、CAM出力時にHolesレイヤの指定を外してDrillsのみで出力し、後からProcess SectionでHolesを追加出力するのが良さそうです。
下の画面で、右のリストで出力するレイヤを指定できます。
困ったときは
「ここをこうしたいんだけど、あってる?間違ってたら連絡くれ」とメモを残しておけば、Elecrowの技術者側で、ある程度融通を効かせてくれます。
困ったら、素直に問い合わせてみるなりするのがやはり正道です。Twitterが反応はやくておすすめです。
eagle+elecrowでPCB発注まとめ
概要
eagleでデザインしたPCBを、Elecrowに発注する際の色々をまとめます。
対象の工程は、ガーバーの出力から商品の受取までで、PCBの設計は完了している状態から開始します。
基本の流れ
基本的には、以下のページを参考にしてもらえば問題ないと思います。
Elecrowはここ。
デザインルールチェック
基本は出てきたエラーを潰していくだけ。
”Stop Mask”エラーが山ほど出る場合があります。これは、シルクがStopレイヤにかかっているときにでます。無視してOKです。
Elecrowに限った話ではないですが、DRのギリギリを攻めると不良率が高くなります。格安PCBサービスを使う場合は、攻めない設計が無難だと思います。
ガーバーデータの出力
出力後に確認しよう
出力した後に、ビューワーなどで確認するとミスがわかりやすくて良いです。特にシルクについては、サイズや位置のずれが結構あるので、やっておくと吉。
私は、ビューワーにgerbvを使っています。
先に発注用ファイルを抜き出す
やっておいたほうがいいです。余分なファイルが混ざっているとミスも見つかりづらいですし、発注時に間違えると面倒です。
適当に作ったWindows用のバッチおいておきます。適当な名前.batとしてeagleプロジェクト直下に置いて使ってやってください。
@echo off
setlocal
echo "Extract Gxx Files"
set /P DST_DIRNAME="output dir name:"
mkdir %DST_DIRNAME%
echo "Top layer:*.GTL"
move *.GTL %DST_DIRNAME%
echo "Bottom layer:*.GBL"
move *.GBL %DST_DIRNAME%
echo "Solder Stop Mask Top:*.GTS"
move *.GTS %DST_DIRNAME%
echo "Solder Stop Mask Bottom:*.GBS"
move *.GBS %DST_DIRNAME%
echo "Silk Top:*.GTO"
move *.GTO %DST_DIRNAME%
echo "Silk Bottom:*.GBO"
move *.GBO %DST_DIRNAME%
echo "NC Drill:*.TXT"
move *.TXT %DST_DIRNAME%
echo "Mechanical layer :*.GML"
move *.GML %DST_DIRNAME%
echo "end."
pause
ビューワでドリルの位置がずれる問題
ElecrowのCAMファイルでは、ドリルデータが.TXTで出力されます。これはEXCELLONという形式なのですが、一部のビューワでは位置ずれが出て、正常に読めないことがあるようです。(Elecrowでの製造はこの形式で問題なし)
ビューワで確認したい!という場合は、CamProcessor画面のDrillsHolesタブで、出力フォーマットにEXCELLON_24を選んで、Process Sectionボタンから別のTXTデータを出力してみてください。これなら問題なく確認できると思います。
[追記] 最新のEagleでは、出力画面が旧Eagleと異なっています。フォーマットが選択できずにビューワで穴ズレが起きてしまいます。ずれ方も、大きくではなく、微妙にずれている感じ…。
しかし、製造はズレなくできるので問題ないようです。Elecrowで配布されているCAMファイルを使ってください。
発注
発注は、適当に項目を選んでカートに入れてお支払してください。
ちなみに、英語で住所かけなかったらローマ字でOKです。船だろうが航空機だろうが、最初は”Japan”しか見ないので。Japan以降の住所を確認されるのは、国内に入ってからなので問題ないです。
支払いは、クレジットカードで支払ったほうが、Paypalよりも若干レートが有利です。微々たる差かもしれませんが。
着荷
後は待っていれば届けてくれます。Elecrowは発送時に写真付きメールでお知らせしてくれます。
だいたい1枚から3枚ぐらいおまけでついてきます。これはElecrowのサービス精神の現れと同時に、不良があっても許してねという意思表示(だと思っています)なので、不良品が入っていたら残念、なかったらラッキー程度で構えたほうがいいです。おまけに期待しちゃダメ。
届いたらTwitterで写真付き報告すると、公式アカウントに補足されます。
SSRでACをPWM制御する
概要
家庭用電源などのACを、SSRでPWM制御します。gnuplotのリハビリも兼ねて。
SSRとは
Solid State Relayの略です。半導体を使ったリレーのことです。機械接点がないので壊れにくいのですが、リレーとは異なる動きもするので注意が必要です。
OFFのタイミングは制御できない
SSRは、トライアックという半導体部品で回路のオンオフを実現しています。ゲートに小さな電流を流すことで、T1,T2間を導通させることができます。
しかし、ゲートへ電流を流すのをやめたとしても、トランジスタのようにオフにはできません。一度T1,T2間が導通すると、電流が流れ続ける限りONのままです。
交流の場合は、電流がゼロになるタイミングがあるので、そのタイミングでOFFになります。つまり、ごく短いパルスをゲートに加えると、50Hz地域なら最大10msだけONになります。
原理上、直流は制御できません(ONにはできるけど…)直流の場合は、リレーやFET、IGBTを使いましょう。
デューティー比=エネルギー比ではない
下図は、デューティー比10%のときのSSR動作イメージです。素直に実装しようとすると、こんなイメージを持つかと思います。
これでは、負荷に10%のエネルギーを与えられていません。
DCでは電圧が一定のため、デューティー比とエネルギー比が一致しますが、ACは電圧が変化するためデューティー比とエネルギー比が一致しません。もちろん計算で求めることができますが、三角関数使うので、少し面倒です。
タイミングがシビア
SSRを使ったPWMでは、OFFのタイミングが負荷側電源の周期に依存します。正確に制御するためには、制御入力のパルス周期と位相を負荷側電源の周期×2(または×1)に合わせてあげる必要があります。
ダメな例1。電源周波数50Hz、PWMのパルス周期11ms、周期がずれている場合のイメージです。
少しづつずれていって、長期的にみると出力50%になってしまいます。
ダメな例2と3。電源周波数が50Hz、PWMのパルス周期10msと周期は合っているが、位相がずれている場合のイメージです。
どちらも10%ではないですね。マイコンから制御しようと思うのであれば、AC100Vと周期・位相を合わせるのは大変です。絶縁も大変だし、部品が増えるし…。
ではどうするか
パルス周期を電源周期に合わせるのではなく、長くしましょう。パルス周期を長いほど、出力の精度が上がります。
下図は、電源周波数が50Hz、パルス周期100s、デューティー比40%です。
このようにすれば、位相を気にせず可変出力が得られます。
低温調理用のコントローラを作る3
概要
低温調理用のコントローラ回路・基板を設計して、発注します。
設計
まずは回路を設計します。私は回路設計にeagleを使用しています。ちょこっとした基板ならFree版で十分ですし、色々なサイトで使用例が出ているので、困ったときには調べられるので、おすすめです。
ライブラリの準備
まずは基本的な部品はライブラリに登録されていますが、今回使う部品でないものだけを追加します。今回は、LCDがなかったので実物と添付資料をもとにライブラリを作成します。
回路図の作成
ATMEGA328を中心に、周辺の回路を書き込みます。今回は下記の機能を使います。
- INT0割り込み(ロータリーエンコーダ)
- PCINT割り込み(タクトスイッチ)
- Timer1 PWM出力(ヒーター制御)
- Timer2 非同期タイマ(RTC)
- ISP
- I2C(LCD制御)
- USART(デバッグ用)
I2Cなどの機能ポートは使用するピンを変更できないので、機能ピンを優先して配置して、その他の配線をしていきます。真面目に線を引くと、ごちゃごちゃしてわからなくなってしまうので、配線に名前をつけたり、ラベルを振ったりして読みやすい回路図にします。
回路の確認
回路が出来上がったら、ブレットボードで動作確認をします。これ以降の工程では、ミスを検出しづらいので、ここで確実につぶしておくことが重要です。
基板のレイアウト
レイアウト・配線
回路図が出来上がったら、ボードエディタに切り替えて、基板の上に部品を配置していきます。
レイアウトの確認
ある程度レイアウトと配線が完了したら、高さのある部品やコネクタなどが干渉しないかを確認します。
おすすめはプリントアウトして実際の部品をはめ込む方法。、画面で確認するより早いですし、バランスを確認しやすいです。
発注
Elecrowへ発注しよう
最近は、基板の発注がかなり安い。今回はElecrowのPCBサービスを使います。送料は別ですが、5×5cm10枚で9.5ドルです。品質や納期の評判もそこそこ良いです。
日本語に対応しているようですが、翻訳が少し怪しいです。ショップには、その他電子工作関連のパーツなどがいっぱいあるので、PCBサービス以外にも、目を通すと欲しいものが見つかるかもしれません。100ドル以上買うと送料無料になるようですが、PCBサービスについては送料無料の恩恵が受けられないみたいです。
デザインルールの確認
まずは、レイアウトした基板がElecrowで製造できるルールにしたがっているかを確認します。Elecrowの商品詳細画面から、デザインルールファイルを取得できます。
パッドにシルクがかぶっているとStop Maskの警告がたくさん出ますが、これは無視しても問題なさそうです。
ガーバーファイルの生成
同じくElecrowの商品詳細画面から、今度はCAM Fileを取得してきます。取得したCAM Fileを使って、ガーバーデータを生成します。
下記の8ファイルが必要なので、これをzipで固めておきます。
Top layer:pcbname.GTL
Bottom layer:pcbname.GBL
Solder Stop Mask top:pcbname.GTS
Solder Stop Mask Bottom:pcbname.GBS
Silk Top:pcbname.GTO
Silk Bottom:pcbname.GBO
NC Drill:pcbname.TXT
Mechanical layer :pcbname.GML
発注
…と思ったら、春節のお休みなので、休みが明け次第発注します。
低温調理用のコントローラを作る2
概要
今回は低温調理器を作るにあたって、主要な部品の選定について話します。
ちなみに
コントローラなんて作らなくてもいいよ、ただ使いたいんだよ!って方は、既製品を購入してもらったほうが早いです。ものによってはヒータ以外セットになってますし、それなりに安いです。
必要なもの
低温調理器は、制御の入門書などでよく見る、水槽の温度制御そのものです。制御対象は水温なので、制御対象の状態を知るために温度計が必要です。水温の操作は、上げるためにヒーターが必要です。下げるためにはクーラーが必要ですが、目標値は室温よりも高いため、クーラは必要ないでしょう。あとはヒーターのON/OFFを行うリレーと、制御用のCPUを選定します。
温度計
熱電対やアナログ出力の温度センサは、基準電圧の生成・管理が面倒なので、デジタル出力の温度センサを使うことにします。さらに、水につけるため防水加工が必要です。
デジタル出力のセンサにはいくつか候補がありますが、パッケージ化+防水加工されているものがAmazonで売られているので、DS18B20というセンサをつかいます。複数のところから同じような製品が出ているので、DS18B20を使ったものであればどれでもいいと思います。秋月電子で、センサ単体が250円ということを考えると、自分で単品を買ってきて防水加工する必要はないでしょう。約300円也。
ヒーター
試算したところ、温度の維持だけであれば100Wもあれば十分な感じです。やはり防水でなければならないので、まずは調理用の湯沸かし器を探しました。
Amazonで見つけた投げ込み式の湯沸かし器ですが、ワット数が高すぎるのと、熱源剥き出し、更に電源が海外仕様なので、ちょっと怪しい感じ。
他に良さそうなものがないので、代替案とりあえず水槽用のヒーターを使います。サーモスタット必要なタイプのヒーターを選んでください。オートヒーターではだめです。熱源が露出していないヒーターを使うことにします。約1,900也。
当然本来の用途と違う上、これを使う以上はAC100Vを扱うことになるので、取扱時にはそれなりに注意が必要です。場合によっては、他の加熱方法を考えます。
リレー
ヒステリシス制御であればリレーで良いですが、PID制御の実装を考えているので、PWM制御のしやすいSSRを使います。 Amazonに完成済みのモジュールが安く売られていますが、レビューに怪しいコメントがあるのを見つけてしまったので、中が見えて安心なものを使います、今回は秋月のキットを使います。250円也。
ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ
放熱をしなくても2A程度まで使用できるので100Wのヒーターなら十分でしょう。
制御用のCPU
ArduinoやmbedやRaspberry pi等のプラットフォームをつかうと実装が楽なのですが、そこそこのお値段がするので、水没・水ぬれする危険がある制御に使うのは気が引けます。なのでマイコンをそのまま使います。
入手しやすいのはPICとAVRですが、ライターの調達難易度からAVRを使います。PWMが使えて、そこそこGPIO数がある品を選びます。250円也。
制御プログラムを書いてみて、十分か判断しますがよっぽど大丈夫でしょう。
その他
調理するたびにPCなんて出したくないので、制御基板一枚で低温調理が完結してほしい。そのため、UIとして、以下の部品を使います。
- キャラクタLCD(I2C接続のもの)約500円
- ロータリーエンコーダ 80円
- タクトスイッチ 10円×2
- LED 3つ
これらと、抵抗などの必要な部品は手元にあったものを使います。諸々の部品含めると、コントローラだけで2000円ぐらいで仕上がるかと思います。
次回は、基板の設計と検証までをまとめます。