注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community(サンファウンダー ラズベリーパイ&アルドゥイーノ&ESP32エンスージアストコミュニティ)へようこそ!Facebook上で、Raspberry Pi、Arduino、ESP32に関するより深い知識を持つ仲間と一緒に探求しましょう。

なぜ参加するべきか?

  • エキスパートサポート: 購入後の問題や技術的な課題を、コミュニティやチームのサポートで解決します。

  • 学び&共有: スキル向上のためのヒントやチュートリアルを交換します。

  • 独占プレビュー: 新製品の発表やプレビューにいち早くアクセスできます。

  • 特別割引: 最新製品に対する特別割引を受けることができます。

  • フェスティバルプロモーションとプレゼント: プレゼントやホリデープロモーションに参加できます。

👉 私たちと一緒に探求し、創造してみませんか?[ここ] をクリックして、今すぐ参加しましょう!

12. サイレン音

このArduinoプロジェクトでは、プログラミングと電子ハードウェアの統合を通じて、サイレンシステムを作成する方法を探求します。

サイレン音は特定の周波数とピッチパターンを使用しており、急激なピッチの上昇と下降が特徴です。これにより、日常の他の音とは異なる、認識しやすい音となっています。 これらのピッチの変化は、自然界で警告信号や危険な状況と関連付けられているため、緊急性を感じさせることができます。

パッシブブザーの周波数を調整することで、サイレン音の特徴的な上昇と下降をシミュレートできます。

このレッスンでは、以下を学びます:

  • パッシブブザーの動作原理

  • tone()関数を使ってパッシブブザーを駆動する方法

  • プログラミングでforループを使用する方法

  • サイレン音を実装する方法

音の特性の理解

音は、空気、水、または固体などの媒介物を通じて伝播する波動現象であり、振動するエネルギーとして伝わります。音の物理的特性を理解することで、異なる環境で音がどのように振る舞うかをよりよく理解し、制御することができます。 ここでは、音のいくつかの主要な物理的特性を紹介します。

../_images/7_siren.png

周波数

周波数は、単位時間あたりの振動サイクル数を指し、通常はヘルツ(Hz)で表されます。 周波数は音のピッチを決定します:高い周波数は高いピッチに聞こえ、低い周波数は低いピッチに聞こえます。人間の可聴範囲は約20 Hzから20,000 Hzまでです。

振幅 振幅は、音波の振動の強さであり、音の大きさを決定します。 振幅が大きいほど音が大きく、振幅が小さいほど音が小さくなります。 物理学では、振幅は通常、音波のエネルギーと直接関連しており、日常の言葉では、デシベル(dB)で音の大きさを表現することが多いです。

音色 音色は、音の質感や「色」を表し、同じピッチと音量を持つ音でも、異なる音源からの音を区別することができます。 たとえば、バイオリンとピアノが同じ音を演奏しても、それらを音色で区別することができます。

このプロジェクトでは、音の周波数が音に与える影響についてのみ探求します。

回路の構築

必要なコンポーネント

1 * Arduino Uno R3

1 * ブレッドボード

1 * パッシブブザー

ジャンパーワイヤー

list_uno_r3

list_breadboard

list_passive_buzzer

list_wire

1 * USBケーブル

list_usb_cable

手順に従って構築する

前のレッスンではアクティブブザーを使用しましたが、このレッスンではパッシブブザーを使用します。回路は同じですが、駆動するためのコードのアプローチが異なります。

  1. パッシブブザーを見つけてください。背面に露出した回路基板があるはずです。

../_images/7_beep_2.png
  1. パッシブブザーには「+」のマークがありますが、極性を持たないデバイスです。ブレッドボードの15Fと18Fの穴にどちらの向きでも挿入してください。

../_images/16_morse_code_buzzer.png
  1. パッシブブザーの一方のピンをArduino Uno R3のGNDピンに接続します。

../_images/16_morse_code_gnd.png
  1. パッシブブザーのもう一方のピンをArduino Uno R3の5Vピンに接続します。この状態では、ブザーは音を出しません。これがアクティブブザーと異なる点で、アクティブブザーはこの接続で音を出します。

../_images/16_morse_code_5v.png
  1. 次に、5Vピンに挿入されているワイヤを取り外し、Arduino Uno R3のピン9に挿入します。これで、コードを使用してブザーを制御できるようになります。

../_images/16_morse_code.png

Code Creation - パッシブブザーを鳴らす

接続時に学んだように、単に高電圧と低電圧を供給するだけでは、パッシブブザーは音を出しません。Arduinoプログラミングでは、 tone() 関数を使用して、指定された周波数で音を生成するためにパッシブブザーやその他の音声出力デバイスを制御します。

  • tone(): ピンに指定された周波数(および50%デューティサイクル)の方形波を生成します。持続時間を指定しない場合、 noTone() が呼ばれるまで波は継続します。

構文

  • tone(pin, frequency)

  • tone(pin, frequency, duration)

パラメーター

  • pin: トーンを生成するArduinoピン。

  • frequency: トーンの周波数(ヘルツ)。許可されるデータ型: unsigned int。

  • duration: トーンの持続時間(ミリ秒単位、オプション)。許可されるデータ型: unsigned long。

戻り値

なし

  1. Arduino IDEを開き、「ファイル」メニューから「新しいスケッチ」を選択して新しいプロジェクトを開始します。

  2. スケッチを Lesson12_Tone として保存し、Ctrl + S を押すか「保存」をクリックします。

  3. まず、ブザーピンを定義します。

const int buzzerPin = 9;  // ブザー用のピン9を定数に割り当てます

void setup() {
    // 一度だけ実行するセットアップコードをここに書きます:
}
  1. tone() 関数の使用を完全に理解するために、void setup() 内でこれを書いて、特定の周波数で設定した持続時間だけブザーが音を出すようにします。

const int buzzerPin = 9;  // ブザー用のピン9を定数に割り当てます

void setup() {
    // 一度だけ実行するセットアップコードをここに書きます:
    tone(buzzerPin, 1000, 100);  // 1000 Hzで100ミリ秒間ブザーを鳴らします
}

void loop() {
    // 繰り返し実行するメインコードをここに書きます:
}
  1. これでコードをArduino Uno R3にアップロードすると、パッシブブザーから短い「ビープ音」が聞こえ、その後無音になります。

質問

  1. コードと回路のピンを7または8に切り替えた場合(これらはPWMピンではありません)、ブザーは音を出すでしょうか?テストして、結果をハンドブックに記録してください。

  2. tone(pin, frequency, duration)frequencyduration がブザーの音にどのように影響するかを探るために、コードを次の2つの条件で変更し、観察した現象をハンドブックに記録してください:

  • frequency を1000に固定し、 duration を100, 500, 1000と徐々に増やします。ブザーの音はどのように変わり、なぜでしょうか?

  • duration を100に固定し、 frequency を1000, 2000, 5000と徐々に増やします。ブザーの音はどのように変わり、なぜでしょうか?

Code Creation - サイレン音を出す

以前、ブザーを鳴らす方法を学び、周波数と持続時間が音にどのように影響するかを理解しました。では、低いピッチから高いピッチに上がるサイレン音を出したい場合、どのように進めるべきでしょうか?

以前の探求から、 tone(pin, frequency) 関数を使用すると、パッシブブザーが音を発することがわかっています。 frequency を徐々に増やすと、パッシブブザーの音のピッチが高くなります。これをコードで実装してみましょう。

  1. 先ほど保存したスケッチ Lesson12_Tone を開きます。「ファイル」メニューから「名前を付けて保存」を選択し、 Lesson12_Siren_Sound として名前を付けて保存します。

  2. tone() 関数を void loop() に書き込み、異なる3つの周波数を設定します。それぞれの周波数音の違いを明確に聞くために、 delay() 関数を使用して間隔を分けます。

const int buzzerPin = 9;  // ブザー用のピン9を定数に割り当てます

void setup() {
    // 一度だけ実行するセットアップコードをここに書きます:
}

void loop() {
    // 繰り返し実行するメインコードをここに書きます:
    tone(buzzerPin, 100);  // 100 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 300);  // 300 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 600);  // 600 Hzでブザーを鳴らします
    delay(500);
}
  1. この時点で、コードをArduino Uno R3にアップロードすると、ブザーが3つの異なる音を繰り返し再生します。

  2. より滑らかなピッチの上昇を実現するには、周波数の間隔を短く設定する必要があります。たとえば、100から110、120...1000まで10ずつ増加させることができます。次のコードを記述してみましょう。

void loop() {
    // 繰り返し実行するメインコードをここに書きます:
    tone(buzzerPin, 100);  // 100 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 110);  // 110 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 120);  // 120 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 130);  // 130 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 140);  // 140 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 150);  // 150 Hzでブザーを鳴らします
    delay(500);
    tone(buzzerPin, 160);  // 160 Hzでブザーを鳴らします
    delay(500);
    ...
}
  1. もし1000まで記述しようとすると、コードは200行以上になります。この場合、繰り返し処理を行うために、波括弧で囲まれたブロックを繰り返す for 文を使用できます。

    • for : for 文は、任意の反復操作に便利で、データやピンのコレクションを操作するために配列と組み合わせてよく使用されます。増分カウンターを使用して、ループのインクリメントと終了を制御します。

    構文

    for (initialization; condition; increment) {
        // statement(s);
    }
    

    パラメーター

    • initialization: 最初に一度だけ実行されます。

    • condition: ループを通過するたびに条件がテストされます。条件がtrueの場合、ステートメントブロックとインクリメントが実行され、再び条件がテストされます。条件がfalseになると、ループが終了します。

    • increment: 条件がtrueのときにループを通過するたびに実行されます。

../_images/for_loop.png
  1. 次に、 void loop() 関数を以下のように変更し、 freq が100から始まり、10ずつ増加して1000まで上昇するようにします。

void loop() {
    // 徐々にピッチを上げる
    for (int freq = 100; freq <= 1000; freq += 10) {
        tone(buzzerPin, freq);  // トーンを発生させる
        delay(20);              // 周波数を変更する前に待機
    }
}
  1. 次に、 freq を1000から始めて10ずつ減少させて100まで下げることで、ブザーの音が低音から高音に、そして再び低音に変化するサイレン音をシミュレートできます。

void loop() {
    // 徐々にピッチを上げる
    for (int freq = 100; freq <= 1000; freq += 10) {
        tone(buzzerPin, freq);  // トーンを発生させる
        delay(20);              // 周波数を変更する前に待機
    }

    // 徐々にピッチを下げる
    for (int freq = 1000; freq >= 100; freq -= 10) {
        tone(buzzerPin, freq);  // トーンを発生させる
        delay(20);              // 周波数を変更する前に待機
    }
}
  1. 以下は完成したコードです。「アップロード」をクリックして、コードをArduino Uno R3にアップロードしてください。

const int buzzerPin = 9;  // ブザー用のピン9を定数に割り当てます

void setup() {
    // 一度だけ実行するセットアップコードをここに書きます:
}

void loop() {
    // 徐々にピッチを上げる
    for (int freq = 100; freq <= 1000; freq += 10) {
        tone(buzzerPin, freq);  // トーンを発生させる
        delay(20);              // 周波数を変更する前に待機
    }

    // 徐々にピッチを下げる
    for (int freq = 1000; freq >= 100; freq -= 10) {
        tone(buzzerPin, freq);  // トーンを発生させる
        delay(20);              // 周波数を変更する前に待機
    }
}
  1. 最後に、コードを保存して作業スペースを整理することを忘れないでください。

まとめ

このレッスンでは、Arduinoとパッシブブザーを使用してサイレン音をシミュレートする方法を学びました。音の基本的な物理特性である周波数とピッチについて説明し、それらが音の知覚や効果にどのように影響するかを理解しました。ハンズオンでの作業を通じて、回路を構築する方法を学ぶだけでなく、Arduinoで tone() 関数を使用して音の周波数と持続時間を制御し、ピッチが上がり下がりするサイレン音を実現することができました。