คิดถึงเปียโนที่บ้านจังเลยว่ะ นานตั้ง 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 ธรรมดาๆ นะน้อง เราต้องสังเคราะห์คลื่นเสียงแบบกลไกเอา
- คำสั่ง `tone(pin, frequency)` ของ Arduino ใช้ตัวจับเวลาในฮาร์ดแวร์เพื่อปั่นคลื่นสี่เหลี่ยม 5V กลับไปกลับมาวินาทีละหลายพันครั้ง
- ตั้งค่าสเกลดนตรี: น้องต้องกำหนดอาร์เรย์ของความถี่ทางกายภาพที่แน่นอน ตัวอย่างสำหรับสเกล C กลาง:
// C4, D4, E4, F4, G4 (Middle C Scale) int notes[] = {261, 293, 329, 349, 392}; - ปุ่มกดแบบสัมผัสหลายปุ่มจะถูกต่อโดยใช้ตัวต้านทาน `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!)
ถ้ามีคำถามหรือข้อเสนอแนะเกี่ยวกับโปรเจคนี้ ก็คอมเมนท์ไว้ข้างล่างได้เลยนะน้อง สู้งานนะ!