いよいよ制御部分です。
メインの基板はArduino leonardoを使いました。理由は余っていたから。それだけ。でも後々これがめんどくさかったり、よかったり。。
そして、熱電対はスイッチサイエンスの熱電対センサモジュールキットを購入しました。
マキシムのMAX31855という石を使っていて、センサモジュールとのやり取りはSPI通信でできます。
Arduinoに入っているSPIライブラリでそのまま動くだろうと思ってサンプルスケッチを動かしてみました。
ところが受信する値はずーっとゼロ。。おかしい。。。
LeonardoはSPI関連のピン配置が純血UNO系と違うんですよ。こんな感じにISPコネクタとMISOやSCKをつながなきゃいけないんす。
まあこれは想定していて、このせいかな~と思ってたんだけど、でもデータこない。
SPIライブラリの中をちょっと見たら、SSピンが固定なってたりしたんでLeonardoではコネクタにつながっていないSS(D17)をつないでみたり。でもこれは関係なかった。
これはモジュール側でMISO端子がグランドにショートしてるのかも??
オシロでSPIの波形みたり、いや、MISO端子とグランドをテスターであたるだけでも良かったのだが、結構はまっててもう嫌になってて、勝手にモジュールが悪いと決めてかかってました。
そんで、スイッチサイエンスさんに状況を説明したら、新しいのを送ってくれました。いつもながら素早い対応ありがとうございます。
んで新しいMAX31855モジュールで試したら、、、試したけど、、、状況変わらず。。。
こりゃ、SPIライブラリじゃね??ちゃんとクロック出てんのかよ???つかLeonardoに対応してるのか???
なんかSPIライブラリが信用できなかったので、ソフトSPIのライブラリを探して拾ってきました。
というか、MAX31855ライブラリがありました。Rocket Scream ElectronicsというところのMAX31855ライブラリ。
ソースみたらソフトでSPI通信やってます。これだ。これならマイコン種別かんけーないぞ。
ということでこのライブラリ使ってやってみたら、はい!ちゃんとデータ読めてます。
スイッチサイエンスさんごめんなさい。。不良品じゃなかったです。。。
このセンサモジュールにコネクタメスをつなぎました。LeonardoのISPコネクタにつながるようにしたんです。
その他はグラフィックLCD、これは秋月で買って使ってなかったやつ。
GLCDライブラリというのがあったのでこれで。ただ、ピンアサインが固定になってたんでその辺はライブラリ修正してピンアサインを自由に変えられる様にしました。
あ、Leonardoはアナログピンをデジタルピンとして使うときはポート番号が他のArduinoと違うのでそこも注意。LCDのバックライトはつきっぱにしました。
適当にステータス表示用にLEDを3個つなぎました。
SSRに3本。押釦スイッチを2個。
グラフィックLCDがデータ8本、CSが2本、RS、RW、ENで13本もポートを使用。
熱電対モジュールとの通信がSCK、DATA、CSで3本
LEDが3本、SSRが3本、押釦が2本でこれで合計22本!
なんとUNOだったらポート足りませんでしたわ。Leonardoにしてよかったのはこれです。
というわけでポート割り当て表
D0:ヒーター上
D1:ヒーター下
D2:ファン
D3:LED紫
D4:GLCD DB0
D5:GLCD DB1
D6:GLCD DB2
D7:GLCD DB3
D8:GLCD DB4
D9:GLCD DB5
D10:GLCD DB6
D11:GLCD DB7
D12:LED緑
D13:LED赤
D14:温度センサ MISO
D15:温度センサ CS
D16:温度センサ SCK
D17:押釦スイッチ2
D18:GLCD CS1
D19:GLCD CS2
D20:GLCD RS
D21:GLCD RW
D22:GLCD EN
D23:押釦スイッチ1
なんとleonardoのポートを全部使いました!
そんで、アルミ板を切り抜いたパネルにArduino LeonardoとGLCDとスイッチとLEDを固定
一度組み立てた後、「スイッチはひとつでよくね?」と思って一つに変更しました。
もともとはスイッチ1がスタート/ストップボタン、スイッチ2はプロファイル選択ボタンにするつもりだったんだけど、プロファイル変更することってあんまないな(鉛フリーかそうじゃないかぐらいかと)って思ってスイッチ2を廃止しました。
フロントパネルに穴が残っちゃうんでここにはUSBのBコネクタをつけて、フロントパネルはめたままデバッグやプログラムの書き換え、場合によっちゃあPC側アプリを作ってPC側でモニタリングやプロファイルの変更や管理ができるようにしましょということで。
上の写真はボタン廃止してUSBコネクタつけた後の写真でした。
とりあえずこの状態で各機能が動作することを確認。さあ次はソフトです。
ヒーターとファンはPWM制御します。ところが割り当てたポートはPWMじゃありません。
ま、ヒーターとファンだから遅くても問題なし。ソフトPWMのライブラリを作成しました。
#include
softPWM heater1(0, 255, 0, 10); // pin, max, init, resolution(ms)
こんな感じでインスタンス作ってやって、あとはメインループでloop()を呼んであげればポートパタパタしてくれるってライブラリです。
タイマ使ってもよかったんだけど精度そんなにいらないし、タイマ資源消費したくなかったのでこんな適当PWMにしました。
void loop(){
heater1.loop();
・
・
heater1.setValue(value);
}
ソフトの方でもう一つ必要なのがPID制御ライブラリ。今回ファンはオンかオフかだけにしましたけど、ヒーターは目的とする温度に調整するにはやはりPID制御が必要かと。
探してみたところPIDライブラリがすぐに見つかったのでそれ使いました。
PID制御するにはまず、素の状態のパルス応答を計測してパラメータを決めます。
というわけでパルス応答の測定です。
まだまだグラフは右上がり中ですがオーブンがぶっ壊れそうなんでやめました。
本当なら温度が飽和するまではかって、やっと飽和温度や傾きが求まるんですけど。。。
ですが、結局はPID制御のパラメータ、Kp、Ki、Kdは試行錯誤して決める事になりました。
そして決まった値と設定したプロファイルで試してみたのがこのグラフ。青い線が温度、赤い線がヒーターのPWM値。この後も若干調整していてプレヒート期間を長くしています。
ハード構成的には上下のヒーターを別々でコントロールできるようにしていますがいまのところ上下のヒーターを同時に制御してます。
しかし冷めるのが遅い。。
GLCDにグラフを描く様にして最初から実験。
よさそーです。
ということでフロントパネルを筐体にねじ止め
なかなかカッコいいオーブンが完成しました♪
さてそれでは、このリフロー装置で実際にリフローしてみましょう!
と、これまた(5)に続きます。。。