はじめに
M5Stackでちょっとした開発をするときに動作確認やアラーム(警告音)として「ビー」とか「ブー」とかいったビープを鳴らしたい場合がある。
しかし、M5Stackの作法を知らないと大音量になったり、ビープ音が止まらないというワナにはまる。
自分も実際そのワナにはまり、ネットを検索すれば多くの人が同じワナにはまり、そしていろいろな説明や実装方法を記載している。
ちゃんとした実装をするには正しく動きを理解する時間や手間をかける必要があるが、時間がない場合やとりあえずビープ音を鳴らしたい場合に使える方法を記載する。
環境
Windows PC:Windows 10 Pro 64bit (1909)
Arduino IDE:V1.8.13
M5Stackプラットフォーム:バージョン 1.0.6
M5Stackライブラリ:バージョン 0.3.1
1. setup()内で簡易的にビープ音を鳴らす
#include <M5Stack.h>
void setup() {
M5.begin();
M5.Power.begin();
M5.Speaker.begin(); // 呼ぶとノイズ(ポップ音)が出る時がある
M5.Speaker.setVolume(1); // 0は無音、1が最小、8が初期値(結構大きい)
M5.Speaker.beep(); // ビープ開始
delay(100); // 100ms待つ(beep()のデフォルト)
M5.Speaker.mute(); // ビープ停止
}
void loop(){
:
(ループ処理)
:
}
ポイントはM5.Speaker.beep()
があくまでビープを開始するだけで、ビープを終了させるには別途処理(M5.Speaker.mute()
、等)が必要というところ。
2. loop()内で簡易的にビープ音を鳴らす
#include <M5Stack.h>
void setup() {
M5.begin();
M5.Power.begin();
M5.Speaker.begin(); // ノイズ(ポップ音)が出る時がある
M5.Speaker.setVolume(1); // 0は無音、1が最小、8が初期値(結構大きい)
}
void loop(){
:
(ループ内処理)
:
M5.Speaker.beep(); // ビープ開始
delay(100); // 100ms待つ(beep()のデフォルト)
M5.Speaker.mute(); // ビープ停止
:
(ループ内処理)
:
delay(1000); // 1秒間待つ(1秒+α毎にビープ音が鳴る)
}
loop()
内の場合はsetup()
内とちょっと違い、M5.Speaker.mute()
の代わりにM5.update()
が実行されていればタイミング次第でビープは停止する。(M5.update()
が内部でM5.Speaker.update()
を実行し、さらにM5.Speaker.update()
が内部でM5.Speaker.mute()
を実行する)
ただし、ビープの鳴らす時間(デフォルト100ms)より前にM5.Update()
が実行されてしまえばM5.Update()
は無効になり、M5.Update()
が実行されるまで処理に時間がかかる場合その間ビープ音は止まらないので注意。
最後に(注意事項含む)
細かい内部の動きの説明や正しい実装は他の多くの方がいろいろな説明をしているのでそちらを参照して欲しい。
なお、M5Stackでビープのテストを行う場合は大音量で音が止まらない状況になる可能性があるので以下の点に注意。
- バッテリーは外しておく(可能であれば)
- スケッチを書き込んでM5Stackのリセットがかかった瞬間に大音量の音が鳴り続ける場合があるので、すぐにUSBケーブルを抜ける準備をしておく。バッテリーが付いている状態だと、USBケーブルを抜いて電源ボタンを2度押しして電源も落とす必要がある。
- 上記を反射的に行える心の準備をしておく