- 必要な材料
- サウンドセンサーの動作
- オシロスコープでの可聴周波数の測定
- ホイッスル検出器Arduino回路図
- Arduinoで周波数を測定する
- ホイッスルを検出するためのArduinoのプログラミング
- Arduinoホイッスル検出器が機能しています
子供の頃、手をたたくとトリガーされるおもちゃの音楽車に魅了され、成長するにつれて、同じものを使って家のライトとファンを切り替えることができるかどうか疑問に思いました。怠惰な自分を配電盤まで歩くのではなく、手をたたくだけでファンとライトをオンにするのはクールでしょう。しかし、この回路は、大きなラジオや隣人の芝刈り機など、環境内の大きなノイズに反応するため、誤動作することがよくあります。クラップスイッチを作成することも楽しいプロジェクトですが。
その時、回路がホイッスルを検出するこのホイッスル検出方法に出くわしました。他の音とは異なり、ホイッスルは特定の持続時間にわたって均一な周波数を持つため、スピーチや音楽と区別することができます。したがって、このチュートリアルでは、サウンドセンサーをArduinoに接続してホイッスル音を検出する方法を学習し、ホイッスルが検出されたら、リレーを介してACランプを切り替えます。その過程で、マイクが音声信号を受信する方法と、Arduinoを使用して周波数を測定する方法についても学びます。面白そうなので、Arduinoベースのホームオートメーションプロジェクトを始めましょう。
必要な材料
- Arduino UNO
- サウンドセンサーモジュール
- リレーモジュール
- ACランプ
- 接続線
- ブレッドボード
サウンドセンサーの動作
このホームオートメーションプロジェクトのハードウェア接続とコードに飛び込む前に、サウンドセンサーを見てみましょう。このモジュールで使用するサウンドセンサーを以下に示します。市場で入手可能なほとんどのサウンドセンサーの動作原理はこれに似ていますが、外観は少し変わる可能性があります。
私たちが知っているように、サウンドセンサーの基本的なコンポーネントはマイクです。マイクは、音波(音響エネルギー)を電気エネルギーに変換するトランスデューサーの一種です。基本的に、マイク内部のダイアフラムは大気中の音波に振動し、出力ピンに電気信号を生成します。ただし、これらの信号は非常に小さい等級(mV)であるため、Arduinoのようなマイクロコントローラーで直接処理することはできません。また、デフォルトでは、音声信号は本質的にアナログであるため、マイクからの出力は可変周波数の正弦波になりますが、マイクロフォンはデジタルデバイスであるため、方形波でより適切に機能します。
これらの低信号正弦波を増幅して方形波に変換するために、モジュールは上記のようにオンボードのLM393コンパレータモジュールを使用します。マイクからの低電圧オーディオ出力は、アンプトランジスタを介してコンパレータの一方のピンに供給され、基準電圧は、ポテンショメータを含む分圧回路を使用してもう一方のピンに設定されます。マイクからのオーディオ出力電圧がプリセット電圧を超えると、コンパレータは5V(動作電圧)でハイになります。それ以外の場合、コンパレータは0Vでローのままになります。このようにして、低信号の正弦波を高電圧(5V)の方形波に変換できます。以下のオシロスコープのスナップショットは、黄色の波が低信号の正弦波で、青色のオンが出力方形波である場合と同じです。ザ・モジュールのポテンショメータを変えることで感度を制御できます。
オシロスコープでの可聴周波数の測定
このサウンドセンサーモジュールは、大気中の音波を方形波に変換します。方形波の周波数は音波の周波数と同じです。したがって、方形波の周波数を測定することにより、大気中の音声信号の周波数を見つけることができます。下のビデオに示すように、サウンドセンサーをスコープに接続して出力信号をプローブし、想定どおりに機能していることを確認しました。
スコープの測定モードをオンにして周波数を測定し、PlayストアのAndroidアプリケーション(Frequency Sound Generator)を使用して既知の周波数の音声信号を生成しました。上記のGIDでわかるように、スコープはかなり適切な精度で音声信号を測定できました。スコープに表示される周波数の値は、私の電話に表示される値に非常に近いものです。モジュールが機能していることがわかったので、サウンドセンサーとArduinoのインターフェースに進みましょう。
ホイッスル検出器Arduino回路図
サウンドセンサーを使用したArduinoホイッスル検出器スイッチ回路の完全な回路図を以下に示します。回路はFritzingソフトウェアを使用して描画されました。
サウンドセンサーとリレーモジュールは、Arduinoの5Vピンから給電されます。サウンドセンサーの出力ピンはArduinoのデジタルピン8に接続されています。これは、そのピンのタイマープロパティによるものであり、プログラミングのセクションで詳しく説明します。リレーモジュールは、UNOボードの内蔵LEDにも接続されているピン13によってトリガーされます。
AC電源側では、中性線はリレーモジュールのCommon(C)ピンに直接接続され、フェーズはAC負荷(電球)を介してリレーのノーマルオープン(NO)ピンに接続されます。このようにリレーがトリガーされると、NOピンがCピンに接続され、電球が点灯します。それ以外の場合、ブラブはオフのままになります。接続が確立されると、私のハードウェアは次のようになりました。
警告: AC回路での作業は危険になる可能性があります。活線の取り扱いには注意し、短絡を避けてください。電子機器の経験がない人には、サーキットブレーカーまたは大人の監督をお勧めします。あなたは警告されました!
Arduinoで周波数を測定する
入ってくる方形波の周波数を読み取るスコープと同様に、周波数を計算するためにArduinoをプログラムする必要があります。パルスイン機能を使用した周波数カウンターチュートリアルで、これを行う方法をすでに学習しました。ただし、このチュートリアルでは、Freqmeasureライブラリを使用して周波数を測定し、正確な結果を取得します。このライブラリは、ピン8の内部タイマー割り込みを使用して、パルスがオンになっている時間を測定します。時間が測定されると、式F = 1 / Tを使用して周波数を計算できます。ただし、ライブラリを直接使用しているため、レジスタの詳細や周波数の測定方法を計算する必要はありません。ライブラリは以下のリンクからダウンロードできます。
- pjrcによる周波数測定ライブラリ
上記のリンクからzipファイルがダウンロードされます。次に、[スケッチ]-> [ライブラリを含める]-> [。ZIPライブラリを追加]のパスをたどって、このzipファイルをArduinoIDEに追加できます。
注: ライブラリを使用すると、タイマーがこのライブラリによって占有されるため、UNOのピン9および10の analogWrite 機能が無効になります。また、他のボードを使用すると、これらのピンが変更されます。
ホイッスルを検出するためのArduinoのプログラミング
デモンストレーションビデオ付きの完全なプログラムは、このページの下部にあります。この見出しでは、プログラムを小さなスニペットに分割して説明します。
いつものように、必要なライブラリを含め、必要な変数を宣言することからプログラムを開始します。上記の見出しで説明したように、 FreqMeasure.h ライブラリがすでに追加されていることを確認してください。変数stateはLEDの状態を表し、変数frequencyとcontinuityは、それぞれ測定された周波数とその連続性を出力するために使用されます。
#include
void setup 関数内で、デバッグのために9600ボーレートでシリアルモニターを開始します。次に、 FreqMeasure.begin() 関数を使用して、周波数を測定するためにピン8を初期化します。また、ピン13(LED_BUILTIN)が出力されることを宣言します。
void setup(){ Serial.begin(9600); FreqMeasure.begin(); //デフォルトでピン8で 測定pinMode(LED_BUILTIN、OUTPUT); }
無限 ループ 内では、関数 FreqMeasure.available() を使用してピン8をリッスンし続けます 。 着信信号がある場合は、 FreqMeasure.read() を使用して周波数を測定します 。 ノイズによるエラーを回避するために、100個のサンプルを測定し、その平均を取りました。同じことを行うためのコードを以下に示します。
if(FreqMeasure.available()){ //複数の読み取り値を一緒に平均する sum = sum + FreqMeasure.read(); カウント=カウント+1; if(count> 100){ frequency = FreqMeasure.countToFrequency(sum / count); Serial.println(頻度); 合計= 0; カウント= 0; } }
ここで Serial.println() 関数を使用して、ホイッスルの周波数の値を確認できます。私の場合、受信した値は1800Hzから2000Hzでした。ほとんどの人の笛の周波数は、この特定の範囲に収まります。ただし、音楽や音声などの他の音でもこの周波数に該当する可能性があるため、それらを区別するために、継続性を監視します。周波数が3回連続している場合は、笛の音であることが確認できます。したがって、頻度が1800〜2000の場合、連続性と呼ばれる変数をインクリメントします。
if(周波数> 1800 &&周波数<2000) {連続性++; Serial.print( "Continuity->"); Serial.println(continuity); 頻度= 0;}
連続性の値が3以上の場合、stateという変数を切り替えてLEDの状態を変更します。状態がすでにtrueの場合は、falseに変更し、その逆も同様です。
if(continuity> = 3 && state == false) {state = true; 連続性= 0; Serial.println( "ライトがオンになりました"); delay(1000);} if(continuity> = 3 && state == true) {state = false; 連続性= 0; Serial.println( "ライトがオフになりました"); delay(1000);}
Arduinoホイッスル検出器が機能しています
コードとハードウェアの準備ができたら、テストを開始できます。接続が正しいことを確認し、モジュールの電源を入れます。シリアルモニターを開いて口笛を吹くと、連続性の値が増加し、最後にランプがオンまたはオフになります。シリアルモニターのスナップショットのサンプルを以下に示します。
シリアルモニターが ライトがオンになったことを示すと 、ピン13がハイになり、リレーがトリガーされてランプがオンになります。同様に、シリアルモニターが ライトがオフに なったことを示すと、ランプはオフに なります 。動作をテストしたら、12Vアダプターを使用してセットアップに電力を供給し、ホイッスルを使用してAC家電の制御を開始できます。
このプロジェクトの完全な作業は、以下にリンクされているビデオで見つけることができます。チュートリアルを理解し、新しいことを楽しんでいただければ幸いです。うまく機能させるのに問題がある場合は、コメントセクションに残すか、フォーラムを使用して他の技術的な質問をしてください。