สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
สวัสดีทุกคน, นี่เป็นคำสั่งแรกของฉัน ฉันหวังว่าคุณจะชอบมัน !!
โดยพื้นฐานแล้ว ในโครงการนี้ ฉันได้ใช้การสื่อสารแบบอนุกรมระหว่าง Arduino และแล็ปท็อปของฉัน เพื่อส่งข้อมูลเพลงจากแล็ปท็อปของฉันไปยัง Arduino และใช้ Arduino TIMERS เล่นข้อมูลเป็นสัญญาณ PWM
อยากจะบอกว่า โปรเจกต์นี้ไม่เหมาะสำหรับ Beginners!!!
อันที่จริง โครงการนี้เป็นหนึ่งในโครงการที่ยาวที่สุด เพราะเราต้องทำหลายอย่างเพื่อให้มันสำเร็จ
ความสนใจ
ฉันได้ทำส่วนที่สองของคำแนะนำนี้แล้ว ซึ่งเป็นวิธีที่ง่ายกว่าและต้องการปัญหาน้อยที่สุดในการทำงาน
ลิงก์ไปยังส่วนที่สอง (ส่วนที่ง่ายที่สุด)
ขั้นตอนที่ 1: สิ่งที่เราต้องการสำหรับโครงการนี้ (ข้อกำหนด)
1. บอร์ด Arduino (เราใช้บอร์ดใดก็ได้ (328, 2560) เช่น Mega, Uno, Mini ฯลฯ แต่มีพินต่างกันเฉพาะ)
2. พีซีหรือแล็ปท็อปกับ Linux (ฉันใช้ Fedora 29) หรือ Live USB กับ Linux
3. เขียงหั่นขนมหรือ Perfboard
4. การต่อสายไฟ
5. TC4420 (ไดรเวอร์ Mosfet หรือสิ่งดังกล่าว)
6. Power Mosfet (ช่อง N หรือ P โปรดวางสายตามลำดับ) (ฉันใช้ N-channel แล้ว)
7. Speaker หรือ Flyback Transformer (ใช่ อ่านถูก!!)
8. พาวเวอร์ซัพพลายที่เหมาะสม (0-12V) (ฉันใช้ ATX Power Supply ของตัวเอง)
9. Heat Sink (ฉันได้กู้มาจากพีซีเครื่องเก่าของฉัน)
10. พีซีที่มี Windows และไดรฟ์ปากกา
หากต้องการทราบรายละเอียดการทำงานของแต่ละองค์ประกอบและโครงการนี้ โปรดอ่านขั้นตอนต่อไป
ฉันได้ทำส่วนที่สองของคำแนะนำนี้แล้ว ซึ่งเป็นวิธีที่ง่ายกว่าและต้องการปัญหาน้อยที่สุดในการทำงาน ลิงก์ไปยังส่วนที่สอง (ส่วนที่ง่ายที่สุด)
ขั้นตอนที่ 2: ทำความเข้าใจหลักการทำงาน
อะแฮ่ม!! ส่วนที่ยาวที่สุดของการสอน การอ่าน และการเขียนส่วนนี้น่าเบื่อทั้งคู่
ก่อนอื่น เราต้องได้รับภาพรวมว่าสิ่งนี้ทำงานอย่างไร
สิ่งที่เราทำที่นี่คือก่อนอื่น เรากำลังแปลงเพลง MP3 ของเราเป็นไฟล์ WAV และไฟล์นี้เป็นไฟล์ส่วนหัว C โดยใช้ซอฟต์แวร์ซึ่งอยู่ในลิงก์ รหัส C นี้มีตัวอย่างข้อมูล 8 บิต (ทำไมต้อง 8 บิตอ่านเพิ่มเติม) ที่เราต้องเล่นโดยใช้ Arduino ของเราในอัตราหรือความเร็วคงที่ซึ่งระบุไว้ตามอัตราการสุ่มตัวอย่างของเรา
ทฤษฎีสัญญาณเสียง
สำหรับผู้ที่ไม่ทราบว่าอัตราการสุ่มตัวอย่างหรืออัตราบิตคืออะไร:-
อัตราการสุ่มตัวอย่างถูกกำหนดเป็นจำนวนตัวอย่าง เรากำลังเล่นในหนึ่งวินาที (ปกติวัดเป็น Hz หรือ KHz)
ต้องการทราบรายละเอียดเพิ่มเติม:-คลิกที่นี่
อัตราการสุ่มตัวอย่างมาตรฐานคือ 44100 Hz (คุณภาพดีที่สุด), 32000 Hz, 22050 Hz เป็นต้น
ซึ่งหมายความว่า 44100 ตัวอย่างถูกใช้ในไม่กี่วินาทีเพื่อสร้างคลื่นตามลำดับ
เช่น แต่ละตัวอย่างจะต้องเล่นในช่วงเวลาคงที่ 1/44100=22.67 uS
จากนั้นความลึกบิตของสัญญาณเสียงก็มาถึง ซึ่งโดยปกติแล้วจะเป็นตัววัดว่าเสียงแสดงออกมาในเสียงดิจิทัลได้อย่างแม่นยำเพียงใด ยิ่งความลึกของบิตสูงเท่าใด เสียงดิจิตอลก็จะยิ่งแม่นยำมากขึ้นเท่านั้น
แต่ด้วย Arduino หรือไมโครคอนโทรลเลอร์อื่นๆ ที่มีนาฬิกา 16Mhz ทำให้เราใช้งานได้ถึง 8 บิตเท่านั้น ฉันจะอธิบายว่าทำไม
มีสูตรอยู่ที่หน้า 102 ในแผ่นข้อมูล 328p:- Datasheet
ฉันจะไม่ลงรายละเอียดว่าทำไมฉันถึงใช้สูตรนี้
ความถี่ของสัญญาณ=สัญญาณนาฬิกา / N x (1+TOP)
สัญญาณนาฬิกา = 16Mhz (บอร์ด Arduino)
N=prescaler (1 คือค่าสำหรับโครงการของเรา)
TOP=value 0 ถึง 2^16(สำหรับตัวนับเวลา 16 บิต) (255=2^8 (8 บิต) สำหรับโครงการของเรา)
เราจะได้ค่าความถี่ของสัญญาณ = 62.5 kHz
ซึ่งหมายความว่าความถี่คลื่นพาหะขึ้นอยู่กับความลึกของบิต
สมมติว่าถ้าเราใช้ค่า TOP = 2^16=65536 (เช่น ความลึกบิต 16 บิต)
แล้วเราจะได้ค่าความถี่ของสัญญาณ = 244 Hz (ที่เราใช้งานไม่ได้)
ตกลง… ดังนั้นทฤษฎีมากมายของวิธีการทำงานของสัญญาณเสียงก็เพียงพอแล้ว กลับไปที่โครงการ
รหัส C ที่สร้างขึ้นสำหรับเพลงสามารถคัดลอกไปยัง Arduino และสามารถเล่นได้ แต่เราจำกัดการเล่นเสียงสูงสุด 3 วินาทีด้วยอัตราการสุ่มตัวอย่าง 8000 Hz เนื่องจากรหัส C นี้เป็นไฟล์ข้อความจึงไม่ถูกบีบอัด ค่อนข้างจะแตกไฟล์ และใช้พื้นที่มากเกินไป (เช่นไฟล์โค้ด C พร้อมเสียง 43 วินาทีพร้อมตัวอย่าง 44, 1 KHz ใช้พื้นที่สูงสุด 23 MB) และ Arduino Mega ของเราให้พื้นที่ประมาณ 256 Kb
ดังนั้นเราจะเล่นเพลงโดยใช้ Arduino ได้อย่างไร มันเป็นไปไม่ได้. คำแนะนำนี้เป็นของปลอม อย่ากังวลนักอ่าน
นั่นเป็นเหตุผลที่เราต้องใช้การสื่อสารบางอย่างระหว่าง Arduino ที่ความเร็วสูงมาก (สูงถึง 1 Mb/s) เพื่อส่งข้อมูลเสียงไปยัง Arduino
แต่เราต้องการความเร็วเท่าไหร่ถึงจะทำได้ ??
คำตอบคือ 44000 ไบต์ต่อวินาที ซึ่งหมายถึงความเร็วมากกว่า 44000*8=325, 000 Bits/s
เราต้องการอุปกรณ์ต่อพ่วงอื่นที่มีที่เก็บข้อมูลขนาดใหญ่เพื่อส่งข้อมูลนี้ไปยัง Arduino ของเรา และนั่นจะเป็นพีซีของเราที่ใช้ Linux (ทำไมพีซีที่มี Linux โปรดอ่านเพิ่มเติมเพื่อทราบข้อมูลเพิ่มเติม)
อ่าาา…นั่นหมายความว่าเราสามารถใช้ Serial Communication ได้…แต่เดี๋ยวก่อน…ซีเรียลนั้นทำได้ด้วยความเร็วสูงถึง 115200 Bits/s ซึ่งหมายความว่า (325000/115200=3) ซึ่งช้ากว่าที่กำหนดถึงสามเท่า
ไม่เพื่อนของฉันมันไม่ใช่ เราจะใช้ความเร็วหรืออัตราบอดที่ 500,000 Bits/s ความเร็วกับสายเคเบิลสูงสุด 20-30 ซม. ซึ่งเร็วกว่าที่กำหนด 1.5 เท่า
ทำไมต้อง Linux ไม่ใช่ Windows ???
ดังนั้น เราจำเป็นต้องส่งตัวอย่างในช่วงเวลา (ตามที่ระบุไว้ด้านบนด้วย) 1/44100=22.67 uS กับพีซีของเรา
แล้วเราจะตั้งโปรแกรมให้มันทำได้อย่างไร??
เราสามารถใช้ C ++ เพื่อส่งไบต์ข้อมูลผ่าน Serial ในช่วงเวลาหนึ่งโดยใช้ฟังก์ชันสลีปบางประเภท
เช่น nanosleep, Chrono เป็นต้น ฯลฯ….
สำหรับ(int x=0;x
sendData(x);
นาโนสลีป (22000); // 22uS
}
แต่มันไม่ทำงานบน WINDOWS ก็ไม่ได้ทำงานในลักษณะนี้บน Linux (แต่ฉันพบวิธีอื่นที่คุณสามารถดูได้ในรหัสที่แนบมา)
เพราะเราไม่สามารถบรรลุความละเอียดดังกล่าวได้โดยใช้หน้าต่าง คุณต้องใช้ Linux เพื่อให้ได้ความละเอียดดังกล่าว
ปัญหาที่ฉันพบแม้กับ Linux…
เราสามารถบรรลุความละเอียดดังกล่าวได้โดยใช้ Linux แต่ฉันไม่พบฟังก์ชันดังกล่าวเพื่อพักโปรแกรมของฉันสำหรับ 22uS
ฟังก์ชันต่างๆ เช่น nanosleep, Chrono nanosleep ฯลฯ ฯลฯ ก็ใช้งานไม่ได้เช่นกัน เนื่องจากให้การนอนหลับมากกว่า 100 uS เท่านั้น แต่ฉันต้องการ 22 uS อย่างแม่นยำ ฉันได้ค้นคว้าทุกหน้าบน google และทดลองกับฟังก์ชันที่เป็นไปได้ทั้งหมดที่มีอยู่ใน C/C++ แต่ไม่มีอะไรทำงานให้ฉัน จากนั้นฉันก็คิดฟังก์ชันของตัวเองขึ้นมา ซึ่งใช้ได้ผลสำหรับฉันในฐานะเสน่ห์ที่แท้จริง
และตอนนี้รหัสของฉันมีสลีปที่แม่นยำและแม่นยำที่ 1uS ขึ้นไป !!!!
ดังนั้นเราจึงครอบคลุมส่วนที่ยากและส่วนที่เหลือก็ง่าย…
และเราต้องการสร้างสัญญาณ PWM โดยใช้ Arduino ที่มีความถี่เฉพาะและความถี่คลื่นพาหะ (62.5KHz (ตามที่คำนวณด้านบน) เพื่อการคุ้มกันสัญญาณที่ดี)
ดังนั้น เราจำเป็นต้องใช้ TIMERS ของ Arduino เพื่อสร้าง PWM อย่างไรก็ตาม ฉันจะไม่ลงรายละเอียดมากเกี่ยวกับเรื่องนั้น เพราะคุณจะพบบทช่วยสอนมากมายในหัวข้อ TIMERS แต่ถ้าคุณไม่พบบางบท ให้แสดงความคิดเห็นด้านล่าง ฉันจะสร้างขึ้นมา
ฉันใช้ไดรเวอร์ TC4420 Mosfet เพื่อบันทึก Arduino Pins ของเรา เพราะบางครั้งพวกมันไม่สามารถส่งกระแสไฟมากขนาดนั้นเพื่อขับ MOSFET ในบางครั้ง
นั่นคือเกือบทฤษฎีของโครงการนี้ ตอนนี้เราสามารถเห็นแผนภาพวงจร
ความสนใจ ความสนใจ ความสนใจ
ที่จริงแล้วโปรเจ็กต์นี้ตั้งใจทำยากมาก (ฉันจะบอกเหตุผล) มีอีกวิธีหนึ่งที่ต้องใช้ noPC เพียงแค่ Arduino และลำโพงในคำสั่งถัดไปของฉัน ลิงก์อยู่ที่นี่
*วัตถุประสงค์หลักของโครงการนี้คือการใช้ Serial Communication และเพื่อให้รู้ว่ามันเป็นพลัง และเรียนรู้วิธีที่เราสามารถตั้งโปรแกรมพีซีของเราให้ทำงานอย่างแม่นยำในช่วงเวลาที่ละเอียดเช่นนี้*
ขั้นตอนที่ 3: แผนผัง
เชื่อมต่อส่วนประกอบทั้งหมดตามที่แสดงในแผนผัง ดังนั้นคุณมีสองตัวเลือกที่นี่:-
1. เชื่อมต่อลำโพง (เชื่อมต่อกับ 5V)
2. ต่อ Flyback Transformer (ต่อไฟ 12V)
ฉันได้ลองทั้งสองอย่าง และทั้งสองทำงานได้ดีทีเดียว
ข้อจำกัดความรับผิดชอบ:-
*ฉันขอแนะนำให้ใช้ Flyback Transformer ด้วยความระมัดระวัง เนื่องจากอาจเกิดอันตรายได้เนื่องจากผลิตไฟฟ้าแรงสูง และไม่ต้องรับผิดต่อความเสียหายใดๆ ทั้งสิ้น*
ขั้นตอนที่ 4: แปลงไฟล์ MP3 เป็น WAV โดยใช้ Audacity
ก่อนอื่น ดาวน์โหลดซอฟต์แวร์
1. ความกล้า ค้นหาและดาวน์โหลดจาก Google
2. ในการแปลงไฟล์ WAV เป็น C-Code ให้ดาวน์โหลดแอปพลิเคชั่นหน้าต่างชื่อ WAVToCode
คุณสามารถเรียนรู้วิธีใช้ซอฟต์แวร์ WAVToCode ได้จากลิงก์นี้และดาวน์โหลดจากลิงก์นี้
ฉันจะให้ขั้นตอนโดยละเอียดเกี่ยวกับวิธีใช้ซอฟต์แวร์ทั้งสองด้วย
โปรดดูรูปภาพที่เชื่อมโยงกับคำแนะนำนี้
ในขั้นตอนนี้ เราจะแปลง MP3 เป็น Wav (ตามภาพ อัตราโปรเจ็กต์ต้อง 44100Hz)
ในขั้นตอนต่อไป เราจะแปลงไฟล์ wav เป็น C Code
ขั้นตอนที่ 5: WAV เป็น C-Code
ติดตามรูปภาพ.
ดูภาพสองภาพสุดท้าย การเปลี่ยนแปลงจะต้องเหมือนกันทุกประการ ตัวอักษรพิมพ์ใหญ่ควรเป็นตัวพิมพ์ใหญ่และตัวพิมพ์เล็กควรต่ำกว่า หรือคุณจะได้รับข้อผิดพลาดทางไวยากรณ์ระหว่างการคอมไพล์
(คุณจะเห็นว่าเพลง 1 นาที 41 วินาทีใช้พื้นที่ 23MB)
เปลี่ยนชื่อเพลงและความยาวด้วยชื่อและระยะเวลาของเพลงตามลำดับ
และบันทึกไฟล์ C Code
ทำสิ่งนี้กับเพลงทั้งหมดที่คุณต้องการเล่นกับ Arduino
ขั้นตอนที่ 6: สร้างไฟล์สุดท้ายและเปิดเครื่อง Linux ของคุณ
เพิ่มเพลงที่แปลงแล้วทั้งหมดของคุณลงในไฟล์ที่ให้ไว้ในลิงค์นี้
และติดตามภาพ
อัปโหลดรหัสไปยัง Arduino ที่ฉันแนบมา
จำชื่อไฟล์ C Code เอาไว้ (เช่น ไลฟ์สไตล์, ดอลลาร์, การสวมใส่) เพราะเราต้องระบุชื่อที่เหมือนกันทุกประการในโค้ดของเราโดยคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ในตอนท้ายเปิด Fedora Live USB หรืออื่น ๆ และติดตั้งคอมไพเลอร์ gcc จากนั้นใช้คำแนะนำในการคอมไพล์จากโฟลเดอร์ที่คอมไพล์โปรแกรมและเรียกใช้
ในที่สุด คุณจะสามารถฟังเพลงจาก Speaker หรือ Flyback ได้
ขอขอบคุณที่อ่านคำแนะนำนี้และโปรดแสดงความคิดเห็นหากคุณชอบ
ATTENTIONI ได้ทำส่วนที่สองของคำแนะนำนี้แล้ว ซึ่งเป็นวิธีที่ง่ายกว่าและต้องการปัญหาน้อยที่สุดในการทำงาน ลิงค์ไปยังส่วนที่สอง (ส่วนที่ง่ายที่สุด)