Arduino Indonesia. Gambar tema oleh Storman. Diberdayakan oleh Blogger.

Supported by Electronics 3 in 1

1. Jasa pencetakan PCB single layer dengan harga paling murah.

(Metode Pembuatan dengan Transfer Toner)
>PCB design sendiri (siap cetak) : Rp.150,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

(Metode Sablon Full Masking dan Silk Screen minimal pemesanan 100 Pcs)
>PCB design sendiri (siap cetak) : Rp.200,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

2. Jasa perancangan, perakitan, dan pembuatan trainer pembelajaran elektronika untuk SMK dan Mahasiswa.

3. Jasa perancangan, perakitan, dan pembuatan berbagai macam kontroller, sensor, aktuator, dan tranduser.
>Design Rangkaian / Sistem Elektronika
>Design Rangkaian / Sistem Instrumentasi
>Design Rangkaian / Sistem Kendali
>Kerjasama Riset (data atau peralatan)
>Kerjasama Produksi Produk-Produk KIT Elektronika
>Produksi Instrumentasi Elektronika

4. Jasa Pembuatan Proyek, Tugas Akhir, Tugas Laboratorium, PKM, Karya Ilmiah, SKRIPSI, dll

Like My Facebook

Popular Posts

Senin, 01 Juni 2026

Arduino Rotary Encoder - Cara Menggunakan Rotary Encoder untuk Membaca Arah dan Posisi Putaran

Rotary encoder merupakan salah satu komponen input yang banyak digunakan pada berbagai perangkat elektronik modern, mulai dari pengatur volume speaker, menu LCD, printer 3D, radio digital, hingga mesin CNC. Berbeda dengan tombol biasa yang hanya memiliki dua kondisi, rotary encoder mampu mendeteksi arah putaran sekaligus jumlah langkah putaran sehingga sangat cocok digunakan sebagai pengganti potensiometer dalam berbagai proyek Arduino.

 

Pada tutorial Arduino Rotary Encoder ini, Anda akan mempelajari cara kerja rotary encoder, perbedaannya dengan potensiometer, cara menghubungkannya ke Arduino Uno, serta cara membaca arah dan jumlah putaran encoder menggunakan metode polling maupun interrupt. Selain itu, Anda juga akan belajar memanfaatkan tombol tekan (push button) yang biasanya sudah terintegrasi di dalam modul rotary encoder.

 

Dengan memahami rotary encoder, Anda dapat membuat berbagai proyek interaktif seperti sistem menu LCD, pengatur kecepatan motor, pengontrol volume digital, navigasi antarmuka pengguna, hingga sistem otomasi yang memerlukan input putar yang presisi.

Perangkat Keras yang Dibutuhkan

- Arduino Uno R3

- Kabel USB

- Modul Rotary Encoder

- Kabel jumper

Apa itu Rotary Encoder?

Rotary encoder adalah perangkat elektromekanis yang berfungsi mengubah gerakan putar menjadi sinyal digital yang dapat dibaca oleh mikrokontroler. Komponen ini mampu mendeteksi arah putaran dan jumlah langkah yang telah dilakukan pengguna. Secara umum terdapat dua jenis rotary encoder yang sering digunakan:

1. Incremental Rotary Encoder

Jenis ini menghasilkan pulsa digital setiap kali poros diputar. Arduino menghitung jumlah pulsa tersebut untuk mengetahui perubahan posisi relatif.

2. Absolute Rotary Encoder

Encoder absolut memiliki kode digital unik untuk setiap posisi poros. Dengan demikian posisi tetap dapat diketahui meskipun sistem dimatikan dan dinyalakan kembali.

Pada tutorial ini kita akan fokus menggunakan Incremental Rotary Encoder, karena jenis ini paling banyak digunakan pada proyek Arduino.

Pinout Rotary Encoder

1. CLK (Clock / Output A)

Pin ini menghasilkan sinyal pulsa utama saat encoder diputar. Setiap langkah putaran akan menghasilkan perubahan logika yang dapat digunakan untuk menghitung posisi encoder.

2. DT (Data / Output B)

Pin DT menghasilkan sinyal yang mirip dengan CLK, namun memiliki pergeseran fase. Perbedaan fase inilah yang digunakan untuk menentukan arah putaran.

3. SW (Switch)

Selain berfungsi sebagai encoder, sebagian besar modul juga memiliki tombol tekan di bagian tengah poros. Saat tombol ditekan, pin SW akan berubah status sehingga dapat digunakan sebagai input tambahan.

4. VCC (+)

Digunakan untuk memberikan tegangan kerja ke modul rotary encoder, biasanya 3,3V hingga 5V.

5. GND

Terhubung ke ground Arduino.

Perbedaan Rotary Encoder dan Potensiometer

Banyak pemula yang menganggap rotary encoder dan potensiometer adalah komponen yang sama. Padahal keduanya memiliki prinsip kerja yang berbeda. Rotary encoder menghasilkan pulsa digital yang menunjukkan perubahan posisi. Komponen ini dapat diputar terus-menerus tanpa batas karena tidak memiliki titik awal maupun akhir. Sebaliknya, potensiometer menghasilkan tegangan analog yang berubah sesuai posisi kenop. Potensiometer memiliki batas putaran tertentu sehingga tidak dapat diputar secara terus-menerus. Jika Anda memerlukan informasi posisi absolut, potensiometer lebih cocok digunakan. Namun jika hanya membutuhkan informasi arah dan jumlah langkah putaran, rotary encoder adalah pilihan yang lebih baik.

Cara Kerja Rotary Encoder

Rotary encoder bekerja dengan memanfaatkan dua kontak internal yang menghasilkan sinyal digital pada pin CLK dan DT. Saat kenop encoder diputar, kedua pin tersebut akan mengalami perubahan status secara bergantian dengan pergeseran fase sekitar 90 derajat. Perbedaan waktu perubahan sinyal antara pin CLK dan DT inilah yang digunakan untuk menentukan arah putaran encoder.

 

Apabila sinyal pada pin CLK berubah lebih dahulu dibandingkan pin DT, maka putaran dianggap searah jarum jam (Clockwise). Sebaliknya, jika sinyal pada pin DT berubah lebih dahulu dibandingkan pin CLK, maka putaran dianggap berlawanan arah jarum jam (Counter Clockwise). Dengan menghitung setiap perubahan sinyal yang terjadi, Arduino dapat mengetahui arah sekaligus jumlah langkah putaran yang dilakukan pada rotary encoder.

 

Baca juga: Arduino Potensiometer Trigger Piezo Buzzer - Mengontrol Buzzer Menggunakan Potensiometer dan Arduino 

Membaca Rotary Encoder Menggunakan Metode Polling

Metode polling merupakan teknik paling sederhana untuk membaca rotary encoder. Pada metode ini, Arduino secara terus-menerus memantau atau memeriksa status pin CLK dan DT di dalam fungsi loop(). Setiap kali terjadi perubahan sinyal pada pin CLK, Arduino akan mendeteksinya dan kemudian memeriksa kondisi pin DT untuk menentukan arah putaran encoder.

 

Berdasarkan hasil pembacaan tersebut, program dapat menambah atau mengurangi nilai variabel counter sesuai arah putaran yang terdeteksi. Selain membaca arah putaran, Arduino juga dapat mendeteksi penekanan tombol yang terdapat pada rotary encoder melalui pin SW. Karena konsep kerjanya sederhana dan mudah dipahami, metode polling sangat cocok digunakan pada proyek-proyek sederhana yang tidak menjalankan banyak proses secara bersamaan.

Wiring Diagram Rotary Encoder

Kode Program Arduino - Membaca Rotary Encoder Tanpa Interrupt

 

#include <ezButton.h>


#define CLK_PIN 2

#define DT_PIN 3

#define SW_PIN 4


#define DIRECTION_CW 0

#define DIRECTION_CCW 1


int counter = 0;

int direction = DIRECTION_CW;

int CLK_state;

int prev_CLK_state;


ezButton button(SW_PIN);


void setup() {

  Serial.begin(9600);


  pinMode(CLK_PIN, INPUT);

  pinMode(DT_PIN, INPUT);

  button.setDebounceTime(50);


  prev_CLK_state = digitalRead(CLK_PIN);

}


void loop() {

  button.loop();


  CLK_state = digitalRead(CLK_PIN);


  if (CLK_state != prev_CLK_state && CLK_state == HIGH) {


    if (digitalRead(DT_PIN) == HIGH) {

      counter--;

      direction = DIRECTION_CCW;

    } else {

      counter++;

      direction = DIRECTION_CW;

    }


    Serial.print("DIRECTION: ");

    if (direction == DIRECTION_CW)

      Serial.print("Clockwise");

    else

      Serial.print("Counter-clockwise");


    Serial.print(" | COUNTER: ");

    Serial.println(counter);

  }


  prev_CLK_state = CLK_state;


  if (button.isPressed()) {

    Serial.println("The button is pressed");

  }

}

 

Penjelasan Program

Program membaca perubahan status pada pin CLK secara terus-menerus. Ketika terjadi perubahan dari LOW ke HIGH, Arduino akan memeriksa kondisi pin DT untuk menentukan arah putaran encoder. Jika pin DT bernilai HIGH, maka encoder dianggap berputar berlawanan arah jarum jam sehingga nilai counter dikurangi satu. Sebaliknya, jika pin DT bernilai LOW, encoder dianggap berputar searah jarum jam sehingga nilai counter ditambah satu. Program juga memanfaatkan library ezButton untuk membaca tombol tekan (SW) yang terdapat pada rotary encoder dengan proses debouncing yang lebih sederhana.

Cara Menguji Program Rotary Encoder Tanpa Interrupt

Setelah rangkaian selesai dirakit dan program berhasil diunggah ke papan Arduino, langkah berikutnya adalah melakukan pengujian untuk memastikan rotary encoder bekerja dengan baik. Mulailah dengan membuka Arduino IDE, kemudian unggah program ke papan Arduino yang digunakan. Setelah proses upload selesai, buka Serial Monitor dan atur baud rate pada 9600 bps.

 

Selanjutnya, putar kenop rotary encoder ke arah kanan dan perhatikan tampilan pada Serial Monitor. Jika rangkaian dan program bekerja dengan benar, nilai counter akan bertambah sesuai jumlah langkah putaran. Setelah itu, putar kenop ke arah kiri dan amati apakah nilai counter berkurang. Untuk menguji fungsi tombol, tekan tombol yang terdapat pada rotary encoder dan perhatikan pesan yang muncul pada Serial Monitor. Apabila seluruh pengujian tersebut berjalan sesuai harapan, maka rotary encoder telah berhasil terhubung dengan Arduino dan berfungsi dengan baik.

Membaca Rotary Encoder Menggunakan Interrupt

Pada metode polling, Arduino harus terus memeriksa status pin encoder secara berulang sehingga penggunaan sumber daya menjadi kurang efisien. Selain itu, jika program sedang menjalankan proses lain yang memerlukan waktu cukup lama, beberapa pulsa encoder berpotensi terlewat. Untuk mengatasi masalah tersebut, kita dapat menggunakan interrupt. Interrupt memungkinkan Arduino langsung merespons perubahan sinyal pada pin tertentu tanpa harus terus-menerus melakukan pengecekan. Ketika terjadi perubahan pada pin CLK, Arduino akan menjalankan fungsi interrupt secara otomatis untuk memperbarui nilai counter. Keuntungan metode interrupt antara lain:

- Pembacaan encoder lebih akurat.

- Risiko kehilangan pulsa lebih kecil.

- Program utama tetap dapat menjalankan tugas lain.

- Kinerja sistem menjadi lebih efisien.    

Kode Program Arduino - Membaca Rotary Encoder dengan Interrupt

Berikut contoh program Arduino untuk membaca rotary encoder menggunakan interrupt. 

  

#include <ezButton.h>


#define CLK_PIN 2

#define DT_PIN 3

#define SW_PIN 4


#define DIRECTION_CW 0

#define DIRECTION_CCW 1


volatile int counter = 0;

volatile int direction = DIRECTION_CW;

volatile unsigned long last_time;


int prev_counter;


ezButton button(SW_PIN);


void setup() {

  Serial.begin(9600);


  pinMode(CLK_PIN, INPUT);

  pinMode(DT_PIN, INPUT);


  button.setDebounceTime(50);


  attachInterrupt(

    digitalPinToInterrupt(CLK_PIN),

    ISR_encoderChange,

    RISING

  );

}


void loop() {

  button.loop();


  if (prev_counter != counter) {

    Serial.print("DIRECTION: ");


    if (direction == DIRECTION_CW)

      Serial.print("Clockwise");

    else

      Serial.print("Counter-clockwise");


    Serial.print(" | COUNTER: ");

    Serial.println(counter);


    prev_counter = counter;

  }


  if (button.isPressed()) {

    Serial.println("The button is pressed");

  }

}


void ISR_encoderChange() {

  if ((millis() - last_time) < 50)

    return;


  if (digitalRead(DT_PIN) == HIGH) {

    counter--;

    direction = DIRECTION_CCW;

  } else {

    counter++;

    direction = DIRECTION_CW;

  }


  last_time = millis();

}

 

Penjelasan Program

Pada program ini, Arduino tidak lagi memantau pin CLK secara terus-menerus di dalam fungsi loop(). Sebagai gantinya, fungsi attachInterrupt() digunakan untuk memicu fungsi ISR_encoderChange() setiap kali terjadi perubahan sinyal pada pin CLK.

 

Ketika encoder diputar, interrupt akan langsung dijalankan sehingga arah putaran dan nilai counter dapat diperbarui secara real-time. Variabel counter, direction, dan last_time diberi keyword volatile karena nilainya dapat berubah di luar alur program utama, yaitu melalui interrupt service routine (ISR).

Untuk mengurangi pembacaan ganda akibat bouncing mekanis, program menerapkan debouncing sederhana menggunakan fungsi millis(). Jika perubahan sinyal terjadi dalam waktu kurang dari 50 ms sejak pembacaan terakhir, perubahan tersebut akan diabaikan.

 

Dengan metode ini, pembacaan rotary encoder menjadi lebih responsif dan tetap akurat meskipun Arduino sedang menjalankan tugas lain secara bersamaan.

Cara Menguji Program Rotary Encoder dengan Interrupt

- Install library ezButton pada Arduino IDE

- Salin kode program ke Arduino IDE

- Hubungkan Arduino dengan komputer menggunakan kabel USB

- Pilih board dan port yang sesuai

- Upload program ke Arduino

- Buka Serial Monitor

- Putar rotary encoder ke kanan dan ke kiri

- Tekan tombol encoder

- Amati hasil yang tampil pada Serial Monitor

Hal yang Perlu Diperhatikan Saat Menggunakan Interrupt

- Pada Arduino Uno, hanya pin digital 2 dan 3 yang mendukung interrupt eksternal.

- Variabel yang digunakan di dalam interrupt sebaiknya diberi keyword volatile.

- Hindari penggunaan Serial.print() di dalam fungsi interrupt.

- Buat kode interrupt sesingkat mungkin agar tidak mengganggu proses lainnya.

- Gunakan teknik debouncing untuk menghindari pembacaan ganda akibat noise mekanis.

 

Baca juga: Mengatur Kecerahan LED Menggunakan Rotary Encoder dan Arduino 

 

 

 

Dalam praktik, hasil dan kendala yang ditemui bisa berbeda tergantung perangkat, konfigurasi, versi library, dan sistem yang digunakan.  

0 on: "Arduino Rotary Encoder - Cara Menggunakan Rotary Encoder untuk Membaca Arah dan Posisi Putaran"