『一番くじ ゼルダの伝説』のエフェクトーンを自作してみました

今週は先週に引き続きPolysherの記事を書くつもりだったのですが、こっちの方が面白そうかつお手軽だったので、こちらの記事から先に上げることにしました。

Twitterを見ていたら、何やら『エフェクトーン』なるものを手に入れた方々が、冷蔵庫やら引き出しやらトイレやらNintendo Switchやらに取り付けて楽しんでいるのが目に入ってきました。自分は全然知らなかったのですが、どうやら最近(2017/5/20)始まった『一番くじ ゼルダの伝説』の景品なのだそう。

自分もとても欲しくなったのですが、当然「くじ」なので、狙って手に入れるのは少し骨が折れそうです。ということで、手元にある具材で自作してみることにしました。

仕組みは見た目に単純で、要するにリードスイッチを磁石でON/OFFさせて、それに合わせて音を再生すればよさそうです。せっかくなので、謎解き音バージョンとアイテムゲットバージョンを切り替えられるようにしましょう。それから、設置場所の自由度は小さくなってしまいますが、気兼ねなく使えるように、USB給電で動作するようにします。

 

今回使った具材はこちら。

今回の工作はとても単純なものなので、別にProではなくて通常のTrinketでもおそらく大丈夫です。残念ながら、自分の持っていたTrinketが壊れてしまったのか、全くプログラムの書き込みができなくなってしまっていたので、余っていたTrinket Proを使いました。

Trinketシリーズは「USB給電可能かつ低価格」という面では魅力的なのですが、プログラムの書き込みが面倒というか、トラブルが起こりがちなので、素直に本家Arduinoシリーズを使うという手もあります。私は使ったことがありませんが、USB給電に拘るならArduino Microという手もあるかもしれませんし、バッテリーや電池で動かすつもりならArduino Pro Miniもありかもしれません。

それからもう、自分の工作では多用し過ぎなぐらい多用しているMP3プレイヤーのDFPlayer Mini。利用方法については、こちらをご参照ください。

このモジュール、安いし小型だしでとても便利なのですが、やはり安かろう悪かろうという面もあって、たまにウンともスンとも動かないものに出くわしてしまう場合があります。元々気難しいモジュールということもあって、接続が悪いのか元々壊れているのかの判断が難しいので、できればこれを使うときは複数個まとめ買いしておくことをオススメします。

上記のMP3プレイヤーは別途Micro SDカードが必要になりますが、今回は高々二つの小さなMP3データを再生するだけなので、小容量・低速のSDカードで問題ありません。

それから、MP3プレイヤーには別途スピーカーを配線する必要がありますが、これはもう、何でも良いです。自分は二個100円で安売りしていたものを使いましたが、食玩とかの中に入っているスピーカーを取り出して繋いでもOKです。

それから、土台となるブレッドボード。両サイドの電源用の部分を取り外せば、結構コンパクトになります。

あと、今回の工作はリードスイッチの取り扱いがキモですが、リードスイッチは秋月が販売しているこのあたりのケース入りが使いやすいと思います。リードスイッチ本体はもっと小さいですが、ガラス菅のようなもので、結構脆くて簡単に壊れてしまうので。

それから、ついでに音声切り替え用のタクトスイッチと、後は適当にブレッドボードに直接挿せるタイプのビニル電線とかピンヘッダが少量あれば、ハード側の具材はOKです。

 

次にソフト側の具材、いわゆるコンテンツですが、『謎解き音』と『アイテムゲット音』のMP3ファイルが必要になります。これについては、自分は『ゼルダの伝説 神々のトライフォース2』のサウンドセレクション(←クラブニンテンドーのポイント交換景品)に収録されていた音声をiTunesでMP3に変換して使っています。音源がない場合は、ゲーム機で実際に鳴っている音をスマホで録音したものを使ってもそこそこ良い感じになります。実際、前に作ったスマブラガシャットの音声も、そうやって作っているものが多いです。

音源が用意できたら、SDカードのトップのフォルダに”mp3″という名前のフォルダを作って、その中に”0001_riddle.mp3″, “0002_item.mp3″のような名前にしたファイルを用意しておけば準備OKです。

 

それでは組み上げていきます。配線はこんな感じです。

th_effectone-4

とてもシンプルです。注意点としては、Trinket Proのソースコード(後述)でソフトウェシリアルとして設定したRxとTxを、DF Player MiniのそれぞれTxとRxに接続すること(Rx<->Tx, Tx<->Rx)。それから、DFPlayerのVccには、Trinket Proの3VではなくBUSの方から接続すること。この二点ぐらいです。

スピーカーとリードスイッチは両面テープでブレッドボードに貼り付けています。

ソースコードは以下です。

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

#define MODE_CORRECT_RIDDLE 1
#define MODE_ITEM_GET       2
#define MODE_PIN 8
#define OPEN_CLOSE_PIN 5
SoftwareSerial mySerial(3,4); // RX, TX

void setup () {
  Serial.begin(9600); 

  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module 
  mp3_set_volume (16);

  pinMode(MODE_PIN, INPUT_PULLUP);
  pinMode(OPEN_CLOSE_PIN, INPUT_PULLUP);
}

uint8_t last_mode_state   = HIGH;
uint8_t last_on_off_state = HIGH;
uint8_t mode_state        = HIGH;
uint8_t on_off_state      = HIGH;

uint8_t current_mode = MODE_CORRECT_RIDDLE;

void loop () {        
  mode_state = digitalRead(MODE_PIN);
  if(last_mode_state == HIGH && mode_state == LOW){
    // モード変更ボタンが押されたとき
    Serial.println("Mode Change.");
    if(current_mode == MODE_CORRECT_RIDDLE){
      current_mode = MODE_ITEM_GET;
    }else{
      current_mode = MODE_CORRECT_RIDDLE;
    }
  }
  last_mode_state = mode_state;

  on_off_state = digitalRead(OPEN_CLOSE_PIN);
  if(last_on_off_state == LOW && on_off_state == HIGH){
    // 開いたとき
    Serial.println("Open.");
    mp3_play(current_mode);
  }
  last_on_off_state = on_off_state;

  delay(20);
}

超シンプルですね。スマブラガシャットと比べると1/20以下のコード量です。

 

実際に動かしてみると、こんな感じになります。

 

うん、うまく動いてくれていますね。

 

さて、上の写真と動画では、リードスイッチのケースをブレッドボードの側面に直付していますが、別にこれはこの部分にある必要はなく、必要に応じていくらでも伸ばすことができます。

 

というわけで。

 

th_effectone-2

リードスイッチを右側の長いものと交換しまして。

 

th_effectone-3

Nintendo Switchの裏側に取り付けると。。。。

 

なんだか思っていた以上に良い感じになりました。しかも都合の良いことに、Nintendo SwitchのドックにはUSBケーブルが挿さるようになっているので、電池切れを心配することなく、いつでもNintendo Switchというお宝を効果音付きでゲットすることができます。

 

ということで、エフェクトーンを自作してみました。思えば似たような工作は過去にやっているのですが、小さな宝箱を作っただけの話で、「取り付ければどんなものでも謎解きやアイテムゲットの対象にできるようなものを作る」という発想には当時至れませんでした。うーん、悔しいなあ。