【Arduino IDE】特定の周波数の音を出す(Tone())

tone() 関数は、Arduino IDE で音を生成するために使用される関数です。ブザーやスピーカーを使って特定の周波数の音を出すことができます。tone() 関数を使用すると、任意のデジタルピンで特定の周波数の音を生成できます。例えば、アラーム、メロディ、効果音などの用途に使えます。

tone() 関数の基本的な使い方

void tone(uint8_t pin, unsigned int frequency);
void tone(uint8_t pin, unsigned int frequency, unsigned long duration);

パラメータの説明

  • pin: 音を出力するデジタルピン番号です。Arduinoのデジタルピン(例: 3, 5, 9 など)を指定します。
  • frequency: 音の周波数をHz単位で指定します。人間の耳に聞こえる範囲はおおよそ 20Hz~20kHz です。例えば、440Hzは「ラ」の音に相当します。
  • duration(任意): 音を出す時間をミリ秒単位で指定します。このパラメータを指定しない場合は、音は無期限に鳴り続けます。

例1: 単純な音を鳴らす

void setup() {
  // デジタルピン8で440Hzの音を鳴らす
  tone(8, 440);
}

void loop() {
  // 空のループ
}

このコードでは、デジタルピン8で440Hzの音(A4、ラの音)が鳴り始めます。tone() を使用すると、音は無期限に鳴りますが、noTone() 関数を使って音を止めることができます。

例2: 一定時間だけ音を鳴らす

void setup() {
  // デジタルピン8で440Hzの音を1000ミリ秒(1秒)鳴らす
  tone(8, 440, 1000);
}

void loop() {
  // 空のループ
}

このコードでは、440Hzの音が1秒間鳴り、その後自動的に音が止まります。

例3: 複数の音を順番に鳴らす

void setup() {
  // デジタルピン8で異なる周波数の音を鳴らす
  tone(8, 262, 500); // C4 (ド) の音を0.5秒鳴らす
  delay(500);        // 0.5秒の休止
  tone(8, 294, 500); // D4 (レ) の音を0.5秒鳴らす
  delay(500);        // 0.5秒の休止
  tone(8, 330, 500); // E4 (ミ) の音を0.5秒鳴らす
  delay(500);        // 0.5秒の休止
}

void loop() {
  // 空のループ
}

このコードでは、C4(ド)、D4(レ)、E4(ミ)という音を順番に鳴らし、それぞれ0.5秒の間隔で再生します。

音を止める: noTone() 関数

tone() で音を鳴らした後に音を止めるには、noTone() 関数を使います。

void setup() {
  tone(8, 440);    // 440Hzの音を無期限に鳴らす
  delay(2000);     // 2秒間待機
  noTone(8);       // 音を止める
}

void loop() {
  // 空のループ
}

このコードでは、2秒間440Hzの音が鳴り、その後音が止まります。

tone() 関数の注意点

  1. PWM(パルス幅変調)ピンに依存しない: tone() 関数は、Arduino の標準的なデジタルピンで動作しますが、特定の周波数の信号を出力するために、タイマーを使用しています。これは、PWM ピンでなくても音が鳴らせることを意味します。
  2. タイマーの競合: tone() は内部でタイマーを使うため、他のライブラリ(例えば Servo ライブラリ)と同時に使うと競合が発生することがあります。
  3. 複数の音を同時に鳴らすことはできない: tone() は1つのピンで1つの音しか鳴らすことができません。別のピンで別の音を鳴らす場合は、別の手段を考える必要があります。

tone() を使ったメロディの再生例

以下は、メロディを再生する例です。

int melody[] = {262, 294, 330, 349, 392, 440, 494, 523}; // ドレミファソラシド
int noteDurations[] = {500, 500, 500, 500, 500, 500, 500, 500}; // 各音の長さ

void setup() {
  for (int i = 0; i < 8; i++) {
    int noteDuration = noteDurations[i];
    tone(8, melody[i], noteDuration);  // 各音を再生
    delay(noteDuration + 100);         // 音を鳴らして次に進む
  }
}

void loop() {
  // 空のループ
}

このコードでは、melody[] に定義された周波数に基づいて「ドレミファソラシド」の音階を再生します。

まとめ

tone() 関数は、特定の周波数の音を生成し、Arduinoプロジェクトでサウンドを出力するために非常に便利です。シンプルに使える関数ですが、使用するタイマーの競合や複数の音を同時に鳴らせないといった制約もあります。音を生成する多くのプロジェクトで役立つため、ブザーやスピーカーを使って音を鳴らしたい場合に覚えておくと便利です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次