音で通知する(Arduino詳解)

Arduino詳解その14です。前回の記事はこちらです。
hirocom777.hatenadiary.org

音を出してみよう

 さて、ボタンの入力はOK。時間も測れます。そして、文字の表示も出来ました。残りは音ですね。今回は以下のモジュールを使いますよ!!
www.switch-science.com

GROVEブザーモジュール

 GROVEブザーモジュールは、圧電素子(ピエゾ素子)を使用したブザーです。LEDモジュールは接続した番号のピン出力をHIGHにすることで点灯できましたが、ブザーモジュールは、この方法では音は鳴りません。

f:id:HiroCom777:20200620181648j:plain

ブザーモジュールを鳴らす方法

 それでは、どのようにすればブザーモジュールを鳴らすことが出来るのでしょうか。ブザーモジュールを鳴らすには、一定周波数の繰り返し信号を加える必要があります。ちょっと面倒くさいのですが、その代わり周波数を変更することによって音の高さを変えることが出来ます。つまり、音程を扱えるんですね。簡単なメロディーを奏でる事ができるわけです。では、早速鳴らしてみましょう。今回は、以下のようなスケッチを用意しました。

#define scaleC  262//ド
#define scaleD  294//レ
#define scaleE  330//ミ
#define scaleF  349//ファ
#define scaleG  392//ソ
#define scaleA  440//ラ
#define scaleB  494//シ
#define scaleC2  523//ド

int scale[] = {
  scaleC, scaleD, scaleE, scaleF, scaleG,  scaleA, scaleB, scaleC2
};

void setup() {
}

void loop() {
  for (int i = 0; i < 8; i++) {
    tone(8, scale[i]);
    delay(1000);
    noTone(8);
    delay(200);
  }
}

ブザーモジュールはGROVEベースシールドのD8につなげてください。また、ブザーモジュールには白いシールが貼ってあると思うのですが、使う前にはがしておいてください。書き込んで動かしてみると・・・・ブザーモジュールがドレミの音階で順番になり始めました!!以外に大きな音が出ますよ!!

スケッチの解説

 今回のスケッチはsetupの中身が空っぽですね。loopだけで動いています。配列scaleには何やら8つの数字が埋め込まれています。loopの中で、その8つの数字をforループで回して何かの処理をしています。ブザーモジュールを鳴らすには、一定周波数の繰り返し信号を加える必要がするとお話ししましたが、このスケッチではtoneという関数を使ってこの処理を実現しています。

・tone(),noTone()
 tone関数は出力ピンに指定の周波数(方形波、HIGHとLOWの比が1:1)を出力することが出来ます。以下のように記述します。

 tone(ピン番号、出力周波数(0〜255)、出力時間(単位ミリ秒、省略可能));

音の高さは周波数によって決まります。スケッチの先頭で配列にセットしていた数字は、それぞれドレミを表す周波数です。8番ピンに出力する周波数を変更することによって、ドレミを奏でていたんですね。出力時間を省略すると鳴りっぱなしになります。止めるときはnoTone関数を使います。

 noTone(ピン番号);

ですね。

音程と鳴らす長さを指定できるということは、この組み合わせを工夫すれば簡単なメロディーなら流せるということです。しかしながら、あまり音質はよくありません。実を言うと僕はこのモジュールを複数持っているのですが、個体によって音質もばらつきがあります。まぁ今回はアラームに使用するブザーということで、我慢してください(笑)

また、tone関数を使うときには、以下の注意が必要です。

・一度に出力できるピンは1つだけ
 ピン番号の設定があるので複数のブザーを一度に鳴らせるのではないかと思いますが、残念ながら一度に出力できるピンは一つだけです。他のピンにつながっているブザーを鳴らしたいときは、鳴らしているピンをnoTone関数で止めなければなりません。
・PWM出力に影響する。
 PWM(パルス幅変調)を覚えていますか?その5:GROVEベースシールド紹介!!で出てきました。PWMはArduinoUNOの3, 5, 6, 9, 10, 11番ピンで使用できるのですが、このうち3,11番ピンのPWMとは同時に使えません。内部で同じ機能を使っているようです。

すべてそろった!!

 これで全ての要素が揃いました。次回はいよいよキッチンタイマー本体のスケッチに取り組みます。
お楽しみに!!
hirocom777.hatenadiary.org


Arduino UNO入門の連載記事はコチラからどうぞ!!