Debouncing
Debounce adalah Usaha pencegahan penutupan palsu suatu kunci atau saklar yang
telah dikenali sebagai satu cara untuk menguci sinyal masuk. Debounce juga berarti
mengenalkan waktu tunggu yang memberi jeda sebelum dilakukan proses transmisi
data kembali.
Saat Anda menekan tombol pada keyboard komputer Anda, Anda mengharapkan
satu kontak dicatat oleh komputer Anda. Namun, sebenarnya, ada kontak awal,
sedikit memantul atau meringankan kontak, kemudian kontak lain ketika bounce
berakhir, namun yang lain bangkit kembali, dan seterusnya. Efek serupa terjadi
ketika saklar yang dibuat menggunakan kontak logam dibuka. Solusi yang biasa
adalah perangkat debouncing atau perangkat lunak yang memastikan bahwa hanya
satu sinyal digital dapat didaftarkan dalam ruang waktu tertentu (biasanya
milidetik).
Penanganan Bouncing Tombol/Saklar
Jika Anda pernah membuat aplikasi mikrokontroler yang memanfaatkan saklar atau
tombol-tekan (pushbutton), tentunya Anda akan menghadapi masalah bouncing (dalam
bahasa jawanya mentul-mentul) pada saklar atau tombol tersebut. Artinya, saat Anda
menekan tombol tersebut, mikrokontroler mendeteksi adanya penekanan berkali-kali,
padahal, sekali lagi, Anda hanya menekan sekali saja! Hal ini bisa dijelaskan melalui
gambar 1.
Gambar 1. Diagram pewaktuan saat terjadi perubahan dari 1 ke 0
Dari Gambar 1 tersebut terlihat jelas bahwa saat terjadi perubahan tombol dari 1 ke 0
(ilustrasi kiri), akan terjadi bouncing berulang-ulang selama 0.01 hingga 100 milidetik
(ilustrasi tengah). Mikrokontroler akan menganggap terjadi perubahan dari 1 ke 0
berkali-kali (ilustrasi kanan).
Rangkaian RC
Solusi sederhana untuk masalah bouncing ini adalah menggunakan rangkaian RC yang
akan menekan terjadi perubahan tegangan secara cepat. Karena waktu bouncing tidak
dinyatakan, nilai-nilai komponen bisa bervariasi. Pada Gambar 2 ditunjukkan sebuah
rangkaian RC untuk mencegah bouncing dengan nilai-nilai komponen yang biasa
digunakan.
Gambar 2. Rangkaian RC untuk mencegah bouncing
Flip Flop Debounce
Jika diinginkan keamanan penuh, perlu diperhatikan hal-hal berikut! Rangkaian yang
menggunakan RS Flip-flop, yang ditunjukkan pada Gambar 3, akan mengubah kondisi
logika luarannya pada saat pulsa pertama yang dipicu saat terjadi bouncing pada saklar.
Walaupun solusi lebih mahal (karena menggunakan saklar SPDT), namun masalahnya
teratasi dengan baik! Selain itu, rangkaian ini tidak membutuhkan kondensator.
Gambar 3. Rangkaian Flip Flop Debounce
Solusi Perangkat Lunak
Selain solusi perangkat keras, suatu solusi perangkat luas juga biasa dilakukan: saat
program menguji suatu kondisi beberapa luaran dan menemukan adanya perubahan,
serta merta pengujian harus melakukan penundaan beberapa saat hingga
perkiraan bouncing selesai. Kelebihannya? Jelas sekali murah meriah (tidak ada
implementasi rangkaian), selain itu bisa diadaptasi untuk saklar atau tombol yang
berkualitas buruk sekalipun. Kelemahannya? Sama seperti rangkaian RC, perubahan
logika yang lebih cepat dari tundaan program tidak bisa terdeteksi.
Menghilangkan Sinyal Bouncing Pada Input Switch
Switch yg sederhana seringkali menimbulkan bouncing seperti tampak pada gambar berikut:
Untuk menghilangkan sinyal bouncing dari sebuah switch kita bisa menggunakan 2 cara : secara
hardware dan software.
Gambar sinyal bouncing pada osciloscope
1. Menghilangkan sinyal bouncing dengan hardware:
atau
B . SOFTWARE
//initialize and declare variables
const int ledPin = 13; //led attached to this pin
const int buttonPin = 2; //push button attached to this pin
int buttonState = LOW; //this variable tracks the state of the button, low if not pressed, high
if pressed
int ledState = -1; //this variable tracks the state of the LED, negative if off, positive if on
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
void setup() {
//set the mode of the pins...
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}//close void setup
void loop() {
//sample the state of the button - is it pressed or not?
buttonState = digitalRead(buttonPin);
//filter out any noise by setting a time buffer
if ( (millis() - lastDebounceTime) > debounceDelay) {
//if the button has been pressed, lets toggle the LED from "off to on" or "on to off"
if ( (buttonState == HIGH) && (ledState < 0) ) {
digitalWrite(ledPin, HIGH); //turn LED on
ledState = -ledState; //now the LED is on, we need to change the state
lastDebounceTime = millis(); //set the current time
else if ( (buttonState == HIGH) && (ledState > 0) ) {
digitalWrite(ledPin, LOW); //turn LED off
ledState = -ledState; //now the LED is off, we need to change the state
lastDebounceTime = millis(); //set the current time
}//close if/else
}//close if(time buffer)
}//close void loop