กลับไปหน้ารวมไฟล์
arduino-talk-1-use-of-the-tone-function-289e83.md

ขั้นตอนที่ 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`)

  1. หูมนุษย์ทั่วไปได้ยินเสียงตั้งแต่ `20Hz` ไปจนถึง `20,000Hz`
  2. ฟังก์ชัน `tone(pin, frequency)` บังคับให้นาฬิกา 16MHz ของ Arduino ใช้ **Hardware Timer 2** ควบคุมการทำงานแบบเบ็ดเสร็จ
  3. ปัจจัยทางฟิสิกส์: ถ้าน้องเขียน `tone(8, 440);` โปรเซสเซอร์จะสั่งให้ Digital Pin 8 สลับระหว่าง `5V` (HIGH) กับ `0V` (LOW) อย่างรวดเร็ว 440 ครั้งต่อวินาทีพอดี!
  4. คริสตัลใน Piezo Buzzer จะงอตัวทางกายภาพ 440 ครั้งต่อวินาที ทำให้โมเลกุลอากาศเคลื่อนที่ พอดิบพอดีกับโน้ตดนตรี 'A4' บนเปียโนเลย!

เรื่องของ `delay()` และโปรโตคอล `noTone()`

ข้อผิดพลาดยอดฮิตเวลาเขียนโค้ดเกี่ยวกับเสียงบน Arduino คือการลืมว่า `tone()` มันทำงานแบบ "เบื้องหลัง" (Asynchronously) หมดเลย

  • ถ้าน้องเขียนแบบนี้:
    tone(8, 440);
    tone(8, 523); // โน้ต C!
    พีโซ่จะไม่มีวันเล่นโน้ต 440 เลย เพราะโค้ดมันรันเร็วมากจนเขียนทับคำสั่งแรกทันที!
  • ทางแก้:
    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 กัน

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

apps:
  - "1x Arduino IDE"
author: "ashraf_minhaj"
category: "Audio & Sound"
components:
  - "1x Buzzer"
  - "1x UTSOURCE Electronic Parts"
  - "1x Arduino UNO"
description: "Acoustic fundamentals! Master the absolute basic requirement of hardware square-wave processing, isolating exactly how the ATmega utilizes internal `Timer2` architecture to output raw frequency mathematics."
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19y0X6Ee0NG0SSb5cHaQBEp8AvaBLw6m0TiYwHPVkMN3Wva9tO3BMI92QiyDbBcWBD72e5bx4IQA5ZTFecqDB+CFfZ/EGiZEP0="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/arduino-talk-1-use-of-the-tone-function-289e83_cover.jpg"
lang: "en"
likes: 1
passwordHash: "2a70cd2e5d62a51f3e402d325dc2f6c852391b7b6950dfd6b365da5597af0e30"
price: 99
seoDescription: "Learn how to add sound to your Arduino project using the Tone Function for audio feedback in this tutorial."
tags:
  - "talk"
  - "robot talk"
  - "tone function"
  - "use of tone generator"
title: "Arduino Talk 1: มาปล่อยเพลงบึ้มด้วยฟังก์ชัน tone กัน!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/Bz_tgR7atys"
  - "https://www.youtube.com/embed/Bz_tgR7atys"
  - "https://www.youtube.com/embed/Bz_tgR7atys"
  - "https://www.youtube.com/embed/CdclcoZlOCw"
views: 14007