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.
Respostas:
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.
fonte
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,
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.
fonte