パソコンから外付け回路を制御するに当たり、I/Fを何にするかは悩むところです。一昔前であればパラレルポート(プリンタポート)を使うのがリーズナブルで定番でした。プリンタがUSB接続やネットワーク接続が当たり前になった頃は空き端子になり、ちょっとした回路をつなぐにはちょうどいい端子でした。しかし、空き端子になるということは需要が無いということで、最近のパソコンにはパラレルポートが付いてません。
今は、USB-マルチI/Oチップを使うのが常識になっていると思われます。
しかし、今回はあえてUSB-シリアル(RS-232C)変換チップを使います。理由は、ドライバ導入で苦労しなさそうという点です。最近のOSであれば、LinuxでもFreeBSDでもとりあえず挿せば動くだろいうということです。
今回買ってきたのは、秋月電子の K-01977 です。これを使用した場合、信号のタイミングはRS-232Cですが、信号レベルはCMOSレベルのままです。今回の用途では、レベル変換されると余計面倒になるのでこのキットが最適です。USB接続モノでは最安なんじゃないかと思います。
単純なパルス出力をしたいので、コレのRTSかDTRを出力に使います。という予定でした。しかし失敗です。
何が失敗かというと、変換チップのリセット時に出力が不定となるからです。つまり、勝手にエアコンの電源がON/OFFされてしまう恐れがあるということです。変換チップのリセットをしなければよいのですが、パソコン再起動時にももちろんリセットされてしまいます。これを避けるのが運用の条件とするのはちょっと厳しいです。
そこで、TxDを出力に使うことにしました。TxDはリセット時もHレベルのままです。
TxDはご存じのとおり、シリアル信号出力です。それをパルス出力に使えるのか?
大丈夫です。TxDはデータが無いときが1で、データはデータ通り0か1が送られます。ということは、0x00(つまり、8bitオール0)を送ると、長めのパルスになります。通信速度を遅くすれば、さらに長くなります。
そこで、300bpsに設定して0x00を送ってみました。が、結果はエアコンが反応したりしなかったりです。
ここで、300bpsで0x00を送った時のパルス幅を考えてみましょう。
RS-232Cの通信では、スタートビットとストップビットが付きます。スタートビットが0でストップビットが1です。ストップビットはパルス幅が1ビット分、1.5ビット分、2ビット分とか選べるのですが、普通は1ビットと設定します。まあ、なんにせよ、スタートビットの1ビットとデータ部の8ビットが送られることになり、9ビット幅のパルスが出ることになります。9ビットが300bpsで送られます。ということは、1/300*9=0.03秒がパルス幅になります。
これで、不安定だったので、3倍にしてみました。0x00を3回連続で送ってみます。すると、確実にエアコンのON/OFFが可能になりました。
ストップビットの分の逆パルスが2回出ちゃうことになります。図にすると以下のようになります。
逆パルスがあるものの、とりあえず動いているので問題なしということにしておきます。
入力について書き忘れましたが、こちらは単純に DSR を使います。
次回はCGIの話を書こうと思います。