M5Stack

【M5Stack】本体に搭載されているスピーカーの使い方を分かりやすく解説!

m5stack-speaker.png

<この記事について>

  • 「M5Stackの本体スピーカーを使う方法がよく分からない…」と悩んでいる人のために書きました。
  • この記事を読むことで、M5Stackの本体スピーカーを制御する方法が分かります。
  • 結論としては、何かライブラリをインストールしたり特別な設定することなく、プログラムを書いて実行するだけでOKです。

こんにちは!こんばんは!

ちゃとらです(・ω・)/

今回はM5Stackのスピーカーについて簡単に解説していきます。これもM5Stackのほぼ基本ですね。

スピーカー制御はM5Stackのかなり効果的なエフェクトとなります。また、作るのが大変ですが電子音で音楽を鳴らすことも可能です。

ちゃとら

M5Stackの本体スピーカーを制御する方法について分かりやすく解説していきます!

今回扱うM5Stack

M5Stackの種類M5Stack FIRE(V2.6)
値段49.90ドル(税別)
(販売価格は7700円程 投稿日現在)
生産国中国
サイズ5.4 x 5.4 x 3.05 cm

今回もいつものようにM5Stack FIREを使っていきます。7700円程の値段です。

M5Stackの内蔵スピーカーは他のどのM5Stackにも搭載されています。M5Stackの派生品は分かりませんが…

具体的にどんな種類かは分かりませんが、出力が1Wのスピーカーが搭載されています。

スピーカーについて

スピーカーの場所やスピーカーを制御するための関数について解説していきます。

スピーカーのある場所

スピーカーの画像その1
スピーカーの画像その2

左の図からスピーカーの穴はM5Stackの左側にあります。

また、右の図から分かるようにM5Stack内部の端にある黒い電子機器がスピーカー本体です。

スピーカーを実際に使用すると分かるのですが、スピーカーの音量を低めに設定しないとかなり大きな音が出てしまうんですよね…

スピーカーを制御する関数

スピーカーを制御する関数について、ここでは代表的な関数を6つ紹介していきます。

スピーカー制御関数説明
M5.Speaker.begin();スピーカーを初期化。
M5.Speaker.end();スピーカーの再生を停止。
M5.Speaker.beep();ビープ音を鳴らす。引数の設定はできない。
M5.Speaker.tone(261.626, 200);周波数261.626Hz(ド4)の音を0.2秒間鳴らす。時間の引数は省略可能。
M5.Speaker.mute();スピーカーで鳴らしている音をミュートする。
M5.Speaker.setVolume(1);スピーカーの音量を1に設定。0(最小)~10(最大)の範囲内で音量の設定が可能。

音を鳴らす関数はbeep()とtone()ですが、beep()だと「ピッ」という音しか鳴らすことができません。なので、様々な音を鳴らすにはtone()を使います。

他にもスピーカーを制御する関数はありますが、だいたいメインとして使うのはこの6つぐらいです。

使い方

本体スピーカーを制御するために何かインストールしたり、特別な設定は必要ないです。

ここでは、M5Stackのセットアップ(Arduino IDE)は完了していること前提で解説していきます。

ちゃとら

M5Stackのセットアップ(Arduino IDE)がまだ完了していない人は以下の記事を参考にしてください!

m5stack-setup-arduino.png
【M5Stack】M5Stackのセットアップ(Arduino)を分かりやすく解説!【Arduino IDE】この記事では、M5Stackのセットアップ(Arduino IDE)について解説しています。手順としては、「USBドライバをインストール」→「ボードマネージャをインストール」→「ライブラリをインストール」→「プログラムを書いて実行」となっています。...

サンプルコード

サンプルコードとして、押したボタンによってビープ音,1オクターブ,きらきら星を鳴らすプログラムを作成してみました!

スピーカーを制御する関数は、beep(),tone(),mute()などを使っています。

#include <M5Stack.h>

// 1オクターブ分それぞれの周波数
#define C4  261.626
#define D4  293.665
#define E4  329.628
#define F4  349.228
#define G4  391.995
#define A4  440.000
#define B4  493.883
#define C5  523.251

// 音符を出力する時間(音符の長さ)
#define tm1 400
#define tm2 650

// 1オクターブの音階と配列のサイズ
float oneOctave[8] = {C4, D4, E4, F4, G4, A4, B4, C5};
int arraySize1 = 8;

// きらきら星の音階と配列のサイズ
float Kirakiraboshi[42] =
{
  C4, C4, G4, G4, A4, A4, G4, F4, F4, E4, E4, D4, D4, C4,
  G4, G4, F4, F4, E4, E4, D4, G4, G4, F4, F4, E4, E4, D4,
  C4, C4, G4, G4, A4, A4, G4, F4, F4, E4, E4, D4, D4, C4,
};
int arraySize2 = 42;

void setup() 
{
  M5.begin();

  // スピーカーの初期化
  M5.Speaker.begin();
  // スピーカーの音量を1に設定
  M5.Speaker.setVolume(1);
  
  M5.Lcd.setTextSize(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 60);
  M5.Lcd.print("Select a button and press!");

  M5.Lcd.setTextSize(7);
  M5.Lcd.setCursor(50, 180);
  M5.Lcd.print("A");
  M5.Lcd.setCursor(145, 180);
  M5.Lcd.print("B");
  M5.Lcd.setCursor(235, 180);
  M5.Lcd.print("C");
}

void loop() 
{
  // 各ボタンとスピーカーの状態を更新
  M5.update();

  // Aボタンを押すとビープ音を鳴らす
  if(M5.BtnA.wasPressed())
  {
    M5.Lcd.setTextSize(3);
    M5.Lcd.fillScreen(RED);
    M5.Lcd.setCursor(60, 100);
    M5.Lcd.print("Play a beep");
    M5.Speaker.beep();
  }
  // Bボタンを押すと1オクターブの音を鳴らす
  else if(M5.BtnB.wasPressed())
  {
    M5.Lcd.setTextSize(3);
    M5.Lcd.fillScreen(BLUE);
    M5.Lcd.setCursor(30, 100);
    M5.Lcd.print("Play one octave");
    for(int i = 0; i < arraySize1; i++)
    {
      M5.Speaker.tone(oneOctave[i]);
      delay(tm1);
    }
    M5.Speaker.mute();
  }
  // Cボタンを押すときらきら星を鳴らす
  else if(M5.BtnC.wasPressed())
  {
    M5.Lcd.setTextSize(3);
    M5.Lcd.fillScreen(GREEN);
    M5.Lcd.setCursor(40, 100);
    M5.Lcd.print("Play the music");
    int count = 1;
    for(int i = 0; i < arraySize2; i++)
    {
      M5.Speaker.tone(Kirakiraboshi[i]);
      if(count / 7 == 1) 
      {
        delay(tm2);
        count = 0;
      }
      else
      {
        delay(tm1);
      }
      count++;
    }
    M5.Speaker.mute();
  }
}

56行目のupdate()ではループが始まる度に各ボタンとスピーカーの状態を更新しています。この処理が無いと音が鳴り続けてしまうなどの問題が発生してしまうので、必須の処理となります。

74行目から78行目では1オクターブの音を先頭から0.4秒間ずつ鳴らしています。

88行目から102行目ではきらきら星の音を先頭から鳴らしていますが、7の倍数番目の音は0.65秒、それ以外の音は0.4秒の長さで鳴らしています。

ボタンについては以下の記事を参考にしてください。

m5stack-button.png
【M5Stack】本体に実装されているボタンの使い方を分かりやすく解説!この記事では、M5Stackのボタンを使う方法について解説しています。特に何かを設定する必要ありませんが、プログラムにupdate()とボタンを制御する関数を記述することが必須となります。...

プログラムを作成できたら、シリアルポートとボードの設定を忘れずに行いましょう。

「ツール」→「シリアルポート」でM5Stackが接続されているポート番号を選び、
「ツール」→「ボード」→「ESP32 Arduino」で「M5Stack-Core-ESP32」を選びましょう。

それぞれ設定ができたら、M5Stackにプログラムを書き込みます。

こんな感じでボタンを押すと音が鳴ります。

音量の設定は1か2がベストです。0は無音ですし3以上になるとかなり大きな音になってしまいます…。必ず音量の設定はプログラムに記述しておきましょう。

電子音なのでちょっと癖がある音です。8bit調のサウンドなら相性がいいかもしれません。

ちゃとら

音楽に精通している人ならもっと本格的な音楽を鳴らすことができるかも!

まとめ

M5Stackの本体スピーカーについて

  1. M5Stackの右側にスピーカーが搭載されている。スピーカーを制御する主な関数としては、beep()やtone()などがある。
  2. 何かをインストールしたり、特別な設定は必要ないが、プログラム内にupdate()を入れてスピーカーの状態を更新する必要がある。
ちゃとら

スピーカー制御はM5Stackにいいインパクト・エフェクトを添えることができます!

今回はここまでです。

ちゃとら(・ω・)/