RPi как измеритель уровня звука?


10

Для научного ярмарочного проекта моей дочери (категория «Компьютерные науки и математика») она хотела бы использовать RPi, чтобы обойти и измерить, находятся ли различные громкие звуки выше порога боли и повреждают ли наши уши. Она шестиклассница, но у нее есть опыт работы с RPi и программированием на Python. Филип Хилс Николс ответил на несколько вопросов на странице FB RPi, но предложил прийти сюда за дополнительной помощью. Она хочет откалибровать Пи с помощью измерителя звукового давления (у меня есть один из них), чтобы выяснить, сколько производится милливольт

Вот что мы думаем до сих пор. Мы купили adc (mcp3008) у adafruit и ожидаем его прибытия. Если мы подключим цифровой выход от АЦП к контакту 11 GPIO и к контакту 12 GPIO с красным светодиодом, сработает ли эта простая программа?

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 # обнулить переменную Пока SPL <??: #Where ?? Является ли значение в милливольтах, создаваемое звуком при 130 дБ SPL = GPIO.input (11) #get значением от АЦП, подключенного к микрофону GPIO.output (12, GPIO.HIGH) # Повернуть светодиод, если уровень звука выше, чем? ?
user5769

1
Вы можете редактировать свой пост, если вы поместите 4 пробела перед кодом, он поместит его в специальное поле «код» и продолжит форматирование. Делает это намного проще для чтения. Не совсем относится к вопросу, но это впечатляет для шестиклассника !!!! Хотел бы я начать так молодым.
Импульс

1
Из интереса, какой маркой / моделью является измеритель звукового давления?
Recantha

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

Обратите внимание, что вы не можете просто использовать АЦП для значимого измерения звукового давления. Вы должны либо измерить осциллирующий сигнал, а затем измерить его амплитуду в программном обеспечении (возможно, применяя частотно-зависимое взвешивание, как это делают реальные измерители), либо выпрямить сигнал до того, как он достигнет АЦП. Возможно, вы захотите провести некоторые эксперименты с использованием ПК со звуковой картой, чтобы получить представление об алгоритме.
Крис Страттон

Ответы:


3

Использование шины SPI, просто подключив вывод цифрового выхода АЦП к выводу 11 RPI GPIO, не будет работать. Этому автобусу нужно еще пару проводов, 4, если быть точным.

Для правильной работы АЦП также потребуется вход SPI, контакты синхронизации и выбора микросхемы. К счастью, есть хорошая информация об этом из нескольких источников.

Во-первых, если вы хотите узнать немного больше о работе SPI, я предлагаю прочитать эту страницу в Википедии, чтобы немного лучше узнать SPI.

Во-вторых, есть очень хорошее руководство по Adafruits, которое точно обсуждает эту тему, оно включает в себя код Python и поможет вам в процессе подключения самого ADC и связи с ним. Один (незначительный) недостаток заключается в том, что код, используемый в этом учебном пособии, не использует сам порт SPI, он программно эмулирует шину SPI (так называемую битовую привязку), это означает, что вы более свободно можете использовать контакты на порту GPIO, которые ты хочешь.

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

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


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

Спасибо. Мы посмотрели учебник adafruit и планируем использовать его для подключения АЦП к RPi. Мы просто оставили этот шаг вне нашего описания. Тем не менее, код adafruit и идея битовых ударов слишком сложны для нее (и меня) в данный момент. Она никогда не сможет объяснить это судьям. Мы проверим версию аппаратного обеспечения и посмотрим, как это выглядит. Но . , , тот факт, что выход микрофона слишком мал (@scruss), будет проблемой наверняка. Спасибо за все ваши ответы, они очень помогут!
user5769

Есть электретный микрофонный усилитель от Adafruit, который увеличивает выход электрета до того, что может прочитать АЦП. Включает в себя микрофонную капсулу.
scruss

0

Для аппаратного SPI с библиотеками MCP3008 и Adafruit_MCP3008 и Adafruit.SPI:

Я попытался настроить функцию 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 давала последовательный CLOCK 25 кГц при наблюдении на DSO. Для частоты дискретизации аналогового входного сигнала 5 кГц Serial 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.