人口密度が高いため、騒音公害は本当に重要になり始めています。通常の人間の耳には、0dBから140dBの音のレベルが聞こえますが、120dBから140dBの音のレベルはノイズと見なされます。ラウドネスまたはサウンドレベルは通常、デシベル(dB)で測定されます。サウンド信号をデシベルで測定できる機器がいくつかありますが、これらのメーターは少し高価であり、残念ながら、デシベルでサウンドレベルを測定するためのすぐに使用できるセンサーモジュールがありません。また、小さな教室やリビングルームのサウンドレベルを測定する必要がある小さなArduinoプロジェクト用に高価なマイクを購入するのは経済的ではありません。
そのため、このプロジェクトでは、Arduinoで通常のエレクトレットコンデンサーマイクを使用し、実際の値にできるだけ近いdB単位で音または騒音公害レベルを測定してみます。通常の増幅回路を使用して音声信号を増幅し、Arduinoに供給します。ここで、回帰法を使用して音声信号をdB単位で計算します。得られた値が正しいかどうかを確認するには、Androidアプリケーション「サウンドメーター」を使用できます。より優れたメーターがある場合は、それを使用してキャリブレーションを行うことができます。このプロジェクトはdBを正確に測定することを目的としておらず、実際の値にできるだけ近い値を提供するだけであることに注意してください。
必要な材料:
- Arduino UNO
- マイクロフォン
- LM386
- 10K可変POT
- 抵抗器とコンデンサ
回路図:
このArduinoサウンドレベルメーターの回路は非常にシンプルで、LM386オーディオアンプ回路を使用してコンデンサーマイクからの信号を増幅し、Arduinoのアナログポートに供給しています。すでにこのLM386ICを使用して低電圧オーディオアンプ回路を構築しており、回路はほぼ同じままです。
この特定のオペアンプのゲインは、ピン1と8の両端に抵抗またはコンデンサを使用して、20〜200に設定できます。これらを空けたままにすると、デフォルトでゲインは20に設定されます。私たちのプロジェクトでは、この回路で可能な最大ゲインがあるため、ピン1と8の間に値10uFのコンデンサを使用します。このピンは極性に敏感であり、コンデンサの負のピンをピン8に接続する必要があることに注意してください。回路はArduinoからの5Vピンによって電力を供給されます。
コンデンサC2は、マイクからのDCノイズをフィルタリングするために使用されます。基本的に、マイクが音を感知すると、音波はAC信号に変換されます。このAC信号には、このコンデンサによってフィルタリングされるDCノイズが結合している可能性があります。同様に、増幅後でも、コンデンサC3を使用して、増幅中に追加された可能性のあるDCノイズをフィルタリングします。
回帰法を使用してADC値からdBを計算する:
回路の準備ができたら、Arduinoをコンピューターに接続し、Arduinoから 「AnalogRead Serial」 サンプルプログラム を アップロードして、マイクから有効なADC値を取得しているかどうかを確認できます。次に、このADC値をdBに変換する必要があります。
温度や湿度の測定などの他の値とは異なり、dBの測定は簡単な作業ではありません。dBの値はADCの値と線形ではないためです。到達する方法はいくつかありますが、私が試したすべての可能なステップでは、良い結果が得られませんでした。試してみたい場合は、このArduinoフォーラムをここで読むことができます。
私のアプリケーションでは、dB値を測定する際にそれほど精度は必要なかったため、ADC値をdB値で直接校正する簡単な方法を使用することにしました。この方法では、SPLメーターが必要になります(SPLメーターはdB値を読み取って表示できる機器です)が、残念ながら私はそれを持っていなかったので、ほとんどの人はそうしません。そのため、Playストアから無料でダウンロードできる「サウンドメーター」というAndroidアプリケーションを使用できます。そのような種類のアプリケーションはたくさんあり、好きなものをダウンロードできます。これらのアプリケーションは、電話の内蔵マイクを使用してノイズレベルを検出し、モバイルに表示します。それらはあまり正確ではありませんが、確かに私たちの仕事には役立つでしょう。それでは、Androidアプリケーションをインストールすることから始めましょう。開いたときの私のものは次のようになりました。
前に述べたように、dB値とアナログ値の関係は線形ではないため、これら2つの値を異なる間隔で比較する必要があります。携帯電話に表示されるさまざまなdBについて、画面に表示されるADCの値を書き留めてください。私は約10回の読み取りを行いましたが、以下のようになりました。少し異なる場合があります。
Excelページを開き、これらの値を入力します。ここでは、Excelを使用して上記の数値の回帰値を検索します。その前に、グラフをプロットして、両方がどのように関連しているかを確認しましょう。私のものは以下のようになりました。
dBの値はADCと直線的に関連していないことがわかります。つまり、すべてのADC値に共通の乗数を使用して、同等のdB値を取得することはできません。このような場合、「線形回帰」法を利用できます。基本的に、この不規則な青い線を可能な限り最も近い直線(黒い線)に変換し、その直線の方程式を与えます。この式を使用して、Arduinoが測定するADCのすべての値のdBに相当する値を見つけることができます。
Excelには、値のセットの回帰を自動的に計算してそのデータを公開するデータ分析用のプラグインがあります。このプロジェクトの範囲外であるため、Excelでそれを行う方法については説明しません。また、Googleにアクセスして学習するのも簡単です。値の回帰を計算すると、Excelは以下に示すようないくつかの値を提供します。以下で強調表示されている数値のみに関心があります。
これらの数値を取得すると、次のような式を作成できるようになります。
ADC =(11.003 * dB)– 83.2073
そこからdBを導き出すことができます
dB =(ADC + 83.2073)/ 11.003
キャリブレーションが異なる可能性があるため、独自の方程式を実行する必要がある場合があります。ただし、Arduinoのプログラミング中に必要になるため、この値は安全に保管してください。
サウンドレベルをdBで測定するArduinoプログラム:
dBを測定するための完全なプログラムを以下に示します。いくつかの重要な行を以下に説明します。
上記の2行では、ピンA0のADC値を読み取り、先ほど導出した式を使用してdBに変換します。このdB値は、実際のdB値に正確ではない可能性がありますが、モバイルアプリケーションに表示される値にかなり近いままです。
adc = analogRead(MIC); //アンプからADC値を読み取りますdB =(adc + 83.2073)/ 11.003; //回帰値を使用してADC値をdBに変換します
プログラムが正しく動作しているかどうかを確認するために、デジタルピン3にLEDを追加しました。これは、Arduinoが60dBを超える大きなノイズを測定したときに1秒間ハイになります。
if(dB> 60){digitalWrite(3、HIGH); // LEDをオンにします(HIGHは電圧レベルです)delay(1000); // 2番目のdigitalWrite(3、LOW);を待ちます }
Arduinoサウンドレベルメーターの動作:
コードとハードウェアの準備ができたら、コードをアップロードしてシリアルモニターを開き、Arduinoで測定されたdB値を確認します。私は自分の部屋でこのコードをテストしていましたが、外のトラフィックを除いてノイズはあまりなく、シリアルモニターで以下の値を取得し、Androidアプリケーションもこれに近いものを表示しました
プロジェクトの完全な作業は、このページの最後にあるビデオで見つけることができます。投影して部屋の音を検出し、アクティビティがあるかどうか、各教室で発生するノイズの量などを確認するために使用できます。60dBを超える音が録音された場合、LEDを2秒間ハイにしました。
作業は奇妙なことに満足のいくものですが、プロジェクトやその他の基本的なプロトタイプに確実に使用できます。もう少し掘り下げてみると、問題は実際にはハードウェアにあることがわかりました。それでも時々ノイズが発生していました。そこで、ローパスフィルターとハイパスフィルターを備えたスパークファンマイクボードで使用されている他の回路を試してみました。私はあなたが試すために以下の回路を説明しました。
フィルタ回路付きアンプ:
ここでは、アンプ付きのローパスフィルターとハイパスフィルターを使用して、このサウンドレベル測定回路のノイズを低減し、精度を向上させました。
上記の回路では、一般的なLM358アンプを使用してマイクからの信号を増幅しました。アンプに加えて、2つのフィルターも使用しました。ハイパスフィルターはR5、C2で形成され、ローパスフィルターはC1とR2で使用されます。これらのフィルターは、ローパスフィルターが8Hz未満のものをフィルターし、ハイパスフィルターが15KHzを超えるものをフィルターするため、8Hzから10KHzまでの周波数のみを許可するように設計されています。この周波数範囲が選択されているのは、以下のデータシートに示すように、コンデンサーマイクが10Hzから15KHZまでしか機能しないためです。
周波数の需要が変化した場合は、以下の式を使用して、必要な周波数の抵抗とコンデンサの値を計算できます。
周波数(F)= 1 /(2πRC)
また、ここで使用する抵抗の値もアンプのゲインに影響することに注意してください。この回路で使用される抵抗とコンデンサの値の計算を以下に示します。頻度の値を変更し、回帰値を計算するために、ここからExcelシートをダウンロードできます。
前者の回路は私の期待通りに機能したので、私はこれを試したことはありません。この回路を試してみたら、コメントで前の回路よりもうまく機能するかどうか教えてください。