RPi เป็นเครื่องวัดระดับเสียงหรือไม่?


10

สำหรับโครงงานวิทยาศาสตร์ของลูกสาวของฉัน (หมวดวิทยาศาสตร์คอมพิวเตอร์และคณิตศาสตร์) เธอต้องการใช้ RPi ไปรอบ ๆ และวัดว่าเสียงที่แตกต่างกันนั้นสูงกว่าระดับความเจ็บปวดหรือไม่และทำให้หูของเราเสียหาย เธอเป็นนักเรียนเกรด 6 แต่เธอมีประสบการณ์เกี่ยวกับ RPi และการเขียนโปรแกรมใน Python Phillip Heels Nichols ได้ตอบคำถามบางข้อในหน้า FB RPi แต่แนะนำว่าเรามาที่นี่เพื่อรับความช่วยเหลือเพิ่มเติม เธอต้องการที่จะสอบเทียบ Pi ด้วยเครื่องวัดความดันเสียง (ฉันมีหนึ่งในนั้น) เพื่อหาจำนวนมิลลิโวลต์ที่ผลิต

นี่คือสิ่งที่เรากำลังคิด เราซื้อ adc (mcp3008) จาก adafruit และกำลังรอการมาถึงของมัน ถ้าเราเชื่อมต่อเอาท์พุทดิจิตอลจาก adc ไปยัง GPIO pin 11 และ GPIO pin 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 #zero ตัวแปรขณะที่ SPL <??: # อยู่ที่ไหน ค่าเป็นมิลลิโวลต์ที่สร้างโดยเสียงที่ 130 db SPL = GPIO.input (11) #get ค่าจาก adc ที่เชื่อมต่อกับไมโครโฟน GPIO.output (12, GPIO.HIGH) # เปิด LED หากระดับเสียงสูงกว่า? ?
user5769

1
คุณสามารถแก้ไขโพสต์ของคุณหากคุณใส่ช่องว่าง 4 ช่องที่ด้านหน้าโค้ดมันจะใส่ลงในช่อง "code" พิเศษและทำการฟอร์แมต ทำให้อ่านง่ายขึ้นมาก ไม่เกี่ยวกับคำถามจริงๆ แต่มันก็น่าประทับใจสำหรับนักเรียนเกรด 6 !!!! ฉันหวังว่าฉันจะเริ่มเด็ก
Impulss

1
เครื่องวัดความดันเสียงรุ่นใดที่น่าสนใจ
recantha

เอาท์พุทจากตัวขยายสัญญาณล่วงหน้าหรือไม่? ไม่เช่นนั้นเอาต์พุตไมโครโฟนจะเล็กไปสำหรับการอ่าน MCP3008
scruss

โปรดทราบว่าคุณไม่สามารถใช้ ADC เพื่อวัดความดันเสียง คุณจะต้องวัดรูปคลื่นของการสั่นแล้ววัดความกว้างของคลื่นในซอฟต์แวร์ (อาจใช้การถ่วงน้ำหนักตามความถี่ในการวัดจริง) หรืออื่น ๆ แก้ไขสัญญาณก่อนที่จะถึง ADC คุณอาจต้องการเรียกใช้การทดลองบางอย่างโดยใช้พีซีที่มีการ์ดเสียงก่อนเพื่อให้เข้าใจถึงอัลกอริทึม
Chris Stratton

คำตอบ:


3

การใช้บัส SPI เพียงแค่เชื่อมต่อขาออกดิจิตอลของ ADC เพื่อขา 11 ของ RPi GPIO จะไม่ทำงาน รถบัสคันนี้ต้องใช้สายไฟอีกสองสามสายเพื่อให้แม่นยำ

ADC ยังต้องการอินพุต SPI, พินและชิพเลือกพินที่เชื่อมต่อเพื่อให้สามารถใช้งานได้อย่างถูกต้อง โชคดีที่มีข้อมูลที่ดีเกี่ยวกับสิ่งนี้จากหลายแหล่ง

ก่อนอื่นถ้าคุณต้องการทราบเพิ่มเติมเกี่ยวกับการทำงานของ SPI ฉันขอแนะนำให้อ่านหน้านี้ใน Wikipediaเพื่อทำความรู้จัก SPI ให้ดีขึ้นเล็กน้อย

ประการที่สองมีการสอนที่ดีมากเกี่ยวกับ Adafruitsที่กล่าวถึงเรื่องนี้อย่างแน่นอนซึ่งรวมถึงรหัส Python และแนะนำคุณตลอดกระบวนการเชื่อมต่อ ADC และสื่อสารกับมัน ข้อเสียเปรียบหนึ่ง (เล็กน้อย) คือรหัสที่ใช้ในบทช่วยสอนนี้ไม่ได้ใช้พอร์ต SPI เองซอฟต์แวร์จะจำลองบัส SPI (เรียกว่าการต่อสู้บิต) ซึ่งหมายความว่าคุณมีอิสระมากขึ้นในการใช้หมุดบนพอร์ต GPIO ที่ คุณต้องการ.

ฉันคิดว่าสำหรับโครงการที่ค่อนข้างง่ายของคุณ (แม้ว่าฉันจะประหลาดใจอย่างมีความสุขทุกวันนี้นักเรียนชั้นประถมปีที่ 6 ทำงานประเภทนี้! สำหรับพวกเขาข้อมูลใหม่จำนวนมากถูกโยนลงไปที่พวกเขาด้วยการสร้างโครงการประเภทนี้) ละเอียด. ข้อดีของการใช้การทุบบิตคือเพื่อการเรียนรู้ที่เหมาะสมกว่าเพราะคุณสร้างสัญญาณ SPI ทั้งหมดตัวประมวลผลไม่ทำอะไรเลยโดยอัตโนมัติดังนั้นคุณจะจบลงด้วยความรู้เชิงลึกที่มากขึ้นเกี่ยวกับ SPI และการสื่อสารแบบอนุกรมโดยทั่วไป!

อาจเป็นความคิดที่ดีที่จะเริ่มต้นด้วยตัวอย่างจาก Adafruit และย้ายไปที่จุดหลังเพื่อใช้การติดตั้งฮาร์ดแวร์บน RPi สำหรับ SPI ในกรณีนี้คุณจะต้องใช้แผ่นข้อมูล (มีประโยชน์ในขณะที่ใช้ซอฟต์แวร์ Adafruit) บทที่ 5 และ 6 อธิบายการสื่อสารและสิ่งที่ต้องกำหนดค่าเพื่อใช้ ADC


ฉันจะหลีกเลี่ยงการใช้งานการโจมตีที่บิตทั้งหมดและตรงไปสำหรับรุ่นฮาร์ดแวร์ ดีตัวอย่างง่ายๆที่นี่: บล็อกของเจเรมี: ราสเบอร์รี่ Pi ฮาร์ดแวร์ SPI อนาล็อกใช้ MCP3008
scruss

ขอบคุณ เราได้ดูการสอนของ adafruit และวางแผนที่จะใช้มันเพื่อเชื่อมต่อ adc กับ RPi เราเพิ่งออกจากคำอธิบายของเรา อย่างไรก็ตามรหัส adafruit และความคิดของการต่อสู้บิตนั้นซับซ้อนเกินไปสำหรับเธอ (และฉัน) ณ จุดนี้ เธอไม่สามารถอธิบายให้ผู้พิพากษาฟังได้ เราจะตรวจสอบรุ่นฮาร์ดแวร์และดูว่ามีลักษณะอย่างไร แต่ . . ความจริงที่ว่าไมโครโฟนที่ส่งออกมีขนาดเล็กเกินไป (@scruss) จะเป็นปัญหาแน่นอน ขอบคุณสำหรับคำตอบทั้งหมดของคุณพวกเขาจะช่วยได้มาก!
user5769

มีแอมพลิฟายเออร์ไมโครโฟน Electretจาก Adafruit ซึ่งเพิ่มเอาท์พุตของอิเล็กเตรตเป็นสิ่งที่ ADC สามารถอ่านได้ มันมีแคปซูลไมค์
scruss

0

สำหรับฮาร์ดแวร์ SPI ที่มี MCP3008 และ Adafruit_MCP3008 และ Adafruit.SPI Python ไลบรารี่:

ฉันได้ลองปรับแต่งฟังก์ชัน set_clock_frequency ('value in Hz') ของวัตถุ SpiDev ของไลบรารี Adafruit.SPI ดังนั้นสิ่งที่ชอบ

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) แต่รุ่น Raspberry Pi 2 B ให้ค่า CLOCK อนุกรม 25 KHz เมื่อตรวจพบ DSO สำหรับอัตราการสุ่มตัวอย่างสัญญาณอินพุตแบบอะนาล็อก 5 KHz, Serial CLK จาก Pi ควรเป็น 90 KHz (อัตราการสุ่มตัวอย่าง 18 เท่าตามที่กำหนดใน MCP 3008 แผ่นข้อมูล) อย่างไรก็ตามสิ่งนี้ไม่สามารถช่วยได้และสิ่งต่าง ๆ จะไม่เปลี่ยนแปลงในขณะที่สคริปต์ python ทำงาน

นอกจากนี้ยังน่าแปลกใจรหัสเดียวกันเมื่อรันบน SPYDER IDE บน RPi พิมพ์ค่า 1006 ใน 1 วินาทีเพื่อระบุอัตราการสุ่มตัวอย่างที่ดีขึ้นด้วยการตั้งค่าที่เหมือนกันเป็น 1 KHz ซึ่งแตกต่างจากเปลือก inbuilt Python-2


คุณช่วยฟอร์แมตสิ่งนี้ได้ไหม คำตอบของคุณในรูปแบบปัจจุบันอ่านยาก หากคุณต้องการตัวชี้ให้ดูศูนย์ช่วยเหลือ
Darth Vader
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.