今回はキッチンタイマーのスケッチにアラーム音を追加します。
音程と周波数
前回の記事では、digitalWrite命令とdelayMicroseconds命令を使って、ずいぶんと面倒なプログラミングをしました。
電子工作では、時間の計算をすることがよくあります。それも、1秒、2秒といったものから、ミリ秒、マイクロ秒まで広い範囲の時間を扱います。面倒なプログラミングですが、この計算を通してミリ、マイクロの扱い方にぜひ慣れておくようにしてください。
ところで、Arduinoでは音を出す命令が用意されているんです。実際のキッチンタイマーのアラーム音はこの音を出す命令を使って実装します。
この音を出す命令を習得する前に、新しい言葉を覚えておきましょう。
前回の記事で、スピーカーが1秒間に262回振動すると「ド」の音が出ることを説明しました。この「1秒間に振動する回数」のことを「周波数」(しゅうはすう)と呼んでいます。単位は「Hz」(ヘルツ)です。
「ド」の音は1秒間に262回振動しますので、「ド」の周波数は「262Hz」ということになります。
ところで世の中には色々な単位がありますが、原則としてアルファベットの大文字、または大文字で始まっている単位は人名からきたものという決まりがあります。
例えば電圧の単位の「V」(ボルト)は、電池を発明したアレッサンドロ・ボルタが由来です。そのためボルトの単位は小文字の「v」ではなく大文字の「V」になっています。また、電流の単位の「A」(アンペア)は電気と磁石の関係を明らかにしたアンドレ=マリ・アンペールが由来です。「Hz」は電波に関係する学問で大きな貢献をしたハインリヒ・ヘルツが由来です。
一方で長さの単位の「m」(メートル)はギリシャ語の「測ること」を意味する「メトロン」という言葉が由来です。このように人の名前が由来ではない場合はアルファベットの小文字を使います。
ところで、力の大きさを表す単位は「N」です。大文字なので誰かの名前なのですが、誰だかわかりますでしょうか。おそらく誰でも一度は聞いたことのある有名な人物です。
音程は周波数、ということがわかりましたので、各音程の周波数をまとめておきます。3オクターブ分の音程を以下の表にまとめます。あとでアラーム音をカスタマイズしますので、その時に見返してみてください。また、正確な周波数は少数ですが、以下の数値は少数第一位で四捨五入しています。
音程 | 周波数 |
---|---|
1オクターブ低い | |
ド | 131 |
ド# | 139 |
レ | 147 |
レ# | 156 |
ミ | 165 |
ファ | 175 |
ファ# | 185 |
ソ | 196 |
ソ# | 208 |
ラ | 220 |
ラ# | 233 |
シ | 247 |
標準オクターブ | |
ド | 262 |
ド# | 277 |
レ | 294 |
レ# | 311 |
ミ | 330 |
ファ | 349 |
ファ# | 370 |
ソ | 392 |
ソ# | 415 |
ラ | 440 |
ラ# | 466 |
シ | 494 |
1オクターブ高い | |
ド | 523 |
ド# | 554 |
レ | 587 |
レ# | 622 |
ミ | 659 |
ファ | 698 |
ファ# | 740 |
ソ | 784 |
ソ# | 831 |
ラ | 880 |
ラ# | 932 |
シ | 988 |
音を出す命令
Arduinoの音を出す命令を確認しましょう。
最初は音を出す命令です。
tone命令は、パラメータに端子番号と周波数を指定します。この命令を実行すると指定した周波数になるように指定した端子の電圧を前回の記事ように制御します。
ところで、tone命令を実行すると音がずっと鳴ったままになります。音を止めるには以下の命令を使用します。
例えば、「ド」の音を1秒間鳴らしたい場合は以下のようにスケッチを作成すればOKです。
tone(18, 262);
delay(1000);
noTone(18);
これでアラーム音が簡単に鳴らせそうです!
アラーム音を追加する
それではキッチンタイマーのスケッチにアラーム音を追加しましょう。
アラーム音はどのようなものにするか悩ましいところですが、まずは「ピピピーッ」という音にしてみます。音程は、、、そうですね、、、1オクターブ高い「ラ」の音にしてみます。
アラーム音の鳴らし方ですが、なかなか時間調整が難しいところですがまずは以下のパターンで鳴らしてみます。
- 60ms鳴らす
- 60ms止める
- 60ms鳴らす
- 60ms止める
- 100ms鳴らす
- 600ms止める
また、鳴らしたままだとうるさいので、「ピピピーッ」のパターンを3回繰り返して停止するようにしてみました。
さらに、スケッチが動作したら秒を表すLEDを点灯するように変更しました。点灯状態の場合はタイマースタートを待っている状態、ということを表すようにしてみました。
また、時間になったら秒を表すLEDを点灯するように変更しました。
以下が完成したスケッチです。
/*
* キッチンタイマー
*
* 内容: スイッチ、LED、スピーカーを使ったキッチンタイマー
* 変更履歴:
* 2019. 8.11: 新規作成
* 2019. 8.15: スタートスイッチ処理を追加
* 2019. 8.17: スイッチ関連の#define追加
* 2019. 9. 8: 点滅回数カウント追加
* 最終的に繰り返し処理をfor文で作成
* 2019. 9.16: スケッチ動作開始時にLEDを点滅
* 2019.10. 5: アラーム音追加
* 動作開始時とタイマー時間の時に青色LEDを点灯するように変更
*/
// 秒を表現するLED関連(青色LED)
#define BYOU_LED 12 // 秒を表現する青色LEDの端子番号
#define BYOU_ON 50 // 秒を表現するLEDをつけている時間 (単位:ミリ秒)
#define BYOU_OFF 1000 - BYOU_ON // 秒を表現するLEDを消している時間 (単位:ミリ秒)
// スタートスイッチ関連
#define SWITCH 23 // スイッチを接続している端子番号
#define SWITCH_OFF 1 // スイッチOFFの時のdigitalReadの値
#define SWITCH_ON 0 // スイッチONの時のdigitalReadの値
// タイマー時間設定(LEDの点滅回数)
#define TIMER_JIKAN 3
// スケッチ動作開始時のLEDの点滅処理
#define TENMETSU 3 // 点滅回数
#define TENMETSU_JIKAN 300 // 点滅の時間間隔(単位:ミリ秒)
// アラーム音関連
#define SPEAKER 18 // スピーカーの端子番号
#define ALARM 880 // アラーム音の音程
void setup() {
// 端子の設定
pinMode(BYOU_LED, OUTPUT); // 青色LED接続端子設定
pinMode(SWITCH, INPUT_PULLUP); // スイッチ接続端子の設定
// 秒のLED(青色LED)を点灯する
digitalWrite(BYOU_LED, HIGH);
// スイッチが押されるまで待つ
while(digitalRead(SWITCH) == SWITCH_OFF) {
}
}
void loop() {
// for文で回数を数えるために使用する変数
uint8_t count;
// TIMER_JIKAN分の回数を数える
for( count=0; count<TIMER_JIKAN; count++) {
// 1秒に1回青色LEDを点滅する
digitalWrite(BYOU_LED, HIGH);
delay(BYOU_ON);
digitalWrite(BYOU_LED, LOW);
delay(BYOU_OFF);
}
// 時間になったので秒のLED(青色LED)を点灯する
digitalWrite(BYOU_LED, HIGH);
// アラーム音を3回鳴らす
for( count=0; count<3; count++) {
// ピ
tone(SPEAKER, ALARM);
delay(60);
noTone(SPEAKER);
delay(60);
// ピ
tone(SPEAKER, ALARM);
delay(60);
noTone(SPEAKER);
delay(60);
// ピーッ
tone(SPEAKER, ALARM);
delay(100);
noTone(SPEAKER);
delay(600);
}
// 何もしないで待つ
while( true ) {
}
}
ミニチャレンジ課題
今回追加したアラーム音は典型的な感じの正直安っぽい感じですよね。そこで、最後にミニチャレンジ課題に挑戦してみてください。
自分のオリジナルのアラーム音に変えてみてください。音程とパターンを変えるといろいろと面白いアラーム音を鳴らすことができると思います。
オリジナルのアラーム音ができたら、次はアラーム音が鳴るタイミングに合わせて青色LEDを点灯させてみてください。例えばアラーム音が「ピピピーッ」だったら、青色LEDを「ピカピカピカーッ」とアラーム音に合わせてつけたり消したりしてみてください。
更新履歴
日付 | 内容 |
---|---|
2019.10.5 | 新規投稿 |
2021.8.26 | 新サイトデザイン対応 |