Membaca data Rotary Encoder di Arduino

Rotary_Encoder_ArduinoRotary encoder atau yang sering disebut dengan encoder adalah sebuah divais elektro mekanik yang dapat mengubah posisi sudut atau pergerakan sebuah poros menjadi kode analog atau digital. Pada kesempatan kali ini, akan sedikit dibahas mengenai cara pembacaan data encoder menggunakan arduino. Encoder yang digunakan merupakan tipe quadrature, yang mana pada encoder tipe ini memiliki 2 channel output yang biasa disebut dengan channel a dan channel b.

Keluaran yang dihasilkan oleh channel a dan b berupa sinyal kotak yang memiliki beda phasa sebesar 90o. Perbedaan tersebut yang nantinya digunakan sebagai pembeda arah putaran poros. Gambar 1 dibawah ini merupakan gambar sinyal yang dihasilkan encoder pada output channel a dan b.

pulse encoder

Gambar 1

Dari gambar 1 diatas, dapat kita lihat adanya perbedaan kondisi yang dihasilkan channel a dan b saat poros berputar. Saat poros berputar searah jarum jam (CW), dapat kita lihat saat ouput a menghasilkan pulsa high dan disaat yang bersamaan output b menghasilkan pulsa low. Begitu sebaliknya, saat poros berputar berlawanan arah jarum jam (CCW) saat output a menghasilkan pulsa high, output b akan menghasilkan pulsa high.

Arah poros

Channel a

Channel b

CW

HIGH

LOW

CCW

HIGH

HIGH

Jika kita sudah memahami konsep sederhana diatas, maka dengan mudah kita bisa mengolah data tersebut menjadi arah dan jumlah putaran di rangkaian kontroller.

Rangkaian kontroller yang digunakan adalah arduino uno. Dalam pembacaan data encoder tersebut biasanya ada beberapa cara menghubungkan output encoder dengan pin pada rangkaian arduino. Koneksi tersebut diantaranya sebagai berikut :

  1. Channel a dan b dihubungkan ke pin digital biasa,
  2. Salah satu channel (a atau b) dihubungkan ke pin external interrupt dan channel yang lain dihubungkan ke pin digital biasa,
  3. Channel a dan b keduanya dihubungkan ke pin external interrupt.

Untuk mendapatkan resolusi pembacaan yang paling akurat, biasanya digunakan cara nomor 3. Tapi yang paling sering digunakan adalah cara nomor 2, karena dengan menghubungkan salah satu channelnya saja ke pin external interrupt itu sudah cukup.

Berikut ini merupakan contoh program untuk mengolah data encoder dengan menghubungkan salah satu channel ke pin external interrupt.

long data, dataOld;

/*
channel a dihubungkan dengan pin external interrupt 1 (INT1)

channel b dihubungkan dengan pin digital 5

*/

void setup(){
Serial.begin(9600);

/*
mengaktifkan interrupt 1

saat pengaktifan interrupt, ada 3 parameter yang harus disetting

1. interrupt yang digunakan

2. fungsi yang dipanggil saat interrupt terjadi

3. metode interupt, mendeteksi perubahan kondisi Low ke High (RISING) dari channel a
*/
attachInterrupt(1,encoder,RISING);

//deklarasi pin d5 menjadi input, dan di pullup
pinMode(5,INPUT);
digitalWrite(5,HIGH);
}

void loop(){
if(dataOld!=data){
Serial.println(data);
dataOld=data;
}
}

void encoder(){
//membaca arah putaran dengan cara membandingkan kondisi channel b
if(digitalRead(5)==1){  //CCW
data--;
}
else{                      //CW
data++;
}
}

Hasil pembacaan data encoder:

  1. Saat poros diputar CWup
  2. Saat poros diputar CCWdown

Untuk mengolah data encoder dengan cara diatas, kita menggunakan beberapa baris program. Sebenarnya pada arduino, sudah tersedia library yang dapat digunakan untuk mengolah data digital yang dihasilkan dari encoder. Library tersebut adalah library encoder.h.

Secara konsep, program yg digunakan pada program diatas dan program yg digunakan pada library encoder.h sama, yaitu sama-sama memiliki 3 cara koneksi output encoder dengan arduino. Jika kita menggunakan library encoder.h, kita hanya menggunakan 2 baris program untuk dapat mengolah data encoder. Berikut ini merupakan program yang menggunakan library.

#include

//deklarasi objek
//channel a terhubung dengan pin digital 3 (INT1)
//channel b terhubung dengan pin digital 5
Encoder myEnc(3, 5);

void setup() {
Serial.begin(9600);
}

long oldPosition  = -999;

void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
    Serial.println(newPosition);
}
}

==================================
Semoga bermanfaat 🙂
Rifqi Amalya Fatekha
==================================

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s