So-net無料ブログ作成

アクセサリデコーダのアドレスの説明 [ds-DCCデコーダ]

 昨日は子供と久しぶりに横浜の原鉄道模型博物館に行きました。子どもは大宮の鉄道博物館に行きたいと言っていましたが、今、リニューアル中のようですので。
 10:20に行ったら、11:00からの動鉄実習に参加できました。以前は混んでてなかなかできなかった印象があるのですが、空いてきたんでしょうね。ドイツのえんじ色とクリーム色の機関車を子供が動かしました。運転台はブレーキの圧力計の赤いメーターも動く本格的なものでした。
re_IMG_20180310_110006.jpg

 その後、ジオラマがを見ていると、少し前にへのへのもへじさんの記事で見かけたSBBクロコダイルが走っていて、電機機関車でロッドがあって、ボンネットがあるという個性的な姿そのままでした。これは確かに一家に一台欲しいかもと思いました。が、価格、高いですね。
 re_IMG_20180310_112949.jpg

 で、本題です、N様から、昇圧ポイントデコーダのスケッチについて質問があり、調べました。
 質問は、アクセサリのアドレスの話で、スケッチ(ino)では、

// This function is called whenever a normal DCC Turnout Packet is received
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State)

命令でアクセサリのアドレスが来たらOn,Offしているけど、
このイベントを起こすnmraDCCライブラリ側を見ると、
BoardAddress =(((~pDccMsg->Data[1]) & 0b0111 0000) << 2) | (pDccMsg->Data[0] & 0b0011 1111 )
OutputAddress = pDccMsg->Data[1] & 0b0000 0111
OutputIndex = OutputAddress >> 1
Addr = (BoardAddress - 1) * 4 + OutputIndex +1

なので、BoardAddressに3とかが来ると、Addrは9~12とかになって、アドレスが一致しない気がするというお話でした。
 私はnmraDCCライブラリお任せで、中身を見ていませんでしたので、調べてみました。
 nmraDCCの仕様書、9.2.1の9ページ目に説明があります。
抜粋すると、
---
Basic Accessory Decoder Packet Format
The format for packets intended for Accessory Digital Decoders is:

{preamble} 0 10AAAAAA 0 1AAACDDD 0 EEEEEEEE 1

Accessory Digital Decoders can be designed to control momentary or constant-on devices, the duration of time each output is active being controlled by configuration variables CVs #515 through 518. Bit 3 of the second byte "C" is used to activate or deactivate the addressed device. (Note if the duration the device is intended to be on is less than or equal the set duration, no deactivation is necessary.) Since most devices are paired, the convention is that bit "0" of the second byte is used to distinguish between which of a pair of outputs the accessory decoder is activating or deactivating. Bits 1 and 2 of byte two are used to indicate which of 4 pairs of outputs the packet is controlling. The most significant bits of the 9-bit address are bits 4-6 of the second data byte. By convention these bits (bits 4-6 of the second data byte) are in ones complement.
---
で、アドレス部分は1データ目のAAAAAAと2データ目のAAAです。ボードアドレスへの変換は
BoardAddress =(((~pDccMsg->Data[1]) & 0b0111 0000) << 2) | (pDccMsg->Data[0] & 0b0011 1111 )
です。9桁しかありませんので、2の9乗で512しか取れません。
 しかし、DCCのアクセサリは2044まであります。どうしているかというと、今度は2データ目のDDDのうち1,2ビット目の取りうる値0~3を使います。これがサブアドレスみたいな感じです。
Dの0ビット目はいわゆるポイントの直進、分岐を制御するビットになります。
 桂庵様のページに説明が載っております。ここではアドレスとは言わずにF1~F4と表現されているようです。
 ここら辺をそのまま書くと、

アドレス ボードアドレス Dの2,1ビット
1 1 0 0
2 1 0 1
3 1 1 0
4 1 1 1
5 2 0 0
6 2 0 1

という感じです。ボードアドレスが1~511ぐらいで、各々のアドレスに対して4つのサブアドレスを持っているイメージです。コマンドステーションからは1~2044を送っているように見せかけて、内部でボードアドレスとサブアドレス(のようなもの)に分けて送っています。
 1データ目、2データのまんまの値がどうなっているかというと、Nuckyさんの日本式信号機でのちょっと複雑なアドレス表がそのままです。いままでNuckyさんのこの信号表、なんでこんな面倒なことになっているのかと思っておりましたが、謎が解けました。
 この表のとおりにして、2データ目の最下位ビットを直進か分岐かの値に書き換えてやることで、多分アクセサリデコーダのDCC信号になります。




コメント(0)