2017年10月24日火曜日

【プラレール修理】つうきん電車(旧動力 緑)の修理

以前修理したけどブログにアップできなかったもの その2 です。
なお、修理前の画像は撮り忘れたので修理後の画像のみです。

つうきん電車(旧動力 緑)を修理しました。
修理箇所はシャーシの動力ユニットを固定する部分です。
全体画像

画像中央部、動力ユニットのツメを引っかけて固定する部分が欠損していたため、プラモデルの灰色ランナーを使用してヒートペンで再生させました。
シャーシ修理画像 上面

底面からはこんな感じです。
シャーシ修理画像 底面


シャーシに合う色の灰色ランナーを全部使ってしまったため一部不完全ではありますが、無事動くようになりました。
シャーシ修理後画像

2017年10月1日日曜日

【雑記】オリジナルガシャット作製の雑記2

あぁ…
オリジナルガシャット用に考えていた案のうち、最も音声データ作製が進んでいた案が使いづらいネタになってしまった。
残り3案のうちの一つはヒダカヒロジ様のガシャットと若干ネタ被りするしなぁ…

困りましたねぇ…

2017年9月18日月曜日

【プラレール修理】名鉄7000系パノラマカー(旧動力 白線なし)の修理

以前修理したけどブログにアップできなかったもの その1 です。
なお、修理前の画像は撮り忘れたので修理後の画像のみです。

名鉄7000系パノラマカー(旧動力 白線なし)を修理しました。
修理箇所は運転台窓枠が折れて紛失していた所と車体左側ひび割れの2ヶ所です。
全体画像

運転台の窓枠は、プラモデルの赤ランナーを使用してヒートペンで再生しました。
が、仕上げが甘くガタガタになってしまいました…
窓枠部分拡大画像


車体左側のひび割れも、プラモデルの赤ランナーとヒートペン塞いだのですが、微妙に赤の色合いが異なったため逆に目立つ結果に…
ボディ左側拡大画像

いつか時間が出来たら、修理し直したいです…

2017年9月3日日曜日

【音声改造】オリジナルガシャット作製その5 『動作確認動画とプログラム公開』

新しい仮面ライダーの放送が始まりましたが、私はまだガシャットを弄っています。
という事で今回は、前回修正したスケッチが正常に動作するか検証していました。

動画にするとこんな感じです。
ガシャット挿入音の再生中にキメワザスロットのボタンを押下しても次処理のキメワザ待機音は実行せず、ガシャット挿入音の再生が終了した後にボタンを押下することでキメワザ待機音が鳴るようになりました。

スケッチが長くなってしまったのでvoid loopの所のみ抜粋してありますがこんな感じです。
void loop(){
  current_state[0] = digitalRead(BUTTON_1_PIN);
  current_state[1] = digitalRead(BUTTON_2_PIN);
  current_state[2] = digitalRead(BUTTON_3_PIN);
 
  if(memcmp(before_state, OFF_OFF_OFF, N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      wait = 1;
      action = set_action(LEVEL_1);
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      wait = 1;
      action = set_action(GASHAT_IN);
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      if(single_mode_flag == false){
        wait = 1;
        action = set_action(GASHAT_NAME);
      }else{
        randNumber = random(2);
        if(randNumber == 0){
          wait = 1;
          action = set_action(GAME_CLEAR);
        }else{
          wait = 1;
          action = set_action(GAME_OVER);
        }
      }
      single_mode_flag = !single_mode_flag;
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      slot_in_time = 0;
      slot_in_flag  = true;
      wait = 1;
      action = set_action(GASHAT_IN);
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      wait = 1;
      action = set_action(LEVEL_1);
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      wait = 1;
      action = set_action(GASHAT_IN);
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      critical_mode_flag = true;
      slot_in_time = 0;
      slot_in_flag  = true;
      wait = 1;
      action = set_action(WEAPON_C_READY);
    }
  }else if(memcmp(before_state, ON_OFF_OFF, N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      if(s_process_ID == 3 && slot_in_time >= 40){
        randNumber = random(2);
        if(randNumber == 0){
          wait = 1;
          action = set_action(CRITICAL_FINISH);
        }else{
          wait = 1;
          action = set_action(CRITICAL_FINISH_KAI);
        }
        s_process_ID = 0;
      }else{
        ;
      }
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(LEVEL_2);
      }else{
       if(s_process_ID == 3 && slot_in_time >= 40){
          randNumber = random(2);
          if(randNumber == 0){
            wait = 1;
            action = set_action(CRITICAL_FINISH);
          }else{
            wait = 1;
            action = set_action(CRITICAL_FINISH_KAI);
          }
          s_process_ID = 0;
        }else{
          ;
        }
      }
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      wait = 1;
      action = set_action(LEVEL_2);
    }
  }else if(memcmp(before_state, OFF_ON_OFF, N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      if(s_process_ID == 2 && slot_in_time >= 40){
        wait = 1;
        action = set_action(GENRE);
        s_process_ID = 0;
      }else{
        ;
      }
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(LEVEL_3);
      }else{
        if(s_process_ID == 2 && slot_in_time >= 40){
          wait = 1;
          action = set_action(GENRE);
          s_process_ID = 0;
        }else{
          ;
        }
      }
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      wait = 1;
      action = set_action(LEVEL_X);
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      wait = 1;
      action = set_action(LEVEL_3);
    }
  }else if(memcmp(before_state, OFF_OFF_ON, N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      wait = 1;
      action = set_action(LEVEL_1);
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      wait = 1;
      action = set_action(GASHAT_IN);
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(CRITICAL_READY);
      }else{
        randNumber = random(2);
        if(randNumber == 0){
          wait = 1;
          action = set_action(CRITICAL_STRIKE);
        }else{
          wait = 1;
          action = set_action(CRITICAL_STRIKE_KAI);
        }
      }
      critical_mode_flag = !critical_mode_flag;
    }
  }else if(memcmp(before_state, ON_ON_OFF,  N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(DRIVER_CLOSE);
      }else{
        if(slot_in_time >= 40){
          randNumber = random(2);
          if(randNumber == 0){
            wait = 1;
            action = set_action(CRITICAL_FINISH);
          }else{
            wait = 1;
            action = set_action(CRITICAL_FINISH_KAI);
          }
        }else{
          s_process_ID = 3;
        }
      }
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(DRIVER_CLOSE);
      }else{
        if(slot_in_time >= 40){
          wait = 1;
          action = set_action(GENRE);
        }else{
          s_process_ID = 2;
        }
      }
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      if(s_process_ID >= 1 && slot_in_time >= 40){
        switch(s_process_ID){
          case 1:
            wait = 1;
            action = set_action(CRITICAL_READY);
            critical_mode_flag = !critical_mode_flag;
            break;
          case 2:
            wait = 1;
            action = set_action(GENRE);
            break;
          case 3:
            randNumber = random(2);
            if(randNumber == 0){
              wait = 1;
              action = set_action(CRITICAL_FINISH);
            }else{
              wait = 1;
              action = set_action(CRITICAL_FINISH_KAI);
            }
            break;     
        }
        s_process_ID = 0;
      }else{
        ;
      }
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      if(slot_in_time >= 40){
        if(critical_mode_flag == false){
          wait = 1;
          action = set_action(CRITICAL_READY);
        }else{
          randNumber = random(2);
          if(randNumber == 0){
            wait = 1;
            action = set_action(CRITICAL_STRIKE);
          }else{
            wait = 1;
            action = set_action(CRITICAL_STRIKE_KAI);
          }
        }
        critical_mode_flag = !critical_mode_flag;
      }else{
        s_process_ID = 1;
      }
    }
  }else if(memcmp(before_state, ON_OFF_ON,  N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(LEVEL_2);
      }else{
        ;
      }
    }
  }else if(memcmp(before_state, OFF_ON_ON,  N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      if(critical_mode_flag == false){
        wait = 1;
        action = set_action(LEVEL_3);
     }else{
        ;
      }
    }
  }else if(memcmp(before_state, ON_ON_ON,   N_BUTTON) == 0){
    if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
      randNumber = random(2);
      if(randNumber == 0){
        wait = 1;
        action = set_action(CRITICAL_FINISH);
      }else{
        wait = 1;
        action = set_action(CRITICAL_FINISH_KAI);
      }
    }else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
      wait = 1;
      action = set_action(GENRE);
    }else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
      s_process_ID = 0;
      slot_in_flag  = false;
      critical_mode_flag = false;
      wait = 1;
      action = set_action(GASHAT_OUT);
    }else if(memcmp(current_state, ON_ON_OFF,  N_BUTTON) == 0){
      ;
    }else if(memcmp(current_state, ON_OFF_ON,  N_BUTTON) == 0){
      randNumber = random(2);
      if(randNumber == 0){
        wait = 1;
        action = set_action(CRITICAL_FINISH);
      }else{
        wait = 1;
        action = set_action(CRITICAL_FINISH_KAI);
      }
    }else if(memcmp(current_state, OFF_ON_ON,  N_BUTTON) == 0){
      wait = 1;
      action = set_action(GENRE);  
    }else if(memcmp(current_state, ON_ON_ON,   N_BUTTON) == 0){
      if(s_process_ID >= 1 && slot_in_time >= 40){
        switch(s_process_ID){
          case 1:
            wait = 1;
            action = set_action(CRITICAL_READY);
            critical_mode_flag = !critical_mode_flag;
            break;
          case 2:
            wait = 1;
            action = set_action(GENRE);
            break;
          case 3:
            randNumber = random(2);
            if(randNumber == 0){
              wait = 1;
              action = set_action(CRITICAL_FINISH);
            }else{
              wait = 1;
              action = set_action(CRITICAL_FINISH_KAI);
            }
            break;     
        }
        s_process_ID = 0;
      }else{
        ;
      }
    }
  }

  if(wait >= 1) {
    flash_led(action);
    wait = 0;
  }else{
    wait++;
  }

    before_state[0] = current_state[0];
    before_state[1] = current_state[1];
    before_state[2] = current_state[2];

  if(slot_in_flag == true){
    if(slot_in_time < 5000){
      slot_in_time++;
    }else{
      slot_in_time = 0;
    }
  }

  delay(50);
}
他の方が作製する際の参考になれば良いのですが…


ガシャットの個体差による認識率の問題はありますが、現時点での課題はほぼほぼ解決したので、次は音ネタ探しに移ります。
さてさて、何が良いでしょうかねぇ

その6に続きます。】

2017年8月27日日曜日

【音声改造】オリジナルガシャット作製その4 『動作確認とプログラム修正2』

土日はスケッチを弄ってました。
今回の改修箇所は、前回気付いたLED点灯間隔の改修とキメワザスロットや武器に挿入した際の挙動の改修です。

LED点灯間隔の改修

前回書いた通り、if文とカウンタを使用してループn回に1度の割合でflash_led(action)の処理をするようにしました。また、DX版のガシャットは最大22秒位点灯しているので、LEDの点灯データも25秒分に増やしました。


キメワザスロットや武器に挿入した際の挙動の改修

ガシャットを武器に挿入(①②③スイッチ同時押下)する際にガシャット挿入音~キメワザ待機音となるので、#define WEAPON_C_READY 17 で新しい処理を追加しました。

また、キメワザスロットや武器に挿入した際にガシャット挿入音が鳴るのですが、DX版のガシャットはガシャット挿入音が鳴っている約2秒の間にキメワザボタンあるいは武器のトリガーを操作しても、次の音は鳴らずにガシャット挿入音が鳴り終わるまでは次の処理を保留するので、それと同様の機構を追加しました。
この処理を流用すれば、ガシャット挿入音の再生完了後にキメワザ待機音を自動再生したり、クリティカルストライク(クリティカルフィニュッシュ)音の後にランダムで「会心の一発」音を再生させることもできそうですが、スケッチの殆どを作り直すことになり、処理も複雑になりそうなので別の機会へ持ち越しとします。


以上が今回の改修点です。
夜に作業していたため、スピーカーを接続せずにシリアルモニタで動作確認したのみですが、動作の方はいい感じに改修できていると思います。
おそらく次の土日になると思いますが、息子のゲーマドライバー等を借りて動作確認し、動作に問題なさそうであれば、現時点でのスケッチを載せてみようかと思います。

その5に続きます。】

2017年8月23日水曜日

【オリジナルガシャット】作製雑記2 『電源周りのトラブル』

オリジナルガシャット作製の際にやらかしてしまった電源周りのトラブルなどを書き残しておきます。
他の方が作製するときの参考になれば…

DFPlayerの電源はArduinoのVccから取らない

最初にブレッドボードでプロトタイピングした際、ArduinoのVccからDFPlayerの電源を取れば良いのではないかと考えて配線したのですが、うまく動いてくれませんでした。
調べたところ、ヒダカ ヒロジ様も同様の問題を経験されたらしく、過去の記事に記述があり、DFPlayerの電源はArduinoから直接取らない方が良いとのことです。
まぁ、回路図通りに作らなかった私が悪いのですが…
ちなみに、ブレッドボード用の電源モジュールから3.3Vを取った場合は正常に動いてくれました。


リチウム電池ではDFPlayerの再生が困難

スイッチサイエンスのリチウムイオン電池が売り切れだったため、ボタン電池のLR44と降圧型モジュールを組み合わせて、3.3Vでの駆動を考えていたのですが、一瞬しか再生してくれなかったり、不快なノイズ音が発生したりして、正常に動作させるのが困難でした。
何か良い方法がないか模索中です。

2017年8月20日日曜日

【音声改造】オリジナルガシャット作製その3 『動作確認とプログラム修正1』

今回はバグヴァイザー対応と武器への対応のため、スケッチを弄りました。

バグヴァイザー対応

レベル3関係のコード部分をコピー・改修してレベルX部分を追加しました。


武器への対応

まず、武器にガシャットを挿入した際の認識率の悪さに関してですが、スケッチ改修前のガシャットをゆっくりめに挿入した際に、割と認識率が高かったので、delay値を10に減らしてみました。
武器のトリガーを引くと変身音が鳴ってしまう件に関しては、武器に挿入した際にクリティカルモードのフラグが真になることを利用して、critical_mode_flag == falseの時にのみレベル2またはレベル3の処理をするように改修しました。


その他改修

DX版のガシャットは、ゲームクリア音とゲームオーバー音はランダムにどちらか一方が再生される仕様なので、ランダム再生にしてみました。
また、クリティカルフィニッシュ、クリティカルストライク時の会心の一発もランダム再生で発生するようにしてみました。


バグヴァイザー対応の動作検証

最初は音が鳴らなかったので、失敗したかと思いましたが、SDカードに音声ファイルを保存し忘れただけだったため、音声ファイル保存後は問題なく動作するようになりました。


武器対応の動作検証

スケッチ改修前は2割程度だった武器認識率が、ガシャコンブレイカーの認識率はほぼ10割、ガシャコンキースラッシャーは7~8割程度と向上しましたが、ブレイカーとスラッシャーの認識率に差が出てしまいました。
スラッシャーの右側スロットと左側スロットの刺し比べをしてみたところ、スラッシャーの右側スロットの方が認識率が悪く、左側スロットに他のガシャットを挿入している状態だと認識率が上がる謎の状況でした。
この辺りはガシャットの個体差や相性の影響もあるのかもしれません。


その他改修の動作検証

ランダム再生にしたので、動作検証にはリアルラックが必要となりましたが、問題なくランダムで再生されました。


新たな課題

前回の問題点はほぼほぼ解消したのですが、新たな課題が発生しました。
武器への認識率を向上させるため、delay値を10に減らしたのですが、LEDの点灯間隔もdelay値に影響されてしまうため、20秒間点灯するはずだったLEDが、2秒間で高速点灯するようになってしまいました。
この件に関しては、カウンタを入れれば制御できると思うので、次回対応時に挑戦してみます。

その4に続きます。】