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
'아두이노 센서' 카테고리의 다른 글
[센서/VL53L0X] 레이저 기반의 거리 센서 (0) | 2017.06.09 |
---|---|
[센서/BME280] 습도, 온도, 기압, 고도 통합 센서 (2) | 2017.06.08 |
[센서/조도,움직임] GY-9960LLC, APDS-9960 RGB and gesture sensor, 조도 및 움직임 센서 (0) | 2017.06.08 |
[센서/컬러센서] TCS34725 센서를 통해 RGB 값을 읽어보자 (6) | 2017.02.12 |
[센서/전압측정] 전압 센서(Voltage Sensor)를 통해 전압을 측정하자 (4) | 2016.05.06 |
[센서/움직임감지센서] PIR(passive infrared) motion sensor로 움직임을 감지해보자 (0) | 2015.11.10 |
[센서/Tachometer] 무언가 반복해서 지나가는 속도를 측정할때는 IR(적외선) 기반 Tachometer를 사용하세요 (0) | 2015.10.26 |
[센서/진동] 가변 진동 센서-디지탈/Adjustable vibration sensor-digital with potentiometer (0) | 2015.08.24 |
[센서/충격] 충격(진동) 감지 센서/Knock sensor/Vibration sensor (0) | 2015.08.17 |
[센서/조도] Lux(룩스)단위로 빛의 밝기를 읽어주는 GY-302센서(BH1750) (1) | 2015.08.12 |