デジタル鉄道模型フォーラムDCC・メルクリン等のデジタル鉄道模型の話題でコミュニケーションできる場です。登録・利用は無料です。
デスクトップステーション(DesktopStation)のページはこちら
・無料の日本型超高品質DCCサウンドデータをWebで配布中!
・鉄道模型をスマホで簡単制御!国産で革新的なコマンドステーション DSair2はこちらから。

2018年01月24日

DSシールドをPLCのようにする その5

メルクリンユーザー様、お待たせしました!!DSシールドで、メルクリンデジタル車両(MM2)を動かしました。特に、コマンドステーション部分についてのソフトは何もいじってませんが、メルクリン車両も動かせると言うことを、一応証明しました。

AUTO_MM2_1.jpg

メルクリンの29791は、弊社ではメルクリン車両のリファレンス機として使用しています。安くて壊れても財布が痛くないのと(当てても負荷をかけても全く壊れません・・・)、個人的にICE2の機関車(TGVの先頭車と同じ方式で、客車じゃないですよ!!)が好きなのもありますが。

□使用している機器

前回使ったタクトスイッチ、ブレッドボード類
・BAITE UNO互換機
DSシールド
・メルクリン ICE2(MM2デコーダ搭載車)
・CTrack線路、センサーレール
・フジガヤ2 S88 Detector(赤外線反射式在線検出器)

AUTO_MM2_2.jpg

□スケッチ

DSshieldAUTO_r0d.zip


/*****************************************************************/
/* User Program Area */
/*****************************************************************/

void user_init(void)
{

pinMode(8, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);

digitalWrite(8, HIGH);//内部プルアップON
digitalWrite(11, HIGH);//内部プルアップON
digitalWrite(12, HIGH);//内部プルアップON

//F0 Light ON
CMD_LocFunction(ADDR_MM2 + 2, 0, 1);

//SPEED 0
CMD_LocSpeed(ADDR_MM2 + 2, 0);

//POWER ON
CMD_Power(1);
Serial.println("Power On");
}


void user_program(void)
{
static byte sButtonState = 1;


//ボタンが押されたとき、digitalReadは0を返す。押さないときは1を返す。

if( digitalRead(8) == 0)
{
Serial.println("Button 1");

sButtonState = 1;
CMD_Wait(100);

/* 前進 */
//FWD
CMD_LocDirection(ADDR_MM2 + 2, 0);

//警笛
CMD_LocFunction(ADDR_MM2 + 2, 2, 1);
CMD_Wait(2000);
CMD_LocFunction(ADDR_MM2 + 2, 2, 0);

//急加速
CMD_LocSpeed(ADDR_MM2 + 2, 100);
}

if( digitalRead(11) == 0)
{
Serial.println("Button 2");

sButtonState = 2;
CMD_Wait(100);
//急停車
CMD_LocSpeed(ADDR_MM2 + 2, 100);
}

if( digitalRead(12) == 0)
{
Serial.println("Button 3");

sButtonState = 3;
CMD_Wait(100);
}

/* S88のスキャン */
CMD_ScanS88();


if( CMD_GetS88(0) == 1)
{
Serial.println("S88 Detected");

CMD_LocSpeed(ADDR_MM2 + 2, 100);
CMD_Wait(500);
CMD_LocSpeed(ADDR_MM2 + 2, 75);
CMD_Wait(500);
CMD_LocSpeed(ADDR_MM2 + 2, 50);
CMD_Wait(500);
CMD_LocSpeed(ADDR_MM2 + 2, 25);
CMD_Wait(500);
CMD_LocSpeed(ADDR_MM2 + 2, 0);
CMD_Wait(1000);

//REV
CMD_LocDirection(ADDR_MM2 + 2, 1);
Serial.println("REV");

//警笛
CMD_LocFunction(ADDR_MM2 + 2, 2, 1);
CMD_Wait(2000);
CMD_LocFunction(ADDR_MM2 + 2, 2, 0);

/* 加速 */
CMD_LocSpeed(ADDR_MM2 + 2, 25);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 50);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 75);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 100);
CMD_Wait(3000);

CMD_LocFunction(ADDR_MM2 + 2, 3, 1);
CMD_Wait(2000);
CMD_LocFunction(ADDR_MM2 + 2, 3, 0);

/* 減速 */
CMD_LocSpeed(ADDR_MM2 + 2, 75);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 50);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 25);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 0);
CMD_Wait(2000);

//FWD
CMD_LocDirection(ADDR_MM2 + 2, 0);
Serial.println("FWD");

//Clear
CMD_ScanS88();

//警笛
CMD_LocFunction(ADDR_MM2 + 2, 2, 1);
CMD_Wait(100);
CMD_LocFunction(ADDR_MM2 + 2, 2, 0);

/* 加速 */
CMD_LocSpeed(ADDR_MM2 + 2, 25);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 50);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 75);
CMD_Wait(1000);
CMD_LocSpeed(ADDR_MM2 + 2, 100);
}
}


□動きの説明

ボタン1を押すとサウンドを出して走行をスタートさせています。その後は、永遠と、往復を繰り返します。センサは1つのみで、時間式でシャトル運転させています。自動運転に関して、パソコンは使っていません。Aruino内に上記のスケッチを書き込んで動かしています。

車両はメルクリンのため、車両アドレスのオフセットにはADDR_MM2を付けています。DCC車両を動かすときは、ADDR_DCCに直せば、DCC車両で同じ事が可能です。

なお、途中でCMD_ScanS88()を呼び出しているのは、S88デコーダは在線検出すると信号をホールド(ラッチ)します。なので、定期的にCMD_ScanS88()をコールしてリフレッシュしないと前回のゴミが残るのです。おまじないとして、途中でコールしてS88デコーダの情報をいったんクリアーしているわけです。実装方法によってはハマりやすい現象なので、お気を付けください。

DSシールドは、DCCとメルクリンの両方に対応した世界で唯一のArduino用シールド(拡張基板)ということが、おわかりになると思います!

□Youtubeビデオ

posted by yaasan at 20:59 | Comment(0) | 鉄道模型
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。