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

2018年01月18日

DSシールドをPLCのようにする その2(挫折&方針変更)

DSシールドだけで、DCC/MMシールドの時のように、自分でArduinoで自動運転プログラミングできるようにするためのチャレンジです。

当初はインタプリターを実装しようと思ってましたが、かなり面倒で時間が掛かる割に、効果が薄いような気もするので、方針を変更して、パケット生成エンジンをタイマ割り込みで優先度を上げた上で、パケットを出していない隙間で、皆さんが自由に自動運転ソフトをかけるようにすることにしました。

□スケッチ

全然調整できていない、チャレンジャー向きです。

DSshieldAUTO_r0.zip

DSshieldAUTO_r0b.zip

□現在の状況(r0→r0b)

・とりあえず動くレベル、MP3デコーダ、ZIMOデコーダ以外では未チェック。たぶん、デコーダによってはうまく動かない可能性もある。→だいぶ調整したので、おおよそのデコーダで一応動くと思う。
31%→ 28%(9.1KB)ROM消費、35%→40%RAM消費。結構余っているので、そこそこのソフトは入れ込めるはず。
・CMD_WAITが狙ったとおり動かない。原因調査中。→Timer0のプリスケーラがおかしいようだが、何もしてないので何でこうなったか調べないといけない。とりあえず、1/4に係数をかけて無理矢理調整。delayなどの関数もこの影響で、妙に遅くなっているはず。
割り込み頻度の調整がまだ足りない。→おおよそ7ms程度、処理の余裕ができるように調整。

□使い方

一番最後の関数のuser_programのみを解放します。以下のように書かれています。
単純なシーケンスプログラムで、電源ON、ファンクション操作、終了(永久ループ)です。終了のwhile命令を入れないと、またuser_programは頭の行から動き始めます。


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

void user_program(void)
{
SerialDS.println("Power On");
CMD_Power(1);

CMD_LocFunction(ADDR_DCC + 3, 0, 1);
CMD_LocFunction(ADDR_DCC + 3, 1, 1);
CMD_Wait(500);

SerialDS.println("Loc 3, Func 10, On");
CMD_LocFunction(ADDR_DCC + 3, 10, 1);

CMD_Wait(500);

SerialDS.println("Loc 3, Func 11, On");
CMD_LocFunction(ADDR_DCC + 3, 11, 1);

CMD_Wait(500);

SerialDS.println("Loc 3, Func 9, On");
CMD_LocFunction(ADDR_DCC + 3, 9, 1);

CMD_Wait(500);

SerialDS.println("End...");
/* 永久ループ(終了) */
while(1){}
}


ループをうまく使うことで、ボタン入力を待つ処理などができるわけです。もうちょっと安定化したら、サンプルをたくさん作っていきます。

□どんなことに使えるか

従来のDSシールドや、DSmainはPCが必須でしたが、パソコンなしで、電源があれば、DCC車両やDCCポイントがプログラミングしたとおりに、勝手に動くジオラマを作ったりできます。ボタンをたくさんつけて、DCCポイントのルート変更、なんていう処理もプログラミングできます。

Arduinoなので、自由度は無限大!・・・と言いたいところですが、パケット生成エンジンが裏で動いていて、これがかなり重たい処理なので、その隙間をぬって動かす必要があります。

なるべく、処理は分散して実装するという一工夫が必要なことをご了承ください。この辺のテクニックは、随時、公開していきます。
posted by yaasan at 22:45 | Comment(2) | 鉄道模型
この記事へのコメント
Dccパケット送信が裏で動く環境があれば、コントローラのカスタマイズはだいぶ楽になりますね。
ただ、自動運転となると、センサー入力が欲しいですね。
Posted by へのへのもへじ at 2018年01月19日 09:30
もちろん、S88はサポート予定です。裏側では準備済みです。あと、DI、DOあたりも関数を用意しようと思ってます(普通にdigitalRead, Write関数をたたけば良いだけですが)
Posted by Yaasan at 2018年01月19日 18:36
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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