Jumat, 02 Desember 2016

Tutorial Rotary Encoder Switch untuk Arduino

Tutorial cara menggunakan module Rotary Encoder Switch pada Arduino


Rotary encoder switch adalah perangkat elektro-mekanik yang mengubah gerak rotasi menjadi informasi digital atau analog. Bentuknya terlihat seperti potensiometer tetapi bisa berputar secara terus menerus (tanpa batas) baik searah jarum jam atau berlawanan arah jarum jam.

Terdapat beberapa jenis encoders rotary yaitu type Absolut dan type Relatif (inkremental).
Type Absolut nilai Outputnya tergantung dari sudut shaft terhadap poros sedangkan type Relatif 
(inkremental) nilai/data Outnya berdasar pada Step/langkah  dan arah putaranya,type ini lah yang banyak digunakan secara umum dan akan kita bahas lebih lanjut.

Ada 2 versi module Rotary Encoder yang umum kita jumpai di pasaran yaitu yang sudah lengkap dengan 'Breakout Board' dan yang masih 'pretelan', keduanya mempunyai fungsi dan jenis yang sama hanya saja untuk yang dilengkapi breakout biasa digunakan untuk prototype/simulasi/pelatihan karena sudah dilengkapi pin header sedangkan yang masih berupa komponen biasanya langsung ke pasang pada Development board sesuai posisi dan fungsinya.

Perhatikan Pin Out dari kedua jenis Rotary Encoder berikut :


Rotary Encoder memiliki 2 pin out data ,saya sebut Out A dan Out B atau anda dapat pula menyebutnya out maju dan out mundur.Sementara itu pada bagian tengah dilengkapi Center Switch atau saklar tekan yang dapat kita gunakan layaknya push button dengan cara menekan tuas/knop nya.

Penggunaan Rorary Encoder Switch biasanya menggunakan metode Active LOW baik untuk output data nya ataupun Center Switch nya, sehingga kita membutuhkan Resistor Pull-Up untuk menstabilkan digital Out A dan B saat kita gunakan menuju mikrokontroller.Untuk Jenis yang dilengkapi breakout board biasanya sudah disertai resistor pullup pada board nya,sedangkan untuk jenis tanpa breakout (pretelan) kita membutuhkan Resistor 10K untuk melakukan pullup Out A dan Out B ke VCC,meskipun demikian dalam pemrograman Arduino kita bisa menggunakan fungsi internal pullup pada i/o Arduino agar tidak menambahkan komponen resistor (gunakan pinMode (x, INPUT_PULLUP); ).



Incremental Rotary Encoder Switch Quadrature Output Waveform

Sebuah rotary encoder inkremental menghasilkan dua sinyal output saat porosnya berputar yang juga disebut Quadrature Ouptut. Tergantung pada arah putaranya, salah satu sinyal memimpin/keluar lebih dulu dari sinyal lainnya. Anda dapat melihat bentuk gelombang sinyal output dari sebuah rotary encoder inkremental dan urutan bit urutan seperti pada gambar di bawah ini.



Contoh Program sederhana menggunakan Rotary Encoder Switch dan Arduino

Berikut adalah contoh sederhana dari penerapan penggunaan Rotary encoder bersama Arduino.
Module yang kita butuhkan :
-Arduino Uno R3 ( Atmega328P )
-Module Rotary Encoder
-Beberapa kabel jumper dupont
-Software Arduino IDE (disarankan versi 1.6.12 atau diatasnya)

Wiring diagram :
Rotary Encoder   <-->  Arduino Uno
VCC   <-->  Pin 5V
GND  <-->  Pin GND
OUT A <--> Pin D2
OUT B <--> Pin D3
Switch <--> Pin D4





Sketch Coding Arduino : 
 
klik tombol buka pada spoiler dibawah ini untuk melihat source code nya.

Source Code:

//dibuat untuk www.belajarduino.com

//Gunakan pin D2 dan D3 untuk fungsi Interupt
int encoderPin1 = 2;
int encoderPin2 = 3;
int encoderSwitchPin = 4; //push button switch

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

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

  pinMode(encoderPin1, INPUT); 
  pinMode(encoderPin2, INPUT);
  pinMode(encoderSwitchPin, INPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on

  //on interrupt 0 (pin 2), or interrupt 1 (pin 3) 
  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop(){ 
  if(digitalRead(encoderSwitchPin)){
    //program yang berjalan saat center switch tidak ditekan
  }else{
    //program yang dijalankan saat center switch ditekan
    encoderValue=0;
  }
 
  Serial.println(encoderValue);
  delay(100); 
}


void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101) encoderValue++;
  if(sum == 0b1110) encoderValue--;

  lastEncoded = encoded; //store this value for next time
}

Rangkai rotary encoder module ke Arduino kemudian upload sketch coding di atas.Setelah selesai upload buka Serial monitor Arduino IDE pada baudrate 9600 dan coba melakukan putaran pada Rotary encoder dan lihat angka yang ada di Serial Monitor,untuk mereset angka anda bisa menekan center switch pada module Rotary encoder.

Demo Audio Tone Control menggunakan Rotary Encoder Switch dan LCD 1602

Berikut adalah contoh (Versi Demo) dari penerapan penggunaan Rotary encoder sebagai Tone Control atau Audio Processing dan ditampilkan pada LCD 1602 dengan kontroller Arduino.
Module yang kita butuhkan :
-Arduino Uno R3 ( Atmega328P )
-Module Rotary Encoder
-Beberapa kabel jumper dupont
-LCD 1602 yang sudah menggunakan i2C
-Software Arduino IDE (disarankan versi 1.6.12 atau diatasnya)

Library
Download library yang dibutuhkan untuk program ini :
-Library i2C LCD Download
-Library Button  Download
Setelah do download extract file kemudian masukan file/folder library tersebut ke dalam folder 'Libraries' yang ada di Program Files Arduino IDE.
(Apabila anda belum pernah menambahkan External libraries pada Arduino IDE silahkan lihat video tutorial berikut ini)

Wiring diagram :
Rotary Encoder   <-->  Arduino Uno
VCC   <-->  Pin 5V
GND  <-->  Pin GND
OUT A <--> Pin D2
OUT B <--> Pin D3
Switch <--> Pin D4 
 
LCD 1602 i2C   <-->  Arduino Uno
VCC   <-->  Pin 5V
GND  <-->  Pin GND
SDA <--> Pin A4
SCL <--> Pin A5
(Jika anda adalah pemula dalam penggunaan LCD 1602 /i2c module saya menyarankan untuk melihat artikel berikut terlebih dulu)
Lihat Artikel

 Rangkai rotary encoder module dan LCD 1602 i2C ke Arduino kemudian upload sketch coding di bawah ini :


Source Code:

// Dibuat Oleh Dani Ardianto untuk www.belajarduino.com
// Dukung perkembangan blog ini via www.tokopedia.com/rajacell/etalase/arduino

#include <LiquidCrystal_I2C.h>  //i2C LCD Library
LiquidCrystal_I2C lcd(0x3F , 16, 2);
#include <Button.h>  //button library
#define PULLUP true     
#define INVERT true                             
#define DEBOUNCE_MS 10   

//Gunakan pin D2 dan D3 untuk fungsi interupt
int encoderPin1 = 2;
int encoderPin2 = 3;
int encoderSwitchPin = 4; //push button switch
Button button(encoderSwitchPin, PULLUP, INVERT, DEBOUNCE_MS);

volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;

boolean menu;
uint8_t swit;
int sel,volume,gain,bass,middle,treble,echo;
int Value[] = {volume,gain,bass,middle,treble,echo};
const char *Mode[] = {"Volume", " Gain ", " Bass ", "Middle", "Treble", " Echo "};

unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

//dibuat Oleh Dani Ardianto untuk www.belajarduino.com
//Dukung perkembangan blog ini via www.tokopedia.com/rajacell/etalase/arduino
void setup() {
  Serial.begin (9600);
  lcd.begin();

  pinMode(encoderPin1, INPUT); 
  pinMode(encoderPin2, INPUT);
  pinMode(encoderSwitchPin, INPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on

  //on interrupt 0 (pin 2), or interrupt 1 (pin 3) 
  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);
}

void loop(){ 
   button.read();  
   if(button.wasPressed()){menu=!menu;}

if(menu==0){
 sel=encoderValue;

 if(swit==2){
  //Gerak mundur
 for(int i=0; i<5; i++){lcd.setCursor (5-i,0); lcd.print(Mode[encoderValue+1]); delay(20); lcd.clear();}
 for(int i=0; i<10; i++){lcd.setCursor (15-i,0); lcd.print(Mode[encoderValue]); delay(20); lcd.clear();}
  swit=0;}
  if(swit==1){
  //Gerak maju
 for(int i=0; i<10; i++){lcd.setCursor (5+i,0); lcd.print(Mode[encoderValue-1]); delay(20); lcd.clear();}
 for(int i=0; i<5; i++){lcd.setCursor (0+i,0); lcd.print(Mode[encoderValue]); delay(20); lcd.clear();}
  swit=0;}
 lcd.setCursor (5,0); lcd.print (Mode[encoderValue]);

 //print Value
 lcd.setCursor (7,1);
 lcd.print (Value[encoderValue]);
 lcd.print ("    ");
}

if(menu==1){
 lcd.setCursor (7,1);
 lcd.print (Value[sel]);
 lcd.print ("    ");
}
}

void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

if(menu==0){
  if(sum == 0b1101 && encoderValue<5) {encoderValue++; swit=1;}
  if(sum == 0b1110 && encoderValue>0) {encoderValue--; swit=2;}
  lastEncoded = encoded;
}
if(menu==1){
  if(sum == 0b1101 && Value[sel]<100) Value[sel]++; 
  if(sum == 0b1110 && Value[sel]>-100) Value[sel]--; 
  lastEncoded = encoded;
}
}
//dibuat Oleh Dani Ardianto untuk www.belajarduino.com
//Dukung perkembangan blog ini via www.tokopedia.com/rajacell/etalase/arduino

Setelah Upload selesai pastikan LCD 1602 anda menampilkan text dan membuat animasi text berjalan saat Rotary encoder diputar.Apabila LCD anda Blank/tidak menampilkan apapun pastikan wiring sudah sesuai dan i2C Address sudah benar.Apabila wiring sudah benar dan i2C address sudah sesuai namun LCD tetap tidak menampilkan apapun mungkin saja anda lupa mengatur contrast nya.
(Jika anda adalah pemula dalam penggunaan LCD 1602 /i2c module saya menyarankan untuk melihat artikel berikut terlebih dulu)
Lihat Artikel

Pada program Demo audio tone control ini anda dapat memutar Rotary encoder ke kanan atau kiri untuk menggeser menu dan menekan center switch pada encoder untuk masuk ke dalam submenu.Setelah masuk ke dalam submenu maka fungsi putaran encoder akan berubah menjadi increas dan decrease value pada submenu,untk kembali ke menu utama (keluar dari sub menu) silahkan tekan kembali tombol center switch.

Semoga artikel ini bisa menginspirasi anda.
-Thanks
by Dani Rajacell

2 komentar:

  1. aku mau nanya kalau mau gerakin 2 motor menggunakan encorder itu gimana ya?

    BalasHapus
  2. pas di kompile kok "expected unqualified-id before '.' token" gimana solusinya ?

    BalasHapus

Copyright © 2014 Belajar Arduino | Designed With By Blogger Templates | Distributed By Gooyaabi Templates
Scroll To Top