SVX日記
2005-03-09(Wed) イニシエのBASICに触れてみる
ここんとこトライアックを利用した調光器をイジッているが、最終目標は調光器のプログラム制御であり、そのために先日秋葉でCdSを購入してきたコトは以前に書いた。しかしながら、CdSが示す抵抗値の可変範囲も把握しないまま、適当に部品を買ってきてしまったため、本当に手持ちの部品だけで組めるのか非常に不安な状態でもある。そこでひとつ、理論的な方面から攻めてみるコトにする。
まずはCdSの組み込み方法だ。先日購入した9P5-1HというCdSを用いることを前提に考える。イキナリだがこのセルのデータが不詳なのでまずはググってみたところ、あまり信憑性の高い情報とはいえないが、最大電圧:100V、最大損失:50mW、抵抗範囲は0luxで1M以上、10luxで72kという情報が得られた。
この情報を元に、まずは耐電圧を考える。家庭用の交流100Vの瞬間最大電圧は144Vであり、ダイアックはトリガ直後に0Vまで下がると仮定すると、そのまま144VがCdSに作用すると考えられる。すると単純に現在のボリュームをCdSに置換するというのはヤバい。そこでCdSを2個直列に並べてやることにする。2つのCdSの抵抗値が同期して変化するなら、各々に作用する電圧は半分の72Vになるからである。
次は最大損失を考える。各々の72Vで流せる最大の電流は、50mW/72V=0.694mA。0.694mAが流れてしまう抵抗値は72V/0.694mA=103.68kΩである。つまり、CdSの抵抗値が103.68kΩを超えるような明るい状況にCdSを置くと、CdSの最大定格を超えてしまう可能性があるということになる。実際にはコンデンサやダイアックの電流特性が作用するから、連続して0.694mAが流れることはないと思われるが、正直そこんトコはよくワカらんのじゃ。
ところが改造前の現状の調光器で、ボリュームを207.36kΩに設定した状態というのは、ほぼ光量を最高に絞った状態の抵抗値と同じなのである。そうなるとCdSが破損しないギリギリまで光を当てても、実際の電球はほとんど点灯しないということになる。こりゃ困った。
そこでダイアックのトリガタイミングを早めるために、コンデンサの容量を小さくすることを考える。コンデンサの蓄電容量が現在の0.1uFよりも小さくなれば、抵抗が大きくても早く電圧が発生するため、トリガタイミングは早くなり、電球は明るくなるという寸法である。むぅ。先日の秋葉では、より大きな容量のコンデンサが必要だと思って0.33uFのコンデンサを買ってきたのに、逆の結果になってしまったぞ。だからちゃんと考えずに買い物をしてはイカンのだ。
しかしココでさらに問題発生である。秋月の調光器の説明書を見たところ、コンデンサの容量が0.047uFを下回るとトライアックがトリガできなくなるという記述があるのである。するとギリギリの0.047uFを使用したとして、果たしてどれくらいまで明るくなるのか? 実際に回路を組む前に実験してみたい気もする。というわけで……
この「図解・わかる電子回路」という本の出番である。以前にも紹介したが、私が購入した電子工作に関する唯一の参考書籍だ。そして、この134ページには、トライアックのトリガタイミングをシミュレーションにより求めるためのプログラムが掲載されているのである。これを入力して抵抗値とコンデンサの容量がトリガタイミングに及ぼす影響を概ね把握するばいいのである。
んが、このコードにも問題がある。イニシエのNEC系BASICで書かれているっぽいのだが、悪いコードの見本市のようなコードなのである。ハナモゲラな変数名、ムチャクチャな変数の影響範囲、当然のようにGOTO文やフラグも使っている。確かに10年前の本ではあるが、10年前のNEC系BASICってこんなにヒドいモンだったのか? 18年前に登場したX68k用のX-BASICは相当エレガントに記述できたぞ。まぁ、なにしろ典型的なBASICのスパゲティコードなのである。
とりあえず、Rubyに書き直しながら内容を理解するコトにする。が、最初にグラフィックの扱いをどうするか決めねばならない。順当な線だとRuby/tkを使うのだろうが、プログラミングが面倒だ。そこで今回はそんなに精度が必要ないコトだし、curseライブラリを使うことにした。curseはいわゆるテキストで擬似ウィンドウを表現するモノで、以前のcccdctみたいに仕上げるということである。なに、イザとなれば端末のフォントを小さくしてウィンドウをいっぱいに広げれば精度は上がるだろう。
まずは、BASICのグラフィック描画コマンドのLINEやPSET、テキスト表示コマンドのLOCATEとPRINTをエミュレートするクラス「LegacyGraphics.rb」を作る。これを作っておけば、本に掲載されているコードを概ねベタ打ちできるという寸法である。で、ほぼベタ打ちしたのがメイン側の「acAdjusterDesign.rb」だ……が、しかしッ!! 誤植はあるわ、バグはあるわ……。結局、ほとんど完全にコードを理解するまでマトモに動かなかった。できるだけモトのBASICの雰囲気を残しつつ、バグの部分もそのままコメントに残しておいたので、興味のある人はノゾいてみてほしい。
というワケで実行結果である。元のプログラムでは抵抗値の違いによるトリガタイミングの違いを、色で表現していたが、curseでは色の扱いが面倒なので数字で表現してみた。上がコンデンサの電圧の上昇グラフで、下がトリガタイミングのグラフである。上記の実行結果は、本に掲載されている設定値、50Hz、0.22uF、ブレークオーバ20Vでの計算値だが、どうやら本の実行例と同じような図が得られたコトから、プログラムは正しく動作しているようである。以上の結果を踏まえ、上記のCdSによる制御のシミュレーションをしてみたが……やはり抵抗値が高すぎるために、どうしてもトリガタイミングが早くならず、50%程度の明るさしか出なさそうな感じである。むー、どうしようか。もう少し無理したセッティングにするか……。