RPi als Schallpegelmesser?

10

Für das Science-Fair-Projekt meiner Tochter (Kategorie Informatik und Mathematik) möchte sie das RPi verwenden, um zu messen, ob verschiedene laute Geräusche über der Schmerzschwelle liegen und unsere Ohren schädigen. Sie ist eine Sechstklässlerin, hat aber Erfahrung mit RPi und Programmierung in Python. Phillip Heels Nichols hat einige Fragen auf der FB RPi-Seite beantwortet, aber vorgeschlagen, dass wir hierher kommen, um weitere Hilfe zu erhalten. Sie möchte den Pi mit einem Schalldruckmesser (ich habe einen davon) kalibrieren, um herauszufinden, wie viele Millivolt produziert werden

Folgendes denken wir bisher. Wir haben einen ADC (MCP3008) von Adafruit gekauft und warten auf seine Ankunft. Funktioniert dieses einfache Programm, wenn wir den digitalen Ausgang des ADC mit dem GPIO-Pin 11 und den GPIO-Pin 12 mit einer roten LED verbinden?

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 ??

Wenn dies funktionieren würde, welcher Code könnte am Ende eingefügt werden, um das Programm per Knopfdruck zurückzusetzen, der mit den GPIO-Pins verbunden ist? Sie möchte, dass dies portabel ist, sodass sie keine Befehle eingeben kann, um das Programm erneut auszuführen.

user5769
quelle
Aus irgendeinem Grund wurde der Code abgeschnitten. Lassen Sie es mich noch einmal versuchen: Importieren Sie RPi.GPIO als GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # Stellen Sie sicher, dass die LED nicht leuchtet. SPL = 0 # Null der Variablen Während SPL <??: #Wo ?? Ist der Wert in Millivolt, der von einem Ton bei 130 dB erzeugt wird? SPL = GPIO.input (11) #Gewert von ADC an das Mikrofon GPIO.output (12, GPIO.HIGH) #Schalten Sie die LED ein, wenn der Schallpegel höher als? ?
user5769
1
Sie können Ihren Beitrag bearbeiten. Wenn Sie 4 Leerzeichen vor den Code setzen, wird dieser in ein spezielles "Code" -Feld eingefügt und die Formatierung wird fortgesetzt. Erleichtert das Lesen erheblich. Nicht wirklich in Bezug auf die Frage, aber das ist beeindruckend für einen 6. Schüler! Ich wünschte, ich hätte so jung angefangen.
Impulss
1
Welche Marke / welches Modell hat der Schalldruckmesser aus Interesse?
Recantha
Ist der Ausgang des Messgeräts vorverstärkt? Andernfalls ist der Mikrofonausgang viel zu klein, als dass ein MCP3008 ihn lesen könnte.
Scruss
Beachten Sie, dass Sie nicht einfach einen ADC verwenden können, um den Schalldruck sinnvoll zu messen. Sie müssen entweder die oszillierende Wellenform messen und dann ihre Amplitude in der Software messen (möglicherweise eine frequenzabhängige Gewichtung anwenden, wie dies bei realen Messgeräten der Fall ist) oder das Signal korrigieren, bevor es den ADC erreicht. Möglicherweise möchten Sie zuerst einige Experimente mit einem PC mit Soundkarte durchführen, um sich ein Bild vom Algorithmus zu machen.
Chris Stratton

Antworten:

3

Die Verwendung des SPI-Busses durch einfaches Verbinden des Digitalausgangs des ADC mit Pin 11 des RPi-GPIO funktioniert nicht. Dieser Bus benötigt noch ein paar Drähte, 4 um genau zu sein.

Der ADC benötigt außerdem einen SPI-Eingang, Clock- und Chip Select-Pins, die angeschlossen sind, um ordnungsgemäß zu funktionieren. Glücklicherweise gibt es hierzu gute Informationen aus mehreren Quellen.

Wenn Sie etwas mehr über die Arbeitsweise von SPI erfahren möchten, empfehle ich zunächst, diese Seite auf Wikipedia zu lesen , um SPI ein wenig besser kennenzulernen.

Zweitens gibt es eine sehr schöne Tutorial von Adafruits , die genau dieses Thema diskutiert, enthält es Python - Code und führt Sie durch die Prozesse des Verbindens des ADC selbst und die Kommunikation mit ihm. Ein (kleiner) Nachteil ist, dass der in diesem Tutorial verwendete Code nicht den SPI-Port selbst verwendet, sondern den SPI-Bus emuliert (Bit-Banging genannt). Dies bedeutet, dass Sie die Pins am GPIO-Port freier verwenden können Sie wollen.

Ich nehme an, für Ihr relativ einfaches Projekt (obwohl ich heutzutage glücklich überrascht bin, dass Schüler der 6. Klasse diese Art von Aufgaben erledigen! Für sie werden durch diese Art von Projekten viele neue Informationen auf sie geworfen) wird die Bit-Banging-Lösung genau funktionieren fein. Ein Vorteil der Verwendung von Bit Banging besteht darin, dass es für Lernzwecke besser geeignet ist, da Sie alle SPI-Signale selbst erstellen und der Prozessor nichts automatisch ausführt, sodass Sie am Ende viel bessere Kenntnisse über SPI und serielle Kommunikation im Allgemeinen erhalten!

Vielleicht ist es eine gute Idee, mit den Beispielen von Adafruit zu beginnen und zu einem späteren Zeitpunkt die Hardware-Implementierung auf dem RPi für SPI zu verwenden. In diesem Fall benötigen Sie das Datenblatt (auch praktisch , wenn Sie die Adafruit-Software-Implementierung verwenden). , Kapitel 5 und 6 beschreiben die Kommunikation und was für die Verwendung des ADC konfiguriert werden muss.

ikku
quelle
Ich würde die Bit-Banging-Implementierungen ganz vermeiden und direkt zur Hardwareversion gehen. Gutes, einfaches Beispiel hier: Jeremys Blog: Raspberry Pi-Hardware-SPI-Analogeingänge mit dem MCP3008 .
Scruss
Vielen Dank. Wir haben uns das Tutorial von adafruit angesehen und planen, es zu verwenden, um den ADC mit dem RPi zu verbinden. Wir haben diesen Schritt einfach aus unserer Beschreibung herausgelassen. Der Adafruit-Code und die Idee des Bitbangens sind für sie (und mich) zu diesem Zeitpunkt jedoch viel zu kompliziert. Sie würde das den Richtern niemals erklären können. Wir werden uns die Hardwareversion ansehen und sehen, wie das aussieht. Aber . . . Die Tatsache, dass der Mikrofonausgang zu klein ist (@scruss), wird mit Sicherheit ein Problem sein. Vielen Dank für all Ihre Antworten, sie werden sehr hilfreich sein!
user5769
Es gibt den Elektretmikrofonverstärker von Adafruit, der den Elektretausgang auf etwas erhöht, das der ADC lesen kann. Es enthält eine Mikrofonkapsel.
Scruss
0

Für Hardware-SPI mit MCP3008- und Adafruit_MCP3008- und Adafruit.SPI-Python-Bibliotheken:

Ich habe versucht, die Funktion set_clock_frequency ('Wert in Hz') des SpiDev-Objekts der Adafruit.SPI-Bibliothek zu optimieren. Also so etwas wie

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

Ich wollte eine Abtastrate von 5 kHz (5 V wurden an MCP3008 abgegeben), aber das Raspberry Pi Modell 2 B ergab eine serielle UHR von 25 kHz, wenn es auf DSO beobachtet wurde. Für eine Abtastrate des analogen Eingangssignals von 5 kHz sollte die serielle CLK von Pi 90 kHz betragen (18-fache Abtastrate, wie im Datenblatt MCP 3008 angegeben). Selbst dies konnte jedoch nicht helfen und die Dinge bleiben unverändert, während das Python-Skript ausgeführt wird.

Es ist auch überraschend, dass derselbe Code, der auf SPYDER IDE unter RPi ausgeführt wurde, in 1 Sekunde 1006 Werte druckte, was auf eine verbesserte Abtastrate hinweist, wobei die Einstellungen im Gegensatz zur eingebauten Python-2-Shell auf 1 kHz gehalten wurden.

S Vyas
quelle
Könnten Sie versuchen, dies neu zu formatieren? Ihre Antwort im aktuellen Format ist schwer zu lesen. Wenn Sie Hinweise benötigen, schauen Sie in der Hilfe nach.
Darth Vader