Ses Seviyesi Ölçer Olarak RPi?


10

Kızımın science fair projesi (Bilgisayar Bilimi ve Matematik kategorisi) için RPi'yi dolaşmak ve farklı yüksek seslerin acı eşiğinin üstünde olup olmadığını ve kulaklarımıza zarar verip vermediğini ölçmek istiyor. 6. sınıf öğrencisi, ancak Python'da RPi ve programlama deneyimi var. Phillip Heels Nichols, FB RPi sayfasında bazı soruları yanıtladı, ancak daha fazla yardım için buraya gelmemizi önerdi. Pi'yi kaç milivolt üretildiğini anlamak için bir ses basıncı ölçerle (bunlardan birine sahibim) kalibre etmek istiyor

İşte şimdiye kadar düşündüğümüz şey. Adafruit'ten bir adc (mcp3008) satın aldık ve gelişini bekliyoruz. ADC'den dijital çıkışı GPIO pin 11'e ve GPIO pin 12'ye kırmızı bir LED'e bağlarsak, bu basit program işe yarar mı?

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

Bu işe yararsa, GPIO pinlerine bağlı bir düğmeye basarak programı sıfırlamak için hangi kodun sonuna konabilir? Bunun taşınabilir olmasını istiyor, bu yüzden programı tekrar çalıştırmak için komut yazamayacak.


Nedense, kod kesildi. Tekrar deneyeyim: RPi.GPIO'yu GPIO olarak içe aktarın GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # LED'in kapalı olduğundan emin olun SPL = 0 # sıfır değişken ise SPL <??: #Where ?? db'de bir ses tarafından üretilen milivolt cinsinden değer SPL = GPIO.input (11) # mikrofon GPIO'ya bağlı adc'den gelen değer GPIO.output (12, GPIO.HIGH) # ses seviyesi daha yüksekse LED yanar mı? ?
user5769

1
Yazınızı düzenleyebilirsiniz, eğer kodun önüne 4 boşluk koyarsanız, onu özel bir "kod" kutusuna koyar ve biçimlendirmeye devam eder. Okumayı çok kolaylaştırır. Gerçekten soru ile ilgili değil, ama bu 6. sınıf öğrencisi için etkileyici !!!! Keşke genç yaşta başlasaydım.
Impulss

1
Ses basıncı ölçer ne marka / modeldir?
recantha

Sayaçtan gelen çıkış önceden güçlendirilmiş mi? Aksi takdirde, mikrofon çıkışı MCP3008'in okuyamayacağı kadar küçük olacaktır.
scruss

Ses basıncını anlamlı bir şekilde ölçmek için sadece bir ADC kullanamayacağınızı unutmayın. Salınımlı dalga formunu ölçmeli ve daha sonra yazılımdaki genliğini ölçmelisiniz (muhtemelen gerçek sayaçların eğilimi olarak frekansa bağlı ağırlıklandırma uygular) veya sinyali ADC'ye ulaşmadan önce düzeltmeniz gerekir. Algoritma hakkında fikir edinmek için önce ses kartı bulunan bir bilgisayar kullanarak bazı denemeler yapmak isteyebilirsiniz.
Chris Stratton

Yanıtlar:


3

Sadece ADC'nin dijital çıkış pinini RPi GPIO'nun 11 pinine bağlayarak SPI veriyolunu kullanmak işe yaramaz. Bu otobüs, kesin olarak 4, daha fazla kabloya ihtiyaç duyar.

ADC'nin düzgün çalışması için bir SPI girişi, Clock ve Chip Select pinlerine de ihtiyacı olacaktır. Neyse ki bu konuda çok sayıda kaynaktan edinilebilecek iyi bilgiler var.

Öncelikle SPI'nin çalışması hakkında biraz daha fazla bilgi edinmek isterseniz, SPI'yi biraz daha iyi tanımak için Wikipedia'daki bu sayfayı okumanızı öneririz .

İkincisi , Adafruits'in bu konuyu tam olarak tartışan çok güzel bir öğreticisi var, Python kodunu içeriyor ve ADC'nin kendisini bağlama ve onunla iletişim kurma süreçlerinde size rehberlik ediyor. Bir (küçük) dezavantaj, bu öğreticide kullanılan kodun SPI bağlantı noktasının kendisini kullanmaması, yazılımın SPI veriyolunu (bit-banging olarak adlandırılır) öykünmesi, yani GPIO bağlantı noktasındaki pinleri kullanmakta daha özgür olduğunuz anlamına gelir İstediğiniz.

Göreceli olarak basit projeniz için sanırım (bugünlerde 6. sınıfların bu tür görevleri yaptıkları için mutlu bir şekilde şaşırmış olmama rağmen!, Onlar için bu tür projeler yaparak onlara birçok yeni bilgi atıldı), bit beceriyor çözüm sadece işe yarayacak ince. Bit vurmanın kullanılmasının bir avantajı, öğrenme amaçları için daha iyi uymasıdır, çünkü tüm SPI sinyallerini kendiniz oluşturursunuz, işlemci otomatik olarak hiçbir şey yapmaz, böylece genel olarak SPI ve seri iletişim hakkında daha iyi bir bilgi birikimine sahip olursunuz!

Belki Adafruit'ten örneklerle başlamak ve daha sonra SPI için RPi'deki donanım uygulamasını kullanmaya geçmek iyi bir fikirdir, bu durumda veri sayfasına ihtiyacınız olacaktır (Adafruit yazılım uygulamasını kullanırken de kullanışlıdır) , Bölüm 5 ve 6 iletişimi ve ADC'yi kullanmak için neyin yapılandırılması gerektiğini açıklar.


Bit beceriyor uygulamalarından tamamen kaçınır ve doğrudan donanım sürümü için giderdim. İyi, basit bir örnek: Jeremy'nin Blogu: MCP3008 kullanan Raspberry Pi donanımı SPI analog girişleri .
scruss

Teşekkürler. Adafruit'un eğitimine baktık ve adc'yi RPi'ye bağlamak için kullanmayı planladık. Bu adımı açıklamamızın dışında bıraktık. Bununla birlikte, adafruit kodu ve bit vurma fikri bu noktada kendisi ve benim için çok karmaşık. Bunu asla hakimlere açıklayamazdı. Donanım sürümünü kontrol edeceğiz ve nasıl göründüğünü göreceğiz. Fakat . . . mikrofon çıkışının çok küçük olması (@scruss) kesin bir sorun olacaktır. Tüm cevaplarınız için teşekkürler, çok yardımcı olacaklar!
user5769

Adafruit'ten elektretin çıkışını ADC'nin okuyabileceği bir şeye yükselten Elektret Mikrofon Amplifikatörü vardır . Bir mikrofon kapsülü içerir.
scruss

0

MCP3008 ve Adafruit_MCP3008 ve Adafruit özellikli donanım SPI için.SPI Python kitaplıkları:

Adafruit.SPI kütüphanesinin SpiDev nesnesinin set_clock_frequency ('Hz' değeri ') içine tweak denedim. Yani şöyle bir şey,

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

5 KHz örnekleme oranı istedim (MCP3008'e 5 V verildi) ancak Raspberry Pi model 2 B, DSO'da gözlemlendiğinde 25 KHz'lik bir seri SAAT veriyordu. 5 KHz analog giriş sinyali örnekleme hızı için Pi'den Seri CLK 90 KHz olmalıdır (MCP 3008 veri sayfasında verildiği gibi 18 kat örnekleme hızı). Ancak bu bile yardımcı olamazdı ve python betiği çalışırken işler değişmeden kalır.

Ayrıca şaşırtıcı bir şekilde, RPi'deki SPYDER IDE üzerinde çalıştırıldığında aynı kod, 1 saniyede 1006 değer yazdırdı ve bu ayarlar, dahili Python-2 kabuğundan farklı olarak 1 KHz'den daha yüksek bir değerle aynı tutuldu.


Bunu yeniden biçimlendirmeye gidebilir misiniz? Şu anki biçimindeki cevabınızı okumak zor. İşaretçilere ihtiyacınız varsa Yardım Merkezi'ne bir göz atın.
Darth Vader
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.