ESP32で電子ピアノ風楽器を作ってみた

 皆さんこんにちは。最近電子工作オタクになり始めているロクです。

 今回は、手元で手軽に曲を演奏できる楽器を作りたいなと思ったので、めちゃくちゃ簡単にそれっぽいものを作ってみようかと思います。

 イメージは、どこにでも持ち運べて、車の中でも草原の中でも家のリビングでも演奏できる小型電子ピアノです。

 それではどうぞお付き合いください。

作るものの機能について

 僕が今回作ろうと思う工作の大まかな機能については、以下のようになります。

  • 7つのボタンでドレミファソラシを指定する
  • +2つのボタンでオクターブを指定する
  • さらにほかの1つのボタンで半音上げる(♯)かどうかの指定をする
  • 圧電スピーカーで指定された音を出す

 これさえ押さえておけば、これから実際に作っていく過程は流し見してくださって結構です。

使う部品・材料・道具

 【使う部品・材料↓】

  • 基板
  • タクトスイッチ(小)×7個
  • タクトスイッチ(大)×3個
  • 抵抗(2.2Ω)×10個
  • トグルスイッチ×1
  • メスの単列ピンヘッダ 18ピン分×2個
  • 圧電スピーカー×1個
  • ESP32
  • ボタン電池1.5V×3個
  • 導線、はんだ

 【使う道具↓】

  • はんだごて
  • ニッパ
  • ラジオペンチ
  • ピンセット

 下の画像が部品一覧になります。

圧電スピーカー

 ここで、赤のLEDと青色の抵抗が写っていますが、今回使わないので考えなくていいです。また、ここには写っていませんが、1.5Vのボタン電池を3個用意します。

電子ピアノの回路図

 下の画像が、僕が簡単に作った回路図になります。

 スイッチが下側に7個、上側に3個あり、スピーカーが中央右あたりにあります。

 スピーカーは、+側を33番ピンに接続するようにしてください。

 今回、電源として1.5ボルトのボタン電池を三つ直列で接続しようと思います。

実際にはんだ付けをしてみる

 さっそく回路図通りに基板に部品や導線をはんだ付けしていきます。

 回路図は、完成品を上から見たものになるので、実際に回路を組むときは、左右反転させて作っていく必要があります。

 2~3時間くらいかけて何とか完成させたものがこちらになります。

 また、基板を裏から見たものがこちらになります。

 「メスのピンヘッダ、下の方がなんか足りてない・・・?」と思った方、見逃してください!まあいろいろと事情があるんですが、別に今回はなくても困らないからいいやと思ってしまいました。(^^;

ESP32にプログラムを組んでいく

 ここからは、実際にESP32というマイコンのほうにプログラムを組んで、動かしていこうと思います。利用する環境はarduinoIDEです。

 ただ、ESP32でarduinoIDEを使う場合は、初期設定が必要になりますので、都合に合わせて以下の記事を読んでいただくといいかと思います。

プログラムの概要

 今回作成したプログラムは、以下のようになります。

float data1[]={261.626,293.665,329.628,349.228,391.995,440,493.883};
float data2[]={277.183,311.127,0,369.994,415.305,466.164,0};
bool onkai[]={false,false,false,false,false,false,false};
bool option[]={false,false,false};//1音程左、2音程右、3シャープ
bool onoff=false;
int staytime=0;
int times=0;
char buttons[]={0,4,16,17,5,19,18,12,14,27};
void inputbutton();
void timeset();
void setup() {
  // put your setup code here, to run once:
  for(int i=0;i<10;i++)
  {
   // pinMode(buttons[i],INPUT);
  }
  pinMode(33,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
 if(staytime!=0)
  {
    if(onoff==false)
    {
      //スピーカーオン
      onoff=true;
      digitalWrite(33,HIGH);
    }
    else
    {
      //スピーカーオフ
      onoff=false;
      digitalWrite(33,LOW);
    }
    delayMicroseconds(staytime);
    times+=staytime;
    if(times>=10000)
    {
      times=0;
      inputbutton();
      timeset();
    }
  }
  else
  {
    delay(10);
    inputbutton();
    timeset();
  }
}
void inputbutton()
{
  for(int i=0;i<7;i++)
  {
    if(digitalRead(buttons[i])==true)
    {
      onkai[i]=true;
    }
    else
    {
      onkai[i]=false;
    }
  }
  for(int i=7;i<10;i++)
  {
    if(digitalRead(buttons[i])==true)
    {
      option[i-7]=true;
    }
    else
    {
      option[i-7]=false;
    }
  }
}

void timeset()
{
  for(int i=0;i<7;i++)
  {
    if(onkai[i]==true)
    {
      float heltz=0;
      if(i!=2&&i!=6&&option[2]==true)
      {
        heltz=data2[i];
      }
      else
      {
        heltz=data1[i];
      }
      char onkainum=(char)option[0]*2+(char)option[1];
      int heltz2;
      if(onkainum!=0)
      {
        heltz2=(int)(heltz*1000)<<(onkainum-1);
      }
      else
      {
        heltz2=(int)(heltz*1000)>>1;
      }
      staytime=1000000000/((heltz2)*2);
      return;
    }else
    {
      staytime=0;
    }
  }
}

 プログラムの細かい説明やそれぞれの変数についての説明は、かなりややこしいので省略します。ただ、このプログラムを使用したい場合は個人的な利用目的に限りご自由にお使いください。

 説明を省略するとはいえ、プログラムだけをポンとおいていくのはあまりにも雑なので、大まかな雰囲気だけでも説明しようと思います。

  1. setup()で入力の設定とスピーカ用の出力の設定を行う
  2. 関数inputbutton()を実行すると、どのスイッチが押されているかを判定し、配列に記憶する
  3. 関数timeset()を実行すると、スピーカーをon/offする間隔を、押されたスイッチに基づいて求める
  4. loop()内で、条件に従ってスピーカー(33番ピン)をon/offさせる。何のスイッチも押されていないときはon/offを止めるようにする

 スピーカーというのは、出したい音の音程や音色の周波数に則って、電気を流したり流さなかったりすることにより、出したい音の通りの振動がスピーカー内部の膜に発生することで、音を再現するという仕組みなんですよね~。

 ただ、今回の場合、単純にon/offしかしないため、音程は表現できても、音色は矩形波(くけいは)の一種類しか表現できません!(矩形波は、ファミコンの音-ピコピコ音-なんかで使われています)

 実際に様々な音色を表現したい場合は、アナログ出力で細かく波形を再現する必要があります。興味がある方はぜひ調べてみてください。

ボタン電池を設置する

 仕上げに、電源用のボタン電池をセットします。

 僕の場合、下のように加工して設置することにしました。

 ・・・なんか不格好。

 とにかく、こんな感じで設置できたらOK。

 では、実際にESP32ご本体を組み込んでみます。

 おおー!なかなかものになっていますね!

実際に音を鳴らしてみる

 作ってさっそく試しに鳴らしてみました。

 ここで、起動の方法ですが、トグルスイッチをオンにするときに、ドの音のスイッチを押している状態にしましょう。

 理由については、ESP32の0番ピン(ドの音のスイッチに接続)の初期設定がPULL UP(スイッチを離している状態でON)となっているため、スイッチを押すことで、ドのスイッチをOFFにした状態で起動できるようにするためです。

 実際に起動して鳴らしてみると、しっかりドレミファソラシド一つ一つを鳴らすことができました。

 さらには、4オクターブ分の音の幅も鳴らし分けることができ、シャープも機能していました。大成功です!

問題発生?

 大成功・・・と思いきや、、しばらく鳴らして遊んでいましたら、途中で音が一切でなくなるという問題が発生しました。

 いったんリセットするとまた出るようになるのですが、しばらくするとまたでなくなります。

 そこでいったん、ESPをパソコンとつないで、USBをつかって給電する方式で試してみました。すると、今度は問題なく演奏を続けることができました。

 問題の原因を考えると、ボタン電池3つだけでは4.5Vしか給電できないうえ、使い続けることで電圧が下がり、ESP32を動作させるために最低限必要な電圧、電流を満たさなくなったために上のような問題が起こったのだと考えられます。

 この問題を解決する方法としては、

 あきらめてPCとマイコンをつないで使うか、

 基板上に昇圧型の5VDC/DCコンバータの回路を設置するか

 のどちらかになりそうですね。今のところ、DC/DCコンバータを設置する方が持ち運びができるので魅力的です。

気を取り直して演奏してみる

 そ、それでは実際に、PCとマイコンをつないだバージョンで、今回つくった電子ピアノを鳴らしてみたいと思います。下の動画が一通りの機能を紹介するデモ動画です。

 そして、下の動画が、途中までしかわからないけど弾いてみた「3分クッキングのあの曲」です。

 だいぶボロボロな演奏です。まだまだ練習が必要です。今はこれが限界です。自分の中ではうまくいった方だと思っています。

 ご視聴ありがとうございました。

最後に

 今回の工作はこんな感じになりましたが、DC/DCコンバータ回路を作ったら、本格的にどこでも使える電子ピアノが作れそうです。

 もしそこまで完成したら、どこかの丘に弾きに行こうかな~。

電気工作

Posted by ロク