การใช้ไมโครโฟนกับ Arduino


18

แก้ไข : ฉันได้รับการตรวจสอบปัญหานี้มาระยะหนึ่งแล้ว มันกลายเป็นโครงการที่ยากกว่าที่ฉันคิดไว้และไม่ใช่บางอย่างสำหรับผู้เริ่มต้น ต้องใช้ฮาร์ดแวร์ราคาแพง (ไมโครโฟน & เครื่องขยายเสียง) และการวิเคราะห์เสียงขั้นสูงบางอย่างบนไมโครคอนโทรลเลอร์ แม้แต่ไมโครโฟนที่สมบูรณ์พร้อมวงจรที่เพียงพอก็ไม่ได้ให้ผลลัพธ์ที่ต้องการ(ตามความคิดเห็นของผลิตภัณฑ์นี้)


ฉันใหม่ทั้งหมดสำหรับ Arduino (แต่ฉันคุ้นเคยกับการเขียนโปรแกรม) เพื่อสร้างมิเตอร์ VUฉันต้องการวางไมโครโฟนไว้ที่อะนาล็อก 0 ขาของ Arduino และแสดงค่าผ่านการเชื่อมต่อแบบอนุกรม

ฉัน googled และพบวงจรนี้:

Simple Audio Pre-Amplifier

... และฉันพยายามสร้างด้วยผลลัพธ์นี้:

(ตอนนี้ฉันใช้วงจรที่ Oli Glaser แนะนำในคำตอบของเขา)

ค่าในมอนิเตอร์แบบอนุกรมไม่เปลี่ยนแปลงขึ้นอยู่กับระดับเสียงเพลง

วิธีที่ง่ายที่สุดในการวัดระดับเสียงในอินพุตแบบอะนาล็อกของ Arduino คืออะไร?

นอกจากนี้ฉันมีTDA2822Mแต่ฉันไม่รู้ว่ามันมีประโยชน์สำหรับโครงการนี้หรือไม่ คำบรรยายใต้ภาพไมโครโฟนอ่านXF-18D

แก้ไข: รหัส Arduino ของฉัน:

void setup() {
  Serial.begin(9600); 
}

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

เอาท์พุทแบบอนุกรม: 1023 1022 1022 1022 1022 1023 1022 และอื่น ๆ

ฉันจะตรวจสอบได้อย่างไรว่าไมโครโฟนทำงานได้เลย? มันเป็นทิศทางหรือไม่

แก้ไข: ตอนนี้ฉันใช้ทรานซิสเตอร์ S9014 ADC และการเชื่อมต่อแบบอนุกรม (ฉันทดสอบด้วยโพเทนชิออมิเตอร์)

เอาท์พุทแบบอนุกรมอยู่ที่ประมาณ 57

นอกจากนี้ฉันไม่มีมัลติมิเตอร์หรือออสซิลโลสโคป ตอนนี้ฉันมีมัลติมิเตอร์


คุณได้ตรวจสอบกับขอบเขตที่คุณสามารถดูรูปคลื่นเสียงที่เอาท์พุทของวงจรของคุณหรือไม่?
HikeOnPast

อ่าทำไมขาของ 3V3 และ 5V สั้นลงในวงจร? นั่นอาจเป็นปัญหา
Connor Wolf

ไม่ฉันเพิ่งวาดแผนผังไม่ถูกต้อง
ขนมปังปิ้ง

คำตอบ:


14

วิธี "ง่ายที่สุด" คือการใช้สัญญาณและตัวอย่างกับ ADC เก็บผลลัพธ์ไว้ในบัฟเฟอร์จากนั้นแสดงผลตามต้องการ (ในกรณีของคุณส่งไปยังพีซีผ่าน RS232)
หากคุณต้องการระดับ RMS ของสัญญาณคุณจะต้องคำนวณสิ่งนี้ในบางจุดก่อนส่งไปยังพีซีหรือหลังจากนั้น

วงจรขยายของคุณดังที่แสดงไม่เหมาะ แต่ควรทำงานอย่างมีเหตุผลสำหรับเครื่องวัด VU พื้นฐาน แก้ไข - ฉันเพิ่งสังเกตเห็น C2 นำสิ่งนี้ออกเพราะมันจะปิดกั้นอคติ DC จากทรานซิสเตอร์และสัญญาณจะแกว่งลงมาที่พื้น

แก้ไข - นี่คือวงจรที่ดีกว่าสำหรับทรานซิสเตอร์ขยาย:

แอมป์อิเลค

นี่ไม่ควรสนใจมากเกินไปเกี่ยวกับทรานซิสเตอร์ที่ใช้อคติเอาท์พุทควรอยู่ที่ประมาณ 2.5V
ค่าที่แน่นอนสำหรับตัวแบ่งอินพุต (R3 และ R4) ไม่สำคัญเกินไปมันเป็นอัตราส่วน 1: 4 ที่มากกว่านั้น ดังนั้นคุณสามารถใช้เช่น 400k และ 100k หรือ 40k และ 10k เป็นต้น (พยายามอย่าไปสูงหรือต่ำกว่าค่าที่เกี่ยวข้องเหล่านี้) C2 ควร> 10uF C1 ควร> 1uF (แทนที่ C1 ในแผนผังของคุณ)
R1 และ R2 ไม่จำเป็นต้องเป็นค่าเหล่านี้
สิ่งที่คุณต้องมีก็คืออิเลคเตรตที่มีตัวต้านทานไบอัส (R1 ในแผนผังของคุณ)

สิ่งหนึ่งที่น่ากังวลคือ Arduino 3.3V และสาย 5V ดูเหมือนจะเชื่อมโยงเข้าด้วยกัน - ฉันคิดว่านี่เป็นข้อผิดพลาดทางวงจร แต่ถ้าเป็นเช่นนี้ในวงจรจริงมันจะไม่ทำงานและอาจสร้างความเสียหายบางอย่าง
เพื่อระบุปัญหามันจะช่วยให้เห็นรหัสของคุณและสิ่งที่คุณเห็นในด้านพีซี คุณใช้ทรานซิสเตอร์ตัวไหน?

หากคุณมีออสซิลโลสโคปแล้วคุณสามารถตรวจสอบเพื่อดูว่าไมโครโฟน / ทรานซิสเตอร์ทำงานได้อย่างถูกต้องหรือไม่ ถ้าไม่ใช้มัลติมิเตอร์ก็สามารถทำการทดสอบขั้นพื้นฐานเพิ่มเติมได้ (เช่นยืนยัน + 5V ปัจจุบันยืนยันว่าฐานทรานซิสเตอร์อยู่ที่ ~ 0.6V, ตัวสะสมการทดสอบเพื่อให้แน่ใจว่ามันไม่ได้ถูกตรึงที่ + 5V หรือกราวด์โดยไม่มีสัญญาณ)

นอกจากนี้คุณต้องตรวจสอบให้แน่ใจว่า RS232 ทำงานอย่างถูกต้องดังนั้นการเขียนโค้ดง่าย ๆ เพื่อส่งค่าทดสอบบางอย่างจะเป็นความคิดที่ดี

หากคุณสามารถให้ข้อมูลที่ร้องขอและแจ้งให้เราทราบว่าเครื่องมือใดที่คุณสามารถให้ความช่วยเหลือเฉพาะเจาะจงมากขึ้น

แก้ไข - หากคุณสุ่มตัวอย่างช้ามากคุณจะต้องมีวงจรตรวจจับจุดสูงสุดดังนี้:

ตรวจจับยอด

คุณจะวางวงจรนี้ไว้ระหว่างทรานซิสเตอร์และขา Arduino (ลบ C2)

ไดโอดสามารถเป็นไดโอดเพียงใดก็ได้ ค่า cap และตัวต้านทานเป็นเพียงแนวทางซึ่งสามารถเปลี่ยนได้เล็กน้อย ค่าของพวกเขากำหนดว่าแรงดันไฟฟ้าจะใช้เวลานานแค่ไหนในการเปลี่ยนแปลงตามระดับสัญญาณ คุณสามารถคำนวณสิ่งนี้โดยใช้ค่าคงที่ RC (เช่น R * C - ในตัวอย่างด้านบนค่าคงที่ RC คือ 1e-6 * 10e3 = 10ms แรงดันไฟฟ้าจะใช้เวลาประมาณ 2.3 เวลาคงที่ถึง 90% ของค่าเดิมดังนั้น ในตัวอย่างด้านบนหากแรงดันไฟฟ้าเริ่มต้นที่ 1V และคุณลบสัญญาณออกมันจะลดลงเหลือ 0.1V ประมาณ 23ms ในภายหลัง

แก้ไข - โอเคคิดว่าฉันพบปัญหาใหญ่ ทรานซิสเตอร์S9012ของคุณเป็นทรานซิสเตอร์PNP (เช่นเดียวกับ S9015) คุณต้องมีทรานซิสเตอร์ NPN สำหรับวงจรนี้ S9014เป็นทรานซิสเตอร์ NPN ดังนั้นคุณจะต้องใช้คนนี้

ตัวเก็บประจุที่ระบุว่า "104" เป็นตัวเก็บประจุเซรามิก 0.1uF เกือบแน่นอน ค่า (ใน pF) คือ 2 หมายเลขแรกตามด้วยจำนวนศูนย์ที่ตั้งค่าด้วยหมายเลขสุดท้าย สำหรับ 104 ค่าคือ 10 + 4 ศูนย์หรือ 100,000pF 100,000pF คือ 100nF หรือ 0.1uF

แก้ไข - ไม่มีขอบเขตหรือมัลติมิเตอร์ทำให้ชีวิตยากมากที่นี่ (คุณควรจะถือหนึ่งหรือทั้งสองอย่างเร็วที่สุดเท่าที่จะทำได้)
อย่างไรก็ตามมีออสซิลโลสโคปการ์ดเสียงพื้นฐานสำหรับพีซีที่สามารถใช้ทดสอบวงจรอิเลคตร้า / ทรานซิสเตอร์ Visual Analyzerเป็นตัวอย่างที่ดี:

เครื่องวิเคราะห์ภาพ

หากคุณแทนที่ C2 (ไม่จำเป็นอย่างเคร่งครัด แต่เป็นความคิดที่ดี) คุณควรจะสามารถป้อนสัญญาณเข้าสู่พีซีโดยตรงและสังเกตในซอฟต์แวร์เพื่อดูว่าไมโครโฟนและเครื่องขยายเสียงทำงานอย่างถูกต้องหรือไม่ หากพีซีของคุณมีสายการใช้งานอยู่ แต่อินพุตไมโครโฟนมักจะดีสำหรับ 2V IIRC คุณสามารถทดสอบอิเล็กเตรตโดยตรง - เพียงแค่ถอดบิตทรานซิสเตอร์และเก็บ R1 และ C1 เอาสัญญาณจากอีกด้านหนึ่งของ C1
โปรดทราบว่าวิธีนี้จะไม่ทดสอบระดับ DC เฉพาะ AC (เนื่องจากฝาปิดกั้น DC ในอินพุต souncard) แต่สัญญาณ AC (เสียง) เป็นสิ่งที่คุณสนใจที่นี่

หากคุณลองทำสิ่งนี้โพสต์ภาพหน้าจอเพื่อที่เราจะได้ทราบว่าเกิดอะไรขึ้น


3.3V และ 5V ไม่ได้ผูกติดกัน เป็นครั้งแรกที่ฉันใช้ซอฟต์แวร์นี้ - ขอโทษ ฉันจะใส่รหัสของฉันในคำถาม แต่ไม่มีอะไรที่ผิดไปกับมัน นอกจากนี้ฉันได้ทำโครงการในวันนี้ที่ใช้ photoresistor และแสดงค่าบนไฟ LED หกดวงอย่างที่ฉันต้องการ vu meter ของฉันให้ดูเหมือนและฉันทดสอบการเชื่อมต่อแบบอนุกรมกับสิ่งนั้น ฉันไม่มีออสซิลโลสโคปและมัลติมิเตอร์ ทรานซิสเตอร์มีคำบรรยายภาพ "S9012 H 331" ฉันยังมีคำบรรยายภาพ "S9014 C 331" และ S9015 ด้วย
ขนมปังปิ้ง

@Toast - ดูแก้ไขเกี่ยวกับ C2 นำสิ่งนี้ออกและเชื่อมต่อโดยตรง
Oli Glaser

ฉันลบ C2 และเพิ่มชิ้นส่วนตามที่ Kristoffon อธิบายไว้ในคำตอบของเขา ยังคงผลลัพธ์เดียวกัน
ขนมปังปิ้ง

1
หากคุณมีโพเทนชิออมิเตอร์หรือแหล่งจ่ายแรงดันผันแปรคุณสามารถใช้อินพุต 0-5V กับอินพุตของ ADC เพื่อทดสอบรหัสของคุณโดยไม่ขึ้นกับวงจรอินพุตของคุณ คุณกำลังพยายามที่จะดีบั๊กสองสิ่งในคราวเดียว - แยกวงจรและตรวจสอบพฤติกรรมของมันโดยใช้ออสซิลโลสโคปและ / หรือแยกรหัสของคุณและให้อินพุตที่คาดเดาได้
HikeOnPast

1
@OliGlaser ฉันสับสนกับวงจร "electret" เป็นไมโครโฟนหรือไม่? สายอื่น ๆ ของไมโครโฟนจะไปไหน, GND หรือ VCC? ฉันเชื่อมต่อ 5 หรือ 3.3V กับวงจรนั้นหรือไม่? คุณช่วยกรุณาลบEDITบล็อกและแก้ไขเพื่อให้สามารถเข้าใจได้โดยไม่ต้องอ่านกระทู้แสดงความคิดเห็น? ฉันยังเป็นผู้เริ่มต้นและฉันไม่เข้าใจว่าปัญหาได้รับการแก้ไขอย่างไรและฉันสามารถใช้วงจรที่คุณโพสต์ตามที่เป็นอยู่ได้หรือไม่
Tomáš Zato - Reinstate Monica

4

สมมติว่าวงจรของคุณทำงานสัญญาณเสียงอยู่ในช่วง kHz ในขณะที่ Arduino มี ADC เหมาะสำหรับระดับ DC ส่วนประกอบ DC ในสัญญาณของคุณเป็นศูนย์ซึ่งจะกล่าวว่ามันลอยอยู่เหนือแรงดันไฟฟ้าคงที่ นั่นคือแรงดันไฟฟ้าคงที่ที่ ADC ของคุณกำลังอ่านอยู่

ในการแก้ไขปัญหานั้นคุณจะต้องวางไดโอดในอนุกรมที่มีเอาต์พุตของคุณเชื่อมต่อกับ ADC และกับตัวเก็บประจุและตัวต้านทาน

หมวกจะเรียกเก็บตามมูลค่าสูงสุดที่ได้รับในขณะที่ตัวต้านทานจะปลดหมวกเมื่อสัญญาณตาย

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

แก้ไข: อินพุต ADC ลอยจริง ๆ เนื่องจากไม่มีอคติใด ๆ เนื่องจากตัวเก็บประจุแบบ หากคุณกำลังจะลองใช้โซลูชันของฉันลบ C2


โอเคฉันเพิ่มสิ่งนี้ลงในวงจรและสัญญาณบนจอมอนิเตอร์แบบอนุกรมตอนนี้คือ 458 (แต่ก็ยังไม่เปลี่ยนแปลงเมื่อมีสัญญาณรบกวน)
ขนมปังปิ้ง

ฉันแลกเปลี่ยนทรานซิสเตอร์จาก "S9012 H 331" กับ "S9014 C 331" และมีค่าเป็น 56
Toast

1
Arduino ADC สามารถสุ่มตัวอย่างเร็วพอสำหรับเสียง ฉันไม่ได้ใช้พวกเขา แต่ฉันคิดว่า 10ksps (ดังนั้นแบนด์วิดธ์สูงถึง 5kHz) เป็นไปได้ด้วยฟังก์ชั่นห้องสมุดซึ่งใช้ได้กับไฟล์ lo-fi (ฉันค่อนข้างแน่ใจว่า ATMega จริงสามารถสุ่มตัวอย่างได้เร็วขึ้นหากใช้งานตามปกติ)
Oli Glaser

@ ขนมปังปิ้ง - คุณสุ่มตัวอย่างเร็วแค่ไหน? ถ้ามันช้ามากเครื่องตรวจจับจุดสูงสุดก็เป็นความคิดที่ดี คุณสามารถทำได้ในซอฟต์แวร์แม้ว่า
Oli Glaser

2
@Kristoffon - ไม่ใช่กับ Arduino ไม่ แต่ฉันได้ใช้ micros 8 บิตที่คล้ายกัน (เช่น PIC16F, 18F ฯลฯ ) สำหรับการสุ่มตัวอย่างและเล่นเสียงหลายครั้ง 10ksps ทำได้ง่าย ในการอ้างถึงเอกสาร AVR ADC นี้ :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser

4

การอ่านค่า 1022, 1023 ของคุณนั้นเต็มไปด้วย ADC ของ Arduino สมมติว่าคุณติดตั้งตัวเก็บประจุแบบไม่ผิดพลาดดังแสดงในแผนภาพของคุณระดับนี้ไม่สามารถมาจากวงจรไมโครโฟนที่คุณสร้างขึ้นเนื่องจากมันสามารถเปลี่ยนแรงดันไฟฟ้าได้เพียงคู่เท่านั้น (เช่น AC)

เป็นผลให้ฉันสงสัยว่าคุณกำลังอ่านกระแสรั่วไหลภายใน ATMEGA ตัวเอง - คุณอาจได้ผลลัพธ์เดียวกันกับหมุดอะนาล็อกอื่น ๆ (ไม่ได้เชื่อมต่อ)

ลองสร้างตัวแบ่งแรงดันไฟฟ้า "เบา ๆ " ที่มีตัวต้านทานค่าสูง (ระหว่าง 10K ถึง 100K) และใช้สิ่งนี้เพื่อไบอัสอินพุตอนาลอกครึ่งหนึ่งของแรงดันอ้างอิง (คุณสามารถใช้โพเทนชิออมิเตอร์ได้เช่นกัน จากนั้นการอ่านที่ไม่มีอินพุตควรอยู่ในละแวก 512

เมื่อคุณมีอินพุตของ ADC อย่างเหมาะสมแล้วคุณสามารถเริ่มทำงานพยายามดูว่าคุณได้รับการเปลี่ยนแปลงบ้างหรือไม่ คุณอาจสุ่มตัวอย่างแบนด์วิดธ์ของคุณบางอย่างซึ่งหมายความว่าคุณจะได้รับนามแฝงขององค์ประกอบความถี่สูง แต่ถ้าสิ่งที่คุณพยายามทำคือการประมาณปริมาณโดยรวมที่ไม่ควรเป็นปัญหามากเกินไป


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