RPi comme sonomètre?


10

Pour le projet d'expo-sciences de ma fille (catégorie Informatique et mathématiques), elle aimerait utiliser le RPi pour faire le tour et mesurer si différents sons forts sont au-dessus du seuil de la douleur et endommagent nos oreilles. Elle est élève de 6e, mais elle a de l'expérience avec RPi et la programmation en Python. Phillip Heels Nichols a répondu à quelques questions sur la page FB RPi, mais a suggéré que nous venions ici pour plus d'aide. Elle veut calibrer le Pi avec un manomètre (j'en ai un) pour savoir combien de millivolts sont produits

Voici ce que nous pensons jusqu'à présent. Nous avons acheté un adc (mcp3008) à adafruit et attendons son arrivée. Si nous connectons la sortie numérique de l'adc à la broche 11 du GPIO et à la broche 12 du GPIO à une LED rouge, ce programme simple fonctionnera-t-il?

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

Si cela fonctionnait, quel code pourrait être mis à la fin pour réinitialiser le programme en appuyant sur un bouton connecté aux broches GPIO? Elle veut que ce soit portable, donc elle ne pourra pas taper de commandes pour exécuter à nouveau le programme.


Pour une raison quelconque, le code a été coupé. Permettez-moi de réessayer: importez RPi.GPIO en tant que GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # assurez-vous que la LED est éteinte SPL = 0 # zéro la variable While SPL <??: #Where ?? est la valeur en millivolts produite par un son à 130 dB SPL = GPIO.input (11) #get value from adc connected to microphone GPIO.output (12, GPIO.HIGH) #turn LED on on if the sound level is upper than? ?
user5769

1
Vous pouvez modifier votre message, si vous mettez 4 espaces devant le code, il le place dans une boîte spéciale "code" et conserve le formatage. Le rend beaucoup plus facile à lire. Pas vraiment lié à la question, mais c'est impressionnant pour un élève de 6e !!!! Je souhaite avoir commencé si jeune.
Impulss

1
Par intérêt, quelle marque / modèle est le manomètre?
recantha

La sortie du compteur est-elle pré-amplifiée? Sinon, la sortie du microphone sera beaucoup trop petite pour être lue par un MCP3008.
scruss

Notez que vous ne pouvez pas simplement utiliser un ADC pour mesurer de manière significative la pression acoustique. Vous devez soit mesurer la forme d'onde oscillante, puis mesurer son amplitude dans le logiciel (en appliquant éventuellement une pondération en fonction de la fréquence comme les vrais compteurs), ou bien rectifier le signal avant qu'il n'atteigne l'ADC. Vous voudrez peut-être exécuter quelques expériences en utilisant un PC avec une carte son d'abord pour avoir une idée de l'algorithme.
Chris Stratton

Réponses:


3

L'utilisation du bus SPI en connectant simplement la broche de sortie numérique de l'ADC à la broche 11 du RPi GPIO ne fonctionnera pas. Ce bus a besoin de quelques fils supplémentaires, 4 pour être précis.

L'ADC aura également besoin d'une entrée SPI, d'horloge et de broches de sélection de puce connectées pour fonctionner correctement. Heureusement, il existe de bonnes informations à ce sujet provenant de plusieurs sources.

Tout d'abord, si vous souhaitez en savoir un peu plus sur le fonctionnement de SPI, je vous suggère de lire cette page sur Wikipedia pour mieux connaître SPI.

Deuxièmement, il y a un très bon tutoriel d'Adafruits qui traite exactement de ce sujet, il comprend du code Python et vous guide à travers les processus de connexion de l'ADC lui-même et de communication avec lui. Un inconvénient (mineur) est que le code utilisé dans ce didacticiel n'utilise pas le port SPI lui-même, il émule le bus SPI (appelé bit-banging), cela signifie que vous êtes plus libre d'utiliser les broches du port GPIO qui tu veux.

Je suppose que pour votre projet relativement simple (bien que je sois heureusement surpris de nos jours, les élèves de 6e font ce genre de tâches !, pour eux, beaucoup de nouvelles informations leur sont jetées en faisant ce type de projets), la solution de frappe va fonctionner juste bien. Un avantage de l'utilisation du bit banging est que, à des fins d'apprentissage, cela convient mieux car vous créez vous-même tous les signaux SPI, le processeur ne fait rien automatiquement, vous vous retrouverez donc avec une bien meilleure connaissance des SPI et des communications série en général!

C'est peut-être une bonne idée de commencer avec les exemples d'Adafruit et de passer à un stade ultérieur à l'utilisation de l'implémentation matérielle sur le RPi pour SPI, dans ce cas, vous aurez besoin de la fiche technique (également pratique lors de l'utilisation de l'implémentation du logiciel Adafruit) , Les chapitres 5 et 6 décrivent la communication et ce qui doit être configuré pour utiliser l'ADC.


J'éviterais complètement les implémentations de bits, et j'irais directement vers la version matérielle. Bon exemple simple ici: Blog de Jeremy: Entrées analogiques SPI matérielles du Raspberry Pi utilisant le MCP3008 .
scruss

Merci. Nous avons regardé le tutoriel d'adafruit et prévoyons de l'utiliser pour connecter l'adc au RPi. Nous venons de laisser cette étape hors de notre description. Cependant, le code adafruit et l'idée de frapper les bits sont beaucoup trop compliqués pour elle (et moi) à ce stade. Elle ne pourrait jamais expliquer cela aux juges. Nous allons vérifier la version matérielle et voir à quoi cela ressemble. Mais . . . le fait que la sortie du microphone soit trop petite (@scruss) sera certainement un problème. Merci pour toutes vos réponses, elles vous aideront beaucoup!
user5769

Il y a l' amplificateur de microphone à électret d'Adafruit qui augmente la sortie de l'électret à quelque chose que l'ADC peut lire. Il comprend une capsule de micro.
scruss

0

Pour les SPI matériels avec MCP3008 et Adafruit_MCP3008 et les bibliothèques Python Adafruit.SPI:

J'ai essayé de modifier la fonction set_clock_frequency ('valeur en Hz') de l'objet SpiDev de la bibliothèque Adafruit.SPI. Donc, quelque chose comme,

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

Je voulais un taux d'échantillonnage de 5 KHz (5 V a été donné au MCP3008) mais le Raspberry Pi modèle 2 B donnait une HORLOGE série de 25 KHz lorsqu'il était observé sur DSO. Pour un taux d'échantillonnage du signal d'entrée analogique de 5 KHz, le Serial CLK de Pi doit être de 90 KHz (18 fois le taux d'échantillonnage, comme indiqué dans la fiche technique MCP 3008). Cependant, même cela ne pouvait pas aider et les choses restent inchangées pendant l'exécution du script python.

Aussi surprenant, le même code lorsqu'il était exécuté sur SPYDER IDE sur RPi a imprimé 1006 valeurs en 1 seconde, ce qui indique une fréquence d'échantillonnage améliorée avec les mêmes paramètres que ci-dessus à 1 KHz contrairement au shell Python-2 intégré.


Pourriez-vous essayer de reformater cela? Votre réponse dans son format actuel est difficile à lire. Si vous avez besoin de pointeurs, consultez le centre d'aide.
Dark Vador
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.