FL12と他のデコーダの違いについて実験してみる [DCC/MM2シールド]
FL12の相性の件は、Desktop Station Forumで、「あとは波形でも眺めないとわからなそうだ」と書いたが、
そういえば、cmdr-arduinoを使うと、DCCの’1’と’0’の信号周期を変更できそうなこと、また、検索していたら、WebNucky様の利用者相互掲示板で、名古屋電鉄様が、「D101ではデコーダの'1'、'0'の閾値を変えないとうまく動かなかった(意訳)」との記述があり、
もしかしたら、DCC/MM2シールドで、普通に動くデコーダのEM13やDN163K0D、と、動きが芳しくないFL12デコーダには、'1'、'0'の閾値に明確な差があるかも知れないと思って、実験をすることにした。
まず、cmdr-arduinoを眺めると、"DCCHardware.c"に、'1'信号と'0'信号の周期を規定している変数がある。
--------------
uint16_t one_count=115; //58us
uint16_t zero_high_count=199; //100us
uint16_t zero_low_count=199; //100us
--------------
で、この記述の上に、計算式などがコメントで詳しく書いてある。
この値を変えれば、'1'、'0'信号の周期を変えることが可能になる。
各デコーダで正しく動く範囲を確認する実験をしようと思い、ハード構成は「激安DCCデコーダ」をコマンドステーション的にしてみるをそのまま使い、周期を変えながらデコーダを操作できるスケッチに改造した。
改造部分が結構たくさんだったので、見たいかたはこちら。
ソフトの改造は、"DCCHardware.c"と"DCCHardware.h"にメインから周期にアクセスできるSet,Get関数を追加して、メインのソフト(CmdrArduino_command.ino)は、シリアル通信のコンソールで適当な動作を出来るようにしたもの。
操作は(手抜きで、)
1キー:'1'の半周期を0.5usだけ短くする。(one_half_count[us])
2キー:'1'の半周期を0.5usだけ長くする。(one_half_count[us])
3キー:'0'の半周期を0.5usだけ短くする。(zero_half_count[us])
4キー:'0'の半周期を0.5usだけ長くする。(zero_half_count[us])
5キー:制御列車のアドレスを-1する。
6キー:制御列車のアドレスを+1する。
9キー:CV3(acceleration rate)を0,30のトグルで切り替える。(今回の実験では未使用)
0キー:F0ライトのオン/オフ
[キー:列車のスピードを+5する。(スピードは-127~127)
]キー:列車のスピードを-5する。(スピードは-127~127)
それぞれ、貯めて通信することも可能で、例えば、
「2222222222」と2を10個入力してEnterを押して送ると、'1'の半周期を0.5[us]*10 = +5us長くすることが出来る。
で、ここまでが準備。
各デコーダの実験だが、まず、実験条件は、
実験1:
'0'の半周期を100[us]固定にして’1’の半周期を振っていき、正常動作する範囲と外れた場合の振る舞いを確認する。
実験2:
'1'の半周期を58[us]固定にして'0'の半周期を振っていき、正常動作する範囲と外れた場合の振る舞いを確認する。
結果だが、
<FL12>
動作確認:F0(ライト オン/オフ、方向変更)
①'1'正常動作範囲:33.5[us]~71.0[us] (範囲:37.5[us]、中心:52.25[us])
外れた場合:最初切り替わりが遅くなり、そのうち切り替わらなくなる。ただし、DCC/MM2シールドのときの振る舞い(数秒後に切り替わる)というのでは無く、一秒後ぐらいまでに切り替わらない場合は、いつまでたっても切り替わらない。
②'0'正常動作範囲:84.5[us]~(200[us]まで確認)
外れた場合:最初切り替わりが遅くなり、そのうち切り替わらなくなる。ただし、DCC/MM2シールドのときの振る舞い(数秒後に切り替わる)というのでは無く、一秒後ぐらいまでに切り替わらない場合は、いつまでたっても切り替わらない。
<EM13>
動作確認:モーター動作
①'1'正常動作範囲:27.0[us]~78.0[us] (範囲:51.0[us]、中心:52.5[us])
外れた場合:周期を小さくすると動かなくなる。周期を大きくするとモーターが最高速運転の暴走をする。
②'0'正常動作範囲:80.0[us]~(200[us]まで確認)
外れた場合:周期を小さくするとモーターが最高速運転の暴走をする。
<DN163K0D>
動作確認:F0でのライト オン/オフ
①'1'正常動作範囲:49.0[us]~78.5[us] (範囲:30.0[us]、中心:64.0[us])
外れた場合:周期を小さくすると動かなくなる。周期を大きくするとモーターが最高速運転の暴走をする。
②'0'正常動作範囲:80.0[us]~(200[us]まで確認)
外れた場合:周期を小さくするとモーターが最高速運転の暴走をする。
なお、オシロスコープを持っていないので、本当に信号がそのように出ているのかは確認できていない。
表にすれば見やすくなるのかもだが、上記結果から、FL12とEM13、DN163K0Dの違いをみると、'0'、'1'の閾値が明らかに異なることがわかる。
FL12:71[us]~84.5[us]が閾値。
EM13,DN163K0D:78[us]~80[us]が閾値。
→FL12は他に比べて'1','0'の信号が明確に分かれていないと動かなそう。
まあ、それ以上に同じDigitrax製品なのに、こんなに範囲がばらついているということに少々驚いた。
そういえば、cmdr-arduinoを使うと、DCCの’1’と’0’の信号周期を変更できそうなこと、また、検索していたら、WebNucky様の利用者相互掲示板で、名古屋電鉄様が、「D101ではデコーダの'1'、'0'の閾値を変えないとうまく動かなかった(意訳)」との記述があり、
もしかしたら、DCC/MM2シールドで、普通に動くデコーダのEM13やDN163K0D、と、動きが芳しくないFL12デコーダには、'1'、'0'の閾値に明確な差があるかも知れないと思って、実験をすることにした。
まず、cmdr-arduinoを眺めると、"DCCHardware.c"に、'1'信号と'0'信号の周期を規定している変数がある。
--------------
uint16_t one_count=115; //58us
uint16_t zero_high_count=199; //100us
uint16_t zero_low_count=199; //100us
--------------
で、この記述の上に、計算式などがコメントで詳しく書いてある。
この値を変えれば、'1'、'0'信号の周期を変えることが可能になる。
各デコーダで正しく動く範囲を確認する実験をしようと思い、ハード構成は「激安DCCデコーダ」をコマンドステーション的にしてみるをそのまま使い、周期を変えながらデコーダを操作できるスケッチに改造した。
改造部分が結構たくさんだったので、見たいかたはこちら。
ソフトの改造は、"DCCHardware.c"と"DCCHardware.h"にメインから周期にアクセスできるSet,Get関数を追加して、メインのソフト(CmdrArduino_command.ino)は、シリアル通信のコンソールで適当な動作を出来るようにしたもの。
操作は(手抜きで、)
1キー:'1'の半周期を0.5usだけ短くする。(one_half_count[us])
2キー:'1'の半周期を0.5usだけ長くする。(one_half_count[us])
3キー:'0'の半周期を0.5usだけ短くする。(zero_half_count[us])
4キー:'0'の半周期を0.5usだけ長くする。(zero_half_count[us])
5キー:制御列車のアドレスを-1する。
6キー:制御列車のアドレスを+1する。
9キー:CV3(acceleration rate)を0,30のトグルで切り替える。(今回の実験では未使用)
0キー:F0ライトのオン/オフ
[キー:列車のスピードを+5する。(スピードは-127~127)
]キー:列車のスピードを-5する。(スピードは-127~127)
それぞれ、貯めて通信することも可能で、例えば、
「2222222222」と2を10個入力してEnterを押して送ると、'1'の半周期を0.5[us]*10 = +5us長くすることが出来る。
で、ここまでが準備。
各デコーダの実験だが、まず、実験条件は、
実験1:
'0'の半周期を100[us]固定にして’1’の半周期を振っていき、正常動作する範囲と外れた場合の振る舞いを確認する。
実験2:
'1'の半周期を58[us]固定にして'0'の半周期を振っていき、正常動作する範囲と外れた場合の振る舞いを確認する。
結果だが、
<FL12>
動作確認:F0(ライト オン/オフ、方向変更)
①'1'正常動作範囲:33.5[us]~71.0[us] (範囲:37.5[us]、中心:52.25[us])
外れた場合:最初切り替わりが遅くなり、そのうち切り替わらなくなる。ただし、DCC/MM2シールドのときの振る舞い(数秒後に切り替わる)というのでは無く、一秒後ぐらいまでに切り替わらない場合は、いつまでたっても切り替わらない。
②'0'正常動作範囲:84.5[us]~(200[us]まで確認)
外れた場合:最初切り替わりが遅くなり、そのうち切り替わらなくなる。ただし、DCC/MM2シールドのときの振る舞い(数秒後に切り替わる)というのでは無く、一秒後ぐらいまでに切り替わらない場合は、いつまでたっても切り替わらない。
<EM13>
動作確認:モーター動作
①'1'正常動作範囲:27.0[us]~78.0[us] (範囲:51.0[us]、中心:52.5[us])
外れた場合:周期を小さくすると動かなくなる。周期を大きくするとモーターが最高速運転の暴走をする。
②'0'正常動作範囲:80.0[us]~(200[us]まで確認)
外れた場合:周期を小さくするとモーターが最高速運転の暴走をする。
<DN163K0D>
動作確認:F0でのライト オン/オフ
①'1'正常動作範囲:49.0[us]~78.5[us] (範囲:30.0[us]、中心:64.0[us])
外れた場合:周期を小さくすると動かなくなる。周期を大きくするとモーターが最高速運転の暴走をする。
②'0'正常動作範囲:80.0[us]~(200[us]まで確認)
外れた場合:周期を小さくするとモーターが最高速運転の暴走をする。
なお、オシロスコープを持っていないので、本当に信号がそのように出ているのかは確認できていない。
表にすれば見やすくなるのかもだが、上記結果から、FL12とEM13、DN163K0Dの違いをみると、'0'、'1'の閾値が明らかに異なることがわかる。
FL12:71[us]~84.5[us]が閾値。
EM13,DN163K0D:78[us]~80[us]が閾値。
→FL12は他に比べて'1','0'の信号が明確に分かれていないと動かなそう。
まあ、それ以上に同じDigitrax製品なのに、こんなに範囲がばらついているということに少々驚いた。
2015-05-10 01:26
nice!(0)
コメント(4)
トラックバック(0)
DCC/MM2シールドでは、モータドライバIC TB6643KQによってデッドタイムが自動的に2us程度が挿入されます。また、パルスの立上り・立下りの誤差も入るので、±3usの規定値になるように狙って実装してます。
パルス幅は、+側は中心値を58us、-側は中心値を120usに狙ってます。
FL12がすぐに切り替わらないのは、想像ですが、すぐに切り替わるかどうかの判断条件があるのかもしれません。メルクリンだと、最低何回以上、受信したら動作を開始する、という動作条件があります。FL12もなんらかしらの動作条件に合わないといけないのかもしれません。
by Yaasan (2015-05-10 05:53)
コメントありがとうございます。
>FL12もなんらかしらの動作条件に合わないといけないのかもしれません。
→なにかおまじないが無いかと検索したら、
・桂庵様のBlogにD101のパケット解析があり、http://blog.goo.ne.jp/katsuraan/e/12df835034681874c429f7d275671fb7
、速度、ファンクションともに3回ずつ自動で送り出しているのでしょうか?
・cmdr_arduinoはDCCPacketShceduler.hに繰り返しの定数があり、
---------------------
#define SPEED_REPEAT 3
#define FUNCTION_REPEAT 3
#define E_STOP_REPEAT 5
#define OPS_MODE_PROGRAMMING_REPEAT 3
#define OTHER_REPEAT 2
---------------------
基本的に3回のようです。ただし、D101の様にスピードを送ったからといって、ファンクションも一緒には送っていないと思われます。
DCC/MM2シールドも繰り返しが3回でしたら、Functionもついでに送るのをやってみようかと思います。
by fujigaya2 (2015-05-10 15:01)
アクセサリ系は、2回連続を3回送る仕組みです。
そのほかは、連続では送りません。が、全部の機関車に送り終わると、また再度、送りなおすのを永遠と繰り返す形です。たくさん機関車に命令を発行している場合は、ちょっと待たないといけないかもしれません。
FL12は、連続で3発送らないと、認識しない仕様になってるかもしれませんね。
by Yaasan (2015-05-11 04:39)
コメントありがとうございます。
cmdr-arduinoのRepeatの各#defineを0にして(3と書いてあるが4回リピートしているようだった)1回のみにしてみましたが、こちらの振る舞いは変わりませんでした(瞬時に変わる)。ただし、一番下のソースで確認しているわけではないので、命令1回なのかどうかは確信持てませんが。
cmdr-arduinoは命令の送信がリピート回数+1回後はFF 00 FFのアイドルパケット?を出し続ける仕様のようでした。
ですので当たり前ですが、
DCC/MM2シールドは「走っている最中の列車を持ち上げて、数秒後に線路に戻すと走り出す」、cmdr-arduinoは走っている最中の列車を持ち上げて、数秒後に線路に戻すと動かない」でした。
by fujigaya2 (2015-05-12 00:48)