RPI як вимірювач рівня звуку?


10

Для проекту наукової ярмарки моєї дочки (категорія «Комп’ютерні науки та математика») вона хотіла б використовувати RPI, щоб обмінятись та виміряти, чи не звучать різні голосні звуки вище порогового болю і чи не пошкоджують наші вуха. Вона шестикласниця, але у неї є досвід роботи з RPi та програмуванням в Python. Phillip Heels Nichols відповів на деякі запитання на сторінці FB RPi, але запропонував нам прийти сюди за додатковою допомогою. Вона хоче відкалібрувати Пі за допомогою вимірювача звукового тиску (у мене є один із них), щоб зрозуміти, скільки мілівольт виробляється

Ось що ми думаємо поки що. Ми купили adc (mcp3008) у adafruit і чекаємо його приходу. Якщо ми підключимо цифровий висновок від ADC до штифта GPIO 11 та контакту GPIO 12 до червоного світлодіода, чи буде ця проста програма працювати?

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) # переконайтесь, що світлодіодний індикатор вимкнено SPL = 0 #zero змінна, тоді як SPL <??: #Where ?? - це значення в мілівольтах, що видається звуком зі швидкістю 130 дБ SPL = GPIO.input (11) #get значення від ADC, підключеного до мікрофона GPIO.output (12, GPIO.HIGH) # увімкнути світлодіод, якщо рівень звуку вище? ?
користувач5769

1
Ви можете редагувати свою публікацію, якщо перед кодом поставити 4 пробіли, вона помістить її в спеціальне поле «код» і продовжує форматування. Полегшує читання. Не дуже стосується питання, але це вражає для шестикласника !!!! Я б хотіла, щоб я почав цю молоду.
Імпульс

1
З інтересу, що маркою / моделлю є вимірювач звукового тиску?
recantha

Чи попередньо підсилений вихід з лічильника? В іншому випадку вихід мікрофона буде занадто малим, щоб MCP3008 міг прочитати.
scruss

Зауважте, що ви не можете просто використовувати АЦП для змістовного вимірювання звукового тиску. Ви повинні або виміряти коливальну форму хвилі, а потім виміряти її амплітуду в програмному забезпеченні (можливо, застосовувати залежне від частоти зважування у міру дії реальних лічильників) або іншим чином виправити сигнал до того, як він досягне АЦП. Можливо, ви хочете спершу провести кілька експериментів, використовуючи ПК із звуковою карткою, щоб зрозуміти алгоритм.
Кріс Страттон

Відповіді:


3

Використання шини SPI шляхом простого підключення цифрового штифта АЦП до контакту 11 RPI GPIO не буде працювати. Для цієї шини потрібно ще пару проводів, 4 щоб бути точним.

АЦП також знадобиться штифти для входу SPI, штифти та мікросхеми для підключення, щоб правильно функціонувати. На щастя, є добра інформація про це, доступна з багатьох джерел.

По-перше, якщо ви хочете дізнатися трохи більше про роботу SPI, пропоную прочитати цю сторінку у Вікіпедії, щоб познайомитися з SPI трохи краще.

По-друге, є дуже приємний підручник з Adafruits, який точно обговорює цю тему, він включає в себе код Python і проводить вас через процеси підключення самого АЦП та спілкування з ним. Один (незначний) недолік полягає в тому, що код, що використовується в цьому підручнику, не використовує сам порт SPI, але програмне забезпечення емулює шину SPI (так званий біт-удар), це означає, що ви вільніше використовувати шпильки на порту GPIO, ти хочеш.

Я припускаю, що для вашого відносно простого проекту (хоча я щасливо здивований, що зараз шестикласники роблять подібні завдання! Для них багато нової інформації кидається на них, роблячи такі проекти), рішення для розбиття бітів буде працювати просто штрафу. Перевага використання розбиття бітів полягає в тому, що для цілей навчання він підходить краще, оскільки ви створюєте всі сигнали SPI самостійно, процесор нічого не робить автоматично, тому ви отримаєте набагато кращі знання про SPI та послідовну комунікацію взагалі!

Можливо, приємно почати з прикладів з Adafruit і пізніше перейти до використання апаратної реалізації RPI для SPI, і в цьому випадку вам знадобиться таблиця даних (також зручна під час використання програмного забезпечення Adafruit) , Глави 5 та 6 описують зв’язок та що потрібно налаштувати для використання АЦП.


Я б взагалі уникав розбіжних реалізацій і перейшов до апаратної версії. Хороший, простий приклад тут: Блог Джеремі: Аналогові входи SPI-аналогових входів Raspberry Pi за допомогою MCP3008 .
scruss

Дякую. Ми розглянули підручник з adafruit і плануємо використовувати його для підключення adc до RPi. Ми просто залишили цей крок поза нашим описом. Однак код адафрута та ідея розбиття бітів є надто складними для неї (і мене) на даний момент. Вона ніколи не зможе пояснити це суддям. Ми перевіримо версію обладнання та побачимо, як це виглядає. Але. . . той факт, що вихід мікрофона занадто малий (@scruss), буде точно проблемою. Дякуємо за всі ваші відповіді, вони дуже допоможуть!
користувач5769

Є підсилювач мікрофона Electret від Adafruit, який підсилює вихід електротрета до того, що може прочитати АЦП. До неї входить мікрофонна капсула.
scruss

0

Для апаратних SPI з бібліотеками MCP3008 та Adafruit_MCP3008 та Adafruit.SPI Python:

Я намагався ввімкнути функцію set_clock_frequency ('значення в Гц') об'єкта SpiDev бібліотеки Adafruit.SPI. Так щось,

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

Я хотів, щоб частота дискретизації 5 КГц (5 В була віддана MCP3008), але модель Raspberry Pi 2 B давала серійний ЧАС 25 КГц, коли спостерігалася на DSO. Для аналогової частоти дискретизації вхідного сигналу 5 КГц, послідовний CLK від Pi повинен бути 90 КГц (18-кратна частота дискретизації, як зазначено в таблиці даних MCP 3008). Однак навіть це не могло допомогти, і все залишається незмінним під час запуску сценарію python.

Також дивно, що той самий код при запуску на SPYDER IDE на RPi надрукував значення 1006 за 1 секунду, що вказує на покращену частоту дискретизації з налаштуваннями, які зберігаються такими ж, як вище, ніж 1 КГц на відміну від вбудованої оболонки Python-2.


Чи можете ви спробувати переформатувати це? Ваша відповідь у нинішньому форматі важко прочитати. Якщо вам потрібні якісь покажчики, перегляньте довідковий центр.
Дарт Вейдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.