ラベル arduino の投稿を表示しています。 すべての投稿を表示
ラベル arduino の投稿を表示しています。 すべての投稿を表示

2018年8月26日日曜日

【オリジナルガシャット】フルタマンガシャット動画公開【作製番外編5】

生存報告も兼ねた更新です。

オリジナルガシャットとは別件でサウンド編集のソフトを弄っていたのですが、マイドキュメントの中に昨年12月頃作製したオリジナルガシャット用の音声データを発見しました。

フルタマンガシャット

当時、話題になっていたフルタマン&フルタイソウで作製しましたが、元ネタがゲームではないため、作製後にそのまま放置していました。
しかし、折角作製したものを、このまま眠らせておくのももったいないので動画として公開します。
ちなみに、動画には撮っていませんが、レベル3音声はフルタイソウ第2です。

なお、この動画は動画編集の練習&YouTubeでの終了画面のテストも兼ねて公開しています。見辛い点等があったとしてもご容赦を…

2018年4月15日日曜日

【オリジナルガシャット】源平討魔伝ガシャット動画公開【作製番外編4】

さて、本筋のオリジナルガシャット作製はひと区切りつけたので、昨年の10月1日の雑記に記載のあった3案の最後のひとつを公開します。

源平討魔伝ガシャット

レベル3音声をどうするか迷っており、製作自体が保留となっています。

【音声改造】オリジナルガシャット作製その8 『ベラボーマンガシャット暫定版完成』

オリジナルガシャットの暫定版が完成しました。

アマゾンで必要な部品を購入してから約13ヶ月…途中、作製を中断していた期間もありますが、ようやく形になりました。

超絶倫人ベラボーマンガシャット

きかんしゃトーマスガシャットの作製が頓挫して以降、いろいろと迷走していましたが、自分がプレイしたことがあり、かつ音源が手に入ったゲームの中で、納得のいくレベルで作成できたものです。
心残りがあるとすれば、ゲーム名の音声が原作には無かったため、Google翻訳で無理やりゲーム名の音声を作ったことでしょうか。

発光部やラベルなどの作製しなければいけない物や、発光パターンの改良等、しなければならない事はまだまだありますが、ひと区切りつけないとこのままダラダラ弄り続けてしまうと思うので、ここで暫定完成とします。

なお、このベラボーマンガシャットに関しては今後も改良を続け、完成度が更に上がったら改めて投稿しようとは思いますが、今回の作製で培った知識や技術で色々やってみたいことが出てきたので、当面の間はそちらを優先しようと思います。

2018年3月27日火曜日

【オリジナルガシャット】作製雑記3 『DFPlayerライブラリが正常動作しない』

DFRobotDFPlayerMini版ライブラリで動作しなかった原因がなんとなく分かってきたような気がします。


ヒダカ ヒロジ様のブログで「電源の問題か繋ぎ方の問題か」とのコメントがあり、購入した製品について色々調べてみました。

購入したProMicro(Arduino Leonardo互換)の製品は、J1のソルダジャンパがオープンの場合3.3V駆動、ショートの場合5V駆動とのことで、手元の基板を確認してみたところ、J1のジャンパはオープン状態だったので3.3V駆動で間違いなさそうな感じでした。
ところが、念のため製品を購入したページを再確認してみたところ、半年程前のレビューに「3.3V表記は嘘で、VCCはJ1 open状態で5Vです。」とあり、3.3V駆動に見せかけた5V駆動の製品っぽい可能性が出てきました。

まぁ、5V駆動であるならば、5V用の対策をすれば良いだけの話なのですが、それにしても、今までのプロトタイピングは3.3V駆動前提で試作していたのに、よく動作したなぁとは思います。

2018年3月25日日曜日

【音声改造】オリジナルガシャット作製その7 『前回の不具合への対策』

今回はSGガシャットへの実装に向けて、前回の動作確認により判明した問題への対策を行いました。

スピーカー周りに接触不良がある

念のため、新しい導線で繋ぎ直してみましたが、やはりスピーカーから音は出ませんでした。
配線が原因ではないとすると、基板上に何らかの原因があると思われるのですが、その原因を調査するとなると手間がかかり過ぎるため、今回は新しいDFPlayerに交換しました。
交換後は問題なく動作するようになりました。


電源について再検討する

以前、オリジナルガシャットの電源をボタン電池で何とかしようとしていた時期に、3.3Vのステップダウンモジュールを購入していたので、それを使用してみたところ、LEDの謎の点滅現象はなくなりました。
また、AruduinoもDFPlayerも問題なく動作しました。


その他課題

スケッチのライブラリをDFRobotDFPlayerMiniに変更し、ArduinoIDEの検証ボタンを押してみたところ、mp3_set_serialやmp3_set_volume等でエラーが発生してしまいました。
ネットで原因を検索してみたところ、DFPlayer_Mini_Mp3のライブラリとはコードが異なるため、その部分も修正しないといけない様子。
そのため、そのサイトを参考にしてスケッチを修正し、エラーが出ない状態になったので、開発機に書き込んで動作確認をしてみたのですが、DFPlayerが全く反応しなくなってしまいました。
DFPlayer_Mini_Mp3版のスケッチを再度書き込んだら問題なく動作したので、DFRobotDFPlayerMini版のスケッチに何か問題があるのか、我が家の開発機との相性が良くないのか…
(参考にしたサイトにあったMP3を再生するスケッチをそのまま書き込んでも動作しなかったので、我が家の開発機との相性問題っぽい…)
いずれにせよ、対応には時間がかかりそうなので、当面の間はDFPlayer_Mini_Mp3版で行くこととします。


以上の対策を行い、SGガシャット実装用の機器で動作確認をしたところ、無事動作するようになったのですが、SGガシャット内に搭載するための作業中に失敗してしまいました。
基板画像

ガシャット内のレイアウトを調整中に配線の一部が切れてしまいました。
はんだごて等を実家に置いてきてしまったため、実家に帰った時に修理します…

その8に続きます。】

2018年3月18日日曜日

【音声改造】オリジナルガシャット作製その6 『本番用部品での検証』

今回は手持ちのArduino基板にスケッチの書き込みを行い、動作検証をしてみました。
動作検証画像


今回の動作検証で判明したこと

スピーカー周りのどこかに接触不良がある

ガシャットのスイッチを操作したところ、DFPlayerのLEDは点灯するのに音が鳴りませんでした。
試しにDACの所にイヤホンの線を接続すると音声が聞こえたので、DFPlayer自体が壊れているわけではなさそうです。


電源について再検討する

電源ユニットから3.3Vを供給して動作確認していた時には何の問題も無く動作したのですが、リチウムイオンポリマー電池で動作確認をした際に、何の操作もしていないのにLEDがずっと特定の点灯パターンを繰り返す状態になってしまいました。


その他課題

今使用しているDFPlayerのDFPlayer-Mini-mp3ライブラリは現在非推奨となっているらしいので、DFRobotDFPlayerMiniの方のライブラリに対応したスケッチを検討します。

その7に続きます。】

2018年2月12日月曜日

【オリジナルガシャット】けものガシャット(仮称)動画公開【作製番外編3】

生存報告も兼ねての更新です。

今回は、昨年の10月1日の雑記に記載した、(当時)最も音声データの作製が進んでいた案が、お蔵入り確定になったので、ブログ用としてこっそり公開します。

けものガシャット

けものガシャット(仮称)です。
当初はアプリ版を参考にして作製していたのですが、レベル2とレベル3音声の作製が難航したため、アニメ等から一部の音源を拝借しました。
そのため、ガシャットネーム音が2種類あります。

2017年12月24日日曜日

【オリジナルガシャット】レッキングクルーガシャット動画(高画質版)公開【作製番外編2】

相変わらず忙しく、オリジナルガシャットの作製になかなか時間が割けない状況ですが、前回のレッキングクルーガシャットをハンディカメラで撮り直してみました。

今回はガシャコンブレイカーの電源を入れ忘れずに撮影できたのですが、完成した動画を見た感じ、クリティカルフィニュッシュ音はあと0.2秒程度早めで良かったかもしれません。

とりあえず、レッキングクルーガシャットの製作はここで一旦中止として、次回からは別のネタの作製に入ります。

2017年11月4日土曜日

【オリジナルガシャット】レッキングクルーガシャット動画公開【作製番外編1】

オリジナルガシャットの作製は相変わらず音ネタ探しに苦労している状況です。
10月1日の雑記に少し記載しましたが、ネタ被りで保留中の案件をこのまま眠らせておくのも勿体ないので、ブログ用として公開します。

レッキングクルーガシャット

ヒダカヒロジ様のスーパーマリオガシャットとゲームは異なりますが、マリオ被りするため保留中のレッキングクルーガシャットです。
BGMの入手元は手持ちのゲームサウンドミュージアム~ファミコン編~のレッキングクルーから。
シングルサイズのCDだったため、再生環境を整えるのに苦労しました。

ネタ的にはガシャコンブレイカーのハンマーモードでクリティカルストライクを…と考えていたのですが、動画はガシャコンブレイカーの電源入れ忘れ&クリティカルストライク音の調整が不十分だったため、動画の最後の方が少し残念な結果になってしまいました。


なお、今回の動画を撮影中、DFPlayerを1個壊してしまいました。
壊れたのはSDカードスロットなので、秋月電子あたりでマイクロSDカードコネクタを買って修理してみようかとも思いましたが、送料等を考えると新しいDFPlayerを買っても大差なさそうな金額になりそうなので、壊れたDFPlayerはジャンク行きにしました。
暇なときにでも、SDカード変換アダプタと結線して修理できるか挑戦してみます。

【動画を撮り直したのでこちらもどうぞ。】

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に続きます。】

2017年8月15日火曜日

【音声改造】オリジナルガシャット作製その1 『試作と動作確認』

昨日記事にしたオリジナルガシャットの試作状況はこんな感じです。
試作状況画像
ベルト等に実際に刺してみた状況を確認するため、ガシャポン版ガシャット(フォーゼ)に犠牲となってもらいました。
以下は動作確認の結果です。


ゲーマドライバー

ガシャット抜き差し、レバー開閉に対して問題なく動作しました。


キメワザスロット

ガシャット抜き差し、キメワザ待機、クリティカルストライクいずれも問題なく動作しました。


ガシャコンブレイカー

武器のトリガーを操作すると変身音が鳴ってしまう点と、偶にガシャコンブレイカーと認識しない時がある点が問題として残りました。



ガシャコンキースラッシャー

ガシャコンブレイカーと同様の状況です。


バグルドライバー

スケッチ上でLvXに対応していないのが判明しているので今回は確認していません。


以上の結果から、バグルドライバーに対応させる改修と武器に対応させる改修を考えなければならないことが判明しました。
バグルドライバー対応はそれ程難しくない改修なのですが、武器への対応をどうするか考えないといけません。