ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【M5StickC Plus/Arduino】PIR Hat(人感センサ)に連動して音を出す

 以前の記事で人感センサのサンプルを動かしました。

 その最後で「人が来たら音を鳴らすおもちゃ」ができそうと書いたので今回はそれを作ってみた次第です。


 では、始めます。


1:M5StickC Plusで音を鳴らす
 M5StickC Plusではブザーが内蔵されているのでライブラリを使用することで簡単に音を鳴らすことができます。
 過去の記事でさらっと音を鳴らすコードを書いていたことはありましたが、自分の中でも整理するためにM5StickC Plusで音を出す方法をまとめます。

 音を鳴らす書き方は基本的には以下の通りです。

#include <M5StickCPlus.h>

void setup() {
  M5.begin();
  M5.Beep.setBeep(4000, 1000); // 初期値:音の高さ(Hz), 鳴動時間(ms)
}

void loop() {
  M5.update();
  M5.Beep.update();

  if (M5.BtnA.wasPressed()) {
    // 初期値の音を鳴らす
    M5.Beep.beep();
  } else if (M5.BtnB.wasPressed()) {
    // 一時的に設定した音を鳴らす
    M5.Beep.tone(2136, 500); // 音の高さ(Hz), 鳴動時間(ms)
  }
}

「M5.Beep.setBeep(4000, 1000);」のところでビープ音として鳴らす音の周波数と長さの初期値を設定し「M5.Beep.beep();」で初期値の音を開始します。loop内の「M5.Beep.update();」で音の鳴動時間を検知して音が止まります。
「M5.Beep.tone」で設定した音は一時的にその音と鳴動時間だけ鳴らします。M5.Beep.toneで音を鳴らした後に「M5.Beep.beep();」で音を鳴らすと初期値の音が開始されます。

 また今回は音を開始した後に「M5.Beep.update();」で鳴動時間を管理していますが、例えば関数内で順番に複数の音を鳴らしたい場合は「M5.Beep.update();」で管理できないので、適切にdelayを入れてやる必要があります。

 これで大体M5StickC Plusで音を鳴らす方法がわかったので、実際に人感センサに合わせて音を鳴らしてみます。


2:人感センサに連動して音を出すサンプル
 PIR HATのサンプルコードを少し改造してみたのが以下のものになります。

・M5StickCPlus_pir_buzzer.ino

#include <M5StickCPlus.h>

#define BEAT    150 // 一つの音を鳴らす時間(ms)
#define PIR_PIN 36  // PIR_HATのピン番号

bool pinFlg = false;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0, 4);
  M5.Lcd.println("PIR STATUS");
  pinMode(PIR_PIN, INPUT_PULLUP);
}

void loop() {
  M5.update();
  M5.Beep.update();

  bool result = digitalRead(PIR_PIN);

  M5.Lcd.setCursor(110, 55, 6);
  M5.Lcd.println(result);

  if (!pinFlg && result) {
    // LOW -> HIGH
    callZeldaSound();
  }

  pinFlg = result;
}

// ゼルダの謎解き音
void callZeldaSound() {
  M5.Beep.tone(3136, BEAT); // ソ
  delay(BEAT);
  M5.Beep.tone(2960, BEAT); // ♯ファ
  delay(BEAT);
  M5.Beep.tone(2489, BEAT); // ♯レ
  delay(BEAT);
  M5.Beep.tone(1760, BEAT); // ラ
  delay(BEAT);
  M5.Beep.tone(1661, BEAT); // ♯ソ
  delay(BEAT);
  M5.Beep.tone(2637, BEAT); // ミ
  delay(BEAT);
  M5.Beep.tone(3322, BEAT); // ♯ソ
  delay(BEAT);
  M5.Beep.tone(4186, BEAT); // ド
  delay(BEAT);
}

 PIR HATを取り付けた状態で書き込むと、PIR STATUSの画面の値が0→1に変化した時だけ音が鳴るようになります。


 以上がM5StickC PlusでPIR Hat(人感センサ)に連動して音を出す方法になります。

 今回は簡単に内蔵のブザーを鳴らしましたが、MP3などのファイルを再生できるようにすれば人が来た時に「コンニチワ」みたいな挨拶をするような何かも作れそうですね。


・参考資料