본문 바로가기
아두이노 센서

[센서/회전검출] Keyes rotary encoder, shaft encoder

by 작동미학 2016. 3. 6.
반응형

Keyes rotary encoder(KY-040)를 사용해 얼마나 회전했는지 검출할 수 있다.

 

▶ 이 가이드를 따라하면

- rotary encoder를 어떻게 활용하는지 알 수 있다.

 

▶ 먼저 읽으면 좋은 글

- Arduino 일반 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

Rotary encoder, shaft encoder라 불리는 이 부품은 얼마나 축이 회전했는지를 알아 낼 수 있는 센서이다. 실제 돌려보면 일정 각도마다 약간씩 멈추는 느낌이 있고 이 주기로 CLK 상태가 변한다. 주로 로보트나 움직이는 장치의 원형(각변화) 움직임 정도를 측정할 때 사용할 수 있으며 손목으로 구부림 변화, 손가락의 구부림 변화 같은 것도 이 센서를 통해 측정된다. 그러나 꼭 로보트 팔의 움직임 정도를 측정한다기 보다는, 거의 모든 구부러짐에 대해 측정하고 이에 피드백 받는 장치를 만들어 낼 수 있는 기반이 된다.

이 rotary encoder센서의 원리는 자기식, 광학식 등 몇가지 종류가 존재하지만, 해석 원리는 간단해서 조금씩 특정 각 이상 회전할 때 마다 pulse(CLK)를 발생시키고 이 개수를 세는 형태로 회전의 정도 측정이 가능하다.

<Keyes rotary encoder, 저 손잡이를 돌리는 정도를 측정한다.>

< GND->GND, +->5V, CLK->D2, DT->D3 에 연결>

배선은 위 그림의 하단 가이드를 참조로 하면 된다. Keyes의 rotary sensor는 SW신호도 있는데 센서의 손잡이를 돌리는 것 외에 누르는 것에도 반응하도록 할 수 있다. 다만, 이 rotary encoder는 실제 정밀하게 사용하기 위해서는(빠른 속도로 회전할때도 정확히 측정) 저항과 capacitor를 같이 연결해주어야 한다고 권고되고 있다. 고급 사용자들은 아래 링크를 참조하기 바란다. http://henrysbench.capnfatz.com/henrys-bench/keyes-ky-040-arduino-rotary-encoder-user-manual/ 이 링크에서는 CLK와 DT의 상태변화에 대한 정보도 추가 확인이 가능하다.


▶ 소스 코드 입력 및 구동

아래 소스는 아두이노 포럼(forum.arduino.cc)에서 발췌했다.

CLK는 회전이 발생하면 HIGH, LOW의 상태가 변화된다. 아래 소스는 이러한 상태 전환이 발생하면, DT의 값을 사용해 방향을 알아낸다.(이때 interrupt를 사용한다.)

이후에는 이 수치를 static변수(전체 프로그램에 걸쳐 값이 계속 보존되는 변수)에 넣으면 시계/반시계 방향으로 최종 회전을 얼만큼 했는지 파악이 가능하다.

아래에서는 앞에서 명기한 대로 회로를 제대로 구성해야만(pull-up 저항 등 첨가) 쓸 수 있는 SW는 제거했다.

 

// https://forum.arduino.cc/index.php?topic=242356.0

// keyes rotary encoder

 

volatile boolean TurnDetected;

volatile boolean up;

 

const int PinCLK=2; // Used for generating interrupts using CLK signal

const int PinDT=3; // Used for reading DT signal

const int PinSW=4; // Used for the push button switch

 

void isr () { // Interrupt service routine is executed when a HIGH to LOW transition is detected on CLK

up = (digitalRead(PinCLK) == digitalRead(PinDT));

TurnDetected = true;

}

 

 

void setup () {

pinMode(PinCLK,INPUT);

pinMode(PinDT,INPUT);

pinMode(PinSW,INPUT);

attachInterrupt (0,isr,CHANGE); // interrupt 0 is always connected to pin 2 on Arduino UNO

Serial.begin (9600);

Serial.println("Start");

}

 

void loop () {

static long virtualPosition=0; // without STATIC it does not count correctly!!!

 

/*

if (!(digitalRead(PinSW))) { // check if pushbutton is pressed

virtualPosition=0; // if YES, then reset counter to ZERO

Serial.print ("Reset = "); // Using the word RESET instead of COUNT here to find out a buggy encoder

 

Serial.println (virtualPosition);

}

*/

if (TurnDetected) {         // do this only if rotation was detected

if (up)

virtualPosition++;

else

virtualPosition--;

TurnDetected = false; // do NOT repeat IF loop until new rotation detected

Serial.print ("Count = ");

Serial.println (virtualPosition);

}

}

 

상기 소스 실행 후, 시리얼 모니터로 연결하고 나서 해당 손잡이를 돌려보자. 방향에 따라 아래와 같이 Count가 변하는 것을 볼 수 있다.

 

 

▶ 구매 가이드

Rotary encoder : http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20160110072419&SearchText=rotary+encoder+arduino ($ 1)

 

강의 키워드

Rotary encoder, 로터리 인코더, shaft encoder, 샤프트 인코더, 회전 측정, 아두이노, KY-040

 

반응형