กลับไปหน้ารวมไฟล์
arduino-based-piano-f9a995.md

คิดถึงเปียโนที่บ้านจังเลยว่ะ นานตั้ง 2 ปีแล้วที่ไม่ได้จับ เลยคิดว่าเอา Arduino มาทำเปียโนเล่นดีกว่า! ถึงแม้หน้าตาและเสียงจะไม่เหมือนเปียโนจริงเป๊ะๆ แต่ก็พอให้เสียงดนตรีออกมาได้เนอะ

เซ็ตอัพ

วางปุ่มกดบนเบรดบอร์ดให้ดีๆ นะน้อง ต้องเว้นช่องไฟระหว่างปุ่มกดแต่ละปุ่ม 1 ช่อง เพราะ Arduino Uno ของพี่มีพอร์ต Digital I/O ไม่พอ เลยใช้แค่คีย์จาก C (อ็อกเทฟที่ 4) ถึง F (อ็อกเทฟที่ 5) เท่านั้น พี่ยังใส่ F sharp (หรือ G flat) กับ A sharp (หรือ B flat) เข้าไปด้วย โดยใช้ปุ่มกดสีต่างกันสองสี ส่วนพอร์ต Analog I/O นั้นพี่ไม่ใช้ เพราะถ้าเปิด pullup มันจะไปรบกวนค่าที่อ่านจาก analogRead( )

การต่อวงจร

ปุ่มกดทุกปุ่มต้องต่อกับ Ground (GND) นะ

ปุ่มกด

อ็อกเทฟที่ 4

  • C - D0
  • D - D1
  • E - D2
  • F - D3
  • F# - D4
  • G - D5
  • A - D6
  • A# - D7
  • B - D8

อ็อกเทฟที่ 5

  • C - D10
  • D - D11
  • E - D12
  • F - D13

โมดูล Passive Buzzer (KY-006)

  • (+) - 5V
  • (-) - Ground (GND)
  • S - D9

เขียนโค้ด

อย่างแรกเลย สร้างตัวแปร global สำหรับปุ่มกดและบัซเซอร์ของคุณก่อน ภายใน void setup( ) ให้เรียกใช้ pinMode( ) เพื่อกำหนดโหมดพินของแต่ละชิ้นส่วนเป็น INPUT หรือ OUTPUT ถ้าน้องไม่ได้ต่อปุ่มกดเข้ากับตัวต้านทาน 1 kΩ ให้ประกาศพินเป็น INPUT_PULLUP ตามที่บทสอนของ Arduino บอกไว้ การกดปุ่มจะส่งสัญญาณ LOW เมื่อพินถูกตั้งค่าเป็น INPUT_PULLUP ส่วนพินของ Passive buzzer ให้ประกาศเป็น OUTPUT เพราะมันเป็นทรานสดิวเซอร์ (ชิ้นส่วนที่แปลงพลังงานไฟฟ้าเป็นแสง ความร้อน หรือเสียง)

จำไว้ให้ดี ปุ่มกดเป็นสวิตช์ชั่วคราว มันจะครบวงจรก็ต่อเมื่อถูกกดเท่านั้น พอปล่อยปุ่ม วงจรก็จะขาดอีกครั้ง สำหรับโปรเจกต์นี้เราไม่ต้องทำ debounce ให้ปุ่มกดก็ได้ เพราะถ้านึกตาม เปียโนก็สร้างเสียงตอนกดคีย์ คีย์เปียโนกับสวิตช์ชั่วคราวทำงานคล้ายกันมาก ยกเว้นเรื่องสายที่ถูกตีในเปียโนตอนกดคีย์

อาร์เรย์ความถี่ (ฟังก์ชัน tone())

อย่าหวังจะเล่นไฟล์เสียง `MP3` ซับซ้อนๆ บน Uno ธรรมดาๆ นะน้อง เราต้องสังเคราะห์คลื่นเสียงแบบกลไกเอา

  1. คำสั่ง `tone(pin, frequency)` ของ Arduino ใช้ตัวจับเวลาในฮาร์ดแวร์เพื่อปั่นคลื่นสี่เหลี่ยม 5V กลับไปกลับมาวินาทีละหลายพันครั้ง
  2. ตั้งค่าสเกลดนตรี: น้องต้องกำหนดอาร์เรย์ของความถี่ทางกายภาพที่แน่นอน ตัวอย่างสำหรับสเกล C กลาง:
    // C4, D4, E4, F4, G4 (Middle C Scale)
    int notes[] = {261, 293, 329, 349, 392};
  3. ปุ่มกดแบบสัมผัสหลายปุ่มจะถูกต่อโดยใช้ตัวต้านทาน `INPUT_PULLUP` (ป้องกันไม่ให้สัญญาณลอย) ตามที่แสดงในแผนภาพการต่อด้านบน

ลูปสำหรับเล่นเสียงพร้อมกัน

ดังนั้น ภายใน void loop( ) น้องจะใช้ if( ) และ else if( ) เพื่อให้เปียโนทำงาน ข้อมูลความถี่ของแต่ละโน้ตเปียโนสามารถหาได้จากแหล่งข้อมูลอ้างอิงทั่วไป จงปัดเศษค่าให้เป็นจำนวนเต็มที่ใกล้ที่สุดก่อนใช้ฟังก์ชัน tone( ) เพื่อสร้างเสียงจาก passive buzzer ของน้อง

Arduino มันจะสแกนปุ่มกดแบบเร็วฉิบหายวนไปเรื่อยๆ พอน้องกดปุ่มเข้าไป ลำโพงก็จะสั่นที่ความถี่ตามนั้น—เสียงดนตรีก็ดังออกมา! ถ้าน้องปล่อยปุ่มทุกปุม ลูปควรเรียก `noTone(speakerPin);` ด้วยนะ จะได้ปิดเสียงเจ้าเครื่องกำเนิดคลื่นสี่เหลี่ยมซะ จะได้ไม่ดังบี๊ปๆ อยู่อย่างนั้นตลอดกาล

ความยาวของเสียงที่บัซเซอร์ดังตอนกดปุ่มน่ะ ตั้งไว้ 30 มิลลิวินาที น้องปรับให้สั้นลงตามใจชอบได้เลย เช่น ถ้าเล่นเพลงเร็วๆ ก็ต้องทำให้เสียงสั้นลง เพราะฟังก์ชัน `tone()` มันทำงานทีละพินเดียวไง อย่าลืม

ตัวอย่างโค้ดจัดให้:

void loop( ){
if ((digitalRead(C4))==LOW){
tone(Buzzer, 262, 30);
}else if ((digitalRead(D4)==LOW){
tone(Buzzer, 294, 30);
}
...
}

ถ้าเจอปัญหาหรือสงสัยเรื่องโค้ด ก็เม้นท์ถามไว้ด้านล่างได้เลยจ้า

หน้าตาเมื่อเสร็จสิ้น

ฮาร์ดแวร์สำหรับสร้างเสียง

  • Arduino Uno/Nano (ความแม่นยำของไทม์เมอร์เทพมาก)
  • ปุ่มกดแบบ Tactile (จัดระยะบนเบรดบอร์ดให้เหมือนคีย์เปียโน)
  • บัซเซอร์แบบ Passive หนึ่งตัว (KY-006) (หรือ Piezo Buzzer ธรรมดาก็ได้)
  • (อัพเกรดเสริม: ใส่โพเทนชิออมิเตอร์ 10K เข้ากับพินแอนะล็อกที่ว่าง ใช้ฟังก์ชัน `map()` เพื่อปรับระดับเสียงแบบเรียลไทม์ เปลี่ยนเปียโนธรรมดาให้กลายเป็นซินธิไซเซอร์แนว EDM!)

ถ้ามีคำถามหรือข้อเสนอแนะเกี่ยวกับโปรเจคนี้ ก็คอมเมนท์ไว้ข้างล่างได้เลยนะน้อง สู้งานนะ!

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "RucksikaaR"
category: "Audio & Sound"
components:
  - "31x Male/Male Jumper Wires"
  - "1x Arduino UNO"
  - "1x Buzzer, Harmony XVB"
  - "1x Solderless Breadboard Full Size"
  - "13x Pushbutton switch 12mm"
description: "Chopsticks on silicon! Map 5 tactile push buttons to mathematically perfect acoustic frequencies using the tone() function to build a fully functional miniature electric synthesizer."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX1/OowL+h9DJ2E4YLQDiwE9u41NLf3YpdYnGxAJ6TLIovIZ1HQK3aOLYDs1tXl2pxcrhoxoxH+vv7YLckx2KQCQn5xQgQTYs8g4="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/arduino-based-piano-f9a995_cover.jpg"
lang: "en"
likes: 1
passwordHash: "48e1ab0ced0d126e6e289b71bf3a87baec655b386417b08da05b58402958715e"
price: 1299
seoDescription: "Build a simple DIY Arduino Piano. Learn to create music with Arduino in this fun project, even if you don't have a real Piano."
tags:
  - "sound"
  - "midi"
  - "music"
  - "piano"
title: "เปียโนสายช่าง! สร้างเองด้วย Arduino งานง่ายแต่หล่อ"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/xCdGTaL4YPk"
views: 8085