BDL168とRX4のLoconetとの通信部分は解析できたので次は車両から発信(発光?)するパケットの構造を決めてAVRで送受信の実験をしたいと思います。
(実はAVRとLoconetの接続を避けているだけなのですがw。UARTを一旦MAX232を通せばLocoUSB Rev.1と同じ回路でLoconetに接続できるのですが、LoconetはオープンコレクタなのでわざわざRS232に変換しなくても….長くなるので今度にします。)
- パケット構造の決定
- パケット内容の決定
- AVRに実装
という順番で書きます。
パケット構造の決定
今のところ送信する内容は自己のDCCアドレスだけなので。短くていいのですが、今後の拡張も考えて汎用性の高いパケットにしようと思います、
ということでこんな構造にしてみました。
ビット”0″:パルス幅2ms
ビット”1″:パルス幅1ms
パケット構造
パケットの開始:14個以上の”1″の後の”0″からパケットスタート(スタートビットという)
パケットの中身:8ビットのデータ(バイト)を送信後、続きがある場合は”0″を送信し次のバイトを送信
パケットの終わり:送信したバイトを全てXORで演算したエラー検出バイトを送信後、ビット”1″を送信
どこかで見たことのあるような….DCCのパケットと同じです(笑)。というのもDCCパケットの受信アルゴリズムを流用したかったのです。ただ、さすがにパルス幅が数十us単位では赤外線通信がぎりぎり途絶えるところでのノイズと区別がつかないのと、DCCパケットほど通信速度が必要ではない(1秒間に数十回程度の送信で十分)のでパルス幅長めに取りました。これは1つのCPUでマルチセレクタを利用して大量の受光素子から受信するのが簡単になるというメリットもあります。
パケット内容の決定
パケット内容とはコマンドのことですが、当分はアドレスの送信だけで良いのでショートアドレス用のパケットとロングアドレス用のパケットだけ策定しておきます。が、まだロングアドレスについてちゃんと理解していないのでショートアドレス用だけ決めておきます。
ショートアドレス:TRANSPOND_SHORT_ADDR
<0x01> <ADDR> <ERR>
ADDR:自己のアドレス-1 (つまり0〜127)
ERR:エラー検出バイト
これだけです。
AVRに実装
送信
送信は割り込みを使わない方法であれば簡単です。タイマー0の比較一致タイマーカウンタクリア(CTC)動作を利用し、LEDを38kHzで点滅させます。
このタイマーを上のプロトコルのようにオンオフすればOKです。
ただ、実際にはDCCパケットの受信(プログラムパケットのみ)もやらないといけないので、どちらかを割り込みで行う必要があります。が、このトランスポンディングの送信を割り込みにする方が簡単なので今後割り込み版を作りたいと思います。
受信
コストパフォーマンス向上のため受信は一つのマイコンで複数のセンサーを監視できるような構造にします。
100 ㎲ごとに入力をポーリングし、立ち上がりエッジから立ち下がりエッジの間の長さをカウントし、パケットを受信していきます。
ただ受信するセンサーが増えた場合、100㎲で全ての処理が終わるのかどうかという問題もあります。もし無理であればビット幅の時間を長くするか、外部クロックで20MHzにするなり今後やってみることにします。