กลับไปหน้ารวมไฟล์
soundbox-20-c8726c.md

Intro

เห้ยน้องๆ รู้ป่าวว่าบอร์ด [Arduino](https://s.shopee.co.th/7fUgFAWSki) มันทำอะไรเจ๋งๆ ได้เยอะนะเว้ย อย่างการสั่งให้ Passive [Buzzer](https://s.shopee.co.th/6pvZFdZdRf) เล่นเพลงงี้ แต่ถ้าจะให้กระจอกๆ แค่นั้นมันไม่ใช่ทางเรา พี่เลยจัดให้มันท้าทายขึ้นอีกนิด ด้วยการเอา Buzzer มาฟีเจอริ่งกับจอ [LCD](https://s.shopee.co.th/6AfsSPcAnb) ขนาด 16:2 ซะเลย โดยใช้ Hardware Schematic ชุดเดิมนี่แหละ น้องจะสั่งให้มันเล่นเพลงง่ายๆ 8 โน้ต หรือจะเอาเพลงที่พี่เตรียมไว้ให้ก็ได้ หรือถ้าใครอยากโชว์เทพ จะเขียนเพลงเองก็ยังได้เลย จัดไปวัยรุ่น!

เพลง "Happy Birthday" ฝีมือพี่เอง

ถ้าโปรเจกต์นี้โดนใจน้อง ลองไปดูงานอื่นๆ ของพี่ได้นะ -

  • Lego Gun Shooter
  • Basketball Buzzer

Step 1: เตรียมของให้พร้อม อย่าให้ขาด!

สำหรับโปรเจกต์นี้ น้องต้องมีไอเทมตามนี้ -

  • บอร์ด Arduino (รุ่นไหนก็ได้ที่ถนัด)
  • สาย Jumper Wires (เอามาเยอะๆ หน่อย)
  • Breadboard แบบครึ่ง (Half-breadboard)
  • Passive Buzzer 1 ตัว
  • จอ LCD (ขนาด 16:2)

ส่วนอุปกรณ์เสริมที่ไม่เกี่ยวกับงานไฟฟ้า ก็ตามนี้เลย -

  • กระดาษลัง
  • กล่องเปล่า
  • เทปกาว
  • กาว

ไอ้พวกของแต่งพวกนี้แล้วแต่น้องเลย จะบิวต์ออกมาให้หล่อเท่แค่ไหน จัดไปเต็มที่!

Step 2: ต่อวงจร (Hardware Schematics)

ขั้นแรก: เตรียม Breadboard

ผังการต่อ Breadboard พื้นฐาน

สูตรสำเร็จเกือบทุกโปรเจกต์ Arduino เลยนะน้อง คือต้องจิ้ม 5V เข้าแถวบวก แล้วเอา GND เข้าแถวลบไว้ก่อนเลย

ขั้นที่สอง: Passive Buzzer

ผังการต่อ Buzzer

ขั้นตอนสำคัญมาแล้ว คือการเสียบเจ้า Passive Buzzer เข้าไป ขาข้างหนึ่งจิ้มลงแถวลบ (GND) ส่วนอีกข้างจิ้มไปที่ Digital Pin 8 ของบอร์ดนะ

ขั้นที่สาม: ติดตั้ง LCD

ผังการต่อจอ LCD

ตรงนี้แหละที่ยุ่งยากสุดในโปรเจกต์นี้ เพราะจอ LCD สายมันเยอะจัด ถ้าดูรูปไม่ชัด พี่ลิสต์มาให้แล้วว่า Pin 1 ถึง 16 ต้องจิ้มตรงไหนบ้าง:

Pin 1 --> GND (แถวลบ)

Pin 2 --> 5V (แถวบวก)

Pin 3 --> Digital Pin 6

Pin 4 --> Digital Pin 12

Pin 5 --> GND (แถวลบ)

Pin 6 --> Digital Pin 11

Pins 7-10 --> ไม่ต้องต่อ ปล่อยว่างไว้

Pin 11 --> Digital Pin 5

Pin 12 --> Digital Pin 4

Pin 13 --> Digital Pin 3

Pin 14 --> Digital Pin 2

Pin 15 --> 5V (แถวบวก)

Pin 16 --> GND (แถวลบ)

เสร็จแล้ว! ตบมือให้ตัวเองหน่อยน้อง ในที่สุดก็ผ่านช่วง Hardware ที่น่าปวดหัวมาได้แล้ว

Step 3: ลุยโค้ด (Software)

พี่เตรียมโค้ดไว้ให้ 3 แบบ อยู่ด้านล่างสุดของหน้านี้ มีทั้งเพลงแบบ 8 โน้ตง่ายๆ, เพลง Happy Birthday (ที่พี่แกะเอง), และเพลงในตำนานอย่าง Coffin Dance (เพลงแบกโลงนั่นแหละ พี่เอาโน้ตมาจาก Sohail 8 แล้วมาปรับแก้ให้รันบน SoundBox ของเราได้)

โค้ดทุกตัวใช้ Hardware ชุดเดียวกันหมด ต่างกันแค่ตรง `int melody` (ที่เอาไว้ใส่ตัวโน้ต) กับ `int noteDurations` (ที่บอกว่าโน้ตแต่ละตัวลากยาวแค่ไหน) แต่ตอนจบเพลง จอ LCD จะขึ้นคำว่า "Song complete- Congratulations!" เหมือนกันหมดนะ

มาดูตัวอย่างโค้ดแบบ 8 โน้ตกันหน่อย ว่ามันทำงานยังไง

#include "pitches.h"
#include <LiquidCrystal.h>
int melody[] = {
NOTE_E5, NOTE_D5, NOTE_C5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_C5, NOTE_C5};
int noteDurations[] = {
4, 4, 2, 4, 4, 2, 8, 4
};
int Contrast=75;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

สองบรรทัดแรกคือการเรียก Library สำหรับเสียงตัวโน้ต (pitches) กับจอ LCD มาใช้ ตัว Library pitches จะรวมค่าเสียงต่างๆ ไว้ให้เราแล้ว ส่วน LiquidCrystal จะช่วยให้เราสั่งงานหน้าจอได้ง่ายขึ้น ไม่ต้องเขียนโค้ดคุมเองจนปวดตับ

ตัวแปร `int melody` คือที่เก็บโน้ตทั้ง 8 ตัว ให้นึกถึงชื่อโน้ตเปียโนเลย ส่วนตัวเลขข้างหลังคือระดับ Octave ส่วน `int noteDurations` คือจังหวะของเพลง เลข 4 คือเขม่นหนึ่งชั้น (quarter note), 8 คือเขม่นสองชั้น (eighth note) อะไรประมาณนั้น ถ้าอยากเปลี่ยนเพลง น้องก็ต้องมาแก้ไอ้สองที่นี้แหละ

ตัวแปร `int Contrast` เอาไว้ปรับความคมชัดของตัวหนังสือบนหน้าจอ LCD ส่วน `LiquidCrystal lcd` คือการบอกบอร์ดว่าเราต่อจอไว้ที่ Pins ไหนบ้าง

void setup() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.25;
delay(pauseBetweenNotes);
noTone(8);
}
analogWrite(6, Contrast);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Song Complete");
lcd.setCursor(0,1);
lcd.print("Congratulations!");
}
void loop() {
//ไม่มีอะไรให้ดูนะจ๊ะ :)
}

ใน `void setup()` โค้ดจะวน Loop สั่งให้ Buzzer ร้องจนครบ 8 โน้ต โดยเว้นระยะห่างระหว่างโน้ตไว้ 25% เพื่อให้เสียงฟังดูเป็นธรรมชาติ พอจบเพลงปุ๊บ LCD ก็จะรับไม้ต่อทันที

`analogWrite` จะส่งค่า Contrast ไปที่ Pin 6 ส่วน `lcd.begin` คือการสั่งเปิดหน้าจอ 16x2 ของเรา จากนั้นก็ตามด้วยคำสั่งพิมพ์ข้อความลงบนจอตามพิกัดที่ตั้งไว้ ถ้าอยากเปลี่ยนคำพูด ก็แก้ในเครื่องหมายคำพูดได้เลยน้อง

ส่วน `void loop()` ปกติจะเป็นที่ที่โค้ดเยอะสุด แต่รอบนี้พี่ปล่อยว่างไว้ เพราะเราอยากให้มันรันแค่รอบเดียวตอนเปิดเครื่องพอ

ทีนี้ลองมาดูความต่างของโน้ตเพลง Happy Birthday กันบ้าง

int melody[] = {
NOTE_D5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_G5, NOTE_FS5, NOTE_D5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_A5, NOTE_G5, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_B5, NOTE_G5, NOTE_FS5, NOTE_E5, NOTE_C6, NOTE_C6, NOTE_B5, NOTE_G5, NOTE_A5, NOTE_G5};
int noteDurations[] = {
8, 8, 4, 4, 4, 2, 8, 8, 4, 4, 4, 2, 8, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4, 2,
};

เห็นป่ะ โน้ตมันจะเยอะและจังหวะซับซ้อนกว่าเดิมหน่อย

และนี่คือโน้ตเพลง Coffin Dance สุดตึง

//เครดิตโดย sohail8
int melody[] = {
NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D5,
NOTE_C5, NOTE_C5, NOTE_C5, NOTE_C5,
NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5,
NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5,
NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5,
NOTE_C5, NOTE_AS4, NOTE_A4, NOTE_F4,
NOTE_G4, 0, NOTE_G4, NOTE_D5,
NOTE_C5, 0, NOTE_AS4, 0,
NOTE_A4, 0, NOTE_A4, NOTE_A4,
NOTE_C5, 0, NOTE_AS4, NOTE_A4,
NOTE_G4,0, NOTE_G4, NOTE_AS5,
NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5,
NOTE_G4,0, NOTE_G4, NOTE_AS5,
NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5,
NOTE_G4, 0, NOTE_G4, NOTE_D5,
NOTE_C5, 0, NOTE_AS4, 0,
NOTE_A4, 0, NOTE_A4, NOTE_A4,
NOTE_C5, 0, NOTE_AS4, NOTE_A4,
NOTE_G4,0, NOTE_G4, NOTE_AS5,
NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5,
NOTE_G4,0, NOTE_G4, NOTE_AS5,
NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5};
int noteDurations[] = {
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
4,4,4,4,
};

อันนี้จัดเต็มทั้งเพลง! ถ้าน้องอยากได้เพลงตัวเอง ก็แค่ก๊อปโน้ตมาวางในช่องพวกนี้แหละ หรือจะหาโน้ตฟรีๆ ในเน็ตที่ใช้ Library pitches เหมือนกันก็ได้

พอเลือกโค้ดที่ชอบได้แล้ว ก็จัดการ Flash ลงบอร์ด Arduino แล้วเตรียมเอาไปลงกล่องได้เลย!

Step 4: เก็บงานให้เนียน (Final Touches)

ขั้นตอนสุดท้ายคือการเอาจุดเชื่อมต่อทั้งหมดไปยัดลงใน Package สวยๆ พี่ใช้กล่องแบบนี้ -

กล่องที่พี่ใช้ (อย่างเก๋า)

แล้วแต่งออกมาให้เป็นสไตล์นี้ -

Arduino SoundBox เวอร์ชั่นหล่อเท่

พี่ใช้ Power Bank แปะไว้ข้างหลังกล่อง แล้วเจาะรูให้เสียบสายเปิด-ปิดกับชาร์จไฟได้ง่ายๆ ส่วนวิดีโอเพลง Happy Birthday อยู่ข้างบนนะ แต่อันนี้เป็นคลิปตอนมันเล่นเพลง Coffin Dance -

Coffin dance arduino. เครดิตโค้ดทำนองจาก sohail8

แค่นี้ก็เสร็จแล้วน้อง! ใครลองทำแล้วมีปัญหา หรืออยากอวดผลงาน คอมเมนต์ไว้ได้เลยนะ เดี๋ยวพี่มาดู!

ข้อมูลทางเทคนิคจัดเต็ม (EXPANDED TECHNICAL DETAILS)

เครื่องเล่นเสียงดิจิทัลแบบโต้ตอบ (Interactive Digital Audio Sampler)

SoundBox 2.0 คือเครื่องดนตรีแบบ Tactile ที่ให้น้องสั่งเล่นไฟล์เสียงคุณภาพสูงได้แค่ปลายนิ้ว

  • การใช้งาน DFPlayer Mini: มีการใช้ DFPlayer Mini MP3 module ซึ่งมีช่องเสียบ SD card และ Amp ขนาด 3W ในตัว บอร์ด Arduino จะคุยผ่าน Serial (UART) เพื่อสั่งเล่นเพลงตามปุ่มที่กด
  • การเลือกแทร็กเพลง: มีระบบ "Mode" สำหรับสลับชุดเสียง (Sound Banks) ทำให้ปุ่มหลักทั้ง 4 ปุ่มเปลี่ยนไปเล่นเสียงกลอง, SFX หรือทำนองเพลงอื่นๆ ได้

ส่วนติดต่อผู้ใช้งาน (User Interface)

  • แสงไฟแสดงจังหวะ: มีการใช้ Addressable NeoPixels ที่จะกระพริบตามจังหวะเสียงเพลง ให้ฟีลแบบ "Performance" จัดเต็ม เหมือนเครื่องดีเจหรือของเล่นล้ำๆ เลยล่ะน้อง สู้ๆ นะ!

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

title: "SoundBox 2.0"
description: "Interface a Passive Buzzer playing a full song with a Liquid Crystal Display!"
author: "ShreyanR"
category: ""
tags:
  - "sound"
  - "audio"
  - "lcd"
views: 2445
likes: 3
price: 299
difficulty: "Intermediate"
components:
  - "1x Alphanumeric LCD, 16 x 2"
  - "1x Hot glue gun (generic)"
  - "1x Breadboard (generic)"
  - "1x Cardboard Box"
  - "1x Tape, Electrical"
  - "1x Arduino UNO"
  - "1x Jumper wires (generic)"
  - "1x Buzzer"
tools: []
apps:
  - "1x Arduino Web Editor"
  - "1x Arduino IDE"
downloadableFiles: []
documentationLinks: []
passwordHash: "beef65390045b44565581ea6ffafcfff2fdfd3a9854a00665d4d6353db1825a8"
encryptedPayload: "U2FsdGVkX1+56eBcFck+R07Irba6FvF67y9dJm2AB2eh+Cjdn97bRzadzfmWCQEnifS2OGQONu23UQpEdQshXi5rHYfnlJzCVTXgB0MUi9wg4//Avk8Fs+OAA+rFRiKD"
seoDescription: "Learn how to interface a Passive Buzzer to play full songs with a Liquid Crystal Display."
videoLinks:
  - "https://www.youtube.com/embed/URCfpu7dwIk"
  - "https://www.youtube.com/embed/nhFlap08xg8"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/soundbox-20-c8726c_cover.jpg"
lang: "th"