« 2011年10月16日 - 2011年10月22日 | トップページ | 2011年11月13日 - 2011年11月19日 »

2011年10月30日 - 2011年11月5日の1件の記事

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月16日 - 2011年10月22日 | トップページ | 2011年11月13日 - 2011年11月19日 »