車両検出を行うにあたり、最後の実験であるAVR(マイコン)をLoconetに接続し、実際にLoconet上に検出情報を送信することを試みます。
Loconetはマイコン関係でいうところのUART(USART)、パソコンではRS-232CのTTLレベル(正論理)に相当する信号です。詳しくはDigitraxのLocoNet ® Personal Use Edition 1.0を参照してください。
LocoUSB Rev.1では一旦MAX232でRS-232C(負論理)に変換してからJMRIのページの参考回路を利用しましたが、TTLレベルのシリアルをMAX232を利用せずに安価な回路でLoconetに接続することを実現したいと思いました。
回路
出力
Loconetへの出力はオープンコレクタで行います。オープンコレクタについてはオープンコレクタ – Wikipediaを参照してください。簡単にいうと、1を出力するときにLoconetをGNDに接続(実際にはトランジスタで)するのです。
が、TTLレベルのシリアルはデータの送信していない間が”1″(+5V)になっていますからNOT回路も挟む必要があります。
入力
これは簡単で、LoconetがそのままTTLレベルのUARTになってますからLocoNet ® Personal Use Edition 1.0で書かれている通り47kΩ以上の抵抗を挟んでAVRのRXDに接続するだけです。
結果
以上の考察から実験をしてうまくできた回路が次の図です。
2009/5/21 修正
TXD側のトランジスタのベースをプルアップ。
USBシリアル変換等では問題ないが、AVRでリセット時、書き換え時にハイインピーダンスとなりLocoNetが占拠されてしまうのを防ぐため。
プログラム
こちらもLocoNet ® Personal Use Edition 1.0を元にしていきます。コマンドを送信するのは簡単で単にUARTから文字を送信するのと同じです。が、Loconetでは他の機器がLoconetに送信している時に同時に送信して競合しないようにする必要があります。
そのために各機械には優先度が決まっています(数字の小さい方が優先度高、0はマスター、センサーは6以下)。競合を避けるため最後にLoconetにコマンドが流れてから一定時間待ってから送信するように規定されていますが、この優先度によって待たなければいけない時間が決定します。この時間は次の計算式で計算できます。(正しく読めていない可能性があるためまちがっているかもしれません)
送信禁止期間=60μs * (20 + 優先度)
ですから、プログラムの実装は受信割り込みが起きると、変数に送信禁止期間を代入し、タイマー割り込みでこの変数を減らしていくことにします。送信時にはこの変数が0になるまで待機(つまり送信禁止期間経過後)し、送信することにします。
以上でAVRからLoconetへ接続する実験は成功しました。これでBDL168互換機器や、スロットの作成もできます。
4 コメント