키스(Keyes, Keyestudio) 포텐셔미터(가변저항)는 회전 각도나 직선 위치의 기계적 변화를 아날로그 전압 신호로 변환하여 아두이노(Arduino) 등의 마이크로컨트롤러가 읽을 수 있도록 해주는 모듈형 센서입니다. 주로 조명 밝기, 모터 속도, 볼륨 조절 등에 활용됩니다.
Rotary encoder, shaft encoder라 불리는 이 부품은 얼마나 축이 회전했는지를 알아 낼 수 있는 센서이다. 실제 돌려보면 일정 각도마다 약간씩 멈추는 느낌이 있고 이 주기로 CLK 상태가 변한다. 주로 로보트나 움직이는 장치의 원형(각변화) 움직임 정도를 측정할 때 사용할 수 있으며 손목으로 구부림 변화, 손가락의 구부림 변화 같은 것도 이 센서를 통해 측정된다. 그러나 꼭 로보트 팔의 움직임 정도를 측정한다기 보다는, 거의 모든 구부러짐에 대해 측정하고 이에 피드백 받는 장치를 만들어 낼 수 있는 기반이 된다.
이 rotary encoder센서의 원리는 자기식, 광학식 등 몇가지 종류가 존재하지만, 해석 원리는 간단해서 조금씩 특정 각 이상 회전할 때 마다 pulse(CLK)를 발생시키고 이 개수를 세는 형태로 회전의 정도 측정이 가능하다.


< GND->GND, +->5V, CLK->D2, DT->D3 에 연결>
배선은 위 그림의 하단 가이드를 참조로 하면 된다. Keyes의 rotary sensor는 SW신호도 있는데 센서의 손잡이를 돌리는 것 외에 누르는 것에도 반응하도록 할 수 있다. 다만, 이 rotary encoder는 실제 정밀하게 사용하기 위해서는(빠른 속도로 회전할때도 정확히 측정) 저항과 capacitor를 같이 연결해주어야 한다고 권고되고 있다.
고급 사용자들은 아래 매뉴얼을 참조하기 바란다. 이 매뉴얼에서는 CLK와 DT의 상태변화에 대한 정보도 추가 확인이 가능하다.
CLK는 회전이 발생하면 HIGH, LOW의 상태가 변화된다. 아래 소스는 이러한 상태 전환이 발생하면, DT의 값을 사용해 방향을 알아낸다.(이때 interrupt를 사용한다.) 이후에는 이 수치를 static변수(전체 프로그램에 걸쳐 값이 계속 보존되는 변수)에 넣으면 시계/반시계 방향으로 최종 회전을 얼만큼 했는지 파악이 가능하다.
참고사항
배선 정보
CLK 핀을 아두이노 보드의 2번 핀(KY-040의 데이터 출력 1)에 연결하고,
DT 핀을 아두이노 보드의 3번 핀(KY-040의 데이터 출력 2)에 연결하세요.
SW 핀을 아두이노 보드의 4번 핀(스위치 - 누르면 LOW가 됨)에 연결하고,
GND 핀을 접지에 연결하세요.
+ 핀을 +5V에 연결하면 10kΩ 저항을 통해 CLK와 DT 핀이 풀업됩니다.
접지에서 CLK로 0.47µF 커패시터를 연결하여 디바운싱하십시오.
접지에서 DT로 0.47µF 커패시터를 연결하여 디바운싱하십시오.
+5V에서 SW로 10kΩ 저항을 연결하십시오 (SW에는 풀업 저항이 내장되어 있지 않습니다!).
아두이노의 내장 풀업 저항을 사용하는 것보다는
KY-040에 내장된 풀업 저항을 사용하는 것이 좋습니다(KY-040의 "+" 단자는 5V에 연결해야 합니다). 사용 중인 KY-040의 기판 하단
에 풀업 저항이 있는지 확인해 보세요 . 만약 없다면, 아두이노의 내장 풀업 저항을 사용하거나 외부 풀업 저항을 연결하세요.
KY-040은 정지 위치에서 CLK와 DT 모두 항상 HIGH 신호를 유지합니다.
엔코더를 한 위치에서 다른 위치로 돌리면 CLK 또는 DT 신호 중 하나가 먼저 LOW로 바뀌고,
다른 신호도 먼저 LOW로 바뀝니다.
먼저 LOW로 바뀌는 신호에 따라 엔코더가 왼쪽으로 회전하는지 오른쪽으로 회전하는지가 결정됩니다.
다음 정지 위치에 도달하면 두 신호 모두 다시 HIGH가 됩니다.
버튼을 누르면 현재 카운트를 0으로 재설정할 수 있습니다.
응답 속도를 높이려면 시리얼 연결 속도를 높이세요.
(시리얼 모니터의 속도도 높여야 합니다.
그렇지 않으면 출력이 표시되지 않습니다.)
// 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);
}
}

튜토리얼의 출처는 이 링크를 따라가세요. 저자에게 감사합니다.
'개발자 > 부품' 카테고리의 다른 글
| ICL8038 신호 발생기 (0) | 2026.07.08 |
|---|---|
| 새로운 ESP32 PhantomSignal Pro - 두 차례의 신호 제어 (0) | 2026.07.04 |
| Heltec ESP32 Wi-Fi HaLow HT HC32 카메라 세트 (0) | 2026.07.02 |
| ESP32-C6 USB-C 보드 (0) | 2026.06.30 |
| Louder ESP32 Mini 보드 (0) | 2026.06.26 |
| RP2350B는 RP2040 디버거, HDMI 및 microSD 카드 슬롯이 내장 (0) | 2026.06.25 |
| ESP32-H2 Zero MINI 개발 보드 (0) | 2026.06.25 |
| ESP32-S3 3.5인치 터치 LCD 터치스크린 디스플레이 N16R8 개발 보드 (0) | 2026.06.23 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩