DCCコントローラ作り直し その2 [DCCコントローラ]
忘れないように、その2に進みます。
次は各種命令を追加していきます。
まずは、ショートアドレス時のスピード指定命令です。
NMRAの9.2.1の仕様をみると、
Multi Function Digital Decoderの命令は、Google翻訳によると、
{プリアンブル} 0 [AAAAAAAA] 0 {命令バイト} 0 EEEEEEEE 1
という形式で送れと書いてあります。
[AAAAAAAA]部分は、アドレスで、
アドレス00000000(0):ブロードキャストアドレス
アドレス00000001~01111111(1-127)(含む):7ビットの多機能デコーダーアドレス
アドレス10000000~10111111(128-191)(含む):9ビットのアドレスを持つ基本的なアクセサリーデコーダーと11ビットのアドレスを持つ拡張アクセサリーデコーダー
アドレス11000000~11100111(192-231)(含む):14ビットの多機能デコーダーアドレス
アドレス11101000~11111110(232-254)(含む):将来の使用のために予約済み
アドレス11111111(255):アイドルパケット
→今回はショートアドレスのつもり(それも0x03固定)なので、
「アドレス00000001~01111111(1-127)(含む):7ビットの多機能デコーダーアドレス」
にします。
で、{命令バイト}は
各命令は次のように定義されます:
{命令バイト} = CCCDDDDD、
CCCDDDDD 0 DDDDDDDD、または
CCCDDDDD 0 DDDDDDDD 0 DDDDDDDD
という感じで、
必要な命令は、方向指示、スピード、ファンクションのF0~F4だけです。
まず、方向指示、スピードは、
{命令バイト} = 001CCCCC 0 DDDDDDDD
で、CCCCC = 11111とするとよいようです。
でDDDDDDDDの下位7ビットが0-127で速度(ただし0:Stop.1:EmersStopらしい)
で最上位ビット(一番左)が方向指示で1:Forward,0:Reverseとのこと。
これらを、まとめると、
{プリアンブル} 0 [0aaa aaaa] 0 {00111111} 0 {dsss ssss} 0 EEEEEEEE 1
aaa aaaa は1-127の車両のアドレス
dは方向 1:Forward,0:Reverse
sss ssss は0-127でスピード指示となる。
・ write_speed_packet(unsigned int address,bool loco_direction,byte loco_speed)
は、スピードパケットを送る命令で、ロコアドレスと、方向と、スピードをもらって、
適当に上記の形に整えて、
実際にパケット送る write_3_packet((byte)address,STEP128,temp_speed);に渡します。
一回だと不安なので、REPEAT_PACKETで3回繰り返しています。
・write_3_packet(byte byte_one,byte byte_two,byte byte_three)
は、3Byte送信用の命令です。
その3に続く。
次は各種命令を追加していきます。
まずは、ショートアドレス時のスピード指定命令です。
NMRAの9.2.1の仕様をみると、
Multi Function Digital Decoderの命令は、Google翻訳によると、
{プリアンブル} 0 [AAAAAAAA] 0 {命令バイト} 0 EEEEEEEE 1
という形式で送れと書いてあります。
[AAAAAAAA]部分は、アドレスで、
アドレス00000000(0):ブロードキャストアドレス
アドレス00000001~01111111(1-127)(含む):7ビットの多機能デコーダーアドレス
アドレス10000000~10111111(128-191)(含む):9ビットのアドレスを持つ基本的なアクセサリーデコーダーと11ビットのアドレスを持つ拡張アクセサリーデコーダー
アドレス11000000~11100111(192-231)(含む):14ビットの多機能デコーダーアドレス
アドレス11101000~11111110(232-254)(含む):将来の使用のために予約済み
アドレス11111111(255):アイドルパケット
→今回はショートアドレスのつもり(それも0x03固定)なので、
「アドレス00000001~01111111(1-127)(含む):7ビットの多機能デコーダーアドレス」
にします。
で、{命令バイト}は
各命令は次のように定義されます:
{命令バイト} = CCCDDDDD、
CCCDDDDD 0 DDDDDDDD、または
CCCDDDDD 0 DDDDDDDD 0 DDDDDDDD
という感じで、
必要な命令は、方向指示、スピード、ファンクションのF0~F4だけです。
まず、方向指示、スピードは、
{命令バイト} = 001CCCCC 0 DDDDDDDD
で、CCCCC = 11111とするとよいようです。
でDDDDDDDDの下位7ビットが0-127で速度(ただし0:Stop.1:EmersStopらしい)
で最上位ビット(一番左)が方向指示で1:Forward,0:Reverseとのこと。
これらを、まとめると、
{プリアンブル} 0 [0aaa aaaa] 0 {00111111} 0 {dsss ssss} 0 EEEEEEEE 1
aaa aaaa は1-127の車両のアドレス
dは方向 1:Forward,0:Reverse
sss ssss は0-127でスピード指示となる。
#define REPEAT_PACKET 3
#define DECODER_ADDRESS 0x03
#define STEP128 0b00111111
#define LOCO_FORWARD 0b10000000
#define LOCO_REVERSE 0b00000000
void write_speed_packet(unsigned int address,bool loco_direction,byte loco_speed)
{
//現状addressは0-127のみ受け付ける
//loco_direction forward:true,reverse:false
//loco_speed は2 - 127,0は停止、1は緊急停止らしいが・・・。
byte temp_speed = loco_speed;
//上限カット
if(temp_speed > 127)
{
temp_speed = 127;
}
if(loco_direction == true)
{
temp_speed |= LOCO_FORWARD;
}
else
{
temp_speed |= LOCO_REVERSE;
}
for(int i = 0;i < REPEAT_PACKET;i++)
{
write_3_packet((byte)address,STEP128,temp_speed);
}
}
void write_3_packet(byte byte_one,byte byte_two,byte byte_three)
{
//3命令送信用
write_preamble();
write_byte(byte_one);
write_byte(byte_two);
write_byte(byte_three);
write_byte(byte_one ^ byte_two ^ byte_three);
//packet_end_bit
bit_one();
}
・ write_speed_packet(unsigned int address,bool loco_direction,byte loco_speed)
は、スピードパケットを送る命令で、ロコアドレスと、方向と、スピードをもらって、
適当に上記の形に整えて、
実際にパケット送る write_3_packet((byte)address,STEP128,temp_speed);に渡します。
一回だと不安なので、REPEAT_PACKETで3回繰り返しています。
・write_3_packet(byte byte_one,byte byte_two,byte byte_three)
は、3Byte送信用の命令です。
その3に続く。
2020-02-16 17:57
コメント(0)
コメント 0