RPi jako miernik poziomu dźwięku?


10

W przypadku projektu Science Fair mojej córki (kategoria informatyka i matematyka) chciałaby używać RPi do poruszania się i sprawdzania, czy różne głośne dźwięki są powyżej progu bólu i uszkadzają nasze uszy. Jest szóstoklasistką, ale ma doświadczenie z RPi i programowaniem w Pythonie. Phillip Heels Nichols odpowiedział na kilka pytań na stronie FB RPi, ale zasugerował, abyśmy przyszli tutaj po więcej pomocy. Chce skalibrować Pi za pomocą miernika ciśnienia akustycznego (mam jeden z nich), aby dowiedzieć się, ile miliwoltów jest wytwarzanych

Oto, co myślimy do tej pory. Kupiliśmy adc (mcp3008) od adafruita i czekamy na jego przybycie. Czy po podłączeniu wyjścia cyfrowego z adc do styku GPIO 11 i styku 12 GPIO do czerwonej diody LED, ten prosty program będzie działał?

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

Jeśli to zadziała, jaki kod można umieścić na końcu, aby zresetować program po naciśnięciu przycisku podłączonego do pinów GPIO? Chce, aby było to przenośne, więc nie będzie mogła wpisywać poleceń, aby ponownie uruchomić program.


Z jakiegoś powodu kod został odcięty. Pozwól, że spróbuję ponownie: zaimportuj RPi.GPIO jako GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # upewnij się, że dioda LED jest wyłączona SPL = 0 # wyzeruj zmienną Podczas gdy SPL <??: #Gdzie? to wartość w miliwoltach wytwarzanych przez dźwięk przy 130 db SPL = GPIO.input (11) #get wartość z ADC podłączonego do mikrofonu GPIO.output (12, GPIO.HIGH) # Włącz diodę LED, jeśli poziom dźwięku jest wyższy niż? ?
user5769

1
Możesz edytować swój post, jeśli umieścisz 4 spacje przed kodem, umieszcza go w specjalnym polu „kod” i kontynuuje formatowanie. Znacznie ułatwia czytanie. Niezupełnie związane z pytaniem, ale to imponujące jak na 6 klasę !!!! Chciałbym zacząć tak młody.
Impulss

1
Jakim marką / modelem jest miernik ciśnienia akustycznego?
recantha

Czy wyjście z miernika jest wstępnie wzmocnione? W przeciwnym razie wyjście mikrofonu będzie zbyt małe, aby MCP3008 mógł je odczytać.
scruss

Pamiętaj, że nie można po prostu użyć ADC do znaczącego pomiaru ciśnienia akustycznego. Musisz albo zmierzyć przebieg oscylacyjny, a następnie zmierzyć jego amplitudę w oprogramowaniu (ewentualnie stosując ważenie zależne od częstotliwości, tak jak robią to rzeczywiste mierniki), albo skorygować sygnał, zanim osiągnie ADC. Możesz najpierw przeprowadzić eksperymenty na komputerze PC z kartą dźwiękową, aby poznać algorytm.
Chris Stratton

Odpowiedzi:


3

Używanie magistrali SPI po prostu podłączając styk wyjścia cyfrowego ADC do styku 11 RPi GPIO nie będzie działać. Ta magistrala potrzebuje kilku dodatkowych przewodów, a dokładniej 4.

ADC będzie również wymagał podłączenia wejścia SPI, pinów Clock i Chip Select do prawidłowego działania. Na szczęście istnieją dobre informacje na ten temat dostępne z wielu źródeł.

Po pierwsze, jeśli chcesz dowiedzieć się więcej o działaniu SPI, sugeruję przeczytać tę stronę na Wikipedii, aby lepiej poznać SPI.

Po drugie, jest bardzo fajny samouczek Adafruits, który dokładnie omawia ten temat, zawiera kod Python i prowadzi przez proces łączenia samego ADC i komunikowania się z nim. Jedną (niewielką) wadą jest to, że kod użyty w tym samouczku nie korzysta z samego portu SPI, program emuluje magistralę SPI (zwaną bit-banging), co oznacza, że ​​masz większą swobodę w korzystaniu z pinów portu GPIO, które chcesz.

Podejrzewam, że w przypadku twojego stosunkowo prostego projektu (chociaż jestem szczęśliwie zaskoczony, że równiarki szóstego stopnia wykonują takie zadania !, dla nich rzuca się na nie wiele nowych informacji, tworząc tego rodzaju projekty), rozwiązanie bit-bit będzie działać tylko w porządku. Zaletą korzystania z bit bitu jest to, że do celów uczenia się lepiej pasuje, ponieważ sam tworzysz wszystkie sygnały SPI, procesor nie robi nic automatycznie, dzięki czemu uzyskasz lepszą wiedzę na temat SPI i komunikacji szeregowej w ogóle!

Być może dobrym pomysłem jest zacząć od przykładów z Adafruit i przejść później do korzystania z implementacji sprzętowej na RPi dla SPI, w takim przypadku potrzebujesz arkusza danych (również przydatnego podczas korzystania z implementacji oprogramowania Adafruit) , Rozdział 5 i 6 opisują komunikację oraz elementy, które należy skonfigurować, aby korzystać z ADC.


Unikałbym całkowicie bitowych implementacji i poszedłbym prosto do wersji sprzętowej. Dobry, prosty przykład tutaj: Blog Jeremy'ego: Sprzętowe wejścia analogowe SPI Raspberry Pi wykorzystujące MCP3008 .
scruss

Dzięki. Przejrzeliśmy samouczek adafruita i planujemy go użyć do połączenia adc z RPi. Właśnie opuściliśmy ten krok z naszego opisu. Jednak kod adafruitowy i pomysł bit bitu są w tej chwili zdecydowanie zbyt skomplikowane dla niej (i dla mnie). Nigdy nie byłaby w stanie wyjaśnić tego sędziom. Sprawdzimy wersję sprzętową i zobaczymy, jak to wygląda. Ale . . . fakt, że wyjście mikrofonu jest zbyt małe (@scruss), na pewno będzie problemem. Dziękuję za wszystkie odpowiedzi, które bardzo pomogą!
user5769

Istnieje wzmacniacz mikrofonu elektretowego od Adafruita, który zwiększa moc elektretu do czegoś, co ADC może odczytać. Zawiera kapsułkę z mikrofonem.
scruss

0

W przypadku sprzętowego interfejsu SPI z bibliotekami Python MCP3008 i Adafruit_MCP3008 i Adafruit.SPI:

Próbowałem dostosować do funkcji set_clock_frequency („wartość w Hz”) obiektu SpiDev biblioteki Adafruit.SPI. Coś w stylu

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

Chciałem częstotliwość próbkowania 5 KHz (5 M podano MCP3008), ale Raspberry Pi model 2 B dawał seryjny ZEGAR 25 KHz, gdy obserwowano go w DSO. Dla częstotliwości próbkowania analogowego sygnału wejściowego wynoszącej 5 KHz, szeregowy CLK od Pi powinien wynosić 90 KHz (18-krotna częstotliwość próbkowania, jak podano w arkuszu danych MCP 3008). Jednak nawet to nie mogło pomóc i rzeczy pozostają niezmienione podczas działania skryptu python.

Co zaskakujące, ten sam kod uruchomiony w SPYDER IDE na RPi drukował wartości 1006 w ciągu 1 sekundy, wskazując na lepszą częstotliwość próbkowania przy zachowaniu takich samych ustawień jak powyżej do 1 KHz, w przeciwieństwie do wbudowanej powłoki Python-2.


Czy mógłbyś spróbować sformatować to? Twoja odpowiedź w obecnym formacie jest trudna do odczytania. Jeśli potrzebujesz wskazówek, zajrzyj do Centrum pomocy.
Darth Vader
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.