RPi sebagai Sound Level Meter?


10

Untuk proyek sains putri saya (kategori Ilmu Komputer dan Matematika), ia ingin menggunakan RPi untuk berkeliling dan mengukur apakah suara keras yang berbeda berada di atas ambang rasa sakit dan merusak telinga kita. Dia adalah siswa kelas 6, tetapi dia memiliki pengalaman dengan RPi dan pemrograman dengan Python. Phillip Heels Nichols telah menjawab beberapa pertanyaan di halaman FB RPi, tetapi menyarankan agar kami datang ke sini untuk bantuan lebih lanjut. Dia ingin mengkalibrasi Pi dengan pengukur tekanan suara (saya punya satu di antaranya) untuk mencari tahu berapa milivolt yang dihasilkan

Inilah yang kami pikirkan sejauh ini. Kami membeli adc (mcp3008) dari adafruit dan menunggu kedatangannya. Jika kita menghubungkan output digital dari adc ke pin GPIO 11 dan pin GPIO 12 ke LED merah, apakah program sederhana ini akan berfungsi?

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

Jika ini berhasil, kode apa yang bisa diletakkan di akhir untuk mereset program dengan menekan tombol yang terhubung ke pin GPIO? Dia ingin ini portabel, jadi dia tidak akan bisa mengetik perintah untuk menjalankan program lagi.


Untuk beberapa alasan, kode terputus. Biarkan saya coba lagi: impor RPi.GPIO sebagai GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # pastikan LED tidak aktif SPL = 0 # nol variabel Sementara SPL <??: #Dimana ?? adalah nilai dalam milivolt yang dihasilkan oleh suara pada 130 db SPL = GPIO.input (11) # dapatkan nilai dari adc yang terhubung ke mikrofon GPIO.output (12, GPIO.HIGH) # menghidupkan LED jika tingkat suara lebih tinggi dari? ?
user5769

1
Anda dapat mengedit posting Anda, jika Anda menempatkan 4 spasi di depan kode, itu menempatkannya ke dalam kotak "kode" khusus, dan terus memformat. Membuatnya lebih mudah dibaca. Tidak benar-benar berkaitan dengan pertanyaan, tapi itu mengesankan untuk siswa kelas 6 !!!! Saya berharap saya mulai semuda itu.
Impuls

1
Karena ketertarikan, apa yang membuat / model pengukur tekanan suara?
recantha

Apakah output dari meter pra-diperkuat? Jika tidak, output mikrofon akan terlalu kecil untuk dibaca oleh MCP3008.
scruss

Perhatikan bahwa Anda tidak bisa hanya menggunakan ADC untuk mengukur tekanan suara secara bermakna. Anda harus mengukur bentuk gelombang berosilasi dan kemudian mengukur amplitudo dalam perangkat lunak (mungkin menerapkan pembobotan tergantung-frekuensi seperti yang ditunjukkan oleh meter nyata) atau memperbaiki sinyal sebelum mencapai ADC. Anda mungkin ingin menjalankan beberapa percobaan menggunakan PC dengan kartu suara terlebih dahulu untuk mendapatkan gagasan tentang algoritma.
Chris Stratton

Jawaban:


3

Menggunakan bus SPI dengan hanya menghubungkan pin keluar digital ADC ke pin 11 dari GPi RPi tidak akan berfungsi. Bus ini membutuhkan beberapa kabel lagi, 4 tepatnya.

ADC juga akan membutuhkan input SPI, pin Clock dan Chip Select yang terhubung agar berfungsi dengan benar. Untungnya ada informasi bagus tentang ini yang tersedia dari berbagai sumber.

Pertama jika Anda ingin tahu lebih banyak tentang cara kerja SPI, saya sarankan untuk membaca halaman ini di Wikipedia untuk mengenal SPI sedikit lebih baik.

Kedua, ada tutorial yang sangat bagus tentang Adafruits yang membahas topik ini, termasuk kode Python dan memandu Anda melalui proses menghubungkan ADC itu sendiri dan berkomunikasi dengannya. Satu kelemahan (minor) adalah bahwa kode yang digunakan dalam tutorial ini tidak menggunakan port SPI itu sendiri, itu perangkat lunak mengemulasi bus SPI (disebut bit-banging), ini berarti bahwa Anda lebih bebas untuk menggunakan pin pada port GPIO yang kamu ingin.

Saya kira untuk proyek Anda yang relatif sederhana (walaupun saya sangat terkejut saat ini siswa kelas 6 mengerjakan tugas-tugas semacam ini !, bagi mereka banyak informasi baru diberikan kepada mereka dengan membuat proyek semacam ini), solusi bit-banging akan bekerja baik. Keuntungan menggunakan bit banging adalah bahwa untuk tujuan pembelajaran lebih baik karena Anda membuat sendiri semua sinyal SPI, prosesor tidak melakukan apa pun secara otomatis, sehingga Anda akan mendapatkan pengetahuan wawasan yang jauh lebih baik tentang SPI dan komunikasi serial secara umum!

Mungkin itu ide yang bagus untuk memulai dengan contoh-contoh dari Adafruit dan pindah di kemudian hari untuk menggunakan implementasi perangkat keras pada RPi untuk SPI, dalam hal ini Anda akan memerlukan lembar data (juga berguna saat menggunakan implementasi perangkat lunak Adafruit) , Bab 5 dan 6 menjelaskan komunikasi dan apa yang perlu dikonfigurasi untuk menggunakan ADC.


Saya akan menghindari implementasi bit-banging sama sekali, dan langsung ke versi perangkat keras. Bagus, contoh sederhana di sini: Jeremy Blog: Raspberry Pi hardware, input analog SPI menggunakan MCP3008 .
scruss

Terima kasih. Kami telah melihat tutorial adafruit dan berencana untuk menggunakannya untuk menghubungkan ADC ke RPi. Kami baru saja meninggalkan langkah itu dari uraian kami. Namun, kode AdWords dan gagasan menggedor bit terlalu rumit baginya (dan saya) pada saat ini. Dia tidak akan pernah bisa menjelaskan hal itu kepada para hakim. Kami akan memeriksa versi perangkat keras dan melihat tampilannya. Tapi . . fakta bahwa output mikrofon terlalu kecil (@scruss) akan menjadi masalah. Terima kasih atas semua jawaban Anda, mereka akan sangat membantu!
user5769

Ada Electret Microphone Amplifier dari Adafruit yang meningkatkan output electret menjadi sesuatu yang dapat dibaca ADC. Ini termasuk kapsul mic.
scruss

0

Untuk SPI perangkat keras dengan pustaka MCP3008 dan Adafruit_MCP3008 dan Adafruit.SPI:

Saya telah mencoba untuk mengubah fungsi set_clock_frequency ('nilai dalam Hz') dari objek SpiDev perpustakaan Adafruit.SPI. Jadi sesuatu seperti,

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

Saya ingin sampling rate 5 KHz (5 V diberikan kepada MCP3008) tetapi Raspberry Pi model 2 B memberikan JAM seri 25 KHz ketika diamati pada DSO. Untuk laju pengambilan sampel sinyal input analog 5 KHz, Serial CLK dari Pi harus 90 KHz (laju pengambilan sampel 18 kali, seperti yang diberikan dalam lembar data MCP 3008). Namun bahkan ini tidak bisa membantu dan hal-hal tetap tidak berubah saat skrip python berjalan.

Juga mengejutkan, kode yang sama ketika dijalankan pada IDE SPYDER pada RPi mencetak nilai 1006 dalam 1 detik yang menunjukkan tingkat pengambilan sampel yang ditingkatkan dengan pengaturan tetap sama seperti di atas hingga 1 KHz tidak seperti shell Python-2 inbuilt.


Bisakah Anda mencoba memformat ulang ini? Jawaban Anda dalam format saat ini sulit dibaca. Jika Anda memerlukan petunjuk apa pun, coba lihat Pusat Bantuan.
Darth Vader
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.