#14中級

ブザーの周波数を調整

4.6(69)
118 完了
ブザーの周波数を調整
4つのボタンでブザーの音を操作します。1つは音を鳴らし、1つは音を止め、残りの2つは音を高くしたり低くしたりします。音を高くするボタンや低くするボタンを押し続けると、音程が段階的に変化し、サイレンのように聞こえます。音の高低が生まれる理由を、自分の耳で確かめられます。

動画

回路図

ブザーの周波数を調整 - Circuit

ソースコード

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Frequency Setting with Buzzer
4// ─────────────────────────────────────────
5// Four buttons control the buzzer: On, Off, Frequency + and Frequency -.
6// Pressing On makes the buzzer play at the current frequency. The + and -
7// buttons change it by 50 Hz per press (starting at 300 Hz); the frequency
8// stays within 50-5000 Hz.
9//
10// Pins:
11//   D8 -> Buzzer + (other leg to GND)
12//   D7 -> On button
13//   D6 -> Off button
14//   D5 -> Frequency + button
15//   D4 -> Frequency - button
16//   Other leg to 5V, pin to GND via 220 ohm
17
18int buzzerPin = 8;     // Buzzer output pin
19int btnOn = 7;         // On button
20int btnOff = 6;        // Off button
21int btnIncrease = 5;   // Frequency + button
22int btnDecrease = 4;   // Frequency - button
23int frequency = 300;   // Start frequency (Hz)
24int state = 0;         // 1 = 1 = sound on, 0 = off
25
26void setup() {
27  // Buttons as inputs, with external pull-downs
28  pinMode(btnOn, INPUT);
29  pinMode(btnOff, INPUT);
30  pinMode(btnIncrease, INPUT);
31  pinMode(btnDecrease, INPUT);
32}
33
34void loop() {
35  if (digitalRead(btnOn)) {          // On: start the sound
36    state = 1;
37  }
38
39  if (digitalRead(btnOff)) {         // Off: stop the sound
40    state = 0;
41  }
42
43  if (digitalRead(btnIncrease)) {    // Raise the frequency by 50 Hz
44    frequency = frequency + 50;
45    delay(100);                      // Step slowly while held
46  }
47
48  if (digitalRead(btnDecrease)) {    // Lower the frequency by 50 Hz
49    frequency = frequency - 50;
50    delay(100);
51  }
52
53  frequency = constrain(frequency, 50, 5000);   // Keep it within 50-5000 Hz
54
55  // Play or silence the buzzer by state
56  if (state == 1) {
57    tone(buzzerPin, frequency);
58  } else {
59    noTone(buzzerPin);
60  }
61}
62

よくある質問

ボタンに220 Ωの抵抗を使うのはなぜですか?▾

このコードは、外付けのプルダウン抵抗を使い、INPUTモードでボタンを読み取ります。各抵抗を対応する入力とGNDの間に接続し、ボタンを離したときにLOWが読み取られるようにします。部品リストの220 Ωの抵抗をこの用途に使うと、5 V電源の回路ではボタンを押したときに約23 mAが抵抗に流れます。10 kΩにすると、この電流は約0.5 mAに減ります。抵抗値を変更する場合は、部品リストも更新する必要があります。

周波数はどの範囲で調整すればよいですか?▾

人の耳に聞こえる周波数は約20 Hz〜20 kHzですが、小さなブザーは500〜5000 Hzの範囲で最もよく音が出ます。周波数の増減幅を50〜100 Hzにすると、変化を聞き取りやすくなります。

ボタンを押し続けると周波数が急に変わります。ゆっくり変えるにはどうすればよいですか?▾

ループのたびに周波数を変えると、ボタンを押し続けたときに周波数が急速に上がります。押した瞬間だけを検出して1回ずつ変えるか(エッジ検出)、変更のたびに短い待ち時間を設けてください。

周波数が範囲外にならないようにするにはどうすればよいですか?▾

コードにはすでに制限があり、`frequency = constrain(frequency, 50, 5000);`の行で値を50〜5000 Hzに保っています。範囲を変更するには、この2つの数値を変えてください。例えば下限を100にすると、非常に低い、びりびりした音を避けられます。