>> Blog Top

ESP32でBLE MIDIパッドを作る①

Publish 2019.06.18


前回はESP32でアナログマルチプレクサを使ってみましたが、小さいブレッドボードに8つのピエゾを繋いでたので叩いて調整するには無理がありました。

というわけで、今回はちゃんと叩いて調整できるようにハードに落とし込んでみました。

それに併せてライブラリもアップデートしました。Ver.0.6になりました。
Release Update Ver. 0.6 · RyoKosaka/HelloDrum-arduino-Library · GitHub

さて、今回やったこととしては、

  1. パッドのハードウェア設計
  2. ライブラリのESP32対応
  3. ライブラリのアナログマルチプレクサ対応

です。 

1. パッドのハードウェア設計

まずはハードの設計から。あくまでコード調整用のプロトタイプなのでかなりラフですし、ボードを綺麗に収めるような設計もしてません。

ピエゾ同士が近いのでパッドとなるプレートは独立しています。配線は作りながら考えようと思ってたので側面に抜け道をたくさん作ってます。底面はなにか適当な板材を使うので固定用に至る所にネジ用穴開けてます。

では早速組み立てます。
プレートはレーザーカッターで作ったほうがいいでしょうね。ただの板なので。

底の板は余ってた段ボールで作って両面テープで固定したので穴は使いませんでした。
ピエゾ用に導線を通します。

プレートとフレームが直接ふれないようにEVAフォームを挟みます。100円ショップで売ってた3mm厚のものです。カッターで細かく切ってグルーガンでくっつけました。

同様にプレートにもEVAフォームを貼りました。

あとはピエゾを繋いで、

ピエゾをプレートの裏に貼り付けます。

これでハードは完成です。

と、思ってたのですがプレートに貼ったEVAフォームが衝撃を吸収しすぎるのか上手く振動が伝わりません。振動が伝わるほど強く叩くと他のピエゾも反応しちゃいます。困った。

というわけで、いったんプレートのEVAフォームは外してピエゾを上面にしました。
これじゃあ、ピエゾを一枚の板に貼ったほうが早かった気がします......

まぁ、とりあえずプロトタイプなんで一旦これで調整します。

2. ライブラリのESP32対応

せっかくライブラリを自作したのでESP32でも使いたいのですが、
そのままだとコンパイルできなかったので、ESP32でも使えるようにライブラリをアップデートします。

コンパイルできなかったのは、EEPROMのライブラリを使用してることが原因でした。
arduino純正EEPROMライブラリを使用しているのですが、これはAVR系じゃないと使えないようで、ESP32はまた別にEEPROMのライブラリがあるみたいです...

ライブラリ内のEEPROMに関連する部分は一旦置いといて、センシング部分だけでもESP32で使いたいところです。

初めて知ったのですが、コード内でボードを判別できるようです。
というわけで、AVR系のボードでは純正EEPROMライブラリを使用して、ESP32では使わないようにしました。

 #ifdef _AVR_ 
//AVR系の時のみ実行されるコード 
#endif 

こんな感じでincludeなどEEPROMに関連する部分全てを囲みました。
EEPROMはもちろん使えませんが、無事センシングに関してはESP32でも自作ライブラリが使えるようになりました。これをESP32対応と言っていいのか怪しいですが。

3. ライブラリのアナログマルチプレクサ対応

現状、ライブラリはこんな風に使います。
(ピエゾを1つだけarduinoのA0ピンに繋いだ場合の例) 

#include <MIDI.h>
#include <hellodrum.h>
MIDI_CREATE_DEFAULT_INSTANCE();
            
int PAD1[5] = {
    800, //sensitivity
    150, //threshold
    5,   //scan time
    10,  //mask time
    38   //note
};
            
HelloDrum pad1(0); //connect to A0 pin
            
void setup() {
    MIDI.begin();
}
            
void loop() {
    //read piezo value
    pad1.singlePiezo(PAD1[0], PAD1[1], PAD1[2], PAD1[3]);
              
    if (pad1.hit == true) {
        MIDI.sendNoteOn(PAD1[4], pad1.velocity, 10);  //(note, velocity, channel)
        MIDI.sendNoteOff(PAD1[4], 0, 10);
    }
}


できるだけ同じように使えるようにしてみました。
(74HC4051の0番ピンにピエゾを繋いだ場合の例)

#include <MIDI.h>
#include <hellodrum.h>
MIDI_CREATE_DEFAULT_INSTANCE();

int PAD1[5] = {
    800, //sensitivity
    150, //threshold
    5,   //scan time
    10,  //mask time
    38   //note
};

HelloDrumMUX mux(2,3,4,0);//D2, D3, D4, A0 : MUXのピン接続
HelloDrum pad1(0); //muxの0番pinにpad1のピエゾを繋ぐ

void setup() {
    MIDI.begin();
}

void loop() {
    //scanning all pin of mux
    mux.scan();  

    //read piezo value
    pad1.singlePiezoMUX(PAD1[0], PAD1[1], PAD1[2], PAD1[3]);
    
    if (pad1.hit == true) {
        MIDI.sendNoteOn(PAD1[4], pad1.velocity, 10);  //(note, velocity, channel);
        MIDI.sendNoteOff(PAD1[4], 0, 10);
    }
}

軽く使い方を紹介します。
新たにHelloDrumMUXというクラスを作りました。74HC4051に名前をつけてピン接続を宣言します。

HelloDrumMUX mux(2,3,4,0);//D2, D3, D4, A0 : MUXのピン接続

loop内のscanというメソッドは名前の通り74HC4051をスキャンします。

mux.scan();//scanning all pin of mux 


また、パッドのクラスに変更はありません。ただしピン番号はピエゾが繋がれている4051のピン番号を記述します。

HelloDrum pad1(0); //muxの0番pinにpad1のピエゾを繋ぐ 

そして、パッドのセンシングは既存のメソッドの末尾に"MUX"をつけるだけです。

pad1.singlePiezoMUX(PAD1[0], PAD1[1], PAD1[2], PAD1[3]);

 以上です。ほとんど以前と同じように使うことができます。

新たにサンプルコードも追加してます。

muxSensing.inoとmuxSensing_ESP32.inoというサンプルを追加しました。 

muxSensing_ESP32.inoを使った映像が以下になります。

うーん。微妙です。もっと調整が必要そうですね....

続きます。


>> Blog Top