Fungsi tone() dan noTone() pada Arduino

Hallo, selamat datang kembali. Pada artikel ini, kita akan khusus membahas tentang fungsi yang digunakan untuk mengontrol output suara dari buzzer atau speaker, fungsi itu adalah tone(), dan noTone(), untuk memahami artikel ini dibutuhkan dasar pemahaman sinyal PWM, jika belum paham bisa dibaca artikel tentang PWM disini, jika sudah mari kita lanjut :

tone()

Fungsi tone() pada pemrograman arduino digunakan untuk menghasilkan sinyal PWM dengan frekuensi tertentu, fungsi ini sering digunakan untuk menghasilkan suara dari buzzer atau piezo speaker. sebelum lanjut membahas fungsi tone(), ayo kita bahas dulu bagaimana suara bisa dihasilkan pada buzzer dan speaker. 

Suara tercipta karena adanya getaran pada udara, ketika getarannya cukup cepat, misal 30 kali getaran pada satu detik, getaran itu menimbulkan suara yang bisa kita dengar, getaran bisa diukur berdasarkan frekuensinya dengan satuan Hertz(Hz), dimana 1 Hz adalah 1 getaran pada 1 detik, sehingga jika terjadi 30 kali getaran pada 1 detik, maka frekuensinya adalah 30 Hz. FYI, manusia hanya bisa mendengar suara dengan rentang frekuensi 20 – 20.000 Hz. 

Jadi, kenapa buzzer dan speaker bisa mengeluarkan suara ? itu karena ada sebuah komponen dalam speaker yang dibuat bergetar oleh pulse signal (sinyal gelombang), getaran komponen itu menyebabkan getaran pada udara sehingga menimbulkan bunyi. Kita bisa membuat pulse signal pada arduino dengan analogWrite() dimana output yang dihasilkan berupa sinyal PWM.

Kita bisa membuat suara pada buzzer menggunakan sinyal PWM, tapi kita tidak bisa membuat nada dengan sinyal itu, karena untuk membuat nada, yang diatur bukanlah lebar pulsanya, tetapi yang diatur adalah frekuensi nya, sehingga kita membutuhkan fungsi yang bisa memodifikasi frekuensi dari sinyal gelombang yang dikeluarkan arduino. kita akan melakukan expriment sederhana untuk melakukan modifikasi frekuensi sinyal gelombang. komponen-komponen yang dibutuhkan adalah :

  • Arduino Uno  BELI
  • Kabel USB BELI
  • Kabel Jumper Male to Male BELI
  • Modul buzzer 5 V BELI
  • Resistor 220 Ohm
  • Breadboard
Coba buat rangkaian seperti gambar ini

Lalu ketik sketch dibawah ini

				
					/* Frekuensi Modulation Experiment - purwarupa3d*/

byte buzzerPin = 9; 

void setup() {
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  float frequensi = 500;    //Set frekuensi

  int periode = (1 / frequensi) * 1000000; //hitung periode berdasarkan frekuensi (dalam mikrosekon)

  //buat sinyal gelombang dengan mengatur kondisi HIGH dan LOW dengan durasi setengah periode
  digitalWrite(buzzerPin, HIGH); 
  delayMicroseconds(periode * 0.5);
  digitalWrite(buzzerPin, LOW);
  delayMicroseconds(periode * 0.5);
}
				
			

Perhatikan fungsi loop(), pertama-tama kita atur dahulu frekuensi yang diinginkan (baris10). kemudian baris program selanjutnya adalah menghitung nilai perioda berdasarkan frekuensi, rumus perioda = 1/frekuensi, dengan satuan detik, selanjutnya kita ubah satuan detik ke mikrodetik dengan dikali 1.000.000. dengan begitu kita dapat nilai periode getaran dalam mikrodetik (1 perioda = 2000 mikrodetik).

Perhatikan baris 16 dan 18, pada baris program itu, kita tentukan delay selama setengah perioda. kenapa setengah perioda ? itu karena dalam satu perioda terdiri dari sinyal HIGH dan LOW yang masing-masing berdurasi setengah perioda (lihat lagi artikel tentang PWM). dengan begitu sinyal HIGH dan LOW masing-masing berdurasi 1000 mikrodetik.

Disini saya menggunakan simulator WOKWI, jika ingin mencoba juga silahkan klik disini. Upload dan perhatikan hasilnya, buzzer akan mengeluarkan bunyi. Setelah itu coba ubah nilai variabel frekuensi (baris 10) dengan nilai 700, kemudian upload ulang, perhatikan apa yang terjadi, buzzer mengeluarkan bunyi yang berbeda dengan bunyi sebelumnya kan ?. Dengan dasar ini kita bisa membuat nada yang bervariasi. 

Sekarang kita masuk ke pembahasan fungsi tone(), daripada harus membuat program sepanjang itu kita bisa menggunakan fungsi tone(), berikut syntaxnya :

				
					tone(pin, frequency);
tone(pin, frequency, duration);
				
			

Parameter :

  • pin : nomor pin yang mengeluarkan output sinyal gelombang
  • frequency : frekuensi sinyal gelombang yang diinginkan
  • duration : parameter ini opsional, untuk menentukan berapa lama nada akan dimainkan dalam milidetik. Jika parameter ini diisi nada akan  otomatis berhenti sesuai durasi yang ditentukan, jika tidak diisi maka nada tidak akan berhenti sampai program membaca fungsi noTone()

Dengan menggunakan fungsi tone() kita bisa membuat program menjadi lebih ringkas. sketch dibawah ini bisa menghasilkan output yang sama dengan sketch sebelumnya.

				
					void setup() {
  // nocode
}

void loop() {
  // Menghasilkan nada dengan frekuensi 1000 Hz (1 kHz) pada pin 8 
  tone(8, 500);

}
				
			

noTone()

Fungsi noTone() digunakan untuk menghentikan output sinyal gelombang yang dihasilkan oleh fungsi tone(). berikut sintaxnya :

				
					noTone(pin)
				
			

Parameter

  • pin : nomor pin yang mengeluarkan sinyal gelombang
  • Note — fungsi tone() tidak bisa mengeluarkan output sinyal gelombang dari beberapa pin secara bersamaan, sehingga, jika kita ingin membuat berbagai nada dari beberapa pin, kita perlu menghentikan output sinyal pada pin yang aktif sebelum mengeluarkan output sinyal dari pin yang lain.

Experiment

Sekarang kita coba menggunakan fungsi tone() dan noTone() untuk membuat projek sederhana, yaitu “membuat nada doremi” menggunakan arduino, sketch yang digunakan masih yang tadi. ketik program dibawah.

				
					/* membuat nada do re mi -- purwarupa3d*/

const byte buzzerPin = 9;

// variabel array untuk menyimpan frekuensi nada dalam Hertz (Hz)
int nada[] = {262, 294, 330, 349, 392, 440, 494}; // C4, D4, E4, F4, G4, A4, B4

// variabel array untuk menyimpan durasi masing-masing nada dalam milidetik
int durasi[] = {500, 500, 500, 500, 500, 500, 500}; // 500 ms untuk setiap nada

void setup() {
  // nocode
}

void loop() {

  for (int i = 0; i < 7; i++) {
    // bunyikan nada sesuai frekuensi pada variabel array
    tone(buzzerPin, nada[i]);
    
    // bunyikan nada selama durasi yang ditentukan
    delay(durasi[i]);
    
    // Hentikan nada pada pin buzzerPin
    noTone(buzzerPin);
    
    // jeda sebelum ke nada selanjutnya
    delay(100);
  }
  
  delay(1000);
}
				
			

Upload sketch diatas kemudian perhatikan hasilnya, buzzer akan mengeluarkan nada DO RE MI (link WOKWI bisa klik disini). 

Penjelasan sketch nya, untuk sekarang fokus saja ke baris 19 dan 25. intinya statement for melakukan pengulangan sebanyak 8 kali, pengulangan pertama yaitu membuat nada dengan frekuensi 262 Hz selama 500 ms (baris 19), kemudian dihentikan dengan fungsi noTone() pada baris 25. pengulangan ke kedua yaitu membuat nada dengan frekuensi 294 Hz selama 500 ms (baris 19), kemudian dihentikan dengan fungsi noTone() pada baris 25, begitu seterusnya sehingga menghasilkan nada DO RE MI. sekian tutorial pada artikel kali ini. semoga bermanfaat.

Tinggalkan komentar