ขั้นตอนที่ 1: ตัวชิ้นส่วน (Components)
หมายเหตุ: buzzer / piezo buzzer/ sound box/ speaker อะไรพวกนี้ จริงๆ มันก็คือตัวเดียวกันแหละน้อง
พี่ใช้ลำโพงจากมือถือเก่าแล้วบัดกรีสายไฟเข้าไปสองเส้น ง่ายๆ เอง
ขั้นตอนที่ 2: หลักการ: ฟิสิกส์ของคลื่นสี่เหลี่ยม (Square Wave)
ทีนี้เราจะมาใช้ฟังก์ชัน `tone()` กัน จุดเริ่มต้นของซินธิไซเซอร์สุดเทพ อะแลร์มรถยนต์ หรือตู้เกมตู้ใหญ่ๆ ทั้งหลาย มันก็มาจากคลื่นสี่เหลี่ยมธรรมดาๆ นี่แหละ บทเรียนนี้จะแยกแยะลอจิก C++ หลักๆ ของไวยากรณ์ `tone()` ให้ดู ว่าการสร้างเสียงบน Arduino มันดราม่าต่างจากการทำให้ LED กะพริบยังไง
เราใช้มันได้สองแบบนะ
1. tone(pin-number, freq-in-Hz);
ตรงนี้ `pin-number` คือหมายเลขขาที่เราเสียบสายจากบัซเซอร์หรือลำโพงเข้าไปใน Arduino แล้วเราก็ต้องตั้งค่าความถี่ (Frequency) เพื่อให้มันส่งเสียงออกมา แบบนี้คือแบบพื้นฐานสุดๆ ถ้าอยากได้เสียงเพราะๆ หรือเสียงบี๊บๆ ลองดูแบบนี้
2. tone(pin-number, freq-in-Hz, delay);
เห็นมั้ย พี่เพิ่ม `delay` เข้าไป นั่นแปลว่าเสียงจะดังต่อเนื่องเป็นเวลาที่เราตั้งค่าไว้
ทีนี้ Arduino ก็จะส่งเสียงออกมาจนกว่าจะครบดีเลย์ที่ตั้งไว้ ตัวอย่างเช่น ถ้าพี่เขียนแบบนี้
tone(pin-number, 1000, 100);
มันจะสร้างเสียงความถี่ 1000 Hz เป็นเวลา 100 มิลลิวินาที สิ่งที่ดีที่สุดคือลองเล่นดูเองเลย ว่าความถี่ไหนเหมาะกับโปรเจคของน้อง ดูในวิดีโอพี่ได้ (เป็นแค่ตัวอย่างเบื้องต้นนะ)
รายละเอียดเทคนิคเพิ่มเติม: การทำงานระดับฮาร์ดแวร์ (`Timer2`)
มันไม่ใช่แค่สั่ง `make_music_now()` แล้วจบหรอกน้อง น้องต้องนิยามทางคณิตศาสตร์ด้วยว่าขาไฟ (physical pin) จะสั่นเร็วแค่ไหน โดยใช้หน่วยเฮิรตซ์ (`Hz`)
- หูมนุษย์ทั่วไปได้ยินเสียงตั้งแต่ `20Hz` ไปจนถึง `20,000Hz`
- ฟังก์ชัน `tone(pin, frequency)` บังคับให้นาฬิกา 16MHz ของ Arduino ใช้ **Hardware Timer 2** ควบคุมการทำงานแบบเบ็ดเสร็จ
- ปัจจัยทางฟิสิกส์: ถ้าน้องเขียน `tone(8, 440);` โปรเซสเซอร์จะสั่งให้ Digital Pin 8 สลับระหว่าง `5V` (HIGH) กับ `0V` (LOW) อย่างรวดเร็ว 440 ครั้งต่อวินาทีพอดี!
- คริสตัลใน Piezo Buzzer จะงอตัวทางกายภาพ 440 ครั้งต่อวินาที ทำให้โมเลกุลอากาศเคลื่อนที่ พอดิบพอดีกับโน้ตดนตรี 'A4' บนเปียโนเลย!
เรื่องของ `delay()` และโปรโตคอล `noTone()`
ข้อผิดพลาดยอดฮิตเวลาเขียนโค้ดเกี่ยวกับเสียงบน Arduino คือการลืมว่า `tone()` มันทำงานแบบ "เบื้องหลัง" (Asynchronously) หมดเลย
- ถ้าน้องเขียนแบบนี้:
พีโซ่จะไม่มีวันเล่นโน้ต 440 เลย เพราะโค้ดมันรันเร็วมากจนเขียนทับคำสั่งแรกทันที!tone(8, 440); tone(8, 523); // โน้ต C! - ทางแก้:
tone(8, 440); delay(1000); // บังคับให้ Uno ฟังโน้ตนี้ไปให้ครบ 1 วินาที! tone(8, 523); delay(1000); - แล้วก็จำไว้ `tone()` **มันไม่หยุดเองนะเว้ย!** จนกว่าน้องจะสั่งมันเอง! ถ้าน้องไม่ใช้ `noTone(8);` บัซเซอร์พีโซ่อิเล็กทริกจะส่งเสียงความถี่ 523Hz ออกไปเรื่อยๆ ไม่มีที่สิ้นสุด จนรบกวนทั้งห้องแล็บ แล้วน้องต้องมาดึงปลั๊กไฟออกเอง! ห้ามช็อตนะตัวนี้
ขั้นตอนที่ 3: ประกอบวงจรง่ายๆ:


วงจรนี้พี่ว่าไม่มีอะไรต้องพูดเยอะนะน้อง เหตุผลที่พี่ต่อสาย
- สายแดงของบัซเซอร์/ลำโพง เข้ากับขา 7 ของ Arduino
- สายดำของบัซเซอร์ เข้ากับขา Gnd ของ Arduino
- มันก็ธรรมดาเลย น้องจะใช้ขา Digital ไหนก็ได้ตามใจชอบ ขา 7 มันไม่ได้พิเศษอะไรเลย เอาล่ะ ต่อบัซเซอร์ตามที่บอกไปเลย
หมายเหตุ: บัซเซอร์ไม่มีขั้วบวก (+) หรือลบ (-) นะ สายไหนจะเป็นบวกหรือลบก็ได้ทั้งนั้น
เช็คลิสต์อุปกรณ์หลักสำหรับงานเสียง
- Arduino Uno/Nano (ความเร็วมาตรฐาน)
- บัซเซอร์แบบพาสซีฟ (Passive Piezoelectric Buzzer) (กระบอกสีดำเล็กๆ มีขา 2 ขา)
- (สำคัญมาก: ต้องมั่นใจว่าน้องใช้บัซเซอร์แบบ "พาสซีฟ" นะ! ชุดเริ่มต้นส่วนใหญ่ชอบแถมบัซเซอร์แบบ "แอคทีฟ" มาให้! ถ้าน้องต่อบัซเซอร์แอคทีฟเข้ากับแบตเตอรี่ มันจะส่งเสียงร้องเองทันทีเลย และมันจะไม่ฟังคำสั่ง `tone()` เลย มันจะส่งเสียงโทนเดียวที่น่าเบื่อตลอดกาล!)
- สายจัมเปอร์ และ ตัวต้านทาน (Resistor) 100 โอห์ม เพื่อต่อวงจรให้ปลอดภัย
ขั้นตอนที่ 4: เขียนโปรแกรมให้ Arduino

ต่อสาย USB ระหว่าง Arduino กับคอมหรือมือถือ แล้วอัปโหลดโค้ดไปเลย
หรือจะก๊อปปี้จากตรงนี้ก็ได้ ตามสบาย
int buzzer=7; //connecting buzzer to pin 7
void setup()
{
pinMode(buzzer,OUTPUT); //setting up buzzer pin as output
}
void loop()
{
tone(buzzer,1000,100); //freq 1000 Hz,delay 100 ms
delay(1000);
tone(buzzer,1000,1000); //freq 1000 Hz,delay 1 sec
delay(100);
}
อย่างที่เห็นพี่ประกาศพินเป็นตัวแปรชื่อ `buzzer` ไว้ จะได้เรียกใช้ง่ายๆ ในฟังก์ชัน `tone()` จากนั้นก็เซ็ตพินนั้นเป็น OUTPUT ฟังก์ชัน `loop()` มันจะรันไปตลอดกาล ตราบใดที่ Arduino ยังมีไฟ มันก็จะส่งเสียงไปเรื่อยๆ ความถี่ตั้งไว้ที่ 1000 Hz และดีเลย์ 100 ms พี่เพิ่มดีเลย์อีกตัวข้างล่างเข้าไป มันจะทำให้มีเสียงปี๊บ แล้วเว้นช่วง 1000 ms หรือ 1 วินาที
คอมไพล์โค้ด แล้วอัปโหลดลง Arduino ได้เลยจ้า
ขั้นตอนที่ 5: เสร็จสิ้น

พออัปโหลดโค้ดสำเร็จ น้องก็จะได้ยินเสียงจาก Arduino ตามที่ตั้งค่าไว้ ไม่ต้องต่อไฟจากแหล่งอื่นเพิ่มนะ เพราะมันใช้ไฟจากคอมหรือมือถือที่ต่อ USB อยู่ได้เลย พี่ลองต่อกับพาวเวอร์แบงค์เพื่อจ่ายไฟให้ Arduino ก็ใช้ได้
และนั่นก็คือทั้งหมด! แค่เพิ่มโค้ดสามสี่บรรทัด น้องก็ทำให้โปรเจคของน้อง "พูดได้" แล้ว (จะพูดเป็นคำๆ ไม่ได้นะ แต่ก็ไม่เลวใช่มั้ยล่ะ 555)
ลองดูตัวอย่างโปรเจคที่พี่ทำเสียงด้วย Arduino กัน