へのへのもへじ工作室
09 | 2017/10 | 11
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ArduinoでDCC通信モニターを作る
DCCを使い始めてまだわからないことも多いですが、arduinoを使って通信モニターを作ってみました。

これで通信を覗くと、いろいろなものが流れているのがわかります。先頭はどうやらアドレスのようですが、常にいくつかのコマンドが流れているようです。こんな感じです。
1,B0,B1,OK
1,3F,AF,91,OK
1,3F,AF,91,OK
1,3F,AF,91,OK
3,3F,8E,B2,OK
3,3F,8E,B2,OK
3,3F,8E,B2,OK
3,3F,8E,B2,OK
3,3F,8E,B2,OK
1,3F,AF,91,OK
1,3F,AF,91,OK
1,3F,AF,91,OK
3,3F,8E,B2,OK
3,3F,8E,B2,OK
1,80,81,OK
コマンドの最後にはチェクバイトがついているようなので、そのチェック機能をつけてみました。



AUTHOR: へのへのもへじ
DATE: 06/11/2013 21:46:30
スケッチはこんな感じです。

//
// DCC command moniter by Henomoheji
// Ver 1.0 release
//
#define DCCIN 12 // DCC input pin (arduino D12)
void setup() {Serial.begin(2400); Serial.println("Start DCC moiter");}
// Check bit data from pulse length
unsigned char checkBit() {
for(;digitalRead(DCCIN)==LOW;); // wait signal is HIGH
delayMicroseconds(60); // wait 60 micro seconds
if(digitalRead(DCCIN)==LOW) return 1; // if signal is LOW, set data is '1"
else for(;digitalRead(DCCIN)!=LOW;); // wait until signal is LOW
return 0; // set data is '0'
}
// Wait end of preamble
unsigned char waitpreamble() {
if(checkBit()==0) return 0; // wait 1 minimum 9 times
if(checkBit()==0) return 0; if(checkBit()==0) return 0;
if(checkBit()==0) return 0; if(checkBit()==0) return 0;
if(checkBit()==0) return 0; if(checkBit()==0) return 0;
if(checkBit()==0) return 0; if(checkBit()==0) return 0;
for (;checkBit()==1;); // wait bit is '0'
return 1;
}
// program loops here
void loop() {
int no=0,dispno;
unsigned char command[10],sum=0;

if (waitpreamble()) {
// get DCC command
do {
no++;
command[no] = checkBit()*128;
command[no] += checkBit()*64;
command[no] += checkBit()*32;
command[no] += checkBit()*16;
command[no] += checkBit()*8;
command[no] += checkBit()*4;
command[no] += checkBit()*2;
command[no] += checkBit();
} while (checkBit()==0); // until end bit is '1'
for(dispno=1;dispno
スポンサーサイト
コメント

拓啓ぽんさん
コメント、ありがとうございます。DCC対応ポイントは持っていないのですが、早速試しました。ポイントを操作すると以下のデータが送信されました。
ポイント1番
81,F9,78,OK
81,F8,79,OK
ポイント2番
81,FA,7B,OK
81,FB,7A,OK
・・・
なんか、パターンが見えてますね。これと比較すれば、ポイントデコーダーは確かに作れそうです。
でもこのテストをして問題だと思ったことがあります。結構、KATOのコマンドステーションの操作が面倒なのです。"SWITCH"ボタン→アドレスの"1"ボタン→ポイントの向き設定ボタン"の手順です。もちろん、2つ以上の同時操作なんて機能はありません。
やはり、拓啓ぽんさんのアイデアのような複数同時切り替えの仕組みが欲しいですね。
[2013/06/12 22:12] URL | へのへのもへじ #79D/WHSg [ 編集 ]


ついでに確認できたコマンドを書いておきます。たぶん、どこかにまとまった資料があるでしょうけど。
ポイント1番
81,F9,78,OK
81,F8,79,OK
ポイント2番
81,FA,7B,OK
81,FB,7A,OK
アドレス,80.チェックビット ライトオン(or ライトオフ) 
アドレス,90.チェックビット ライトオフ(or ライトオン)
アドレス,B0,チェックビット 不明(常に出ている)
アドレス,3F,0~7E.チェックビット REVERSEの走行
アドレス,3F,80~FE.チェックビット FORWARDの走行
[2013/06/12 22:26] URL | へのへのもへじ #79D/WHSg [ 編集 ]


こんばんは
へのへのもへじ様
お世話になってます
なんかすごいことになってますね
ポイントデコーダーはネット上で沢山作られておられる方がいますので、コピーですと私でも簡単に作れます
操作ですが、USB→Loconetさえ作れば JMRI が使えます
PC上でレイアウトも表示できますし、同時操作簡単です
もう御考慮中だとは思いますが。
[2013/06/12 23:52] URL | chevy101 #79D/WHSg [ 編集 ]


あまりよくわかっていないのですが。
AVRにモータードライバを複数繋いでおいて、
ポイント1直進を受けたら1のパターン、
ポイント1分岐を受けたら2のパターン、
ポイント2直進は3のパターンと、マイコン側で判断させてはどうでしょう。
[2013/06/14 05:30] URL | 拓啓ぽん #79D/WHSg [ 編集 ]


chevy101さん
こんにちは、USB→Loconetはなんとかできそうなのですが、DCC専用の固定レイアウトがないとあまりメリットがないような気がしましたが、
そのうちちょっと似たようなことはやってみようと思います。
拓啓ぽんさん
まさしくこのポイント操作ですね。ポイントの駆動はちょっとタイミングをずれしてみるとか、信号も合わせて連動させるとかできれば面白そうです。
市販だと、デコーダー1つで動かせる数は少ないですが、自作だとアドレスを複数アサインさせていろいろな動きが実現できそうですね。
まだ、よろしくお願い致します。
[2013/06/14 23:04] URL | へのへのもへじ #79D/WHSg [ 編集 ]


コメントの投稿














管理者にだけ表示を許可する



天気予報


-天気予報コム- -FC2-

プロフィール

へのへのもへじ

Author:へのへのもへじ
FC2ブログへようこそ!

最近の記事

最近のコメント

最近のトラックバック

カテゴリー

ブロとも申請フォーム

この人とブロともになる

アルバム

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。