Endless trail

寄り道好きのひとりごと
<< September 2019 | 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 >>
 
PR
RECENT COMMENT
  • KATO C56 (HOタイプ)を頑張ってオープンサウンド化にしてみる。
    MECY (08/30)
  • KATO C56 (HOタイプ)を頑張ってオープンサウンド化にしてみる。
    KAKKA (08/30)
  • KATO C56 (HOタイプ)を頑張ってオープンサウンド化にしてみる。
    MECY (08/27)
  • KATO C56 (HOタイプ)を頑張ってオープンサウンド化にしてみる。
    KAKKA (08/26)
  • Next18のSmileDecoderを試す
    MECY (08/13)
  • Next18のSmileDecoderを試す
    なごでん (08/13)
  • Hoゲージの大ジオラマでC59を思いきり走らせてみた
    KAKKA (08/11)
  • Hoゲージの大ジオラマでC59を思いきり走らせてみた
    MECY (08/11)
  • Hoゲージの大ジオラマでC59を思いきり走らせてみた
    KAKKA (08/09)
  • Hoゲージの大ジオラマでC59を思いきり走らせてみた
    KAKKA (08/09)
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
DSシールドの自動運転スケッチを試してみた。

JUGEMテーマ:鉄道

 最近、大小サイズのSLサウンドにドップリと漬かっていますが、サウンドを楽しむのに広いコースで豪快にSLを走らせるのが最もベストではあります。ですがウサギ小屋生活のMECYに広大なコースを持つ事などは夢のまた夢で、せいぜいレンタルコース等を拝借して走らせるのが関の山です。しかしここは視点を変え工夫次第で限られたスペースでもサウンドは楽しめるのではないか?と思っていました。そこで今回考えたのは自動運転にして、操作もおろか何も手を触れす、永遠とサウンドと動輪の動きだけを見て聞いて楽しむとゆうちょっとマニアック度が濃い楽しみ方をしてみます。

 自動運転なのでDiskTopstainonの自動運転スクリプトを組んでやるのが王道だと思いますが、今回はDSシールドのスケッチの中にDSshieldAUTOとゆう自動運転制御をユーザが書き込めるエリアが用意されているスケッチが公開されているので、Wiikのチュートリアルを参考に半日程唸っておりました。

 題材は以前サウンド化したHoゲージのC59です。SLサウンドはフジガヤさんが初版リリースしたベースのMP3V5向けのものに、MECYがあれこれいじりこんで、MP3の音源をスロットルワークで鳴らしまくる仕込みを入れています。これだけでも普通にDCCコントローラで動かす分にはSLサウンドを十分楽しめる感じですが、今回は一度電源をONをしたらあとは一切触らないで見ているだけで楽しめるところまでDSシールドのスケッチを作りこみます。

 自動運転のモードは単純です。「発車→加速→しばらく定速→減速→しばらく停車→バックで発車→繰り返し」 までをひたすらループさせるだけです。この一連の運転パターンの中に汽笛を鳴らすタイミングを仕込んだり、お試しとして絶気運転呼ばれる状態を再現させるため停止直前でF3でドラフト音を一旦止めて、機関車が滑走しているかの様なモードも付け加えてみました。

 スケッチの掛かり始めでは「な〜に20行くらいの追加で出来きちゃうんじゃないか?」と思いましたが、途中からあれこれ細かい動作の調整や、運転モードの追加などを入れいていって気が付いたら書いたコードが200行位に膨れ上がっていました.

 

 自動運転のスケッチは以下です、長いので前進部分のみの抜粋です。後進も同じ感じです)

 

/*****************************************************************/
/*  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_DCC + 3, 0, 1);
    
    //SPEED 0
    CMD_LocSpeed(ADDR_DCC + 3, 0);
    
    //POWER ON
//    CMD_Power(1);
//    Serial.println("Power On");
}


void user_program(void)
{
    static byte sButtonState = 1;
    CMD_Wait(20000);    
    
    //ボタンが押されたとき、digitalReadは0を返す。押さないときは1を返す。
    
       if( digitalRead(8) == 0)
       {
       //POWER ON
       CMD_Power(1);
       Serial.println("Power On");
       }
       
       if( digitalRead(8) == 1)
     {
        Serial.println("Button 1");
        
        sButtonState = 1;
        CMD_Wait(100);
        
                /* 前進 */
                //FWD
               CMD_LocDirection(ADDR_DCC + 3, 0);
               CMD_Wait(2000);
   
           //警笛
           CMD_LocFunction(ADDR_DCC + 3, 11, 1);
           CMD_Wait(7000);
            //CMD_LocFunction(ADDR_DCC + 3, 11, 0);
                //CMD_Wait(2000);

                //繰り返し。車両のスピードを変える(加速)

                for( int i = 0; i < 170; i++)
                   {
                    CMD_LocSpeed(ADDR_DCC + 3, i * 4 );
                    CMD_Wait(100);
                   }

           //急加速
           //CMD_LocSpeed(ADDR_DCC + 3, 100);

                //定速時間
                CMD_Wait(20000);    //定速時間20秒

                //警笛
                CMD_LocFunction(ADDR_DCC + 3, 11, 0);
                CMD_Wait(2000);
                
                //定速時間
                CMD_Wait(20000);    //定速時間20秒

                //繰り返し。車両のスピードを変える(減速1)
                for( int i = 170; i > 32; i--)
                   {
                    CMD_LocSpeed(ADDR_DCC + 3, i * 4 );
                    CMD_Wait(100);
                   }

                //絶気モード
                CMD_LocFunction(ADDR_DCC + 3, 3, 1);
                CMD_Wait(2000);
                
                //繰り返し。車両のスピードを変える(減速2)
                for( int i = 32; i > 0; i--)
                   {
                    CMD_LocSpeed(ADDR_DCC + 3, i * 4 );
                    CMD_Wait(100);
                   }

                //停車
                CMD_LocSpeed(ADDR_DCC + 3, 0);
                CMD_Wait(2000);
                
                //絶気モード解除
                CMD_LocFunction(ADDR_DCC + 3, 3, 0);
                CMD_Wait(2000);
                
                CMD_Wait(40000);   //停止時間40秒

        /* 後進 */
        //REV
        CMD_LocDirection(ADDR_DCC + 3, 1);
        CMD_Wait(2000);

 

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

    後進処理も同様の繰り返し

 

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

 

 Wiikチュートリアルのサンプルコードは車両アドレスがMM2に対応させて書かれていましたが、ここをDCC用に置き換えてます。アドレスはデフォルト3にしています。

 

下記が自動運転の大まかな動きです。基本、前進/後進を交互に繰り返します。

「汽笛→発車(前進)→加速/汽笛→しばらく定速/汽笛(20秒)→減速/汽笛→→絶気→しばらく停車(40秒)

  →汽笛→バックで発車→→加速/汽笛→しばらく定速/汽笛(20秒)→減速/汽笛→絶気→しばらく停車(40秒)

・・・繰り返し」

 

 スケッチの冒頭で本当はタクトスイッチ「押す/押さない」で電源をON/OFFにする様にしたかったのですが、上手く切り替わらなかったので、母艦のArduinoのリセットボタンを押してから、直ぐに長押しで20秒位タクトスイッチを押して線路へ電源供給が入る様にしました。また自動運転を止める場合にも母艦のArduinoのリセットボタンを押すと機能が停止する形にしています。これは厳密なOFFの機能ではありません。(線路電源がONに入らないだけで、見かけ上機能は停止してますが、多分自動運転のスケッチの処理は裏で動き続けている状態です)つまり一度、自動運転を始めるとリセットかACアダプターを抜かない限り永遠に動き続ける無限ループで今時はやりのスマートな自動運転とは言い難い、車両かデコーダのどちらかが潰れるまで動き続けるアリ地獄の様なDSシールドのスケッチが出来上がりました。

 

 少し長いですがDSシールド自動運転の動画をご覧ください。(13分弱くらいです)

 

 ◇前にも見たことのあるアングルですが、C59のサウンドは少し変えています。

 

 スタートから止めるまで一切手を触れず、放置してお茶なんぞ飲んでましたが、最後まで止まらずに動き続けていました。

 

 DSシールドのAUTOスケッチによる自動運転ですが、PC要らずで単体でシンプルに動かせる点が利点です。プログラムの初心者でも自動運転用に用意された指令コマンドコードを動かしたい順に素直に書いて行けば、直ぐに動かせるコードが出来ると思います。プログラム言語の構文もある程度使える様ですので、慣れている人なら結構複雑な動きも組めるかもしれません。ただデバックがやりずらいので、少し複雑な処理になると机上である程度設計してから掛からないとハマルかもしれません。

 

 簡単なGo/Stop/Goの自動運転ですが、デモ用にnon Stopで動いてくれたので、その点は満足です。

 

スケッチは有志のページに貼っておきます。

 

mp3付はファイルサイズが大きいのでこちら

 

 

 

スポンサーサイト
- | 23:00 | - | - |
コメント
from: MECY   2018/04/17 1:14 PM
#フジガヤ様
コメントありがとうございます。
衝突事故は起きないと思いますか、やはり動輪がレール乗っていないので左右の揺れに弱く不安定です。車体を固定する何かを考えないといけません。

#KAKKAさま
コメントありがとうございます。
MINTカンでも自動運転ができるんですね。文字列の制御は見慣れないと難しそうです。
C59の現役の走行は見た事はないので完全に妄想の中で音合わせをしてますが、D51の方が実物見れますし、音と走行のイメージが出来るのでお似合いかも知れません。
from: KAKKA   2018/04/17 12:34 AM
MECY様
MINTカンを使って自動運転始めました。

以下の文字列を1秒ごとに1文字処理して動画の様に走りました。

"L2f0A5sA9sL22468wwwww6420r24wwwww20A5dL2f2468A9dwwwwL26420A9sL2r24wwwww20f24
wwww20A9dL2r246ww420f2468wwwwwwA9dA5swwwwwwwwwwwL2642"

出だしの位置合わせは、ポイント制御で絶縁部に止まってます。

L2f0 : 2番列車を前進停止
A5sA9s :ポイント5番直進、 ポイント9番直進、
L22468wwwww : 2番列車を加速、ウエイト5回

コマンドはこんな意味です。

MP3V5_SL102aTR7 を書き込みました。 いい感じでD51が走りました。
from: fujigaya2   2018/04/16 9:49 PM
模型市のデモとしてよさそうですね。
暴走して、追突の危険もありませんし。
コメントする









 

(C) 2019 ブログ JUGEM Some Rights Reserved.