RPi como um medidor de nível de som?

10

Para o projeto da feira de ciências da minha filha (categoria Ciência da computação e matemática), ela gostaria de usar o RPi para medir e medir se diferentes sons altos estão acima do limiar da dor e estão prejudicando nossos ouvidos. Ela é da sexta série, mas tem experiência com RPi e programação em Python. Phillip Heels Nichols respondeu a algumas perguntas na página do FB RPi, mas sugeriu que viéssemos aqui para obter mais ajuda. Ela quer calibrar o Pi com um medidor de pressão sonora (eu tenho um destes) para descobrir quantos milivolts são produzidos

Aqui está o que estamos pensando até agora. Compramos um adc (mcp3008) da adafruit e aguardamos sua chegada. Se conectarmos a saída digital do adc ao pino GPIO 11 e ao pino GPIO 12 a um LED vermelho, este programa simples funcionará?

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

Se isso funcionasse, qual código poderia ser colocado no final para redefinir o programa com o pressionar de um botão conectado aos pinos GPIO? Ela deseja que isso seja portátil, para que não seja possível digitar comandos para executar o programa novamente.

user5769
fonte
Por alguma razão, o código foi cortado. Deixe-me tentar novamente: importe RPi.GPIO como GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # verifique se o LED está desligado SPL = 0 # zero a variável Enquanto SPL <??: #Where ?? é o valor em milivolts produzido por um som a 130 db SPL = GPIO.input (11) #get valor do adc conectado ao microfone GPIO.output (12, GPIO.HIGH) #turn LED aceso se o nível de som for maior que? ?
User5769
11
Você pode editar sua postagem, se você colocar 4 espaços na frente do código, ele a colocará em uma caixa "código" especial e continuará a formatar. Facilita a leitura. Não está realmente relacionado com a questão, mas isso é impressionante para um aluno da 6ª série !!!! Eu gostaria de começar tão jovem.
Impulss
11
Fora de interesse, que marca / modelo é o medidor de pressão sonora?
#
A saída do medidor é pré-amplificada? Caso contrário, a saída do microfone será muito pequena para um MCP3008 ler.
scruss
Observe que você não pode simplesmente usar um ADC para medir significativamente a pressão do som. Você deve medir a forma de onda oscilante e, em seguida, medir sua amplitude no software (possivelmente aplicando a ponderação dependente da frequência como os medidores reais tendem a) ou então retificar o sinal antes de atingir o ADC. Você pode querer executar algumas experiências usando um PC com uma placa de som primeiro para ter uma idéia do algoritmo.
Chris Stratton

Respostas:

3

O uso do barramento SPI, apenas conectando o pino de saída digital do ADC ao pino 11 do RPi GPIO, não funcionará. Este barramento precisa de mais alguns fios, 4 para ser mais preciso.

O ADC também precisará de uma entrada SPI, pinos de Clock e Chip Select conectados para funcionar corretamente. Felizmente, há boas informações sobre isso disponíveis em várias fontes.

Primeiro, se você quiser saber um pouco mais sobre o funcionamento do SPI, sugiro ler esta página na Wikipedia para conhecer o SPI um pouco melhor.

Segundo, existe um tutorial muito bom do Adafruits que discute exatamente esse assunto, que inclui o código Python e o guia pelos processos de conexão do próprio ADC e comunicação com ele. Uma (menor) desvantagem é que o código usado neste tutorial não usa a porta SPI, ele emula o barramento SPI (chamado de troca de bits), isso significa que você tem mais liberdade para usar os pinos na porta GPIO que você quer.

Suponho que, para o seu projeto relativamente simples (embora hoje eu esteja feliz em surpreender os alunos da 6ª série realizem esse tipo de tarefa !, para eles, muitas informações novas são lançadas para eles ao fazer esse tipo de projeto), a solução que funciona pouco funciona bem. Uma vantagem do uso de bit bang é que, para fins de aprendizado, combina melhor porque você mesmo cria todos os sinais SPI, o processador não faz nada automaticamente, então você terá um conhecimento muito melhor sobre SPI e comunicações seriais em geral!

Talvez seja uma boa idéia começar com os exemplos do Adafruit e, posteriormente, usar a implementação de hardware no RPi for SPI; nesse caso, você precisará da folha de dados (também útil ao usar a implementação do software Adafruit) , Os capítulos 5 e 6 descrevem a comunicação e o que precisa ser configurado para usar o ADC.

ikku
fonte
Eu evitaria completamente as implementações de processamento de bits e segui direto para a versão do hardware. Exemplo simples e bom aqui: Blog do Jeremy: Entradas analógicas SPI do hardware Raspberry Pi usando o MCP3008 .
scruss
Obrigado. Analisamos o tutorial da adafruit e planejamos usá-lo para conectar o adc ao RPi. Acabamos de deixar esse passo fora de nossa descrição. No entanto, o código adafruit e a ideia de troca de bits são muito complicados para ela (e eu) neste momento. Ela nunca seria capaz de explicar isso aos juízes. Vamos verificar a versão do hardware e ver como isso se parece. Mas . . . o fato de a saída do microfone ser muito pequena (@scruss) será um problema, com certeza. Obrigado por todas as suas respostas, elas ajudarão bastante!
User5769
Existe o amplificador de microfone de eletreto da Adafruit que aumenta a saída do eletreto para algo que o ADC possa ler. Inclui uma cápsula de microfone.
scruss
0

Para hardware SPI com as bibliotecas MCP3008 e Adafruit_MCP3008 e Adafruit.SPI Python:

Tentei ajustar a função set_clock_frequency ('value in Hz') do objeto SpiDev da biblioteca Adafruit.SPI. Então, algo como,

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

Eu queria uma taxa de amostragem de 5 KHz (5 V foi dado ao MCP3008), mas o Raspberry Pi modelo 2 B estava fornecendo um RELÓGIO serial de 25 KHz quando observado no DSO. Para uma taxa de amostragem de sinal de entrada analógica de 5 KHz, o CLK serial do Pi deve ser de 90 KHz (taxa de amostragem de 18 vezes, conforme fornecido na folha de dados do MCP 3008). No entanto, nem isso pode ajudar e as coisas permanecem inalteradas enquanto o script python é executado.

Surpreendentemente, o mesmo código, quando executado no SPYDER IDE no RPi, imprimiu 1006 valores em 1 segundo, indicando uma taxa de amostragem aprimorada com as configurações mantidas iguais às anteriores a 1 KHz, diferentemente do shell Python-2 embutido.

S Vyas
fonte
Você poderia tentar reformatar isso? É difícil ler sua resposta no formato atual. Se você precisar de ponteiros, consulte a Central de Ajuda.
Darth Vader