- วัสดุที่ต้องการ:
- แผนภูมิวงจรรวม:
- แผนผังและคำอธิบาย:
- ทำความเข้าใจกับ
- การเล่นเสียงเปียโนบน Arduino:
- การเขียนโปรแกรม Arduino:
- เล่นบันทึกเล่นซ้ำและทำซ้ำ! :
Arduino เป็นประโยชน์สำหรับผู้ที่ไม่ได้มาจากพื้นฐานด้านอิเล็กทรอนิกส์เพื่อสร้างสิ่งต่างๆได้อย่างง่ายดาย มันเป็นเครื่องมือสร้างต้นแบบที่ยอดเยี่ยมหรือจะลองทำอะไรเจ๋ง ๆ ในโครงการนี้เราจะสร้างเปียโนตัวเล็ก แต่สนุกโดยใช้ Arduino เปียโนตัวนี้ค่อนข้างธรรมดาด้วยปุ่มกด 8 ปุ่มและเสียงกริ่ง ใช้ฟังก์ชัน tone () ของ Arduino เพื่อสร้างโน้ตเปียโนประเภทต่างๆบนลำโพง เพื่อเพิ่มรสชาติให้ดียิ่งขึ้นเราได้เพิ่มคุณสมบัติการบันทึกในโปรเจ็กต์ซึ่งจะช่วยให้เราสามารถเล่นเพลงและเล่นซ้ำได้อีกครั้งเมื่อจำเป็น ฟังดูน่าสนใจ !! มาสร้างกันเถอะ….
วัสดุที่ต้องการ:
- Arduino Uno
- 16 * 2 จอแสดงผล LCD
- Buzzer
- ทริมเมอร์ 10k
- สวิตช์ SPDT
- ปุ่มกด (8 Nos)
- ตัวต้านทาน (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภูมิวงจรรวม:
Arduino Piano Project ที่สมบูรณ์สามารถสร้างขึ้นที่ด้านบนของเขียงหั่นขนมพร้อมสายเชื่อมต่อบางส่วน แผนภาพวงจรที่ทำโดยใช้ fritzing ที่แสดงมุมมอง breadboard ของโครงการดังแสดงด้านล่าง
เพียงทำตามแผนผังวงจรและต่อสายตามนั้นปุ่มกดและกริ่งเหมือนที่ใช้กับโมดูล PCB แต่ในฮาร์ดแวร์จริงเราใช้สวิตช์และกริ่งเท่านั้นไม่ควรทำให้คุณสับสนมากนักเพราะมีพินประเภทเดียวกัน. คุณยังสามารถดูภาพด้านล่างของฮาร์ดแวร์เพื่อทำการเชื่อมต่อของคุณ
ค่าของตัวต้านทานจากซ้ายอยู่ในลำดับต่อไป, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k และ 10k หากคุณไม่มีสวิตช์ DPST เดียวกันคุณสามารถใช้สวิตช์สลับปกติเหมือนที่แสดงในแผนภาพวงจรด้านบน ตอนนี้เรามาดูแผนผังของโครงการเพื่อทำความเข้าใจว่าเหตุใดเราจึงทำการเชื่อมต่อต่อไปนี้
แผนผังและคำอธิบาย:
แผนผังสำหรับแผนภาพวงจรที่แสดงด้านบนแสดงไว้ด้านล่างซึ่งทำโดยใช้ Fritzing
หนึ่งการเชื่อมต่อหลักที่เราต้องเข้าใจว่าวิธีการที่เรามีการเชื่อมต่อ 8 ปุ่มกดกับ Arduino ผ่านเข็มอนาล็อก โดยพื้นฐานแล้วเราต้องใช้พินอินพุต 8 พินซึ่งสามารถเชื่อมต่อกับปุ่มกดอินพุต 8 ปุ่ม แต่สำหรับโปรเจ็กต์เช่นนี้เราไม่สามารถใช้ไมโครคอนโทรลเลอร์ 8 พินสำหรับปุ่มกดเท่านั้นเนื่องจากเราอาจต้องการใช้ในภายหลัง ในกรณีของเราเรามีจอ LCD ที่จะเชื่อมต่อ
ดังนั้นเราจึงใช้พินอะนาล็อกของ Arduino และสร้างตัวแบ่งที่มีศักยภาพพร้อมค่าตัวต้านทานที่แตกต่างกันเพื่อทำให้วงจรสมบูรณ์ ด้วยวิธีนี้เมื่อกดแต่ละปุ่มแรงดันอนาล็อกที่แตกต่างกันจะถูกจ่ายให้กับขาอนาล็อก ตัวอย่างวงจรที่มีเพียงตัวต้านทานสองตัวและปุ่มกดสองปุ่มแสดงอยู่ด้านล่าง
ในกรณีนี้ขา ADC จะรับ + 5V เมื่อไม่ได้กดปุ่มกดหากกดปุ่มแรกตัวแบ่งที่เป็นไปได้จะเสร็จสมบูรณ์ผ่านตัวต้านทาน 560R และหากกดปุ่มที่สองตัวแบ่งที่มีศักยภาพจะแข่งขันโดยใช้ 1.5 k ตัวต้านทาน วิธีนี้แรงดันไฟฟ้าที่ได้รับจากขา ADC จะแตกต่างกันไปตามสูตรของตัวแบ่งที่มีศักยภาพ หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของตัวแบ่งที่เป็นไปได้และวิธีคำนวณค่าของแรงดันไฟฟ้าที่ได้รับจากขา ADC คุณสามารถใช้หน้าเครื่องคำนวณตัวแบ่งที่เป็นไปได้
นอกเหนือจากนี้การเชื่อมต่อทั้งหมดจะตรงไปตรงมาLCD เชื่อมต่อกับพิน 8, 9, 10, 11 และ 12 ออดเชื่อมต่อกับพิน 7 และสวิตช์ SPDTเชื่อมต่อกับพิน 6 ของ Arduino โครงการที่สมบูรณ์ขับเคลื่อนผ่านพอร์ต USB ของแล็ปท็อป คุณยังสามารถเชื่อมต่อ Arduino กับแหล่งจ่ายไฟ 9V หรือ 12V ผ่านแจ็ค DC และโครงการจะยังคงทำงานเหมือนเดิม
ทำความเข้าใจกับ
Arduino มีฟังก์ชัน handy tone () ซึ่งสามารถใช้เพื่อสร้างสัญญาณความถี่ที่แตกต่างกันซึ่งสามารถใช้เพื่อสร้างเสียงที่แตกต่างกันโดยใช้เสียงกริ่ง มาทำความเข้าใจว่าฟังก์ชันนี้ทำงานอย่างไรและจะใช้กับ Arduino ได้อย่างไร
ก่อนหน้านั้นเราควรรู้ว่า Piezo buzzer ทำงานอย่างไร เราอาจได้เรียนรู้เกี่ยวกับผลึก Piezo ในโรงเรียนของเรามันไม่ใช่อะไรนอกจากคริสตัลที่แปลงการสั่นสะเทือนทางกลเป็นไฟฟ้าหรือในทางกลับกัน ที่นี่เราใช้กระแสแปรผัน (ความถี่) ซึ่งคริสตัลสั่นสะเทือนจึงทำให้เกิดเสียง ดังนั้นในการทำให้ Piezo Buzzer ส่งเสียงดังเราต้องทำให้คริสตัลไฟฟ้า Piezo สั่นระดับเสียงและระดับเสียงขึ้นอยู่กับว่าคริสตัลสั่นเร็วแค่ไหน ดังนั้นโทนเสียงและระดับเสียงสามารถควบคุมได้โดยการเปลี่ยนแปลงความถี่ของกระแสไฟฟ้า
เอาล่ะเราจะรับความถี่ตัวแปรจาก Arduino ได้อย่างไร? นี่คือที่มาของฟังก์ชัน tone () โทน () สามารถสร้างความถี่เฉพาะบนพินเฉพาะ นอกจากนี้ยังสามารถระบุระยะเวลาได้หากจำเป็น ไวยากรณ์ของ tone () คือ
ไวยากรณ์โทน (ขาความถี่) โทน (pin, ความถี่ระยะเวลา) พารามิเตอร์ขา: ขาที่จะสร้างความถี่เสียง: ความถี่ของเสียงในเฮิรตซ์ - ระยะเวลา int ไม่ได้ลงนาม: ระยะเวลาของเสียงในมิลลิวินาที (optional1) - ไม่ได้ลงนามยาว
ค่าของพินอาจเป็นพินดิจิทัลของคุณก็ได้ ฉันใช้พินหมายเลข 8 ที่นี่ ความถี่ที่สามารถสร้างได้ขึ้นอยู่กับขนาดของตัวจับเวลาในบอร์ด Arduino ของคุณ สำหรับ UNO และบอร์ดทั่วไปอื่น ๆ ความถี่ต่ำสุดที่สามารถผลิตได้คือ 31Hz และความถี่สูงสุดที่สามารถผลิตได้คือ 65535Hz อย่างไรก็ตามมนุษย์เราสามารถได้ยินเฉพาะความถี่ระหว่าง 2000Hz ถึง 5,000 Hz
การเล่นเสียงเปียโนบน Arduino:
เอาล่ะก่อนที่ฉันจะเริ่มหัวข้อนี้ให้ฉันพูดให้ชัดเจนว่าฉันเป็นมือใหม่ที่ชอบโน้ตดนตรีหรือเปียโนดังนั้นโปรดยกโทษให้ฉันด้วยหากมีสิ่งใดที่กล่าวถึงในหัวข้อนี้เป็นการพูดพล่อยๆ
ตอนนี้เรารู้แล้วว่าเราสามารถใช้ฟังก์ชันโทนเสียงใน Arduino เพื่อสร้างเสียงบางอย่างได้ แต่เราจะเล่นโทนเสียงของโน้ตเฉพาะโดยใช้เสียงเดียวกันได้อย่างไร โชคดีสำหรับเรามีห้องสมุดชื่อ "pitches.h"เขียนโดยBrett Hagmanไลบรารีนี้มีข้อมูลทั้งหมดเกี่ยวกับความถี่ที่เทียบเท่ากับโน้ตบนเปียโน ฉันรู้สึกประหลาดใจที่ห้องสมุดนี้ใช้งานได้จริงและเล่นเกือบทุกโน้ตบนเปียโนฉันใช้แบบเดียวกันนี้เพื่อเล่นโน้ตเปียโนของ Pirates of Caribbean, Crazy Frog, Mario และแม้แต่ไททานิค อ๊ะ! เราได้รับหัวข้อเล็กน้อยที่นี่ดังนั้นหากคุณสนใจที่จะลองเล่นท่วงทำนองโดยใช้โครงการ Arduino คุณจะพบคำอธิบายเพิ่มเติมเกี่ยวกับไลบรารี pitches.h ในโปรเจ็กต์นั้น
โปรเจ็กต์ของเรามีปุ่มกดเพียง 8 ปุ่มดังนั้นแต่ละปุ่มจึงสามารถเล่นโน้ตดนตรีได้เพียงตัวเดียวดังนั้นเราจึงสามารถเล่นโน้ตได้เพียง 8 ตัวเท่านั้น ฉันเลือกโน้ตที่ใช้บ่อยที่สุดบนเปียโน แต่คุณสามารถเลือก 8 ตัวใดก็ได้หรือแม้กระทั่งขยายโปรเจ็กต์ด้วยปุ่มกดเพิ่มเติมและเพิ่มโน้ตเพิ่มเติม
โน้ตที่เลือกในโปรเจ็กต์นี้คือโน้ต C4, D4, E4, F4, G4, A4, B4 และ C5ซึ่งสามารถเล่นได้โดยใช้ปุ่ม 1 ถึง 8 ตามลำดับ
การเขียนโปรแกรม Arduino:
มีทฤษฎีเพียงพอให้เราไปถึงส่วนที่สนุกของการเขียนโปรแกรม Arduino สมบูรณ์โปรแกรม Arduinoจะได้รับในตอนท้ายของหน้านี้คุณสามารถกระโดดลงหากคุณกระตือรือร้นหรืออ่านเพิ่มเติมที่จะเข้าใจวิธีการทำงานของรหัส
ในโปรแกรม Arduino ของเราเราต้องอ่านแรงดันอนาล็อกจากพิน A0จากนั้นคาดเดาว่าปุ่มใดถูกกดและเล่นเสียงตามลำดับสำหรับปุ่มนั้น ในขณะที่ทำสิ่งนี้เราควรบันทึกด้วยว่าผู้ใช้กดปุ่มใดและกดนานแค่ไหนเพื่อให้เราสามารถสร้างโทนเสียงที่ผู้ใช้เล่นในภายหลังได้
ก่อนที่จะไปที่ส่วนลอจิกเราต้องประกาศว่าเราจะเล่นโน้ต 8 ตัวไหน จากนั้นความถี่ตามลำดับสำหรับโน้ตจะถูกนำมาจากไลบรารี pitches.h จากนั้นอาร์เรย์จะถูกสร้างขึ้นดังที่แสดงด้านล่าง ที่นี่ความถี่ในการเล่นโน้ต C4 คือ 262 และอื่น ๆ
บันทึก int = {262, 294, 330, 349, 392, 440, 494, 523}; // กำหนดความถี่สำหรับ C4, D4, E4, F4, G4, A4, B4,
ต่อไปเราต้องพูดถึงหมุดที่เชื่อมต่อกับจอแสดงผล LCD หากคุณทำตามแผนผังเดียวกันกับที่ระบุไว้ข้างต้นคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรที่นี่
const int rs = 8, th = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // หมุดที่เชื่อมต่อ LCD LCD LiquidCrystal (rs, en, d4, d5, d6, d7);
ถัดไปในฟังก์ชั่น การตั้งค่า ของเราเราเพิ่งเริ่มต้นโมดูล LCD และจอภาพอนุกรมสำหรับการดีบัก นอกจากนี้เรายังแสดงข้อความแนะนำเพื่อให้แน่ใจว่าสิ่งต่างๆทำงานได้ตามแผนที่วางไว้ ถัดไปภายใน หลัก ฟังก์ชั่นห่วงเรามีสองในขณะที่ลูป
หนึ่งขณะที่วงจะถูกดำเนินการตราบเท่าที่ สวิตช์ถูกวางไว้ในบันทึกเพิ่มเติมในโหมดบันทึกผู้ใช้สามารถจ่ายโทนเสียงที่ต้องการและในขณะเดียวกันโทนเสียงที่กำลังเล่นจะถูกบันทึกไว้ด้วย ดังนั้น while loop จะเป็นแบบนี้ด้านล่าง
ในขณะที่ (digitalRead (6) == 0) // หากสวิตช์สลับถูกตั้งค่าในโหมดบันทึก {lcd.setCursor (0, 0); lcd.print ("การบันทึก.. "); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
ในขณะที่คุณอาจสังเกตเห็นเรามีสองฟังก์ชั่นภายในห่วงในขณะที่ฟังก์ชันแรก Detect_button () ใช้เพื่อค้นหาว่าผู้ใช้กดปุ่มใดและฟังก์ชันที่สอง Play_tone () ใช้เพื่อเล่นโทนเสียงตามลำดับ นอกเหนือจากฟังก์ชันนี้แล้วฟังก์ชัน Detect_button () ยังบันทึกว่าปุ่มใดถูกกดและ ฟังก์ชัน Play_tone () จะบันทึกระยะเวลาที่กดปุ่ม
ภายใน Detect_button () ฟังก์ชั่นที่เราอ่านแรงดันไฟฟ้าแบบอะนาล็อกจากขา A0 และเปรียบเทียบกับค่าที่กำหนดไว้ล่วงหน้าบางส่วนเพื่อหาที่ปุ่มถูกกด ค่านี้สามารถกำหนดได้โดยใช้เครื่องคำนวณตัวแบ่งแรงดันไฟฟ้าด้านบนหรือโดยใช้มอนิเตอร์แบบอนุกรมเพื่อตรวจสอบว่าแต่ละปุ่มอ่านค่าอะนาล็อกใด
โมฆะ Detect_button () { analogVal = analogRead (A0); // อ่านโวลต์อะนาล็อกที่พิน A0 ปุ่ม pev_button =; // จำปุ่มก่อนหน้านี้ที่ผู้ใช้กด ถ้า (analogVal <550) ปุ่ม = 8; ถ้า (analogVal <500) ปุ่ม = 7; ถ้า (analogVal <450) ปุ่ม = 6; ถ้า (analogVal <400) ปุ่ม = 5; ถ้า (analogVal <300) ปุ่ม = 4; ถ้า (analogVal <250) ปุ่ม = 3; ถ้า (analogVal <150) ปุ่ม = 2; ถ้า (analogVal <100) ปุ่ม = 1; ถ้า (analogVal> 1,000) ปุ่ม = 0; / **** Rcord ปุ่มที่กดในอาร์เรย์*** / ถ้า (ปุ่ม! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; Record_button = 0; button_index ++; } / ** สิ้นสุดโปรแกรมการบันทึก ** / }
ดังที่กล่าวไว้ภายในฟังก์ชันนี้เรายังบันทึกลำดับการกดปุ่มต่างๆ ค่าที่บันทึกไว้จะถูกเก็บไว้ในอาร์เรย์ชื่อ record_button เราตรวจสอบก่อนว่ามีการกดปุ่มใหม่หรือไม่ถ้ากดแล้วเราตรวจสอบด้วยว่าไม่ใช่ปุ่ม 0 โดยที่ปุ่ม 0 คืออะไร แต่ไม่มีการกดปุ่มใด ๆ ภายในลูป if เราจะเก็บค่าในตำแหน่งดัชนีที่กำหนดโดยตัวแปร button_index จากนั้นเรายังเพิ่มค่าดัชนีนี้เพื่อไม่ให้เราเขียนบนตำแหน่งเดียวกันมากเกินไป
/ **** Rcord ปุ่มที่กดในอาร์เรย์*** / if (button! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; Record_button = 0; button_index ++; } / ** สิ้นสุดโปรแกรมการบันทึก ** /
ภายใน Play_tone () ฟังก์ชั่นที่เราจะเล่นเสียงตามลำดับสำหรับปุ่มกดโดยใช้หลาย ถ้า เงื่อนไข นอกจากนี้เราจะใช้อาร์เรย์ชื่อ record_time ซึ่งเราจะบันทึกระยะเวลาที่กดปุ่ม การดำเนินการจะคล้ายกับลำดับปุ่มบันทึกโดยเราใช้ฟังก์ชัน millis () เพื่อกำหนดระยะเวลาที่กดแต่ละปุ่มนอกจากนี้สำหรับการลดขนาดของตัวแปรเราจะหารค่าด้วย 10 สำหรับปุ่ม 0 ซึ่งหมายความว่าผู้ใช้ไม่ได้ กดอะไรก็ได้ที่เราไม่เล่นเสียงในช่วงเวลาเดียวกัน รหัสที่สมบูรณ์ภายในฟังก์ชันแสดงอยู่ด้านล่าง
เป็นโมฆะ Play_tone () { / **** บันทึกเวลาหน่วงเวลาระหว่างการกดแต่ละปุ่มในอาร์เรย์ *** / if (button! = pev_button) { lcd.clear (); // จากนั้นทำความสะอาด note_time = (millis () - start_time) / 10; บันทึกเวลา = note_time; time_index ++; เวลาเริ่มต้น = มิลลิวินาที (); } / ** สิ้นสุดโปรแกรมการบันทึก ** / if (button == 0) { noTone (7); lcd.print ("0 -> หยุดชั่วคราว.. "); } if (ปุ่ม == 1) { โทน (7, โน้ต); lcd.print ("1 -> NOTE_C4"); } if (ปุ่ม == 2) { โทน (7, โน้ต); lcd.print ("2 -> NOTE_D4"); } if (ปุ่ม == 3) { โทน (7, โน้ต); lcd.print ("3 -> NOTE_E4"); } if (ปุ่ม == 4) { โทน (7, โน้ต); lcd.print ("4 -> NOTE_F4"); } if (ปุ่ม == 5) { โทน (7, โน้ต); lcd.print ("5 -> NOTE_G4"); } if (ปุ่ม == 6) { โทน (7, โน้ต); lcd.print ("6 -> NOTE_A4"); } if (ปุ่ม == 7) { โทน (7, โน้ต); lcd.print ("7 -> NOTE_B4"); } if (ปุ่ม == 8) { โทน (7, โน้ต); lcd.print ("8 -> NOTE_C5"); } }
ในที่สุดหลังจากบันทึกผู้ใช้ต้องสลับ DPST ไปทางอื่นเพื่อเล่นเสียงที่บันทึกไว้เมื่อเสร็จสิ้นโปรแกรมจะแยกออกจากลูป while ก่อนหน้าและเข้าสู่วินาทีในขณะที่วนซ้ำซึ่งเราเล่นโน้ตตามลำดับของปุ่มที่กดในช่วงเวลาที่บันทึกไว้ก่อนหน้านี้ รหัสในการทำเช่นเดียวกันแสดงอยู่ด้านล่าง
ในขณะที่ (digitalRead (6) == 1) // หากสวิตช์สลับถูกตั้งค่าในโหมดการเล่น { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("กำลังเล่น.. "); สำหรับ (int i = 0; i <sizeof (record_button) / 2; i ++) { delay ((record_time) * 10); // รอก่อนจ่ายเพลงถัดไป ถ้า ( record_button == 0) noTone (7); // ผู้ใช้แตะปุ่มอื่น ๆ โทน (7, โน้ต - 1)]); // เล่นเสียงที่ตรงกับปุ่มที่ผู้ใช้สัมผัส } } }
เล่นบันทึกเล่นซ้ำและทำซ้ำ!:
สร้างฮาร์ดแวร์ตามแผนภาพวงจรที่แสดงและอัปโหลดรหัสไปยังบอร์ด Arduino และเวลาที่แสดง วางตำแหน่ง SPDT ในโหมดบันทึกและเริ่มเล่นโทนเสียงที่คุณเลือกการกดแต่ละปุ่มจะให้โทนเสียงที่แตกต่างกัน ระหว่างโหมดนี้ LCD จะแสดง“ กำลัง บันทึก… ” และในบรรทัดที่สองคุณจะเห็นชื่อของโน้ตที่กำลังกดอยู่ตามที่แสดงด้านล่าง
เมื่อคุณเล่นโทนแล้วให้สลับสวิตช์ SPDT ไปอีกด้านหนึ่งและ LCD จะแสดงข้อความ“ กำลัง เล่น.. ” จากนั้นเริ่มเล่นโทนที่คุณเพิ่งเล่น โทนเดียวกันจะเล่นซ้ำแล้วซ้ำอีกตราบเท่าที่สวิตช์สลับยังคงอยู่ในตำแหน่งดังที่แสดงในภาพด้านล่าง
การทำงานทั้งหมดของโครงการสามารถพบได้ในวิดีโอด้านล่าง หวังว่าคุณจะเข้าใจโครงการและสนุกกับการสร้างมัน หากคุณมีปัญหาในการสร้างโพสต์นี้ในส่วนความคิดเห็นหรือใช้ฟอรัมเพื่อขอความช่วยเหลือด้านเทคนิคในโครงการของคุณ อย่าลืมตรวจสอบวิดีโอสาธิตด้านล่าง