« 2011年10月 | トップページ | 2011年12月 »

2011年11月の3件の記事

2011年11月25日 (金)

熱電対によるヒーター制御:比例(P)制御だけで十分か

電源とAC制御部の制作(11/16/2011)
 熱電対を使ったヒーターの温度制御は、SSR(ソリッドステートリレー)によるAC制御部とマイコンの電源を、ケースの都合で温度表示・設定部と別にすることにしていた。ところがあらためて調べてみると手持ちのケースの中に、電源部などが入る適当な大きさのものが見つからない。

 結局、何か買ってこなければならなくなった。何だ、それなら最初から両方が入るケースを買えばよかったのだ。やっぱり思いつきで工作はするものではない。ケースが2つになってしまう。効率が悪い。

 久しぶりに秋葉原に出て、千石で適当なケースを探す。温度表示・設定部のテイシン(TB-65B)と同じメーカーのTB-73(60×90×29 ¥220)にした。こちらの方が新しいシリーズらしく、固定したままケースをはずすことができるように改良されている(前のはケースを開けるのに、固定板をとりはずす必要がある)。

S_pb184378 ただ、前に較べるとちょっと背が低い(高さ29mm)。SSRに手持ちのヒートシンクをつけたので入るかどうか心配だ。ヒーターは300Wくらいだが、連続通電はまずしない。ヒートシンク無し(2Aまで)でも大丈夫だとは思うが、念のためつけてある。これで連続400Wくらいまで大丈夫なはずだ。しかし、ヒートシンクの高さは出先なので、その高さがわからない。

 秋月で、手持ちのものよりもう少し小さい(と思う)シンクを念のため買った。家に帰って確かめる。おお、うまいぞピッタリか、いや、このヒートシンク(高さ18mm)でもSSRのキットをそのまま基板の上に載せると入らない。うーむ、どうすれば良いか。そうか、キットの配線をベース基板に移せばそれだけ低くなり、このケースに入りそうだ。

 いや待てよ。トライアックだけベース基板に移せば、キットの基板配線をそのまま使える。リード線でトライアックを主基板に移す。ちまちました作業だが、少しでも合理的な工作が出来ると嬉しいものである。はたからみれば、何のことで一喜一憂しているのだといぶかれるだろうが、自分の知恵で課題が解決するというのが快感なのだ。

S_pb184382 ソフト開発の方は、だいぶ前にon/off制御のステートメントを入れ、テストが済んでいる。単に1秒ごとに、温度が設定より高くなればoff、下がればonになるという滅法簡単なロジックをいれただけだ。もちろん、あとで、PWMなどで比例制御をやるつもりだが、これはあくまでもテスト用である(これでうまくいけばという下心もある)。

 工作を続行する。マイコンの5V電源は、このあいだLAN電源制御コントローラーで壊れたACアダプターを分解してセットする。あのあとパンクしたコンデンサーを取り替え、割れたケースを接着して使えるようにしていた。資源の徹底活用である。

 ここの自慢は、このアダプター基板の固定だ。外側のモールドを、サーキュラーソーで4ミリ程度に輪切りにし、これを基板に接着した。ちょうどモールドには基板を固定する爪がついており、これを生かしたのでちょうどピッタリ固定される(最終的にはホットボンドで固定)。

 いやいや好調である。「俺は天才ではなかろうか」などとうそぶきながら、機嫌よく工作を進める(単にケチなだけだが)。ACコード(何でAC用はどれもこんなに太いのか)のハンダ付けが少々面倒だったが、キットを組み合わせるだけである。大した手間もかからずAC制御と電源の配線は終了した。

 むしろ外回りのAC線の引き回しが厄介だった。ACをいきなりon/off制御をするのは、何となく怖いので、最初は調光器を経由してやろうと考えている。これから予定している比例制御(P制御)の感触をつかむためもある。 

 しかし、そのままつなぐとマイコン電源アダプターに調光器で落とされた電圧がかかってしまいまずい。はじめは、ハンダ付けか何かで制御部と、電源部のAC入力を仮にわけようと考えていたが、AC制御部の出力のピン差込端子(車の電装用と思われる)に、ピン差込端子を経由してアウトレット(ACコンセント)を用意すれば、調光器をヒーターだけにかけられることに気づいた。こうしておけば、仮配線はしないですむ。早速、余ったピン差込端子を使ってこしらえる。

S_pb224399 ピン差込端子は、もしかするとAC配線用ではないかもしれない。しかし振動の激しい車で何十アンペアという大電流に耐えられる端子である。全く大丈夫と判断している。もちろん自己責任である。アクリル曲げ器を動かしたまま、家を留守にすることはあり得ないし。

 熱電対がニクロム線に触れぬようガラス繊維チューブを切って細いキャップを作り、接合点に被せ、アクリル曲げ器のニクロム線のコイルの中に差し込む。バラックも良いところだが、とりあえずヒーターの温度制御の実験環境はととのった。

on/off制御では温度差が激しすぎる(11/18/2011)
 いよいよ、AC電源を入れたテストである。始めは怖いので、ヒーターではなくスタンドの白熱灯を負荷にする。勇気を出して電源部のACコードを差し込む。緊張の一瞬だ。よし、温度測定・設定部の7セグLEDが点いた。正常に5Vは供給された。しかし電灯は点かない

 う、温度設定はONのはず(設定温度が現在温度より高い)なのにおかしい。慌てて電源を切る。スタンドを確かめる。はっはっは、スタンドのスイッチが入っていなかった。スイッチを入れて再度通電。おめでとうございます。スタンドのクリプトン電球が点灯した。S_pb224396

 設定温度を下げれば電球は消える。リレーではないので全く音はしない。たいした回路でもないが、すべての部品がちゃんと機能して、思い通りに動いてくれているのを見ることは無性に嬉しい。子供のようにロータリーエンコーダーをぐりぐり回し、点けたり消したりして暫く遊ぶ。

 さあ、次は本番のヒーター制御のテストである。温度推移を記録するため、UARTを復活させ、ケースから出してISPケーブルをつけ測定に入る。ふむ、ISPピンを外に出しておかないと不便だな。また穴あけをしなければ。10秒ごとに温度をUARTに出力させてグラフを作る。

Photo 結果はグラフを見てもらった方が早い。最初のグラフの山は、調光器を入れて設定温度を100℃にしたときのカーブである。調光器のセットは、以前連続で150℃近辺になるよう調整した電圧である(テスター見るとRMS40Vくらい)。オーバーシュートもほとんどなく、温度の差は20℃内外で、on/off制御でも、まあまあの性能である。

 一方、次の大きなカーブは、調光器なしに直接100Vをon/offした結果である。生の100Vでは250Wのニクロム線でも(例のCT電力センサーで測った)、温度は一気に上がり、100℃に設定しても、温度の慣性が高い(というより熱電対と発熱源が離れすぎているのだろう)ので、電源がoffになってからも200℃近くまで上昇し、そのあとも激しく温度変化を繰り返すことがわかる。

 調光器で加減すれば、20℃内外の温度差で落ち着くが、設定温度を変える度に、調光器で調整する必要がある。まあ、アクリル曲げ器くらいなら問題ないだろうけれど、これでは自動制御とは言えないだろう。完成度が低すぎる。もう少し手を入れてやる必要がある。

 温度が測れるので、色々試してみた。調光器による温度設定は、加減すれば一定の温度にとどまり、うまくやれば安定した温度が得られることがわかった。負荷をかければもちろん駄目だが、アクリルの曲げるところを当てるくらいでは余り影響がないだろう。もうひとつのグラフは、この安定した温度が得られる様子を示している。温度が安定する度に調光器のボリュームを上げて温度を段階的に上げている。

Photo_2

 さあ、これに負けない制御にしなければならない。なるべく単純なロジックで最大の効果が出るしかけを作りたい。あれこれ考えをめぐらす。紙にメモをとりながら可能性を探る。電子工作の醍醐味のひとつである。

しゃれた二次曲線の比例制御ではうまくいかない(11/21/2011)
 とはいえ、on/off制御の次にやるべきは、やはり定番の比例制御である。設定温度との差に応じてヒーターにかける電力を上下させる。今度の温度制御は、アクセル(ヒーター)だけで、ブレーキ(強制冷却など)のようなマイナス方向の制御はしないので、精密な制御はもともと無理でするつもりもない。

 電力の制御は、秋月のSSRキットである。本来は、on/off用だが、このSSRはゼロクロス制御機能を持ったフォトトライアックを使っているので、電源周波数(50Hz)分50段階の電力制御が可能だ(正確には半サイクルごとの100段階まで、長周期にすればいくらでも多段階にできる)。

 お手本は、前記事に紹介した、このハンダごての温度コントローラーの記事である。全く同じキットを使われている。音、LEDなどの光と違ってヒーターという非常に時定数の大きい制御対象なので、この程度のゆるいスイッチングでも全く問題はない。

 ただ、問題は通常のマイコンのPWMにこんな低い周波数でPWMが出来るものがないことだ。しかし、マイコンの便利なところは、このあたりを気楽にタイマーの割り込みで作ってしまえるところだ。

 タイマーで、50Hzのタイミング、20msの割り込みを発生させ、割り込みの都度、制御係数を見て、適当なパルス幅を決めてやれば、1秒間隔(1Hz)の自作PWMが完成する。カウントは50で繰り返す。対象の周波数との同期をとる必要はない。少し遅れるがフォトトライアックの部分で同期する。

 比例制御の実行部分は、これで整った。次は、制御仕様の部分である。ウェブには色々な方法が紹介されているが、とりあえず、比例制御の部分を設定温度の1/2から始めることにする。それまでは全力(100%)でヒーターを加熱する。比例部分は、単なる直線では面白くないので、2次曲線で比例するように趣向をこらしてみた。時定数の大きい熱制御なので、最初は激しく、後半は慣性が効いて来るので小さく加熱というくらいのつもりである。

 難しいコーディングでもない。ただ、2次曲線で比例制御するために2乗の計算を整数でやるのは、ちょっと大変だった。16ビットではなく、32ビットの変数が必要である。桁あふれをしないよう、割り算で有効数字がなくなってしまわないよう、気を遣う。久しぶりに方程式を立てて制御係数が0から50になるようにする。

 手作り1秒PWMはオシロでうまく動くことを確認した。さあ、いよいよテストである。温度設定を100度にしてスイッチON。おお、順調に比例制御が出来ているようだ。UARTに刻々と比例制御の係数が出力され、温度の1/2から、PWMが効いてパルスが細くなっていく。

 ただ、最初の突っ込みは比例制御の範囲ではないので、猛烈な立ち上がりとなる。ヒーターと熱電対の間が離れているので、遅れが大きい。目標温度を感知した時は、既にこのパイプを倍の温度近くまで加熱する熱量を出した後だ(調光器を通さず、250Wの全電力がかかる)。比例制御は最初からやるべきか。

10

 おやあ、150℃の設定で140℃にしかならない。100℃でも10℃近い偏差が出て目標温度に達しない。二次曲線なので、目標温度付近の比例制御値は0に近く、この程度の加熱では、100℃以上の高温にならない。

 そうか、積分制御(I制御)というのは、こういうときのためなのか。段々わかってきたぞ。PID制御というのは徹底した実務的な制御なのだ。色々な系の状況を吸収して、合わないときは所定の目標値に強引に合わせるというのが、I制御なのだ。こうやって制御を実際に動かしてみると良く理解できる。

 感心していても、解決策は生まれない。PID制御まで行かないで、もう少し簡便な方法で制御ができるはずだ。やはり基本に戻って、普通の一次比例制御(直線制御)でやってみよう。

単純な比例制御と倍周波数のPWMで予想以上の成果(11/24/2011)
 直線制御にするついでに、制御段階をさらに細かくしてみることにする。交流なのでゼロクロスするところは1サイクルに2回ある。50段階ではなく、100段階のPWMが可能だ。

 割り込みの間隔を1/2にし、比例値を0~50でなく、0~100にする。今度の比例分を出すのは、さっき苦労して計算した2乗など必要ない。32ビット変数もいらないくらいだ。あっけなくロジックも出来た。

 勇躍、テストに入る。目標温度を150℃に決めてヒーターONする。よーし、今度は、比例制御を目標の1/2ではなく最初から比例するようにしたので、立ち上がりがおだやかになった。オーバーシュートも50℃以内におさまっている。良いぞ。

 比例制御を最初からやっているので高温の時は遅くなるかもしれないが、この程度のパイプを熱するだけなら全く問題ない。しかし、150℃の目標温度に近づかない。うーむ、一次比例でも駄目なのか。やっぱり積分制御が必要なのかなあ。

 どうしようかとオシロのPWM波形を見ていたとき、閃いた。目標温度に近づかないのは、失われていく熱に対して、供給する熱が少ないからである。この量を増やしてやれば良い。PWMの間隔を50Hzでなく倍にしてみてはどうだろうか。

P

 理論的には、比例制御の勾配を倍にし、1/2のところから比例制御するのと同じだが、まあ、だめもとでPWMの間隔を半分にしてみる。ビンゴ!であった。150℃はもちろん、100℃、50℃でも±10℃の間でピッタリ納まった。立ち上がりこそ、最初が全力で立ち上がるのでオーバーシュートが100℃以上になるが、それ以外はもう文句のつけようのない制御である。いやあ、比例制御だけで十分か。

S_pb224393

 このアクリル曲げ器のニクロム線(250W)とアルミパイプなどの機器の熱容量にだけに通用する制御だけれど、比例制御だけで、こんなに安定して温度が制御できるとは思っていなかった。30℃や40℃の設定でも結構OKである。余裕が出来たので、CT電流センサーの出力をオシロに入れ、SSRの制御波形を観測してみた。50Hzの波形が見事に、立ち上がりからスタートしているのがわかる。AC制御・電源部のケースも完成した。電源がONのときは赤LEDが点灯してパイロットランプ代わりになっている。

S_pb224392

 お約束の回路図とソースコードを公開することにする。電源部とSSRは既製品とキットの活用である。ソースコードは今後、(I)(D)制御を加える予定なので、あくまでも途中経過のコードであることをおことわりしておく(エラー表示も未実装)。また当然のことであるが、回路図、ソースコードとも全くの無保証であるのでそのつもりでご利用頂きたい。

S_pb244405

以下に例によってAVRStudioのフォルダーでかためたソースコード一式を置きます。回路図ファイル(bsch3V)も入っています。ソースコードは、参考のために、あえて試行錯誤の後をコメントアウトで残してあります。

「ThrmCpl861.zip」をダウンロード

Thermocouple_3

 

| | コメント (2) | トラックバック (0)

2011年11月14日 (月)

熱電対によるヒーター制御:温度測定と設定部の実装完成

 Tiny861のバグ騒ぎが一段落して、ブレッドボード上では熱電対による測定温度の表示と、温度の設定までの機能が完成した。7セグLEDは、FPGAのときに使った6桁のテスト基板なので1列の緑単色と味気ないが、実装版は緑と赤の2段の7セグLEDでそれらしくなるはずだ。

 温度設定のロータリーエンコーダーも余程、高速で回さない限り割り込み方式で確実に回転を捉えている。ただ、値が変わる度にEEPROMにデータを書き込んでいると、とりこぼしが多い。EEPROMは書き出しに4ms近く待たされるからだ。まあ、そんな高回転でまわすこともないし、大勢に影響はない。

 実装版は結局、当初案どおりアクリル曲げ器のスイッチ用の小さなケースに表示・設定部を組み込み(というよりここの工作が先行してしまっている)、SSR(ソリッドステートリレー)などのヒーター制御部は分離する方向で計画が進んでいる。どちらも曲げ器の台板に固定して使う予定なので、分ける必要はないのだが、部品在庫一掃のねらいもある。

久しぶりのハンダ付けが楽しい(11/6/2011)
 実装版は、ケースが決まっているが構成は確定していない。いつもと順序が逆である。今回の工作は2階建ての基板で、上に7セグLEDとエンコーダー、シフトレジスターが載り、下の基板がCPUとオペアンプなどのアナログ部が載る予定である。

S_pb064326

 いつものようにアートワークを始める。下の主基板のCPU部や、アナログ部はスペースもあり、アートワークを描くまでもないのだが、上の7セグLEDの方は配線のスペースがない。7セグLEDのダイナミック表示のため並列配線も簡単なように見えて重ならないようするのは、そう簡単ではない。おかしいな。こんなに大変だったっけ。

 まあ、簡単でないから面白いということもある。そうか、このあいだはLEDはわずか2つだけだったし、FPGAの時に作った6ヶの7セグLEDは、ピンが縦位置で、並列配線が楽だったのだ。今度は、ピンが横位置でしかも3ヶづつ2段。面倒なわけである。

 アートワークの面白いところは、工夫次第で配線が一気に楽になることがあることである。そういえば、Eagleでは日がな一日、これをやってあきなかった。他の事もやりながら(気分を換えて見直すと、良いアイデアが浮かぶ)、2日間かけて主基板とLED基板2枚のアートワークは完成した。

 いよいよ、実装だ。久しぶりのハンダ付けが楽しい。まず、主基板のアナログ部から配線を始める。アナログ部の配線はわずかですぐ完成した。例によってkumanさん流の逐次開発方式で、ブレッドボードでやった調整をもう一度、実装版で繰り返す。

 アナログ部は、冷温端の温度を計測する温度センサーLM60の出力電圧を、熱電対の発生起電圧(1℃あたり、40.7μV)に合わせる分圧抵抗の調整と、熱電対と合算した電圧を、Tiny861のADコンバーターの測定範囲(最大2.56V 10ビット1024段階)に合わせて増幅するオペアンプの増幅率の調整である。

 LM60 は半田付けせず、調整のためソケットにしてある。まずLM60をつけずにソケットに適当な電圧をかけ、熱電対との分圧回路の補正を行う。ここは室温の補正なので数百度の温度を扱うときは、それほど神経を遣う必要はない。抵抗を分離して片側を固定抵抗にしたので調整は簡単に済んだ。 

 次は、オペアンプの増幅率の調整だ。ここはオフセット電圧もからむので、熱電対をはずして、また別の電圧をかけ、方眼紙を取り出して慎重に測定を開始する。

 うーむ、オペアンプのリニアリティが余り高くないな。どの電圧域でも同じ増幅率というわけにはいかない。電圧の高いところで、所定の増幅率61.425(1℃あたり2.5mVにするため、2.5/0.0407)にすると、低い電圧(0.1V以下)では大きくずれてしまう。

 オフセット電圧が悪さをしているのだろうが、補正の仕方がいまいちわからない。このあいだのグラフはオフセット電圧がマイナスに行ってしまった。こればっかりやっているわけにもいかない。補正はあとでも出来るので、アナログ部は一応これで良しとして、次に移ることにする。

7セグLEDの配線は相当な密集度だ(11/8/2011)
 ハンダ付けは、7セグLED基板の方に移った。面倒である。7セグLEDを組み込んだ基板だけが結構な値段で売られている理由が良くわかった。7セグLEDがたくさん並び、エレメントを始めから並列に配線したダイナミック表示用のユニットもあるが、3つのはないので今度の工作には使えない。ただ黙々とつないでいくしかない。

S_pb114330

 凝り性なもので、気楽に線を交叉させて配線するのに抵抗がある。アートワークはそうならないように引いてはあるが、現実にハンダ付けがその通りできるかというと、線が重なってそううまくはいかない。一回のハンダ付けの集中の限度は限られている。少しやっては、何か別のことをやって気を紛らし、また半田ごてを握るという繰り返しである。

 そのかたわら、そろそろ温度制御のことについて検討し始めた。まだ先の話ではある。でも、単なるon/off制御だけでは面白くない。モーター制御のころから考えているロボットやラインセンサーなどの制御より、温度制御はゆるくて勉強にはもってこいである。色々ウェブを探し回ってわかりやすいサイトを探す。

 PID制御の復習をした。Dは良くわかるが(前回との偏差で比例量をいつもより増やすか減らす)、Iはどうするのだろう。設定値と現在値の差分を足して行って、一定のタイミングで比例量を増やすのだろうか。P制御だけでは、オフセットはとれないのだろうか。

 今まで習った制御の伝達関数とはどういう関連があるのだろう? PID制御との接点が見つけられない。2次応答の時間変化を周波数成分変化にするような変換だったような気がするが、その記憶は遠い彼方に消えている。

Tiny861のフューズビットを書き損なう(11/10/2011)

 すべての配線が終了した。しかし、なぜかすぐ電源を入れるのが怖くて何となく別の作業しているうちに、またショックな事件がおきた。実装版のCPUを用意しようとして、もうひとつのストックのTiny861を初期設定しているとき、フューズビットを書き損ったのである。

Tiny861a フューズビットのハイバイトとローバイトを間違えて書き込んだ。コンソールのメッセージを見ると、SEL0~3にデータシートにないビットを書き込んだことになる。これだけで、全く反応しなくなった。やれやれ、¥200(秋月)の石だけれど、まだ新品だ。一度も使わずに部品箱に死蔵されてしまう部品をまたひとつ作ってしまった。不憫でならない。

 パラレルプログラミングの出来るAVR Dragonなら、こういう石を救えるのだろうか。DigiKeyでは¥4,305である。円高でまた少し下がったようである。この前、Tiny2313(¥100)を救おうとした時は、1対47(当時4700近辺)の投資対効果だったが、今度は、300:4300と1対14まで上がった。そろそろ買っても良いか。

 ただ、送料無料にするためには、もう少し買うものを増やす必要がある。あと、¥3000ばかり。こうして電子工作無限地獄が続いていく。

電動ドリルのスタンドを買う(11/11/2011)
 何か、ものを失うと、無意識のうちに何か別のものを揃えようとする癖が今度も出た。久しぶりにDIY店に行って、無性にドリルスタンドが買いたくなった。CPUチップの代わりというのもなんだが、前から欲しかった工具である。

Pb144355 普通の電動ドリルをボール盤にする(まあ、ドリルスタンドです)工具である。¥2,980の超廉価だが結構しっかりしている。電子工作のプラスティックケースの穴あけ工作くらいならこれで十分だ。プロクソンのミニルーター用のドリルスタンドは既にあるが、少し大きい穴を開けるのは今までの大工工作用の昔の大きな電動ドリルを手で支えて開けていた。

 買って帰って早速、ドリルのテストをする。うん、これは楽だ。値段が安い割にはがたつきも少なく強度も問題ない。しかし、出来上がった温度計の実装版に電源を入れる気力がまだわかない。たいした機械でもないのに結構苦労した。動けばともかく動かないときのショックを味わうことを恐れている。

 というか、色々なことを思いつく(やりたくないための無意識の行動だろう)。実際の熱電対の高温測定実験などもそうである。本来の用途、アクリル曲げ器の温度測定のため、ニクロム線を入れたパイプの中に熱電対を入れて温度を測ってみた。なぜ、今までやらなかったのだろうと思うぐらいの基本的なテストだ。熱電対の発生電圧は例のDVM(秋月のデジタル電圧計)で測る。0.1mVまで測れる。

 どの程度の制御で温度を一定に保てるかというのが実験の当面の目的である。とりあえず調光器で下げた電圧を与えて様子を見る。通電すると見る見るうちに電圧が上がり、切ると、結構早く温度が下がって行く。on/off制御でも何とかなりそうだ。

S_pb114333

 ただ、パイプの中と外では、100度近い温度差があることがわかった。表面温度を熱電対で確実に測るには、熱電対を表面に固定する必要があるが、固定の仕方がわからない。それにパイプの場所によって結構温度に違いがある。中の方が安定して測れることは確かだ。換算する方が信頼性が高いかもしれない。

 このあたりをウェブで色々調べるが、熱電対の世界は、圧倒的にプロの世界で、当研究所のような遊び半分の温度測定のケースは全くない。うーむ、参考になる情報が少ないなあ。手探りで作っていくしかないようだ。

やっと実装版に通電。何とかLEDまでは出た(11/12/2011)
 出来上がったものをいつまでも置いておくわけには行かない。意を決して、出来上がった実装版のテストに入った。残っていた電源コネクターをつけて通電する。おお、7セグLEDが点いた。おーし、このあたりは大丈夫なようだ。ただ、フォントは無茶苦茶だし、エンコーダーも動いていない。

 少し調べて、原因はすぐわかった。エンコーダーが動いていないのは、制御線をプルアップしていない。フォントがおかしいのは、スキャンが逆方向だったり配線間違いが見つかった。不具合の場所はほぼ特定できた。そりゃそうだ。ブレッドボード版と何も変えていない。良かった。これでゆっくり寝られる。

 次の日、きのうまでの究明経過をメモに書きだし、確かめながらひとつづつ、つぶしていく。直すべきところがわかっているこういう作業は、むしろ楽しい。CPUソケットの内側にプルアップ抵抗を入れようとして苦労する。シングルラインではない梯子型のソケットでやりにくい。

 最近の当研究所のCPUソケットはすべてシングルラインを使っている。中にパスコンなどが入れられるので便利である。それに気づく前に買った梯子型のソケットが部品箱にだぶついている。

 ここも在庫一掃のためなのだが、マーフィーの法則とはこういうものである。こういうときに限って、ソケットの中に部品を実装しなければならなくなる。梯子のような支持部が邪魔だ。プルアップ抵抗2つを無理やり押し込む。

 次は、7セグのエレメント違いである。9番と10番をテレコにしていることが、昨日のテスト結果で判明している(1から9までの数字を表示させて見つけた)。これはうっかりミスだ。基板配線を確認する。あれえ、間違っていない。どうしてだろう。ソースコードのコメントを見て驚いた。

 これまで動かしてきた7セグLEDは、ピンの順番がabcdegfと最後の2エレメントがfgと並ばずgfと逆になっている。こういうものだと思って3種類の7セグLEDをこれまで問題なく動かしてきた。ところが、今度買ってきた(千石電商)7セグのデータシートは、abcdefgとアルファベット順になっている! 

 予備の部品をブレッドボードに差して実際に確かめる。そうだ間違いない(あたりまえか)。ふーむ、7セグLEDのピン配列は統一されていないのか。一つ勉強した。解決は?四の五の言わずに半田付けでひっくり返しただけである。

 さて、最後は7セグの表示位置がずれている件である。もういちどピンナンバーとドライブしているトランジスターとの結線を確認する。どうしたことだ。全くの勘違いも良い所で、全然順番になっていない。一体、どういうつもりでこの配線をしたのか疑いなくなるデタラメぶりである。

S_pb124339

 1本のドライブをシフトレジスターのパラレルピンの残りの1ビットでつけているので、これに何か縛られておかしなことになったらしい。いずれにしても、ソフトをいじっても解決する話だが、あんまりハードが目茶目茶なものをソフトで吸収すると、あとで苦労しそうで、わかりやすい形に順番をそろえる。

熱電対による温度制御は、表示部と設定部まで完成した(11/13/2011)
 さあ、細かいところは、まだいくつかあるが、大所はこれで大丈夫なはずだ。ChaNさんのISP-UARTを使っているので、デバッグ->ソース改修->テストのサイクルが早い。PC(UART)端末の接続を切れば、AVRは自然にISPモードになり、プログラムをただちに書き込める。書き終わった後、端末を立ち上げると、デバッグ用のUARTメッセージが流れてプログラムがスタートする。

 2Kばかりのフラッシュなのでコンパイルは一瞬で終わる。端末を立ち上げる。よーし、7セグLEDが光った。緑と赤なのできれいだ。ちゃんとした数字になっている。エンコーダーを回す。良いぞ、ちゃんと数字が上下する。

S_pb114331

 勢いに乗って、ケースの完成を急ぐ。早速買ったドリルスタンドが大活躍する。大きな穴もリーマーではなく、3ミリドリルあたりで連続して揃えて開けていけばどんな形にも簡単に切り抜くことが出来る。正確な位置に開けられるのでこういうことが楽に出来る。やっぱり工具には金をかけるものだ。熱電対のコードのソケットと電源ケーブル(制御線を含める)ソケットの穴が短時間に正確に開いた。好調だ。

 電池を仮付けして持ち運びが出来るようにしたら、やることがある。台所に機材を持ち込む。基準温度として我が家で最も正確な温度、100℃を計測するためである。我家の標高は、40mで今日は天気も良い。沸騰点は殆ど100℃のはずである。

S_pb124350

 家族に内緒で、鍋に水をいれ沸騰させる。熱電対をそこに入れる。温度は順調に上がって、100℃を越えた。暫く沸騰を続け、105~110℃の範囲に納まることを確かめた。平均は107℃あたりのようだ。鍋の底の火のあたるところが高く、沸騰面の水面近くが低い。お湯はこっそり捨てる。

 ふむ、7%の誤差か。もう少し校正したほうが良いかもしれない。しかし、アクリル曲げ器の温度設定のリファレンスとしては、これでもう十分なような気もする。

少し、ゆとりが出来たので、温度制御で空焚きをしたときに出すエラーメッセージを7セグLEDに出して遊ぶ。温度センサーが発熱体からはずせるので、これは必須の機能だ(昔、熱帯魚の飼育でひどい目にあったことがある)。

S_pb124338

 いずれにしても、これで温度制御の第一ステップ、温度測定部と温度設定部はほぼ完成したようだ。次の課題は、いよいよSSRを使ったヒーター制御だ。

 回路図やソースコードの公開は、簡単なヒーター制御が出来てからにしよう。

| | コメント (2) | トラックバック (0)

2011年11月 5日 (土)

熱電対を使ったヒーター制御の野望実現へ

 ガイガーカウンターの工作は2台作ってやっと少し熱がさめた。2台目のガイガー(GM)管SBM-20がベータ線で時間とともにパルスカウントが増加してしまう問題は解決されていない。しかしケースに入れてガンマー線を測っている限り、全く問題なく安定して線量が測定できる。これをさらに追求する必然性は薄れた。

 当研究所のモットーは「実用」である。名目でも何でも良いから実用的な目的がないと工作をしないことにしている。実用目的無しに始めたのはLEDマトリックスの電光ニュース基板くらいなものである。

 これも最初は、ネットにつないでメールの受信メッセージを掲示するという仮の目的を作ってあった。Xbeeを使ったラジコンなどは、実用というには少々おこがましいが、ラジコンそのものが実用という強引な解釈である。

 最近流行(はやり)の小さなTFT液晶やMbedなどは実は自分も欲しくてひそかに買ってある。天邪鬼でへそ曲がりの割には他の人の工作が気になる、いやな性格である。しかしこのあたりの機器の目的が見つからないのでやりたくてもなかなか手がつけられない。

 工作のための工作というのは可能な限りやらないことにしている。いまさら小さな画面に画像を出したり、タッチパネルで操作ができても、スマートフォン全盛の時代である。どれだけ頑張って完成させても「で、それがどうしたの」と無邪気に馬鹿にされておしまいである。これまでの苦労と自尊心がズタズタにされてしまうのが怖い。

 電子工作を始めて、かれこれ4年、やりたいテーマ、出番を待っているICチップ、基板は(雑誌付録まで入れるともう)それこそ山ほどあるが、どれも役に立ちそうな応用が見つからない。何かわくわくするものがない。食指が動かないのである。

 ということで次のテーマがなかなか見つからなかった。8つくらい候補をリストアップしてみたが、どれもいまひとつ魅力に欠ける。GM管の外部クェンチ回路などはこれまでの記事で何回か候補に上げているが、この回路が動いたとしても、SBM-20のベータ線によるCPM増加が止まる保証は全くない。うまくいかなかったら空しいだけだ。

S_pa234310熱電対温度計に決める(10/23/2011)
 迷った挙句、選んだのは熱電対の温度計だった。ガイガーカウンター工作が混迷していた時、きまぐれにここのサイト(http://mgw.ti-da.net/e3171197.html)を参考に、ミニブレッドボードに多回転VRとオペアンプを載せて熱電対をテストしている(前記事参照)。これをそろそろ実装してみることにした。この温度計の先には、このあいだ作ったアクリル曲げ器などのヒーターの温度制御が待っている。

 立派な実用目的である。7セグLEDで、現在温度と設定温度を色を変えて表示する。温度設定は、これまで用もないのに面白がって秋月で買ったロータリーエンコーダー(たったの¥200)で、ぐりぐり動かして決める。面白そうだ。

 この前の熱電対の実験は、単にオペアンプで所定の電圧が作れるか試しただけだったが、今度は、手持ちの温度センサーLM60をつけて実際の温度変化を試す。手で持つと手の暖かさで確実に電圧が上がっていく。このLM60は、0℃で424mVと大きなオフセットを持っているので、補正しないと正しい温度が得られないが(その分低温が測れる)、正常に動くことは確認できた。

 次は熱電対だ。熱電対のソケット(サイトにならって平型端子を流用)を汎用基板の切れ端にハンダ付けして端子基板を作り、これをブレッドボードに差して測ってみた。熱電対のプローブを手で触る。電圧は上がった。しかし倍以上の電圧である。しかも激しく変化する。熱電対の上昇は温度センサーに較べるとはるかに小さく、オペアンプで増幅しているにしても、こんな値になるはずはない。

 何か、おかしい。オシロを取り出して出力電圧を見てみた。おやおや、盛大なノイズが上がっている。オペアンプが発振しているのだろうか。いや違うようだ。ウェブで色々原因を探し回る。

 的確な答えはなかったが、要するにオーディオアンプの入力と同じで人体に乗っている微小なACが悪さをしていると考えるのが一番妥当なようだ。つまり熱電対の出力のところがハイインピーダンスだと言うことである。

 実際には、熱電対の接点を手で触ることはなく、耐熱チューブで包んでヒーターの中に入れるだけだから問題ないとは思うが、手で触っただけでおかしくなるというのは何とかしなければいけない。

 そうか、ハイインピーダンスというのなら、交流的にコンデンサーを入れてバイパスしてしまえば良いのではないか。温度変化は、殆ど直流と考えてよいので少々のコンデンサーを入れても影響はないはずだ。早速実験してみることにする。

 100pFから、10μFまでのコンデンサーを次々に入れていく。やった。4.7μFあたりからピタリとノイズが止まった。表示電圧に変化はない。仮説に基づいて対策を考え、それが想定どおりの動きをする。いやいや、こんなささいなことでも思ったように動くというのは嬉しいものである。

 とりあえずはブレッドボード上で熱電対を含めて温度が測定できるところまでは確認できた。試しに百円ライターで熱電対の接点をあぶると、盛大に電圧が上がる。アナログ部はこれで問題がないようだ。

 オペアンプはまだLM358。電源は5V単電源で良いだろう。様子を見てレールツーレールのLMC6482に行く(買ってある)。そろそろデジタル側のことも考えなければいけない。CPUは最近の定番,Tiny2313ではADコンバーターを持っていないので面倒だ。Tiny861あたりだろうか。Megaまで行くことはあるまい。Tiny861なら、大分前に使う当てがなかったが秋月で安かったので買ってある(¥200)。想定しているケースは少し小さいので、7セグLEDを含めたレイアウトが悩ましい。

S_pa254311

ケースの製作だけが進んでいる(10/25/2011)
 主だった構成は決まったが、細かいところの仕様はなかなか固まらない。それなのにケースの制作だけは進んでいく(これは命取りになるときがあるが)。今、考えている仕様は、7セグLEDを2段にして一つの段に現在温度、次の段に設定温度を表示させ、ロータリーエンコーダーで設定温度を決めると、その温度差を見てニクロム線ヒーターをON/OFFする。ACの入り切りは、SSR(ソリッドステートリレー)で行う。

 ケースは、千石で買ったテーシンのTB-65B(54×84×35)である。底はアルミプレートになっており、これでアクリル曲げ器の台板に固定する。少し小さいが、これはもともと電源スイッチをつけるためだけに買ってあったものである。このケースも、このあいだの電子ボリュームと同じように、基板の固定用の柱が中に出っ張っていて、配線用の基板は隅を切らないと入らない。

 ここに全部入るだろうかとケースを手にとって眺めている間に、急に作りたくなり、サーキュラーソーで、ケースに入る汎用基板の隅を切り始めると、もう手が止まらなくなった。7セグLEDの固定をどうするか考えて、保守性を上げるため主基板にポストを立てて固定するアイデアが浮かぶ。

S_pa254313 するとまたこれも作りたくなり、以前買ってあったABS樹脂の外径4ミリ内径2ミリのパイプを切って、2ミリセルフタッピングネジをねじ込んでみた。おお、結構強く固定できそうだ。ちょっと様子を見るだけの工作がどんどんエスカレートして、2階建ての基板が出来上がってしまった。そう、最近は頭より手の動きの方が早い。

アナログ回路はほぼ確定した(10/27/2011)

  そうは言っても、アナログ回路の検討は続けている。ウェブの情報を頼りに熱電対のセンサー部分のテストを進める。これまで参考にしているサイトの回路は、簡便に可変抵抗器の中点を、分圧点やオペアンプの入力にしているが、これだと変化が大きすぎて調整しにくい。片側だけ可変にして、一方を固定抵抗にし、調整し易いようにする。

 冷温側の測定センサーは手持ちのLM60である。このセンサーの1℃あたりの電圧は6.25mVで、参考にしているサイトのセンサー(LM61)とは異なる。補正値を修正する必要がある。5VをVRに入れ、32.5mVが出るように多回転VRをまわす。うまくいった(0.0065倍)。

 微小電圧なので周りの外乱が心配だが、実際は、数百度(今のところ150℃近辺)の制御なので、余り気を遣う必要はないだろう。ブレッドボード(ミニ)だけれど結構安定している。

 次は、オペアンプの調整だが、その前に全体仕様をかためた。秋月で入手したK型熱電対は、1200℃まで測れるが、もちろんこんな高温まで測るつもりはない。アクリル曲げ器に特化するなら200℃程度までで十分だ。欲を出して7~800℃くらいにしておけば、半田ごてなどの温度測定にも使えるだろう。

 CPUチップは手持ちのAVR ATTiny861で決まりだ。2313はADコンバーターを持っていないし、温度制御のロジックを考えると、2Kのフラッシュでは少し不安だ。Tiny861のADコンバーターの基準電圧は、2.56Vと1.1Vの2種が選べる。オペアンプが使えるので当然2.56Vにする。

 分解能は、10ビット、1024ポイントある。一度単位で、0度から1024度までカバーできる。そのときの分解能は1℃、2.56/1024= 0.0025V で、1度あたり2.5mVである。

 つまりオペアンプは、熱電対の1℃あたりの電圧、40.7μVを2.5mVにしてやると良い。増幅率は、2.5/0.0407 = 61.425倍である。オペアンプ1段ではちょっと不安な倍率だがやってみることにする。

 ブレッドボードで少しづつ慎重に測定する。このあいだ作ったDVMが思わぬところで役に立った。こいつは200mVフルスケールを4桁表示してくれる。つまり分解能は0.1mVもある。これは助かった。

S_pa234308 しかし、入力オフセット電圧の測定でつまづく。ボルテージフォロワーでそれぞれのオフセット電圧(LM358は3mv、LMC6482は6mV)をだしたのは良いが、方眼紙に描いたグラフで入力電圧と出力をプロットしたら、オフセット電圧がマイナスになってしまう。

 この2つのオペアンプ以外のオペアンプは、どういうわけか微小な入力が入ると、出力が電源電圧まで上がる奇妙な現象に悩まされる。アナログは本当に難しい。

レイアウトは出来た(10/28/2011)
 選んだケースはやはり小さすぎてAC電源の制御まで一緒に入れることは無理なようだ。5Vの電源を、この小さなケースに組み込むことはとても不可能だ。5Vの電源と、SSR(ソリッドステートリレー)などのAC制御部は別に作ることにする。出来たら、すでにある調光器キットのケースに入れたい。

 ヒーターの制御をどうするか迷っている。手持ちに秋月のSSRキットがあるので、これで制御するつもりだが、単なるon/off制御ではなく、折角マイコンで制御するのだから、もう少しエレガントな制御をしてみたい。あれこれウェブで情報を漁った。

 すると、ゼロクロスのSSRを50HzのPWMでドライブして電源制御をやっているウェブサイト(http://www.geocities.jp/neofine9/work/solder2/solder2.html
)を見つけた。これこれ、まさしく所長がねらっていた制御の方法だ。on/off制御では、温度のようなやたらに時定数の大きい制御は、よほどうまくやらないと制御不能になる。しかしPWMで電力を自在に変えられれば制御はずっと楽になる(はずだ)。

 これで秋月でずいぶん前(3年前)にLAN電源制御用として買ったSSRも存在意義を認められることになった(リレーではPWMできない)。 用もないのに買ったロータリーエンコーダーも、これで遂に日の目を見る。今度のプロジェクトは部品箱に眠っていたTiny861も含めて、当研究所の在庫一掃セールのような感じになってきた。

 いずれにしても温度設定と温度制御のところは、まだ先の話である。まず、温度測定を完成させよう。それでもレイアウトは、温度設定のための空き地を考慮しながら配置する。

ピンが足らないことに気づく(10/29/2011)
 プラットフォームのCPUをTiny861に決めて、アートワークに入ってから大事なことに気づく。7セグLED(7ピン)の現在温度3桁、設定温度3桁の6ヶをドライブすれば、それだけで13本。Tiny861で自由になるGPIOは、11本しかない。2本も足らない。これに、ここまで気がつかなかったとは、お馬鹿な話である。

 Mega168あたりでもぎりぎりだ。7セグLEDのドライブ以外に、ヒーター制御出力、ロータリーエンコーダ、あわせて15ピンはいる。Mega168のGPIOは17本でなんとか入るがこの程度のアプリにMegaを使うのは抵抗がある。

 というので、持ち出したのが、このあいだの電光掲示板の予備にとってあったシフトレジスター74HC595である。これだと、セグメント7ピンを、ラッチ、クロック、データの3本でドライブできる。

 LED基板のほうに置けばケーブルも減らせるのだが、スペースが意外とない。ロータリーエンコーダーが結構、かさばりなかなかうまくいかない。やっとのことでレイアウトを決定する。いやあ、ますます、在庫一掃の工作になってきた。

またまたピンが足らない(11/1/2011)
 HC595を使うことになったので、いきなり基板に組むのを止めてブレッドボードで、この前のFPGAの練習のため作ってあった6ヶの7セグLED基板を使ってソフトのテストをすることにした。

 ソフトそのものは、これまでの寄せ集めでそれほど時間をかけずに作ることが出来た。とりあえず3つの7セグLEDだけで測った温度が表示されるように組む。動かしてみる。ありゃあ、UARTから字化けしたゴミデータが延々と出力されてしまう。あ、あ、あ、いかん。ISP-UARTの受信ピンがHC595の制御データの出力になっている。デバッグ用のUARTは受信をエコーバックしているので、UARTそのものを大きく変えないとこのままではテストにならない。

 困った。単にマイコンからの出力をPCコンソールに表示させるだけだから構わないと思ったが、エコーバックを忘れていた。UARTを改修して、このまま進めることもできるが、温度制御のところまで考えると、PC側から何らかの指示で動作を選べるようにしておきたい。

 色々対策を考えているうちにふと気づいた。HC595の8ビットのシフトレジスターは、7セグなので1ビット余って、空振りしている。これが使えないか。

 この1ビットのところに、7セグのコモン側の制御を入れてやれば、1ビットを押し込められそうだ。8回まわっている7セグのエレメントの拾い出しを7つで止め、最後のシフトに、コモンのピンのon/offを入れてやる。ふむ、うまく行きそうだ。

 ソフトを改修する。よーし出来たぞ。喜び勇んでテストする。よしよし、3つの7セグLEDがデタラメながら点滅しはじめた。ここまで来たらあともう少しだ。

S_pb024319 このあと、HC595のスペックを勘違いするなど(ラッチとOEを間違える)、まともに動くまでえらい時間がかかったのだが、このあとの苦労の方がもっと大変だったので全部省略する。とにかく悪戦苦闘の末、3つの7セグLEDで現在温度(今のところ単なる補正前の3桁のADC値)を表示することに成功した。しかし、本当の泥沼はこれからだったのである。

ロータリーエンコーダーの入力が2本だったとは(11/3/2011)
 7セグの表示が何とか動き始めたので、ブレッドボードで、ついでに温度設定までのテストをすることにした。出来上がってから頭を抱えるより、ブレッドボードでバグをつぶす方が楽である。ロータリーエンコーダーを持ち出して、スペックを調べ始める。

 ここでまた重大な誤りに気づいた。ロータリーエンコーダーの入力は1本ではないのである。うっかりしていた。折角押し込めたピンがまた足らないことになったのである。

 CR内蔵クロックにすれば、もう2本空くが、CRクロックは、UARTが9600bpsを超えるだけでも不安定になるので余り使いたくなかった。しかし、もうここしか空きは残っていない。涙を飲んで、クリスタル発振からCR内蔵発振に切り替える。

 ロータリーエンコーダーの制御法を勉強する。調べたところでは、やはりChaNさんの方式が主流なようだ。2入力を2ビットとして記録し、前後4ビットのテーブルを比較して正転か逆転を判断する。

 しかし、オシロで波形を調べているうちに気がついた。どちらかのデータの立ち上がり(立下りでも同じ)で割り込みをかけ、そのときのもう一方の入力を調べれば、一発で正逆転が判断できることがわかった。割り込みなので、タイマーでサンプリングするより正確である。

 ウェブで調べたが、これを明記している記事は見つからない。しかし、チャートを確かめてもこれで出来る筈だ。間違いない。意気揚々とコーディングに入る。

 さあ、どうだ。ふーむ、回転は認識するが、正逆転しない。どちらをまわしても正転するか逆転するか一方向だけである。おかしい、オシロのデータはちゃんと正転と逆転では値が違うのに、入力ピンが1を認めない。常に0としか読まない。

 最初、元のXtalのピン(PB5)で入力を調べているのでこれが何かまずいのかと思い、別の空きピンに入力を移してみる(7セグLEDはまだ全部実装していない)が、同じ。???である。何故か、入力ピンが動かなくなってしまった。INT0(PB6)などの割り込みピンは何の問題もなく動いているのにおかしい。

Tiny861のバグ(だろう)に振り回されてふらふら(11/5/2011)
 とんでもないことになっている。Tiny861で入力ピンが0のまま読み取れない。PINポートをデータに取り込んで、表示させても0のままだ。考え付く限りの入力ピンの状態を調べるコードを入れてテストするが、がんとして入力は1にならない。

 しかも1ピンだけではない。残っている全部のピン入力が言うことを聞かない。受信割り込みや、外部割込みのINT0(PB6)は動いているというのに何故だろう。何かとても基本的なことを間違えているのかもしれない。不安がよぎる。

 頭の中が混乱してきた。いつものAVRのピン入力が突然動かなくなったのだ。PINとPORTでは今まで散々悩まされてきた。昔買った、AVRのリファレンス本まで取り出して、基本から読み直す。手がかりは得られない。おかしなことをしているわけではない。全く見当がつかない。完全に暗礁に乗り上げた。

 こうなると、どうもハードを疑うしか考えられなくなった。ピンそのものが生きているか、ピンの割り込みだけでも生きているのか調べてみることにした。というよりこれくらいしか調べるところがなくなった。

 Tiny861のピンチェンジ割り込みは、すべて共通の割り込みエントリーである。今のプログラムは、UARTの受信割り込みに使っている。ここへテストピン(PA4)の割り込みが来ても識別できるようなコードを加え、UARTに影響がないようにする。

 ピンチェンジのテストをする。うーむ、テスト用のLEDがついて動いたようだが、本当にPA4の割り込みがどうかは確認できない。何気なくロータリーエンコーダーを動かすと、何と何と、UARTに表示しているピンの状態に変化がでた! 該当するビットに1が出た! 7セグLEDの数字はエンコーダーの動きに応じて、増えたり減ったりしている。直ったのだ!

 何ということだ。ピンチェンジ割り込みをenableにしないと、入力ピンが動かないとは。こんな話は今まで聞いたことがない。少しづつコードを減らして行って、「入力ピンにするには、グローバル割り込みマスクレジスターGIMSKでそのピンに対するピンチェンジ有効のビットを立てる必要がある」ということがわかった(出力は問題ない)。

 いやあ、これはバグだろう。ウェブで探してみるが、それらしい記事は見つからなかった。本家のデータシートにもERRATAの記述はない。昨日の夜からほぼ半日これにふりまわされた。

 わかってしまえば、回避は簡単である。Tiny861は、ピンチェンジ割り込みは2段階で設定する。まず、GIMSKレジスターで範囲(PCINT8~11までは、ビットPCIE0に、PCINT0~7とPCINT12~15までは、PCIE1という変則な設定)で割り込みを可能にする。

 次に、個別のピンの割り込みは、さらにそれぞれのピンに応じてPCMSK0レジスターかPCMSK1レジスターにピン単位に設定する。ややこしいやり方である。2段階なので、ERRATAを回避するには、こちらの方を未設定にしておけば良い。これで割り込みは起きない。入力ピンは正常に動く。

 いずれにしても、これで6ヶの7セグLEDを想定どおり動かせる見通しが立った。このあと、ADコンバーターの設定でPA3がおかしかったり(AREFを使う設定が、レジスター2つにまたがっている!)、ステートメントのコピーミスで同じ数字を2箇所に出したりするようなトラブルはあったが、とにかく無事にブレッドボード上で、6個の7セグLEDが点って、それぞれ動くところまで来た。

S_pb044321 やれやれ、これで一安心である。このあたりでブログに報告することにしよう。いやあ、今度もドラマの連続だったなあ。

| | コメント (1) | トラックバック (0)

« 2011年10月 | トップページ | 2011年12月 »