ESP32のタッチセンサ3つでドレミファソラシまで鳴らせるピアノを作ってみた

Pocket

ESP32のタッチセンサ3つでドレミファソラシまで鳴らせるピアノを作ってみた

こんにちは!「ESP32でタッチセンサを使ってピアノを作ってみた」で3つの抵抗を使い、それぞれにドレミを当てはめて鍵盤を作りました。しかしよく考えてみると(オン、オフ)の状態を表せるタッチセンサ×3 = 8つの状態が表せるのです。
つまり前述の記事と同じ回路でドレミファソラシまで鳴らせないかという試みが本記事です。結論から言えば、できました!

実際に動いている様子

前提知識

ESP32のタッチセンサ関連の記事はこちら

今回は特に下の方のページの原理を使い、音を鳴らしてみます。
音を鳴らす方法などはESP32で圧電スピーカーを動かしてみた【wak-tech Advent Calender 2018】をご覧ください。

今回使用するbit演算ですが、「ESP32のタッチセンサ3つを使って8個の状態を表してみた」に詳しく記載しています。本記事のプログラムの詳細が知りたい方はご一読ください。

実行環境

ソフトウェア関連

  • windows10 home
  • Arduino 1.8.5
  • ESP32 core for arduino 1.0.0

使用部品

回路

  • GPIO27,14,12(それぞれT7,T6,T5)から伸びている青い線には、実際には3本の抵抗が付いています。
  • GPIO25にはただ圧電スピーカーをつなげただけ

以上のように、かなりシンプルな回路です。TOUCH7~TOUCH5までを鍵盤として使用します。このピンから適当な導体を伸ばし、手で触れる状態にしましょう。

私は動画からわかる通り、抵抗を鍵盤として使用しました。

プログラム(コピペで動きます)

#define BUZZER_PIN 25
#define BEAT 200
//音階の設定
#define C4 261.6
#define C#4 277.18
#define D4 293.665
#define D#4 311.127
#define E4 329.63
#define F4 349.228
#define F#4 369.994
#define G4 391.995
#define G#4 415.305
#define A4 440
#define A#4 466.164
#define B4 493.883
#define C5 523.251

float default_values[] = {0.0,0.0,0.0};
uint8_t pins[] = {T5,T6,T7};
float value_ratio = 1;

int i = 0;
int selected = 3; //デフォルトの音の波長を0Hz

//音再生関数
void playTone(float tone){
  ledcWriteTone(1,tone);
  delay(BEAT);
}

//タッチセンサの状況を出力
int getTouchState(){
  int state = 0;
  int base = 1;
  for(i=0;i<3;i++){
    value_ratio = touchRead(pins[i])/default_values[i];
    if(value_ratio < 0.7){
      //stateにiの状態を記入(2がonの時はbase << 2 = 0b100になる)
      state = state + (base << i);
    }
  }
  return state;
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("ESP32 piano start");
  ledcSetup(1,12000, 8);
  ledcAttachPin(BUZZER_PIN,1);

  //タッチセンサの設定
  int i = 0;
  for(i=0;i<3;i++){
    default_values[i] = touchRead(pins[i]);
    Serial.println(default_values[i]);
  }
}

void loop() {
  int state = getTouchState();
  Serial.print("state: ");
  Serial.println(state);
  switch (state){
    case 0:
      playTone(0);
      break;
    case 1:
      playTone(C4);
      break;
    case 2:
      playTone(D4);
      break;
    case 3:
      playTone(E4);
      break;
    case 4:
      playTone(F4);
      break;
    case 5:
      playTone(G4);
      break;
    case 6:
      playTone(A4);
      break;
    case 7:
      playTone(B4);
      break;
    default:
      break;
  }
}

タッチセンサの押されているピンから状態の番号を読み取り、それに従った音をswitch文で分岐して出力しています。

最後に

twitterアカウントの方で最新記事のお知らせや記事にならないような小さな情報を小出ししています。もしよろしければフォローお願いいたしますm(__)m

ご覧いただきありがとうございました!

Pocket

関連記事   ESP32でledcWrite()を使ってPWM出力をする【wak-tech Advent Calender2018】

1件のコメント

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です