.. note:: こんにちは!SunFounderのRaspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebookへようこそ!Raspberry Pi、Arduino、ESP32について、仲間と一緒に深く掘り下げましょう。 **参加する理由** - **専門サポート**: 購入後の問題や技術的な課題を、コミュニティとチームの助けを借りて解決。 - **学びと共有**: スキルを向上させるためのヒントやチュートリアルを交換。 - **独占プレビュー**: 新製品の発表や先行プレビューに早期アクセス。 - **特別割引**: 最新の製品に対する特別割引を享受。 - **フェスティブプロモーションとプレゼント**: プレゼントやホリデープロモーションに参加。 👉 準備はできましたか?[|link_sf_facebook|]をクリックして、今すぐ参加しましょう! 21. サイレン音 ========================= このArduinoプロジェクトでは、プログラミングと電子ハードウェアの統合を通じて、サイレンシステムを作成する方法を探ります。 サイレン音は特定の周波数とピッチパターンを使用し、急激なピッチの上昇と下降によって特徴付けられています。これにより、他の日常的な音とは異なる、非常に認識しやすい音になります。 これらのピッチの変化は、しばしば警告信号や自然界の危険な状況に関連しているため、緊急性を感じさせることができます。 パッシブブザーの周波数を調整することで、サイレン音の特徴的なピッチの上昇と下降をシミュレートできます。 .. raw:: html このレッスンで学ぶこと: * パッシブブザーの仕組み * tone()関数を使用してパッシブブザーを駆動する方法 * プログラミングでforループを使用する方法 * サイレン音を実装する方法 音の特性の理解 ----------------------------------- 音は、空気、水、または固体などの媒質を介して伝わる波現象です。音の物理的特性を理解することで、異なる環境で音がどのように動作するかをよりよく理解し、制御することができます。 ここでは、音のいくつかの重要な物理的特性を紹介します。 .. image:: img/7_siren.png :width: 500 :align: center **周波数** 周波数は、通常ヘルツ(Hz)で表される、単位時間あたりの振動サイクルの数を指します。 周波数は音のピッチを決定します:高い周波数は高いピッチに、低い周波数は低いピッチになります。人間が聞くことができる範囲は約20Hzから20,000Hzです。 **振幅** 振幅は、音波の振動の強さを指し、音の大きさを決定します。 振幅が大きいほど音は大きく、振幅が小さいほど音は小さくなります。 物理学では、振幅は通常、音波のエネルギーに直接関連していますが、日常の言葉では、デシベル(dB)を使用して音の大きさを表現することが多いです。 **音色** 音色は、音のテクスチャーや「色」を表し、同じピッチと大きさであっても、異なる音源の音を区別することができます。 たとえば、バイオリンとピアノが同じ音を演奏しても、その音色によって区別することができます。 このプロジェクトでは、周波数が音に与える影響のみを探ります。 回路の構築 ----------------------- **必要なコンポーネント** .. list-table:: :widths: 25 25 25 25 :header-rows: 0 * - 1 * Arduino Uno R3 - 1 * ブレッドボード - 1 * パッシブブザー - ジャンパーワイヤー * - |list_uno_r3| - |list_breadboard| - |list_passive_buzzer| - |list_wire| * - 1 * USBケーブル - - - * - |list_usb_cable| - - - **ステップバイステップの構築** 前のレッスンでは、アクティブブザーを使用しました。このレッスンでは、パッシブブザーを使用します。回路は同じですが、駆動するためのコードのアプローチが異なります。 1. パッシブブザーを見つけます。裏面に露出した回路基板があるのが特徴です。 .. image:: img/7_beep_2.png 2. パッシブブザーには'+'の記号がありますが、極性はありません。どちらの向きでも、ブレッドボードの15Fと18Fの穴に挿入できます。 .. image:: img/16_morse_code_buzzer.png :width: 500 :align: center 3. パッシブブザーの片方のピンをArduino Uno R3のGNDピンに接続します。 .. image:: img/16_morse_code_gnd.png :width: 500 :align: center 4. パッシブブザーのもう一方のピンをArduino Uno R3の5Vピンに接続します。この場合、ブザーは音を出しません。アクティブブザーであれば、このように接続すると音が鳴ります。 .. image:: img/16_morse_code_5v.png :width: 500 :align: center 5. 次に、5Vピンに挿入したワイヤーを取り外し、Arduino Uno R3のピン9に挿入します。これにより、コードでブザーを制御できるようになります。 .. image:: img/16_morse_code.png :width: 500 :align: center 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. スケッチを ``Lesson21_Tone`` として保存します。 ``Ctrl + S`` を押すか、「保存」をクリックします。 3. 最初に、ブザーピンを定義します。 .. code-block:: Arduino const int buzzerPin = 9; // ブザー用のピン9を定数に割り当てる void setup() { // ここに一度だけ実行するセットアップコードを記述 } 4. ``tone()``関数の使用を完全に理解するために、 ``void setup()`` 内で記述し、特定の周波数と持続時間でブザーを鳴らします。 .. code-block:: Arduino :emphasize-lines: 5 const int buzzerPin = 9; // ブザー用のピン9を定数に割り当てる void setup() { // ここに一度だけ実行するセットアップコードを記述 tone(buzzerPin, 1000, 100); // 1000Hzで100ミリ秒間ブザーを鳴らす } void loop() { // ここに繰り返し実行するメインコードを記述 } 5. これでコードをArduino Uno R3にアップロードすると、パッシブブザーから短い「ビープ」音が聞こえ、その後は無音になります。 **質問** 1. コードと回路のピンをPWMピンではない7または8に切り替えた場合、ブザーは音を出すでしょうか?テストしてから、手帳に答えを書いてください。 2. ``tone(pin, frequency, duration)``における ``frequency`` と ``duration`` がブザーの音にどのように影響するかを探るために、コードを次の2つの条件で変更し、観察結果を手帳に記入してください。 * ``frequency``を1000に固定し、 ``duration`` を100、500、1000と徐々に増やします。ブザーの音はどう変化するでしょうか?なぜですか? * ``duration``を100に固定し、 ``frequency`` を1000、2000、5000と徐々に増やします。ブザーの音はどう変化するでしょうか?なぜですか? Code Creation - サイレン音の発生 ----------------------------------------- 以前、ブザーを鳴らす方法を学び、周波数と持続時間が音にどのように影響するかを理解しました。では、ブザーを低音から高音へと変化させるサイレン音を発生させるにはどうすればよいでしょうか? 以前の探求から、 ``tone(pin, frequency)`` 関数を使用すると、パッシブブザーが音を発することがわかりました。 ``frequency`` を徐々に増やすことで、パッシブブザーの音のピッチが高くなります。これをコードで実装してみましょう。 1. 先ほど保存したスケッチ、 ``Lesson21_Tone`` を開きます。 2. 「ファイル」メニューから「名前を付けて保存」を選択し、 ``Lesson21_Siren_Sound`` に名前を変更します。「保存」をクリックします。 3. ``tone()``関数を``void loop()``に記述し、3つの異なる周波数を設定します。それぞれの周波数の音の違いをはっきりと聞くために、 ``delay()`` 関数を使用して間隔をあけます。 .. code-block:: Arduino const int buzzerPin = 9; // ブザー用のピン9を定数に割り当てる void setup() { // ここに一度だけ実行するセットアップコードを記述 } void loop() { // ここに繰り返し実行するメインコードを記述 tone(buzzerPin, 100); // 100Hzでブザーを鳴らす delay(500); tone(buzzerPin, 300); // 300Hzでブザーを鳴らす delay(500); tone(buzzerPin, 600); // 600Hzでブザーを鳴らす delay(500); } 4. ここまでの作業が完了したら、コードをArduino Uno R3にアップロードし、ブザーが3種類の異なるトーンを繰り返して鳴るのを確認してください。 5. よりスムーズなピッチの上昇を実現するためには、 ``frequency`` の間隔を10に設定し、100から110、120と順次1000まで上げる必要があります。以下のようにコードを書きます。 .. code-block:: Arduino void loop() { // ここに繰り返し実行するメインコードを記述 tone(buzzerPin, 100); // 1000 Hzでブザーを鳴らす delay(500); tone(buzzerPin, 110); // 1000 Hzでブザーを鳴らす delay(500); tone(buzzerPin, 120); // 1000 Hzでブザーを鳴らす delay(500); tone(buzzerPin, 130); // 1000 Hzでブザーを鳴らす delay(500); tone(buzzerPin, 140); // 1000 Hzでブザーを鳴らす delay(500); tone(buzzerPin, 150); // 1000 Hzでブザーを鳴らす delay(500); tone(buzzerPin, 160); // 1000 Hzでブザーを鳴らす delay(500); ... } 6. 本当に1000まで書くと、このコードは200行を超える長さになります。この時点で、繰り返し処理をカールブレース内にまとめるために ``for`` ステートメントを使用できます。 * ``for``: ``for`` ステートメントは任意の反復操作に役立ち、配列と組み合わせてデータやピンの集合を操作するのに頻繁に使用されます。インクリメントカウンタが通常、ループをインクリメントおよび終了させるために使用されます。 **構文** .. code-block:: for (initialization; condition; increment) { // statement(s); } **パラメータ** * ``initialization``: 最初に一度だけ実行されます。 * ``condition``: 各ループのたびに条件がテストされます。真であれば、ステートメントブロックとインクリメントが実行され、再度条件がテストされます。条件が偽になると、ループが終了します。 * ``increment``: 条件が真の間、ループごとに実行されます。 .. image:: img/for_loop.png :width: 400 :align: center 7. 次に示すように、 ``void loop()`` 関数を変更し、 ``freq`` を100から開始し、10ずつ増加して1000まで上げます。 .. code-block:: Arduino :emphasize-lines: 3-6 void loop() { // ピッチを徐々に上げる for (int freq = 100; freq <= 1000; freq += 10) { tone(buzzerPin, freq); // トーンを発する delay(20); // 周波数を変更する前に待機 } } 8. 次に、 ``freq`` を1000から開始し、10ずつ減少させて100まで下げることで、ブザーの音が低音から高音に変化し、さらに高音から低音に変化するサイレン音をシミュレートします。 .. code-block:: Arduino :emphasize-lines: 9-12 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); // 周波数を変更する前に待機 } } 9. 完成したコードは以下のようになります。これをArduino Uno R3にアップロードしてください。 .. code-block:: Arduino 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); // 周波数を変更する前に待機 } } 10. 最後に、コードを保存し、作業スペースを整理することを忘れないでください。 **Summary** このレッスンでは、Arduinoとパッシブブザーを使用してサイレン音をシミュレートする方法を学びました。音の基本的な物理的特性、例えば周波数とピッチについて話し合い、それらが音の認識と効果にどのように影響するかを学びました。ハンズオン活動を通じて、回路の構築方法を学び、Arduinoの ``tone()`` 関数を使用して音の周波数と持続時間を制御するプログラミングを習得し、ピッチが上がり下がりするサイレン音のシミュレーションを実現しました。