บทที่ 23: การเขียนโปรแกรมสั่งงาน Buzzer ให้เกิดโทนเสียงต่าง ๆ

UTEN BOONLIAM Avatar
บทที่ 23 / 26

บทที่ 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 ขาที่ต่อใช้งานกับบัซเซอร์

  1. เขียนโปรแกรมเปลี่ยนโทนเสียงตัวบัซเซอร์บน Arduino Uno

    1. เลื่อน DIP SWITCH(3) ของ BUZZER ไปตำแหน่ง ON

    2. เปิดตัวอย่างโปรแกรมโดยไปที่ File -> Examples -> Digital -> toneMelody

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

  1. ทำการอัปโหลดโปรแกรมไปยังตัว 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 ให้หยุดเสียงที่บัซเซอร์

    1. เขียนโปรแกรมเปลี่ยนโทนเสียงตัวบัซเซอร์บน ESP-32

ตัวคอมไพเลอร์ของ ESP32 จะไม่มีฟังก์ชัน tone เหมือนพวกแพลตฟอร์ม Arduino แต่เราสามารถใช้ฟังก์ชัน ledWrite ได้ซึ่งจะเป็นการสั่งงานให้ขา PWM ของตัว ESP-32 ส่งสัญญาณออกไปในลักษณะ Pulse Width Mod ซึ่งจะกำหนดความถี่ให้กับตัวบัซเซอร์ได้

  1. เขียนโปรแกรมตามตัวอย่างโค้ดด้านล่าง

  1. ทำการอัปโหลดโปรแกรมไปยังตัว 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 จากบทเรียนที่ผ่านมา โดยให้เขียนโปรแกรมโดยมีลำดับการทำงานดังนี้

  1. เมื่ออุณภูมิมีค่าสูงกว่า 27C ให้มีเสียงแจ้งเตือนที่บัซเซอร์ Beep – Beep (บี๊บ-บี๊บ สองจังหวะ)

  2. แต่ถ้าอุณหภูมิสูงกว่า 33C ให้มีเสียง Beep…..pppp (บี๊บ ยาว)

  3. แสดงค่าอุณหภูมิที่จอ LCD16x2 I2C

 

 

 

  1. ทดลองสร้างเซ็นเซอร์ถอยหลังรถยนต์ โดยจำลองการทำงานของเซนเซอร์ที่ติดอยู่กับหลังรถยนต์เพื่อตรวจสอบระยะห่างของวัตถุกับท้ายรถยนต์ โดย

    1. ระยะห่างเกิน 2 เมตร ไม่มีเสียงแจ้งเตือน

    2. ระยะ 2 – 1.5 เมตร เสียงดัง 1 วินาที หยุดดัง 1 วินาที

    3. ระยะ 1.5 – 1.0 เมตร เสียงดัง 0.5 วินาที หยุดดัง 0.5 วินาที

    4. ระยะ 1.0 – 0.5 เมตร เสียงดัง 0.3 วินาที หยุดดัง 0.3 วินาที

    5. น้อยกว่า 0.5เมตร เสียงดังบี๊บยาว

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *