RPi作为声级计?


10

对于我女儿的Science Fair项目(计算机科学和数学类),她想使用RPi来测量不同的响声是否超过疼痛阈值并损害我们的耳朵。她是6年级的学生,但是她具有RPi和Python编程经验。Phillip Heels Nichols在FB RPi页面上回答了一些问题,但建议我们过来寻求更多帮助。她想用声压计(我有一个)校准Pi,以找出产生了多少毫伏。

到目前为止,这是我们的想法。我们从adafruit购买了ADC(MCP3008),正在等待其到来。如果我们将adc的数字输出连接到GPIO引脚11,并将GPIO引脚12连接到红色LED,那么这个简单的程序可以工作吗?

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)#确保LED熄灭SPL = 0#将变量清零,而SPL <??:#Where ?? 是在130 db时声音产生的毫伏值SPL = GPIO.input(11)#从连接到麦克风GPIO的adc获取值。output(12,GPIO.HIGH)#如果声音级别高于,则打开LED指示灯? ?
user5769

1
您可以编辑自己的帖子,如果您在代码前放置4个空格,则会将其放入特殊的“代码”框中,并保持格式。使它更容易阅读。并不是真正与这个问题有关,但是对于六年级的学生来说,这真是令人印象深刻!!!我希望我从小就开始。
冲动

1
出于兴趣,声压计的品牌/型号是什么?
recantha

仪表的输出是否被预先放大?否则,麦克风输出将太小而无法读取MCP3008。
scruss

请注意,您不能仅仅使用ADC来有效地测量声压。您必须测量振荡波形,然后在软件中测量其振幅(可能会按照实际电表的趋向应用频率相关的加权),或者在信号到达ADC之前对其进行整流。您可能想先使用带有声卡的PC进行一些实验,以了解算法。
克里斯·斯特拉顿

Answers:


3

仅将ADC的数字输出引脚连接到RPi GPIO的引脚11才能使用SPI总线。该总线需要多根电线,准确地说是4根。

ADC还需要一个SPI输入,连接的时钟和片选引脚以正常工作。幸运的是,可以从多个来源获得关于此的良好信息。

首先,如果您想进一步了解SPI,我建议阅读Wikipedia上的此页面,以更好地了解SPI。

其次,有一个很好的Adafruits教程,它很好地讨论了该主题,其中包括Python代码,并指导您完成连接ADC本身并与其通信的过程。一个(次要)缺点是,本教程中使用的代码不使用SPI端口本身,而是软件仿真SPI总线(称为“位撞”),这意味着您可以更自由地使用GPIO端口上的引脚你要。

我想为您的项目比较简单(尽管现在令我感到惊讶的是,六年级学生会做这些任务!因为对他们来说,通过制作此类项目会给他们带来很多新信息),按位分配解决方案就可以了精细。使用位冲击的优点是,出于学习目的,它更适合,因为您可以自己创建所有SPI信号,处理器不会自动执行任何操作,因此您通常会获得对SPI和串行通信的更深入的了解!

也许从Adafruit的示例开始,然后在以后转而使用RPi上的SPI的硬件实现是一个好主意,在这种情况下,您需要数据表(在使用Adafruit软件实现时也很方便)第5章和第6章介绍了通信以及使用ADC需要配置的内容。


我会完全避免麻烦的实现,而直接使用硬件版本。此处的简单示例很好:Jeremy的博客:使用MCP3008的Raspberry Pi硬件SPI模拟输入
scruss

谢谢。我们已经看过adafruit的教程,并计划使用它来将ADC连接到RPi。我们只是将该步骤留给了我们的描述。但是,对于她(和我)而言,adafruit代码和点敲打的想法现在太复杂了。她永远无法向法官解释这一点。我们将检查硬件版本,并查看外观。但是。。。麦克风输出太小(@scruss)的事实肯定会成为一个问题。感谢您的所有回答,他们将为您提供很大的帮助!
user5769

Adafruit 的驻极体麦克风放大器将驻极体的输出提高到ADC可以读取的值。它包括一个麦克风盒。
scruss

0

对于具有MCP3008和Adafruit_MCP3008和Adafruit.SPI Python库的硬件SPI:

我试图调整Adafruit.SPI库的SpiDev对象的set_clock_frequency('value in Hz')函数。所以像

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

我想要5 KHz的采样率(向MCP3008提供5 V),但是当在DSO上观察时,Raspberry Pi 2 B型的串行时钟为25 KHz。对于5 KHz的模拟输入信号采样率,Pi的串行CLK应为90 KHz(18倍采样率,如MCP 3008数据表所述)。但是,即使这样做也无济于事,并且在python脚本运行时一切保持不变。

同样令人惊讶的是,同一代码在RPi上的SPYDER IDE上运行时,在1秒内打印出1006的值,这表明与内置的Python-2外壳不同,其设置保持与1 KHz相同的情况下,采样率有所提高。


您可以重新格式化吗?您当前格式的答案难以阅读。如果您需要任何指导,请查看帮助中心。
达斯·维达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.