บทที่ 23: การเขียนโปรแกรมสั่งงาน Buzzer ให้เกิดโทนเสียงต่าง ๆ
ลำโพงบัซเซอร์ เป็นอุปกรณ์ที่ให้กำเนิดเสียงทำหน้าที่เปลี่ยนสัญญาณไฟฟ้าให้อยู่ในรูปสัญญาณเสียง
โดยมีวงจรกำเนิดความถี่ (oscillator ) อยู่ภายในตัว ใช้ไฟเลี้ยง 3.3 – 5V สามารถสร้างเสียงเตือนหรือส่งสัญญาณที่เป็นรูปแบบต่าง ๆ

เราอาจจะเคยได้ยินเสียงบัซเซอร์อยู่บ่อย ๆ เช่น เสียง ปี๊บที่อยู่ในคอมพิวเตอร์ก็ใช้บัซเซอร์ในการส่งสัญญาณให้ทราบสถานะของคอมพิวเตอร์ให้ทราบว่ามีปัญหาอะไร
ลำโพงบัซเซอร์มีอยู่ 2 ประเภท ได้แก่
1. แบบแอคทีฟ (Active Buzzer) ลำโพงชนิดนี้มีวงจรกำเนิดความถี่อยู่ภายใน สามารถสร้าง สัญญาณเสียงเตือนได้ทันทีเพียงแค่จ่ายแรงดันไฟฟ้าเข้าไป
2. แบบพาสซีฟ (Passive Buzzer) ลำโพงชนิดนี้ทำงานเหมือนลำโพงขนาดเล็ก คือ ถ้าป้อน แรงดันไฟฟ้ากระแสตรงเข้าไปไม่มีเสียง ถ้าต้องการให้มีสัญญาณเสียงต้องทำการป้อนสัญญาณความถี่ เข้าไป ลำโพงชนิดนี้สามารถกำเนิดเสียงที่มีความแตกต่างกันตามความถี่ที่ป้อนเข้ามาในวงจร
บนบอร์ด Arduino Learning Kit มีตัวบัซเซอร์ชนิดพาสซีฟ ติดตั้งอยู่โดยเชื่อมต่อเข้ากับขา Arduino Uno, Arduino Nano และ ESP-32 ตามตารางด้านล่าง โดยคุณสมบัติของตัวบัซเซอร์สามารถดูได้จากข้อมูลด้านล่าง
| Buzzer Pin | |
|---|---|
| Arduino Uno | 11 |
| Arduino Nano | 11 |
| ESP32(ESP-WROM-32) | 27 |
ตารางที่ 23. 1 ขาที่ต่อใช้งานกับบัซเซอร์


-
เขียนโปรแกรมเปลี่ยนโทนเสียงตัวบัซเซอร์บน Arduino Uno
-
เลื่อน DIP SWITCH(3) ของ BUZZER ไปตำแหน่ง ON -
เปิดตัวอย่างโปรแกรมโดยไปที่ File -> Examples -> Digital -> toneMelody
-

-
หลังจากที่เปิดโปรแกรมตัวอย่าง toneMelody ขึ้นมาแล้ว ให้ทำการเปลี่ยนแปลงขาที่ใช้ต่อกับตัวบัซเซอร์ โดยเปลี่ยนจาก 8 เป็นขาของตัว Arduino Uno คือ 11

-
ทำการอัปโหลดโปรแกรมไปยังตัว Arduino Uno จากนั้นฟังเสียงของบัซเซอร์หลังจากรันโปรแกรม
อธิบายการทำงานของโค้ด
-
จากโค้ดตัวอย่าง toneMelody จะประกอบด้วยไฟล์อยู่ 2 ไฟล์ โดยไฟล์แรกคือไฟล์โปรแกรมหลัก(toneMelody.ino) และไฟล์ pitches.h ซึ่งจะเก็บค่า define ของโทนเสียงต่าง ๆ ไว้ โดยในโค้ดหลักบรรทัดที่ 18 ต้องทำการ include เข้ามาใช้ก่อน
-
บรรทัดที่ 21-23 เป็นการประกาศตัวแปร integer แบบ Array โดยจะเก็บค่า Melody tone ต่างๆ
-
บรรทัดที่ 26-28 เป็นการประกาศตัวแปร integer แบบ Array เช่นกัน แต่จะเก็บค่าเวลาที่ทำให้เกิดเสียง
-
ในการทำงานของโปรแกรมตัวอย่างนี้ ได้ออกแบบมาเพื่อทำการรันเพียงครั้งเดียวในฟังก์ชัน setup เท่านั้น โดยจะรันตัวโน้ต 8 ตัวใน for loop บรรทัดที่ 32 จนถึงบรรทัดที่ 45
-
บรรทัดที่ 36 จะเป็นการประกาศตัวแปร noteDuration ซึ่งทำหน้าที่กำหนดเวลาที่จะทำให้เกิดเสียงดัง โดยในโค้ดค่าสูงสุดคือ 250mS และค่าต่ำสุดคือ 125mS
-
บรรทัดที่ 37 เรียกใช้ tone เพื่อให้เกิดเสียงดังที่บัซเซอร์ โดยมีรูปของการใช้งานดังนี้
tone(pin, frequency, duration)
pin: ขาที่ต่ออยู่กับตัวบัซเซอร์
frequency: ความถี่ที่ใช้
duration: ระยะเวลาที่เสียงจะดัง
-
บรรทัดที่ 41-42 กำหนดช่วงเว้นระยะของตัวโน้ตแต่ละตัว
-
บรรทัดที่ 44 noThone ให้หยุดเสียงที่บัซเซอร์
-
เขียนโปรแกรมเปลี่ยนโทนเสียงตัวบัซเซอร์บน ESP-32
-
ตัวคอมไพเลอร์ของ ESP32 จะไม่มีฟังก์ชัน tone เหมือนพวกแพลตฟอร์ม Arduino แต่เราสามารถใช้ฟังก์ชัน ledWrite ได้ซึ่งจะเป็นการสั่งงานให้ขา PWM ของตัว ESP-32 ส่งสัญญาณออกไปในลักษณะ Pulse Width Mod ซึ่งจะกำหนดความถี่ให้กับตัวบัซเซอร์ได้
-
เขียนโปรแกรมตามตัวอย่างโค้ดด้านล่าง

-
ทำการอัปโหลดโปรแกรมไปยังตัว ESP-32 จากนั้นฟังเสียงของบัซเซอร์หลังจากรันโปรแกรม
อธิบายการทำงานของโค้ด
-
ในฟังก์ชัน setup บรรทัดที่ 6 เป็นการกำหนดค่าให้ขาที่ต่อกับบัซเซอร์ โดยใช้คำสั่ง ledAttachPin
โดยมีรูปแบบคำสั่งคือ
ledcAttachPin(pin,channel);
-
บรรทัดที่ 11 เป็นการประกาศตัวแปร freq โดยจะทำการเก็บค่าความถี่เริ่มต้นให้กับตัวบัซเซอร์ ซึ่งจะเริ่มที่ 500 Hz
-
บรรทัดที่ 12-19 จะเป็นลูปชนิด Do While โดยจะทำการรันโปรแกรมใน While ก่อน แล้วค่อยมาตรวจสอบเงื่อนไขภายหลัง ในการตรวจสอบเงื่อนไข ความถี่ต้องไม่เกิน 3000Hz
-
บรรทัดที่ 13 เป็นการกำหนดค่าพารามิเตอร์ให้กับคำสั่ง ledcSetup โดยมีรูปแบบคำสั่งคือ
ledcSetup(channel,frequency,resolution)
channel: ช่องที่กำหนดไว้ที่บรรทัดที่ 6 ซึ่งมีค่าคือ 1
frequency: ความถี่ที่ต้องกับขับบัซเซอร์ ซึ่งค่าแรกคือ 500Hz
resolution: ความละเอียดของ PWM กำหนดไว้คือ 8 บิต (กำหนดที่บรรทัด 2)
-
หลังจากที่กำหนดค่าพารามิเตอร์แล้ว บรรทัดที่ 14 เป็นการสั่งบัซเซอร์ โดยมีรูปแบบคำสั่งดังนี้
ledcWrite(channel, dutyCycle)
channel: ช่องที่กำหนดไว้ที่บรรทัดที่ 6 ซึ่งมีค่าคือ 1
dutyCycle: ค่า % ของ PWM นั้นเอง โดยกำหนดที่ 128 หรือ 50% นั่นเอง
(100% ของ 8 บิต = 255 และ 50% ของ 8 บิต = 128)
-
บรรทัดที่ 15-17 เป็นการหน่วงเวลาที่ทำให้เกิดสัญญาณเสียง และหยุดสัญญาณเสียงของตัวบัซเซอร์
-
บรรทัดที่ 18 จะทำการเพิ่มความถี่ไปทีละ 500 ดังนั้นค่าความถี่ที่ออกไปคือ 500Hz, 1000Hz, 1500Hz, 2000Hz, 2500Hz และ 3000Hz
แบบฝึกหัดสำหรับทบทวนความเข้าใจและประยุกต์ใช้งานจริง
1.ทดลองสร้างโปรเจ็คเสียงแจ้งเตือนเมื่ออุณหภูมิเกิน โดยประยุกต์ใช้กับเซนเซอร์ DHT22 จากบทเรียนที่ผ่านมา โดยให้เขียนโปรแกรมโดยมีลำดับการทำงานดังนี้
-
เมื่ออุณภูมิมีค่าสูงกว่า 27C ให้มีเสียงแจ้งเตือนที่บัซเซอร์ Beep – Beep (บี๊บ-บี๊บ สองจังหวะ)
-
แต่ถ้าอุณหภูมิสูงกว่า 33C ให้มีเสียง Beep…..pppp (บี๊บ ยาว)
-
แสดงค่าอุณหภูมิที่จอ LCD16x2 I2C
-
ทดลองสร้างเซ็นเซอร์ถอยหลังรถยนต์ โดยจำลองการทำงานของเซนเซอร์ที่ติดอยู่กับหลังรถยนต์เพื่อตรวจสอบระยะห่างของวัตถุกับท้ายรถยนต์ โดย
-
ระยะห่างเกิน 2 เมตร ไม่มีเสียงแจ้งเตือน
-
ระยะ 2 – 1.5 เมตร เสียงดัง 1 วินาที หยุดดัง 1 วินาที
-
ระยะ 1.5 – 1.0 เมตร เสียงดัง 0.5 วินาที หยุดดัง 0.5 วินาที
-
ระยะ 1.0 – 0.5 เมตร เสียงดัง 0.3 วินาที หยุดดัง 0.3 วินาที
-
น้อยกว่า 0.5เมตร เสียงดังบี๊บยาว
-




Leave a Reply