AVRとLoconetの接続

On 2009年5月10日, in DCC機器の自作, by chibiegg

車両検出を行うにあたり、最後の実験である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に接続するだけです。

結果

以上の考察から実験をしてうまくできた回路が次の図です。

 

LoconetとAVR(UART)の接続

LoconetとAVR(UART)の接続

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互換機器や、スロットの作成もできます。

Tagged with:  

4 Responses to AVRとLoconetの接続

  1. あやのすけ より:

    こんにちは。
    LocoNet I/F の回路簡略化の実験の成功おめでとうです。
    自分が作ったものも、こっちに置き換えれば、がんばれば
    6極4芯のローゼットに入りそうです(^_^

    トランジスタは2SC1815でしょうか?

    • chibiegg より:

      あ、書くの忘れてましたね。
      トランジスタは2SC1815です。

      自分が作ったものも、こっちに置き換えれば、がんばれば
      6極4芯のローゼットに入りそうです(^_^

      報告楽しみにしています。

  2. あやのすけ より:

    トランジスタが無いので、AVRでなく、vb.net のプログラムでも
    同じことができるかなという実験をやって見ました。
    あっさり、動くもんですね。
    本来は受信割り込みから送信禁止期間を設ける必要がありますね。

    あまり難しいことを考えなくても、loconetの制御は簡単にできるのかなと勘違いモード?!(^_^;

    • chibiegg より:

      JMRIなどを全く使わずにシリアルを直接叩いて自動運転というのも大きな選択肢ですね。AVRだけでTOMIXのTCS自動運転ユニット程度の運転ならやってみるとすぐできるかもしれませんね。

      私もLocoNetへの送信は案外簡単な印象でした。
      送信禁止期間を守らなくても同時に送信してしまった分だけが無視されるだけなので大量のデータを送り続けない限り大きな問題にはならないよう?
      AVRで実験しているときもまだLocoNet上のデータが少ないおかげかデータの欠損は起きたことがありません。これからセンサー類のデータをいっぱい出すとどうなるかわかりませんが。

      本来ならば送信したデータと同じデータが同時に帰ってくるはずなのでそれを比較することによってエラー検出をするのが望ましいそうですが、実装するのが非常に面倒くさそうで(笑)

      日曜日にとりあえず送信禁止期間を考慮したAVR用の送信部分だけの関数が公開できそうです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>