忍者ブログ

あやの

NゲージをベースとしたDCCについての日記を 書いています。 ある程度貯まりましたら、鉄道模型のDCCのまとめサイトに まとめています。 DCC館 http://1st.geocities.jp/dcc_digital/ DCC2号館 http://dcc.client.jp/

2017/07    06«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  »08
SmileFunctionDecoderを使って、FX効果が作れるスケッチを作ってみた。
自由にカスタムできる様に、↓な感じにスケッチを書きます。

//FX効果
//Cmd,Time,値,分周比
//Cmd I:初期状態,O:出力,S:スイープ,L:ループ,E:終了
unsigned char ptn[4][5]={{'I',0,5,1},{'S',50,255,1},{'S',50,5,1},{'E',0,5,1}}; // 三角波

//モールス効果
unsigned char mptn[]="1000 00 0100_1000 00 0100_1000 00 0100_1000 00 0100*";// ばか ばか ばか ばか (ぽにょ) 0:単音 1:長音
※しょーもない、モールス信号ですみません、ぽにょで出てきたモールス信号ですw



スケッチは後で公開しますが、DCCの受信に影響無い様に、
/* HeadLight control Task (10Hz:100ms) */
void HeadLight_Control()
の100ms周期内に、FX効果用とモールス効果用ステートマシンを作りました。
標準で、ランダムで光るライトや、マーズライト、フラッシュライト、ストロボの
パターンを登録しておくと使えるデコーダになりますでしょうかw

モールス効果は、需要があるか?ですが、ジオラマで船を浮かばせた時の
効果にでもw

※ソースコピペしたら、インデントめちゃくちゃですね・・・
//---------------------------------------------------------------------
// FX効果ステートマシン
// 100ms周期で起動
// unsigned chart ptn[4][5]{{'I',0,0,1},{'S',20,255,1},{'S',40,0,1},{'E',0,0,1}};
//---------------------------------------------------------------------
  static char state = 0;    // ステート
  static char adr = 0;      // アドレス
  static int timeUp = 0;    // 時間
  static float delt_v = 0;  // 100msあたりの増加量 
  static float pwmRef =0;
  S00:
  if(gState_F0 == 0){ // F0 OFF
    state = 0; 
  }
  
switch(state){
case 0: // S00:idel
        adr = 0;
        timeUp = 0;
        pwmRef = 0;
        TCCR1 = 1<<CS10;  //分周比をセット
        //       OCR1B有効   high出力 
        GTCCR = 1 << PWM1B | 2 << COM1B0;
        analogWrite(O4, 0);  
         
if(gState_F0 == 1){ // F0 ON
        state = 1;
}
      goto S00;     // 100ms待たずに再度ステートマシーンに掛ける
break;
      
    case 1: // S01:コマンド処理
        if( ptn[adr][0]=='I'){ // I:初期化
          timeUp = ptn[adr][1];
          pwmRef = ptn[adr][2];
          delt_v = 0; // 変化量0
          TCCR1 = ptn[adr][3]<<CS10;  //分周比をセット
          analogWrite(O4, (unsigned char)pwmRef); // 0〜255            
          adr++;
          state = 1;
          goto S00;   // 100ms待たずに再度ステートマシーンに掛ける
        } else if( ptn[adr][0]=='E'){ // E:end
          state = 0;
        } else if( ptn[adr][0]=='L' ){  // L:Loop
          adr = 0;
          state =1;
          goto S00;   // 100ms待たずに再度ステートマシーンに掛ける
        } else if( ptn[adr][0]=='O' ){ // O:出力
          timeUp = ptn[adr][1];
          pwmRef = ptn[adr][2];
          TCCR1 = ptn[adr][3]<<CS10;  //分周比をセット
          delt_v = 0;
          state = 2;          
        } else if( ptn[adr][0]=='S' ){ // S:sweep
          timeUp = ptn[adr][1];
          TCCR1 = ptn[adr][3]<<CS10;  //分周比をセット      
          delt_v = (ptn[adr][2]-pwmRef)/timeUp;  // 変化量を算出
          state = 2;
        }
      break;
      
case 2: // S02:時間カウント
      timeUp--;
      pwmRef = pwmRef + delt_v;
      if(pwmRef<=0){            // 下限、上限リミッタ
          pwmRef = 0;
      } else if(pwmRef>=255){
          pwmRef = 255;
      }
      analogWrite(O4, (unsigned char)pwmRef); // 0〜255         
 
      if( timeUp <= 0 ){
        adr ++;
        state = 1;  //次のコマンドへ
      }
      break;
      default:
      break;
  }
//#endif


//---------------------------------------------------------------------
// モールス効果ステートマシン
// 100ms周期で起動
// 単音1,長音3,文字間3,単語間7
//---------------------------------------------------------------------
void MorseCode_Control()
{
  static char state = 0;    // ステート
  static char adr = 0;      // アドレス
  static char cnt = 0;      // 単音、長音のカウント
  if(gState_F3 == 0){ // F3 OFF
    state = 0; 
  }
  S10:  
  switch(state){
    case 0:
      if(gState_F3 == 1){ // F3 ON
        state = 1;
        digitalWrite(O2, LOW);               // 消灯 
        goto S10;            
        break;
      }
    case 1:
      switch(mptn[adr]){
        case '0':  // 単音?
          cnt = 1;
          digitalWrite(O2, HIGH);           // 点灯 
          state = 2;
        break;
        
        case '1':  // 長音?
          cnt = 3;
          digitalWrite(O2, HIGH);           // 点灯 
          state = 2;
        break;
        
        case ' ':  // 文字区切り
          cnt = 3;
          state = 2;
        break;
        case '_':  // 単語区切り
          cnt = 7;
          state = 2;
        break;
        case '*':  // 終わり
          state = 0;
        break;
        default:
         break;
      }
    break;
    
    case 2:   // 時間が着たら消灯
      cnt --;
      if(cnt == 0){
        digitalWrite(O2, LOW);               // 消灯 
        state = 3;
      }
    break;
    case 3:   // 短点と長点の間隔処理(一回通る)
        adr++;
        state = 1;
    break;
    default:
    break;
  }
//        LightMes(0,1);
}

拍手[0回]

PR
お名前
タイトル
メール(非公開)
URL
文字色
絵文字 Vodafone絵文字 i-mode絵文字 Ezweb絵文字
コメント
パスワード   コメント編集に必要です
管理人のみ閲覧

ブログ内検索

プロフィール

HN:
あやのすけ
性別:
非公開
<< Back  | HOME Next >>
Copyright ©  -- あやの --  All Rights Reserved
Design by CriCri / Material by もずねこ / powered by NINJA TOOLS / 忍者ブログ / [PR]