소음계로서의 RPi?


10

딸의 과학 박람회 프로젝트 (컴퓨터 과학 및 수학 범주)의 경우, 그녀는 RPi를 사용하여 다른 시끄러운 소리가 고통의 문턱 이상을 넘어 귀를 손상시키는 지 측정하고 싶습니다. 그녀는 6 학년이지만 Python에서 RPi 및 프로그래밍 경험이 있습니다. 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 # 변수가 0 인 동안 SPL <?? : #Where ?? 130 db에서 사운드에 의해 생성 된 밀리 볼트 단위의 값입니다. SPL = GPIO.input (11) # 마이크에 연결된 adc의 값 가져 오기 GPIO.output (12, GPIO.HIGH) # 사운드 레벨이?보다 높으면 LED를 켭니다. ?
user5769

1
코드 앞에 4 개의 공백을 넣으면 게시물을 편집 할 수 있으며, 특수한 "코드"상자에 넣고 서식을 유지합니다. 읽기가 훨씬 쉽습니다. 실제로 질문과 관련이 없지만 6 학년 학생들에게는 인상적입니다! 나는 그 젊은이를 시작했으면 좋겠다.
Impulss

1
흥미롭게도, 음압 계는 어떤 제조사 / 모델입니까?
recantha

미터의 출력이 사전 증폭되어 있습니까? 그렇지 않으면 마이크 출력이 너무 작아 MCP3008이 읽을 수 없습니다.
scruss

ADC를 사용하여 음압을 의미있게 측정 할 수는 없습니다. 발진 파형을 측정 한 다음 소프트웨어에서 진폭을 측정하거나 (실제 미터에 따라 주파수 종속 가중치를 적용 할 수 있음) ADC에 도달하기 전에 신호를 수정해야합니다. 알고리즘에 대한 아이디어를 얻기 위해 먼저 사운드 카드가있는 PC를 사용하여 몇 가지 실험을 수행 할 수 있습니다.
Chris Stratton

답변:


3

ADC의 디지털 출력 핀을 RPi GPIO의 핀 11에 연결하기 만하면 SPI 버스를 사용할 수 없습니다. 이 버스는 두 개 이상의 전선이 필요합니다.

ADC는 또한 제대로 작동하려면 SPI 입력, 클럭 및 칩 선택 핀이 필요합니다. 운 좋게도 여러 출처에서 얻을 수있는 좋은 정보가 있습니다.

먼저 SPI 작동에 대해 조금 더 알고 싶다면 Wikipedia에서이 페이지 를 읽고 SPI를 조금 더 잘 알아볼 것을 권장합니다 .

둘째 ,이 주제에 대해 정확하게 설명 하는 Adafruits에 대한 훌륭한 자습서가 있습니다 . 여기에는 Python 코드가 포함되어 있으며 ADC 자체를 연결하고 통신하는 프로세스를 안내합니다. 이 튜토리얼에서 사용되는 코드는 SPI 포트 자체를 사용하지 않고 소프트웨어가 SPI 버스 (비트 뱅킹)를 에뮬레이트한다는 점에서 가장 작은 단점은 GPIO 포트의 핀을 더 자유롭게 사용할 수 있다는 의미입니다. 당신이 원합니다.

나는 비교적 간단한 프로젝트에 대해 생각합니다 (현재 6 학년 학생들이 이런 종류의 작업을 수행하는 것에 놀랐습니다!). 이러한 유형의 프로젝트를 통해 많은 새로운 정보가 그들에게 던져지기 때문에 비트 뱅킹 솔루션은 효과가 있습니다. 좋아. 비트 뱅킹을 사용하면 얻을 수있는 장점은 모든 SPI 신호를 직접 생성하고 프로세서가 자동으로 수행하지 않기 때문에 학습 목적에 더 적합하다는 것입니다. 따라서 일반적으로 SPI 및 직렬 통신에 대한 훨씬 더 나은 통찰력을 얻게됩니다!

어쩌면 Adafruit의 예제로 시작하여 나중에 SPI에 대한 RPi의 하드웨어 구현 사용으로 이동하는 것이 좋습니다.이 경우 데이터 시트 가 필요합니다 (Adafruit 소프트웨어 구현을 사용하는 동안에도 편리함) , 5 장 및 6 장에서는 통신 및 ADC를 사용하도록 구성해야하는 사항에 대해 설명합니다.


비트 뱅잉 구현을 완전히 피하고 하드웨어 버전으로 바로 이동합니다. 좋은 간단한 예 : Jeremy 블로그 : MCP3008을 사용한 Raspberry Pi 하드웨어 SPI 아날로그 입력 .
scruss

감사. 우리는 adafruit의 튜토리얼을 살펴보고이를 사용하여 adc를 RPi에 연결합니다. 우리는 그 단계를 설명에서 제외했습니다. 그러나 adafruit 코드와 비트 뱅잉 아이디어는 현재 그녀와 나에게는 너무 복잡합니다. 그녀는 판사에게 그것을 설명 할 수 없었습니다. 우리는 하드웨어 버전을 확인하고 그 모습을 볼 것입니다. 그러나. . . 마이크 출력이 너무 작다는 사실 (@scruss)은 확실히 문제가 될 것입니다. 모든 답변에 감사드립니다. 많은 도움이 될 것입니다!
user5769

Adafruit 의 Electret 마이크로폰 앰프 는 일렉 트릿의 출력을 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)

5KHz 샘플링 속도 (MCP3008에 5V 제공)를 원했지만 Raspberry Pi 모델 2B는 DSO에서 관찰했을 때 25KHz의 직렬 CLOCK을 제공했습니다. 5KHz의 아날로그 입력 신호 샘플링 속도의 경우 Pi의 직렬 CLK는 90KHz (MCP 3008 데이터 시트에 제공된 샘플링 속도의 18 배) 여야합니다. 그러나 이것조차도 파이썬 스크립트가 실행되는 동안 도움이되지 않고 일이 변경되지 않습니다.

놀랍게도, RPi의 SPYDER IDE에서 실행될 때 동일한 코드는 1 초 만에 1006 값을 인쇄하여 내장 Python-2 셸과 달리 설정을 1KHz 이상으로 유지하면서 샘플링 속도가 향상되었음을 나타냅니다.


이것을 재 포맷 할 수 있습니까? 현재 형식의 답변을 읽기가 어렵습니다. 포인터가 필요한 경우 도움말 센터를 살펴보십시오.
다스 베이더
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.