google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

ペルチェ温度コントローラーの製作(機能・ソフト解説)

◆まえがき
少し間が空いてしまいましたが、ペルチェ温度コントローラー作りの話の続きです。前回は基板とケース作りでしたが、今回は機能説明とソフトの解説です。

・ペルチェ温度制御装置の外観
ペルチェ温度コントローラー

◆機能説明
・操作パネル
操作パネル
下段には電源スイッチとOK表示(stabilized 表示)LEDを付けました。このLEDは実際の温度が設定値の±0.2℃以内に入った時に点灯します。上の段は操作スイッチでリセットとスタートボタン、項目選択つまみです。

電源を入れて、実行したい項目を選び、その後にスタートスイッチを押すことで実際に温度制御が開始されるようになっています。こうしておくと、電源を入れただけで加熱(冷却)運転が始まることは無いので安全です。なお、電源スイッチがあるのでリセットボタンは無くても良いのですが、あれば便利かもしれないので付けておきました。

◆表示パネル
・機能選択画面
現在の機能は下記の5種類です。最後に選んだ機能はEEPROMに記録しているので、次回の起動時は最初からその機能が選択されています。機能を追加・変更したい時はコード書いて再コンパイルです。
1. マニュアル :セレクトつまみで温度を設定します。設定値は運転中に任意に変更可能
2. プログラム1:10℃→60℃→10℃を10℃ステップ、各ステップ5分間ホールドの繰り返し。1サイクル50分
3. プログラム2:10℃→60℃→10℃を2℃/分の速度で昇温/降温、上下端で5分ホールドの繰り返し。1サイクル60分
4. プログラム3:10℃/60℃を最高速度で繰り返す。各温度で1.5分ホールド。1サイクル3分
5. プログラム4:20℃/50℃を最高速度で繰り返す。各温度60秒ホールド。1サイクル2分

・機能選択画面
マニュアル

プログラム-1 20191222IMG_0651.jpg 以下同様

・運転中の画面表示
プログラム-2
128x32画素のOLEDに出来るだけ多くの情報を詰め込みました。
・運転時間はスタートからの累積時間を秒で表示します。なおマニュアルでも表示。
・ペルチェのパワーは±100%の数値で示すと共に、一番下にバーグラフでグラフィックに表示しています。左に振れると冷却、右に振れると加熱ですが、直感的に判り易いです。

◆プログラム
こちら → ペルチェコントローター制御プログラム 20191221peltierTempCon (shift-JIS です)

機能が多いので長めのプログラムになっています。全体のポイントは以下の通りです。
・タイミングはMsTimer2で5ms周期の割り込みで制御
・ペルチェのパワーはフルブリッジを使ったPWM制御 (Arduino の analogWrite )
・温度はPID制御

◆PID制御
Arduino のライブラリもあったのですが、使い方が判り難かったのと、制御出力が正負に対応していない感じがしたので、自前の関数を作りました。そうはいっても、計算は離散値PID制御で標準的に使われている式でやっています。なお、PIDのパラメーターはプログラム先頭付近の #define の Kp, Ki, Kd の値で定義しています。

一般的な計算式を使ったといっても少しカストマイズしているので、自分用のメモを兼ねて中の仕組みを解説しておきます。

PID制御の出力はfloat pid( ) 関数の戻り値となっています。この関数が制御のキモなのでコードを見ながら説明します。
float pid(float sv, float pv) {       // 制御量を計算(pid制御)飽和対策
float x;
float e, dP, dI, dD;
static float e1 = 0.0;
static float e2 = 0.0;
static float lastMv = 0.0;
float dMv; // 操作修正量

if ((sv - lastSv) > 2.0) { // 1回の変化量の上限超えていたら
sv = lastSv + 2.0; // 微分成分の飽和防止のために変化量を制限する(2℃/0.2秒)
}
if ((sv - lastSv) < -2.0) {
sv = lastSv - 2.0;
}
lastSv = sv; // 次回監視用に値を保存

// 離散値に対するPID制御の式で制御量を決定
e = sv - pv; // 現在の誤差量
dP = Kp * (e - e1); // 比例部
dI = Ki * e; // 積分部
dD = Kd * ((e - e1) - (e1 - e2)); // 微分部
dMv = dP + dI + dD; // 補正量計算

Serial.print(F(", ")); Serial.print(TTC * 0.2, 1); // 時間
Serial.print(F(", ")); Serial.print(dP); // ΔKp
Serial.print(F(", ")); Serial.print(dI); // ΔKi
Serial.print(F(", ")); Serial.print(dD); // ΔKd
Serial.print(F(", "));

x = lastMv + dMv; // 制御量を決定
e2 = e1;
e1 = e;

if (x > 100.0) { // 調節範囲の上限越していたら
x = 100.0; // 100%でクランプ
}
if (x < -100.0) { // 下限以下なら
x = -100.0; // -100%でクランプ
}
lastMv = x; // 次回の計算用に保存(制約付きで保存)
return x; // 実際の制御量を返す
}

1) PIDの制御量計算
この関数では毎回制御量を計算し、30行の x = lastMv + dMv; で実際のペルチェの出力を決定しています。この式は過去の計算結果が累積されるので積分型になっています。こういう方式にしておくことで過去のデーターを大量に保存しなくて済み、プログラムが簡単になるのだと思います。

積分した結果でPIDの各要素の効果を発揮させるということは、それぞれの要素はあらかじめ1回微分した値を用意しないといけません。つまり、P(比例)は誤差の微分で、I(積分)は誤差そのままで、D(微分)は誤差を2回微分した値で準備します。dP, dI, dD の各要素はそういう意図で計算されているのですが、最初はこういう理屈が判らなくて悩みました。

2) アンチワインディング
例えば設定を70℃とした場合、実際に到達可能な温度の上限は約65℃なので誤差はゼロになりません。こういう状態が続くと積分項の効果はどんどん蓄積されるので制御量は非常に大きな値になってしまいます。そういう状態から例えば設定値を50℃に下げたとします。当然制御量を減らして追従しようとしますが、すでに非常に大きな値が入っているのでなかなか制御量が減りません。その結果反応時間が遅れてしまいます。これをワインドアップ現象と言います。
そういう問題を無くす方法はいろいろあるようですが、34から39行の処理で制御量の上限を制限しました。

3) 設定値変化速度の制限
以上のような方法でアンチワインドアップ対策を行うと計算結果の情報の一部が失われることになります。一番影響が出るのが微分項です。最初の変化は無視されてしまって、後半の変化量だけの情報が反映されるようなことが起きてしまいます。その結果、極端な場合は操作方向が逆になってしまうようなことまで起きてしまいます。そういう場合でも、時間が経てば誤差ゼロの状態に収束しますが、応答時間が長くなって好ましくありません。

対策はいろいろ考えられそうですが、手っ取り早い処置として、操作の変化速度の上限を制限することにしました。具体的には9~15行までの処理で、ここで1回、つまり0.2秒あたりの変化量を最大で2℃に制限しました。

◆まとめ
・PID制御のプログラムはもっと美しい実装がありそうですが、とりあえず動いているのでまあこれで良いかと思っています。PID制御を本格的に勉強しようとしている学生には非常に良い教材なので、もっと性能の良い実装を考えてもらうと良いと思います。

ダイソーの3.4AのUSB充電器を何かうまいことに使えないだろうか?というかなり不純な動機で始めたペルチェ温度コントローラーですが、やってみるとなかなか面白かったです。これ作らなかったらPID制御なんてやらなかったので良い経験をさせてもらいました。

・表示に小型のOLEDを使いましたが、表現力が高く、グラフィックな表示も出来るのでなかなか使い易いです。ただ1倍角の文字は小さすぎて読みづらいので、縦だけ2倍角の文字、つまり幅6画素で高さ16画素の文字が表示できるともっと表現の幅が広がると思います。誰かそういうライブラリを作ってくれないですかね。ひょっとしたら Adafruit_SSD1306 で出来るのかも知れないのですが。

Arduino で作るクリスマスツリーイルミネーション(改良版)

一昨年にArduino で作るクリスマスイルミネーションを作ったので、今年も引っ張り出して飾っています。せっかくなのでプログラムをバージョンアップして、イルミネーションのパターンを追加してみました。

作業は Arduino NANO を使って行いました。

▼プログラムのバージョンアップ作業中
Arduino NANOで豪華なLチカ、ツリー
NANO を使うとコンパクトに作業を行うことが出来ます。

回路図
Arduino NANOで豪華なLチカ
ポートからGNDへ向けてLEDを接続しています。形が悪いですが、上の緑色のLEDがクリスマスツリーの先端になるイメージでイルミネーションのパターンを作っています。

プルアップ抵抗を使ってLEDを光らせているので外付けの電流制限抵抗はありません。なお、プルアップの抵抗値は高いので、出来るだけ明るいLEDを使う必要があります。最近のLEDなら大丈夫です。指向性の強いLEDを使うと、正面から見た輝度は高くなりますが横から見ると暗くなるので痛しかゆしです。

今回のプログラムの改版で、流れ星というか雨だれのようなパターンを今回追加しました。

プログラムはこちら。ツリーイルミネーションのプログラム 20191213Xmassilumi.txt

Source code in English varsion :20191213XmassIlumi-E.txt


▼動画


ブレッドボード上で動かしているので窮屈ですが、配線を延長して小さなツリーにLEDを取り付けるとそれっぽくなります。その話が以下に続きます。

せっかくプログラムが出来たので、以前作ったミニクリスマスツリーのプログラムを書き換えましたが、そのために書き込み回路を追加しました。
▼クリスマスツリーの回路図(書き込み回路追加)
ツリーイルミネーション回路(ATmega328P)
右下が今回追加したシリアル書き込み用の回路です。

CPUは内部8MHz CRオシレーターモードにヒューズを切り替えているので、Arduino Pro mini (8MHz) として書き込みを行います。

▼こんなツリーです
ミニツリーのイルミネーション

・制御回路
イルミネーションの制御回路
薄いベースの中に回路を入れてあり、DIPパッケージのCPUの足を曲げるという禁止技を使っています。QFPパッケージのArduino NANO や Pro なら基板がそのまま入ったかも知れません。

▼動画


◆まとめ
ATmega328P の単独動作にするためにはいろいろハードルがあって大変ですが、Arduino NANO をそのまま使うなら難しいところは無いのでお勧めです。それに中華な互換品なら値段も安く済みます。

このクリスマスツリーをネタにしていろいろ引っ張ってきました、(例えばこんな物も) が、そろそろ限界ぽいです。何か他の出し物を探さないといけない時期のようです。

ペルチェ温度コントローラーの製作(基板とケースの製作)

◆まえがき
久しぶりにペルチェ温度制御装置の話です。前回の記事でソフトはあらかた出来たので、今回はプリント基板とケースを作って最終的な形に仕上げて行きます。とは言ったものの、製作中の写真はほとんど撮っていないので、完成状態の写真で紹介します。

現物の前にまずは回路図です。

◆回路図 (図をクリックで別窓に拡大図)
Arduinoを使ったペルチェ温度コントローラーの回路図
モジュール間を分離するためのコネクタを書いて、実装状態が判る図面に書き換えました。この図面に書き忘れちゃいましたが、電源スイッチはコネクタで操作パネル側に引き出しています。あと、クーリンファンの電源の配線(5V)も書き漏らしていました。

コントローラーには安く手に入る Arduno NANO の互換品を組み込んでいます。

電源は USB の ACアダプタを使いますが、NANO の基板の電源をどうやって供給するかが悩ましいところです。今回はショットキバリアダイオード (D1) を経由して NANO の +5V ピンに直接供給する方式にしました。なお、もし 7V 以上の電圧の電源を使うなら、VIN から供給することになりますが、このあたりの話は、Arduino よもやま話-7 (Nano の互換機を使ってみた) に関連の話が出てきます。

◆各部の写真
以下写真で紹介していきます。
・全体
ペルチェ温度コントローラー
プリント基板が剥き出しになっちゃってますが、この状態で完成としました。まあ使うのは自分だけだし、使用頻度も少ないはずなのでこれで妥協しました。

・正面
ペルチェ温度コントローラー
パネルは厚さ1mmくらいのプラ板で作りました。これ、加工しやすくて便利です。

・操作パネル
操作パネル
128x32 画素の OLED に情報を表示しています。右のツマミはロータリーエンコーダーで、これを使って各種設定を行います。下の方に緑色に光っている LED は温度が設定値の±0.2℃以内に入ったことを示しています。

この OLED はサイズが小さいのが難点ですが、安いのに視認性が良く表現力も高いので便利です。Arduino を使った工作の表示にはキャラクタ液晶を使うことが多かったですが、このようなグラフィック OLED を使うともう戻れない感じです。

・モジュールを分解した状態
ペルチェ温度コントローラー、コネクタを外した状態
メンテナンスし易いようにモジュール間はコネクタで分離出来るようにしました。

・プリント基板
ペルチェ制御基板
おなじみの秋月のC基板をそのまま使いました。

・基板裏面
コントローラー基板の裏面
いつもより使った線の色が多いですが、パワー系と制御系の電流パスを明示するために線の色と太さを変えています。

信号の配線はいつものようにφ0.26の青色のPTFEの単線を使っています。この線の在庫が少なくなったので、そろそろ秋葉原のオヤイデ電気に買い出しに行かないといけません。調布のマルツにあればそこで済ませたいところです。

・基板取り付け状態
ペルチェ制御基板の取り付け状態
コネクタはピンヘッダ/ピンソケットを必要なピン数に切断して使っています。なお、逆挿ししないように(し難くなるように)、ケーブルをフォーミングしています。左下の赤/青の線は電源ですが、ここには少し電流容量の大きな逆挿し出来ないコネクタを使っています。

・保温カバー
保温カバー
多少なりとも外乱の影響が少なくなるように、硬質のスポンジを両面テープで貼り合わせてて作った保温カバーを用意しました。

・裏側
保温カバー裏面
カバーは輪ゴムで止めています。被試験物も輪ゴムで軽く押し付けられるように、M2.5のタップ穴をいくつか開けておきました。

◆まとめ
・あまり見かけは良くありませんが、とりあえず使い易い状態にまで仕上げることが出来ました。デバイスの温度特性の測定などに便利だと思います。

・次回の記事ではソフトの解説と機能解説編を予定しています。

◆電源容量について
電源にはダイソーの 3.4A 出力の USB 充電用の ACアダプタを使うことを想定しています。というか、ダイソーの 3.4A の ACアダプタを買ったのがきっかけでこのペルチェ温度コントローラーの製作を思いつきました。

しかし実際に動かしてみると、大電流が必要になるのは、最大発熱から最大吸熱へ、あるいはその逆に一気に切り替えた時だけでした。これはペルチェ効果による電圧が残っている状態で逆電圧を加えるので大きな電流が流れるわけで、そういう状態はすぐに解消されてしまって、定常状態では1.8Aくらいの電流容量があれば十分でした。

つまり 3.4A の電流容量が無くても何とかなります。もちろん過大電流が流れると出力電圧低下などのい問題が発生しますが、そういうことに目をつむれば、普通のスマホの充電器がそのまま使える可能性が高いです。
カレンダー
05 | 2020/06 | 07
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード