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.
Odpowiedzi:
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.
źródło
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
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.
źródło