3Dプリンターづいている今日この頃。みなさんいかがお過ごしでしょうか。
先日3Dプリンターのキットが届いたと書きましたが、そのあとキットの組み立てはまだしてないんです。並行してCNCルーターで3Dプリンティングをしよう!とか、思い付きプロジェクトをやっていて泥沼に入っております。
その泥沼プロジェクトで毎日朝晩シコシコ作業していたのが、温度コントローラーを作るということでした。
CNCルーターで3Dプリンティングをするにあたっては、プラスチックを溶かす関係上、温度の管理をすることが必要なのですが、そういう道具立ては残念ながら持っていないので作んなきゃな、ということで作りました。
このページで紹介されているものと、まあ似たようなものです。
出来上がったものは、
こういうもので、ホットエンドとヒートベッド、それからホットエンドに付属のファンを接続して、温度制御、ファンのON/OFF制御ができます。設定温度の変更や各制御、それから設定のセーブ(EEPROMに)などが、本体の3つのボタンだけでできるようになっています。また、シリアルでPCに接続ができるようになっていて、サーミスターの定数や、温度制御のパラメターは、PCから変更でき、また、動作状況をPCからモニターできるようになっているのが特徴です。
基板の回路図を貼っておきますが、
基板のハードウェアとしてはおおむねArduino ボードにサーミスター入力、LCDとボタン3つ、MOSFET3つをつけただけ、みたいなシンプルな構成です。IC基板で配線してもいいのですが、ここはいつもの習慣通り切削で基板作成しました。
温度の制御は、接続したヒートベッドなどへの電流をMOSFETでPWM的にスイッチングして調節するようになっています。PWMの周波数はあまり高いと、音がしてあまりよろしくないので、周期は1秒程度のゆっくりとしたPWM制御をしています。最初PWMは、ArduinoのanalogWrite() を使ってみたら、ビービー音がして落ち着かないので、今のようなゆっくり制御になっています。たぶん、使用した電源はアナログメーターで電流を見ているので、メーターから可聴域の音が出ているんでしょう。
また、温度のフィードバック制御は、ありきたりですが、PID制御を実装してみました。
ユーザーインターフェースはそれなりに凝ったものに作りました。ファンはアニメーションでONにしたときLCD画面内で回りますし、ヒートベッドへの電流量(PWM値)をLCDの外字を定義することでグラフィカルに表示したりしています。
さて、出来上がった温度コントローラーを、亀甲型ヒートベッドに接続して制御してデータどりをしてみました。というより、PID制御のテストをしてみた、といった方が良いかもしれない。
これがテストの風景で、コントローラーの電源は、ずーっと倉庫で塩漬けになっていたアマチュア無線用の電源を使いました。20A以上流せるので大丈夫でしょう。
このヒートベッドを12Vで使うとおおむね7A程度の電流が流れますので、それなりに電源の配線は気を使います。少し電流容量が不足するかもしれませんが、配線は、18AWGのPC電源用の90cm延長ケーブルから線を切り取って行っています。
MOSFETは通電時かなり発熱しますので、このままではNGで放熱板をつける必要がありそうです。使用したMOSFETのON抵抗が最大0.08オーム程度あるとすると、7A通電時は4W弱のMOSFETでの損失になります。パッケージ(TO220)と外気の熱抵抗は63℃/W程度とすると、そのまま通電し続けると温度上昇は250℃以上という計算になり、チップの動作温度150℃を超えちゃいますのでアウトということになります。実際、MOSFETの発熱で、チップのON抵抗が高くなり、連続的に電流を流すと、電流値がだんだんだれてくるのが観察できます。無限大の放熱板をつけた場合には、これは、熱抵抗3.6℃/Wとなるようなので、14℃程度の上昇ですみます。
6/1に手持ちの3mm厚のアルミ板を25mm幅 100mm長さに切り出してMOSFETに取り付けてみました。結果は良好で、ヒーテッドベッドを120℃に調節した際も、MOSFETは手で触れる程度の温度に維持されているので、これでよさそう。
Reprapのコントローラー(RAMPSとかSanguinololu)を見ると、特にMOSFETに放熱板などはついていないので、どうなってんだろ。ヒーテッドベッドは直接つけられないんじゃないかな(とりあえず動くがそのうち壊れるパターン)。
コントローラー自体の消費電流は、17mA程度でしょうか。バッテリーにつないでいるわけではないので、特にCPUをスリープさせるなどの所作はしていません。
ヒーターのPID制御は下記のように行っています。
Terr(誤差) = T_target(設定温度) – T (現在温度) として、
pwm値(0-255) = Kp * Terr + Ki * ∫ Terr dt +Kd * dTerr/dt
でpwm値を計算して制御にかけています。∫Terr dt の項は、どんどん累積しても困りますので、-300~300の範囲にArduinoのconstrain関数を使って制約しています。
設定温度を70℃として、PCから動作状況をモニタリングしつつ実験をしてみました。
これは、積分の項Ki=0.4としたとき、Kp(比例項)の係数を70~500で変化させて状況をみたもので、Kpが大きいと、温度変化が振動的になることがわかります。Kpはばね的な動きの強さに関わると考えることができそうです。
一方、Kp は同じで、Kiを変えた場合には、余り小さなKiでない限り動作は似ていますね。
Kiが0だと、ターゲット温度より低い温度にしかいかない。Kiを設定すると最初オーバーシュートしますが、おおむね安定な制御ができているようです。
実験の結果から、今の場合、Kp=70, Ki = 0.4あたりが無難なパラメターと言えそうです。
また、10℃温度を上げるのに、15秒ほどかかっています。
120℃にヒーテッドベッドを維持する試験もやってみましたが、結構大変で、少し風が吹くと温度が低下してしまってちょっとぎりぎりだなという感じがしました。高温を維持するにはヒーテッドベッドの電力が不足している感じで、みなさんベッドの下側の保温材とか遮熱版とか苦労されているようですが、単純にヒートベッドに加える電圧をあげるというのも解の一つかなという感じがします。(台座が樹脂でできていることが多くあまり熱を加えられないということもあるとはおもいますが)。運用するときは、コントローラーに加える電圧を15V程度まで上げるということをやるのがよさそう。MOSFETの放熱には少し気を使っておかなければいけませんが。
というわけで、温度コントローラーはおおむねよさそうなので、別に入手したキットを組み立てつつ、こちらのホットエンド・エクストルーダーを組み立ててテストしてみるつもりです。