騒音計としてのRPi?


10

私の娘のscience fairプロジェクト(コンピューターサイエンスと数学のカテゴリー)では、彼女はRPiを使用して、さまざまな大きな音が痛みのしきい値を超えており、耳に損傷を与えているかどうかを測定したいと考えています。彼女は6年生ですが、RPiとPythonでのプログラミングの経験があります。Phillip Heels NicholsがFB RPiページでいくつかの質問に回答しましたが、さらにヘルプが必要な場合はここに来ることを提案しました。彼女は、生成されたミリボルト数を把握するために、音圧計(私はこれらの1つを持っています)を使用してPiを較正したいと考えています。

これが私たちがこれまでに考えていることです。私たちはadafruitからadc(mcp3008)を購入し、その到着を待っています。ADCからのデジタル出力をGPIOピン11に、GPIOピン12を赤いLEDに接続すると、この簡単なプログラムは機能しますか?

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.IN)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,GPIO.LOW)    #make sure LED is off
SPL=0 #zero the variable

While SPL<??:            #Where ?? is the value in millivolts produced by a sound at 130 db
    SPL=GPIO.input(11)   #get value from adc connected to microphone
GPIO.output(12,GPIO.HIGH)   #turn LED on if the sound level is higher than ??

これが機能する場合、GPIOピンに接続されたボタンを押すことでプログラムをリセットするために、どのコードを最後に置くことができますか?彼女はこれを移植可能にしたいので、コマンドを入力してプログラムを再度実行することはできません。


何らかの理由で、コードが途切れました。もう一度試してみましょう:RPi.GPIOをGPIOとしてインポートしますGPIO.setmode(GPIO.BOARD)GPIO.setup(11、GPIO.IN)GPIO.setup(12、GPIO.OUT)GPIO.output(12、GPIO.LOW)# LEDがオフになっていることを確認しますSPL = 0#変数をゼロにしますSPL <??:#Where ?? 130 dBのサウンドによって生成されるミリボルト単位の値ですSPL = GPIO.input(11)#マイクに接続されたADCから値を取得GPIO.output(12、GPIO.HIGH)#サウンドレベルが高い場合はLEDをオンにしますか? ?
user5769

1
投稿を編集できます。コードの前に4つのスペースを配置すると、特別な「コード」ボックスに配置され、フォーマットが保持されます。とても読みやすくなります。質問とは関係ありませんが、6年生には印象的です!!!! あの若さから始めたいと思います。
インパルス、2013

1
興味津々で音圧計はどのメーカー/モデルですか?
recantha 2013

メーターの出力はプリアンプされていますか?そうしないと、マイク出力がMCP3008で読み取るには小さすぎます。
2013

ADCを使用して意味のある音圧を測定することはできないことに注意してください。発振波形を測定してから、ソフトウェアでその振幅を測定する(おそらく、実際のメーターの傾向に応じて周波数依存の重み付けを適用する)か、ADCに到達する前に信号を整流する必要があります。アルゴリズムを理解するために、最初にサウンドカードを備えたPCを使用していくつかの実験を実行することができます。
Chris Stratton、2013年

回答:


3

ADCのデジタル出力ピンをRPi GPIOのピン11に接続するだけでSPIバスを使用することはできません。このバスには、正確には4本以上のワイヤーが必要です。

ADCはまた、適切に機能するために接続されたSPI入力、クロックおよびチップセレクトピンを必要とします。幸いなことに、これに関する良い情報が複数のソースから入手できます。

まず、SPIの動作についてもう少し詳しく知りたい場合は、Wikipediaのこのページを読んで、SPIについてもう少し詳しく知ることをお勧めします。

次に、このテーマを正確に説明するAdafruitsの非常に優れたチュートリアルがあります。Pythonコードが含まれており、ADC自体を接続して通信するプロセスをガイドします。1つ(マイナー)な欠点は、このチュートリアルで使用するコードがSPIポート自体を使用しないことです。ソフトウェアはSPIバスをエミュレートします(ビットバンギングと呼ばれます)。これは、GPIOポートのピンをより自由に使用できることを意味します。あなたが欲しい。

私はあなたの比較的単純なプロジェクトについて推測します(今日、6年生はこの種のタスクを実行しています!大丈夫。ビットバンギングを使用する利点は、すべてのSPI信号を自分で作成するため、学習目的に適していることです。プロセッサは自動的には何も実行しないため、SPIおよびシリアル通信全般の洞察に関する知識が大幅に向上します。

Adafruitの例から始めて、後でSPIのRPiでハードウェア実装を使用することをお勧めします。その場合、データシートが必要になります(Adafruitソフトウェア実装を使用する場合にも便利です)。 、第5章および第6章では、通信と、ADCを使用するために何を設定する必要があるかについて説明します。


私はビットバンギングの実装を完全に避け、ハードウェアバージョンにまっすぐ進みます。ここでの良い、簡単な例:Jeremyのブログ:MCP3008を使用したRaspberry PiハードウェアSPIアナログ入力
2013

ありがとう。adafruitのチュートリアルを見てきましたが、これを使用してADCをRPiに接続する予定です。説明から外れました。ただし、現時点では、adafruitコードとビットバンギングの考え方は、彼女(および私)にとって複雑すぎます。彼女はそれを裁判官に説明することができませんでした。ハードウェアのバージョンを確認し、その外観を確認します。だが 。。。マイク出力が小さすぎる(@scruss)ことは確かに問題になります。あなたのすべての回答に感謝します、彼らは大きな助けになります!
user5769 2013

Adafruitのエレクトレットマイクアンプがあり、エレクトレットの出力をADCが読み取れるものにステップアップします。マイクカプセルが含まれています。
2013

0

MCP3008およびAdafruit_MCP3008とAdafruit.SPI Pythonライブラリを備えたハードウェアSPIの場合:

Adafruit.SPIライブラリのSpiDevオブジェクトの関数set_clock_frequency( 'value in Hz')を調整しようとしました。だから、のようなもの、

import Adafruit_SPI as SPI  
ChangeClk=SPI.SpiDev(spi=0, port=0, max_speed = default)
ChangeClk.set_clock_frequency(90000)

5 KHzのサンプリングレートが必要でしたが(MCP3008には5 Vが与えられていました)、DSPで観察すると、Raspberry Piモデル2 Bは25 KHzのシリアルCLOCKを与えていました。5 KHzのアナログ入力信号のサンプリングレートの場合、PiからのシリアルCLKは90 KHz(MCP 3008データシートに記載されているように、サンプリングレートの18倍)である必要があります。しかし、これでも役に立たず、Pythonスクリプトの実行中は変更されません。

また、意外なことに、RPiのSPYDER IDEで同じコードを実行すると、1秒で1006の値が出力され、組み込みのPython-2シェルとは異なり、設定を上記と同じにして1 KHzにすると、サンプリングレートが向上しました。


これを再フォーマットしてみませんか?現在の形式での答えは読みにくいです。ポインタが必要な場合は、ヘルプセンターをご覧ください。
ダースベイダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.