สารบัญ:
- ขั้นตอนที่ 1: ข้อกำหนด 1/3 - ฮาร์ดแวร์
- ขั้นตอนที่ 2: ข้อกำหนด 2/3 - ส่วนประกอบสำหรับวงจรของคุณ
- ขั้นตอนที่ 3: ข้อกำหนด 3/3 - ซอฟต์แวร์
- ขั้นตอนที่ 4: วงจรอินพุต
- ขั้นตอนที่ 5: วงจรเอาต์พุต
- ขั้นตอนที่ 6: [ไม่บังคับ] การสร้างแผงวงจรพิมพ์และส่วนประกอบบัดกรี
- ขั้นตอนที่ 7: การตั้งค่า SoC
- ขั้นตอนที่ 8: การเขียนโปรแกรม C HPS
- ขั้นตอนที่ 9: การได้มาซึ่ง ADC แบบดิจิทัลจากการ์ด
- ขั้นตอนที่ 10: การคำนวณ FFT
- ขั้นตอนที่ 11: การแสดง FFT
- ขั้นตอนที่ 12: การประกอบ
- ขั้นตอนที่ 13: เอฟเฟกต์เสียง
- ขั้นตอนที่ 14: [ไม่บังคับ] การสร้างหมวกกันน็อค
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
สวัสดี! เราคือทีมนักเรียน 4 คนจากโรงเรียนโปลีเทคนิคของมหาวิทยาลัยซอร์บอนน์:
- หลุยส์ บูเชิร์ต
- บิลัล เมเลฮี
- Bao Tinh Piot
- มาร์โก ลองเปญ
โครงการนี้เป็นส่วนหนึ่งของการศึกษาของเรา และมีเป้าหมายที่จะนำเครื่องมือต่างๆ มาใช้ควบคู่ไปกับการแสดงความสำเร็จตามทฤษฎีของเรา
วัตถุที่มีชื่อเสียงมีลักษณะเป็นหมวกที่คล้ายกับฮีโร่ของวิดีโอเกมบางเกมที่จะสูญเสียชื่อ สำหรับด้านการออกแบบ เรายังมีหน้าจอที่แสดงการแปลงฟูริเยร์ของสัญญาณเสียงที่ออกมาจากลำโพง จุดประสงค์ของชุดหูฟังนี้คือการเปลี่ยนเสียงของผู้ให้บริการแบบเรียลไทม์โดยใช้เอฟเฟกต์ที่เลือกได้มากมาย
เป้าหมายการศึกษา:
- บันทึกเสียงจากไมโครโฟน
- ขยาย กรอง แปลงสัญญาณเป็นดิจิทัล
- ตระหนักถึง FFT ของสัญญาณ
- แสดง FFT นี้บนหน้าจอ
- การสังเคราะห์สัญญาณ
- ดึงเสียงออกจากลำโพง
- ตระหนักถึงผลกระทบต่อเสียง (เสียงก้อง, เสียงสะท้อน, ฯลฯ …)
ตอนนี้เราได้ใส่พื้นหลังและนำเสนอโครงการแล้วก็ถึงเวลาลงมือทำ!
ขั้นตอนที่ 1: ข้อกำหนด 1/3 - ฮาร์ดแวร์
ในการสร้างหมวกกันน็อคของคุณให้สำเร็จ เราจำเป็นต้องมีฮาร์ดแวร์บางอย่างเพื่อใช้งานอุปกรณ์
- DE0-Nano-SoC Development Board โดย Terasic + Adafruit TFT LCD Screen (Arduino)
- การเข้าถึงเครื่องพิมพ์ 3 มิติเพื่อทำหมวกกันน็อค (หากคุณเป็นนักศึกษามหาวิทยาลัยย้ายเข้าไปใกล้มหาวิทยาลัยของคุณ บางแห่งจะมีห้องทดลองสำหรับนักศึกษา)
- คอมพิวเตอร์ที่มีการเชื่อมต่ออินเทอร์เน็ตและการเชื่อมต่อขั้นต่ำ (USB, อีเธอร์เน็ต) คอมพิวเตอร์ของคุณจำเป็นต้องมีโปรเซสเซอร์ที่แข็งแกร่ง เนื่องจากการรวบรวมโปรแกรมบน Qsys ใช้เวลานาน
- (ไม่จำเป็น) เครื่องพิมพ์ที่ทำแผ่นวงจรพิมพ์ (PCB) จากไฟล์ Gerber เพื่อลดขนาดวงจร + หัวแร้งสำหรับวางส่วนประกอบบน PCB
- (ขอแนะนำอย่างยิ่ง): กาแฟชั้นดีที่จะเพลิดเพลินไปกับการทำงานของคุณด้วยคำแนะนำของเรา:)
ขั้นตอนที่ 2: ข้อกำหนด 2/3 - ส่วนประกอบสำหรับวงจรของคุณ
นี่คือส่วนประกอบที่จำเป็นสำหรับวงจรของคุณ:
- Texas Instrument LM386 เครื่องขยายเสียงคลาส AB
- เขียงหั่นขนม
- ชุดสายไฟชาย-ชาย, ชาย-หญิง
- LM358P ตัวแปลงดิจิตอลเป็นอนาล็อก (DAC)
- วิทยากร
- ไมโครโฟนขนาดเล็กที่ใช้ในวงจรแอนะล็อก
- ชุดเกมตัวต้านทานตั้งแต่ 1kOhm ถึง 220kOhm
- ตัวเก็บประจุ 1.5nF
- ตัวเก็บประจุ 50nF
- ตัวเก็บประจุ 100nF
- ตัวเก็บประจุ 100uF
- ตัวเก็บประจุ 220uF
- x4 ตัวเก็บประจุ 10uF
ขั้นตอนที่ 3: ข้อกำหนด 3/3 - ซอฟต์แวร์
สุดท้ายนี้ คุณจะต้องใช้ซอฟต์แวร์:
- Quartus 15.1: รุ่น Lite
- คอมไพเลอร์ A C (เช่น gcc)
- Altium สำหรับการออกแบบ PCB
- ชุด SoC แบบฝังของ Altera เพื่อสื่อสารกับแผนที่ SoC
- สีโป๊ว
ขั้นตอนที่ 4: วงจรอินพุต
มาสร้างวงจรกันเถอะ ใช้ภาพด้านบนของวงจรเพื่อประกอบเข้ากับเขียงหั่นขนมของคุณ คุณจะเห็นรูปภาพของ BreadBoard และวงจรด้านในเพื่อดูว่าพินเชื่อมต่อกันอย่างไร วงจรทั้งหมดขับเคลื่อนด้วยกระแสตรง 5V (DC) สำหรับสิ่งนี้ คุณสามารถใช้แบตเตอรี่ 5V กับตัวแปลง USB-B หรือตัวสร้างฟังก์ชันได้
การเตือนความจำบางส่วน:
- แหล่งจ่ายไฟ 5V และกราวด์เชื่อมต่ออยู่บนเส้นแนวนอนที่แยกจากกันของเขียงหั่นขนม
- หากคุณต้องการเชื่อมต่อ 2 ส่วนประกอบแบบขนาน ให้วางไว้ในบรรทัดร่วมของเขียงหั่นขนม
- หากคุณต้องการเชื่อมต่อ 2 ส่วนประกอบแบบอนุกรม ส่วนประกอบต้องมีเพียงพินเดียวในสายทั่วไปของเขียงหั่นขนม
อย่าลังเลที่จะดูบทแนะนำเกี่ยวกับวิธีใช้เขียงหั่นขนมและสร้างวงจรขึ้นมา อย่าลืมอ่านตำแหน่งพินของเครื่องขยายเสียง LM358P อย่างละเอียดด้วย (ดูภาพด้านบน)
ขั้นตอนที่ 5: วงจรเอาต์พุต
คำแนะนำค่อนข้างเหมือนกับขั้นตอนที่ 4 อินพุตสี่ตัว: SDI ไม่ใช่ CS, SCK ไม่ใช่ LDAC มาจากบอร์ด DE0-Nano-Soc ของคุณ เราจะเห็นในภายหลังว่าจะสร้างได้อย่างไร
อย่าลืมอ่านตำแหน่งพินของเครื่องขยายเสียง LM386 อย่างละเอียด (ดูภาพด้านบน)
ขั้นตอนที่ 6: [ไม่บังคับ] การสร้างแผงวงจรพิมพ์และส่วนประกอบบัดกรี
หากคุณโชคดีพอที่จะเป็นเจ้าของเครื่องพิมพ์แผงวงจรหรือใช้งานได้ เรากำลังจะสร้างแผงวงจรพิมพ์ (PCB) ของเราเอง โปรดทราบว่าขั้นตอนนี้เป็นทางเลือก ขั้นตอนนี้ประกอบด้วยการย้ายวงจรของคุณจากเขียงหั่นขนมไปยัง PCB เท่านั้น
คุณจะต้องใช้ไฟล์ GERBER 2 ไฟล์นี้
ไฟล์เหล่านี้สร้างบน Altium ใช้บนซอฟต์แวร์เครื่องพิมพ์ PCB ของคุณเพื่อพิมพ์ PCB ของคุณ เมื่อคุณได้รับ PCB แล้ว ตรวจสอบให้แน่ใจว่า PCB ของคุณสะอาดและพิมพ์แทร็กอย่างถูกต้อง
ตอนนี้มาถึงข้อตกลงที่แท้จริง: การบัดกรี 2 รูปข้างบนนี้เป็นแผนผังของวงจรบน PCB แต่ละองค์ประกอบมีชื่อ (R6, C4, MK1 เป็นต้น) รูปภาพในขั้นตอนที่ 4 และ 5 แสดงพารามิเตอร์ส่วนประกอบ (ความต้านทาน การนำไฟฟ้า..) วางแต่ละส่วนประกอบจากเขียงหั่นขนมของคุณไปยัง PCB ตามชื่อ
เมื่อคุณบัดกรีทุกอย่างด้วยหัวแร้งแล้ว ให้ทดสอบส่วนประกอบทุกชิ้นด้วยโวลต์มิเตอร์เพื่อตรวจสอบว่ามีการลัดวงจรหรือไม่
ขั้นตอนที่ 7: การตั้งค่า SoC
เกี่ยวกับการตั้งค่า SoC คุณจะต้องเรียกใช้คำสั่งและสคริปต์บางอย่างที่รวมอยู่ในชุดฝังตัว SoC ภายในเทอร์มินัล ในการทำเช่นนี้ คุณจะต้องเพิ่ม $PATH PATH ถูกใช้ภายในเทอร์มินัลเพื่อบอกให้ค้นหาไฟล์ในไดเร็กทอรีที่กำหนดโดยพาธเมื่อคุณรันคำสั่ง โดยพิมพ์บรรทัดคำสั่งต่อไปนี้:
เส้นทางการส่งออก=/cygdrive/c/altera_lite/15.1/quartus/sopc_builder/bin:$PATH
จากนั้นพิมพ์บรรทัดคำสั่งเพื่อสร้างส่วนหัวจากไฟล์ sof คุณได้รับไฟล์ sof โดยรวบรวมโครงการของคุณบน Quartus โดยพิมพ์:./generate_header
ขั้นตอนที่ 8: การเขียนโปรแกรม C HPS
ในส่วนนี้เราต้องตระหนัก 2 สิ่ง คือ อ่านค่า ADC แล้วเขียนลงใน SPI
1. อ่านค่า ADC
แอดเดรสของหน่วยความจำที่มี ADC อยู่นั้นไม่สามารถเข้าถึงได้โดยตรง อันที่จริง ระบบ linux ที่อยู่บนการ์ดจะตั้งค่าส่วนที่เป็นนามธรรมของหน่วยความจำ ในการเข้าถึงที่อยู่ ADC เราจะใช้ฟังก์ชัน mmap
"h2p_lw_spi_addr=virtual_base + ((unsigned long)(ALT_LWFPGASLVS_OFST + SPI_0_BASE) & (unsigned long)(HW_REGS_MASK));"
คำแนะนำนี้อนุญาตให้เพิ่มออฟเซ็ตที่จุดเริ่มต้นของที่อยู่ฐานเพื่อเข้าถึงที่อยู่ของหน่วยความจำที่จัดสรรสำหรับ ADC และดำเนินการกับที่อยู่ที่เป็นผลลัพธ์ ตรรกะ และ เพื่อพิจารณาการมาสก์
หลังจากนั้น จำเป็นต้องยกเลิกการอ้างอิงพอยน์เตอร์ในโปรแกรมเพื่อรับค่าของมัน
2. เขียนค่าของ ADC ใน SPI
การจัดการเหมือนกัน คราวนี้เราให้ mmap ออฟเซ็ตไปยังที่อยู่ที่จัดสรรโดย SPI ขณะเขียน SPI เอกสารทางเทคนิคระบุว่าคุณต้องเขียนไปยังที่อยู่ +1 ค่าของ adc
"*(h2p_lw_spi_addr+1) = ((0x1 << 12) | *h2p_lw_adc_addr);"
คำแนะนำนี้ช่วยให้คุณสามารถเขียนถึง SPI แน่นอนบิต 4 ดังนั้น 1 << 12 เป็นบิตที่ช่วยให้เปิดใช้งาน SPI ด้วยตรรกะ OR เราจึงให้ทั้งบิตการเปิดใช้งานและค่าของ ADC แก่ SPI
ขั้นตอนที่ 9: การได้มาซึ่ง ADC แบบดิจิทัลจากการ์ด
ก่อนอื่น คุณจะต้องตั้งค่าที่อยู่ IP ของอีเทอร์เน็ตของคอมพิวเตอร์ของคุณผ่านแผงควบคุม -> เครือข่าย -> การ์ด Parmesals เลือกอินเทอร์เฟซอีเทอร์เน็ตของการ์ด คุณสมบัติ ที่อยู่ ipv4 และป้อน IP คงที่ หน้ากาก ฯลฯ …
ถัดไป เชื่อมต่อการ์ดจากด้านแจ็คไฟด้วยสายไมโคร USB เปิดโปรแกรมเมอร์ Quartus และเริ่มต้นการส่งออก การจัดการนี้จะทำใหม่หลังจากปิดการ์ดแต่ละครั้ง
เปลี่ยนสายปลั๊กไมโคร USB เพื่อเชื่อมต่อในครั้งนี้ถัดจากแจ็คอีเทอร์เน็ต ตอนนี้ด้วย Putty จำเป็นต้องเชื่อมต่อกับการ์ดโดยใช้ลิงก์แบบอนุกรม การกำหนดค่าสามารถมองเห็นได้ในภาพถ่าย แนวคิดคือการแทนที่ COM5 ด้วย COM ตามด้วยหมายเลขที่คุณสามารถหาได้ในตัวจัดการอุปกรณ์ของคุณ (คลิกขวาที่โลโก้ windows เพื่อเปิด)
กด Enter คุณเชื่อมต่อแล้ว
ข้อมูลการเริ่มต้นโครงการใหม่: - แก้ไข IP ของอีเทอร์เน็ตที่สอดคล้องกับการ์ด - เปิดการ์ด ทุกครั้งที่คุณเปิดเครื่อง จำเป็นต้องใส่ "โปรแกรม" ไว้ใต้ควอตัสของโปรเจ็กต์ที่คอมไพล์ในการ์ด ทำได้ผ่านพอร์ต micro-USB - เพื่อให้สามารถแสดงผลของโปรแกรมได้ เราใช้ micro USB มากขึ้น แต่ UART - ด้วยการกำหนดค่า putty สำหรับ serial COM5 (หรือ 6 watch gestinnaire periph) เชื่อมต่อกับการ์ด - ตั้งรหัสผ่าน (passwd) - ตั้งค่าที่อยู่ IP ifconfig ethxx IPchoice (IP ไม่ไกลจากนั้นสำหรับ eth ของพีซี) - สร้างส่วนหัวตาม Qsys ด้วยเทอร์มินัลที่ฝังอยู่ (export PATH) - ทำ - scp l exec ใน แผนที่ - ดำเนินการภายใต้สีโป๊ว prog
ขั้นตอนที่ 10: การคำนวณ FFT
เพื่อให้ได้ Fast Fourier Transform ในโปรแกรม C เราจะใช้ไลบรารี่ที่เขียนโดย Mark Borgerding: Kiss FFT คุณสามารถดาวน์โหลดห้องสมุดได้ที่นี่: https://kissfft.sourceforge.net/ จำเป็นต้องใช้ FFT กับสัญญาณเพื่อแก้ไขและใช้เอฟเฟกต์สัญญาณ นอกจากนี้ยังสามารถแสดงสเปกตรัมของสัญญาณได้อีกด้วย
ขั้นตอนแรกในโปรแกรม C ของคุณประกอบด้วยการจัดสรรหน่วยความจำเพื่อจัดเก็บผลลัพธ์ FFT ขนาดของหน่วยความจำขึ้นอยู่กับจำนวนจุดที่ใช้ในการคำนวณ FFT ยิ่งคุณมีคะแนนมากเท่าไร FFT ก็จะยิ่งเข้มงวดมากขึ้นเท่านั้น อย่างไรก็ตาม โปรแกรมจะทำงานช้าลงและจะใช้หน่วยความจำมากขึ้น โปรดทราบว่าคุณจะได้รับสองอาร์เรย์จากฟังก์ชัน kiss_fft: อินพุตและเอาต์พุตของฟังก์ชัน (cx_in และ cx_out)
เมื่ออาร์เรย์ของเราเต็มไปด้วยค่า FFT ใหม่ เช่น เมื่อ r = Win - 1 เรากำลังประมวลผล FFT เกี่ยวกับการแสดงผล เราแสดงเฉพาะส่วนบวกของสเปกตรัม เนื่องจากมีความสมมาตรระหว่างส่วนลบกับส่วนบวก
เกี่ยวกับแกนนอน เรากำลังลดค่าพีคลง 100*height/(height²) เพื่อแยกความแตกต่างของพีคของความถี่หลัก
เรากำลังใช้การเรียกระบบ usleep เพื่อกำหนดความถี่ในการอ่านค่า ADC ความถี่นี้ตั้งไว้ที่ 1, 5 Hz
ขั้นตอนที่ 11: การแสดง FFT
จากตัวอย่างที่แสดงบนหน้าจอ Adafruit TFT LCD ที่มีให้ที่นี่: https://www.terasic.com/downloads/cd-rom/de0-nano-s… เราได้ตั้งโปรแกรม NIOS ของบอร์ดไว้เพื่อให้เขาอ่านได้ ค่า ADC
ดังนั้นการลงทะเบียน ADC จะถูกแชร์ระหว่าง NIOS และ HPS เนื่องจากค่า ADC จะถูกใช้เพื่อแสดง FFT บนหน้าจอ NIOS และค่าเดียวกันนั้นจะถูกเขียนบน SPI เพื่อส่งออกไปยังบอร์ดและสุดท้ายจะถูกแปลง โดย DAC เพื่อรับสัญญาณแอนะล็อก
ขั้นตอนที่ 12: การประกอบ
เราใกล้จะเสร็จแล้ว ! คุณจะต้องประกอบทุกส่วนของโปรเจ็กต์ (วงจรเข้า วงจรเอาท์พุต และบอร์ด) ตรวจสอบให้แน่ใจว่าได้เชื่อมต่อชิ้นส่วนต่างๆ เพื่อแก้ไขหมุดตามโครงการ Quartus
- วงจรอินพุตจะส่งสัญญาณเสียงที่ไมโครโฟนจับ ขยาย กรอง และออฟเซ็ต
- โปรแกรม C ที่แสดงบนการ์ดจะอ่านค่าของ ADC ตามที่เราได้เห็นก่อนหน้านี้ และจะเขียนลงใน SPI เพื่อให้เราสามารถกู้คืนค่าบน GPIO ของการ์ดได้
- จากนั้นเอาต์พุต GPIO ของ SPI จะส่งข้อมูลที่จะถอดรหัสโดย DAC ของเราและขยายโดยวิ่งไปถึงลำโพง
ขั้นตอนที่ 13: เอฟเฟกต์เสียง
ขั้นตอนเดียวที่เหลือคือเอฟเฟกต์เสียง
เอฟเฟกต์ที่ใช้ได้คือ:
- ตัวกรองความถี่สูง
- ตัวกรองความถี่ต่ำ
- …
คุณสามารถสลับระหว่างเอฟเฟกต์ได้ด้วยปุ่มเดียว ปุ่มนี้จะเปลี่ยนตัวแปรในโปรแกรม C ของเรา เพื่อให้สามารถใช้เอฟเฟกต์ที่เหมาะสมได้
ขั้นตอนที่ 14: [ไม่บังคับ] การสร้างหมวกกันน็อค
เราอยู่ในขั้นตอนที่ต้องทำมากที่สุดของโครงการ:
- อันดับแรก เราติดส่วนต่างๆ ที่พิมพ์ 3 มิติของหมวกกันน็อค
- ในการเติมช่องว่างระหว่างชิ้นส่วนที่ติดกาว เราได้เพิ่มการตกแต่งโดยใช้ปากกา 3 มิติ
- เราขัดส่วนที่คั่นด้วยปากกาและหมวกกันน๊อคให้เป็นปกติมากขึ้น เพื่อให้ภาพวาดติดแน่นในภายหลัง
- เราทาสีหมวกกันน็อคด้วย 2 ชั้น: ชั้นแรกเป็นสีดำแอนทราไซต์ในระยะใกล้ และชั้นที่สองเป็นสีเขียวหลักจากที่อื่นเพื่อให้เฉดสีเขียวเข้มขึ้น
- ในที่สุดเราก็พิมพ์โลโก้ของโรงเรียนของเราที่ด้านข้างของหมวกกันน็อค