로터리형 엔코더 모듈

:  전기모터, 엔진 회전 각도 / 속도 측정 시 사용

노브를 수직으로 눌러 출력 값 변경 가능

축이 일정량 회전 시 펄스 발생, 펄스 수 세어 축 각도 측정

사용 예시) 마우스 휠, 스피커 볼륨, 전자 피아노 설정 조절 버튼, 자동차 노브

축 회전 = 핀 A, B가 공통 핀과 접촉 = 2개 디지털 신호 출력

신호 펄스 계산 = 두 출력 中 1개 만 사용 but 회전 방향 결정 위해 2개 고려

좌측 시계방향 (동시)파

우측 반시계방향 (동시)초 

 


핀 구성 : CLK / DT / SW / VCC / GND

특징 : 회전부를 회전시켜 전기신호 발생, 360도 무한 회전


실습 예제

결선 회로도

GND = GND

VCC = 5V

SW = D4

DT = D3

CLK = D2 

int LED_T = 10;     // 위 LED
int LED_B = 9;      // 아래 LED
 
int CLK = 2;        // CLK
int DT = 3;         // DT
int SW = 4;         // SW
 
static int oldCLK = LOW;  // CLK 값 저장 변수
static int oldDT = LOW;   // DT 값 저장 변수
 
int brightness = 143;    // LED 밝기 값(=중간(0~255))
int location = 0;        // 켜진 LED 위치 저장 변수 (0(=위) 초기화)
 
void setup() {
  pinMode(CLK, INPUT_PULLUP); // 내장 풀업 저항 사용하는 입력
  pinMode(DT, INPUT_PULLUP); 
  pinMode(SW, INPUT_PULLUP);  

  pinMode(LED_T, OUTPUT);
  pinMode(LED_B, OUTPUT);
}
 
void loop() {
  if (digitalRead(SW) == LOW) { // 노브 눌렸을 때
    changeLED();                // changeLED 함수 호출, LED 켜기
    location++;                 // LED 위치 바꾸기
    delay(300);                 // 중복 입력 방지
  }
  
  else {                              // 노브 돌렸을 때
    brightness += (getDirection()*5); // 밝기 조절
    if(brightness < 0)                // LED 밝기 최솟값(0)이하 떨어지는 것 방지
      brightness = 0;
    if(brightness > 255)              // LED 밝기 최댓값(255)이상 올라가는 것 방지
      brightness = 255;
    changeLED();                      // 변화한 밝기값 적용
  }
}
 
//방향 반환 함수
int getDirection() {
  int direct = 0;                 // 방향 초기화
  int newCLK = digitalRead(CLK);  // 현재 CLK 값 저장 변수
  int newDT = digitalRead(DT);    // 현재 DT 값 저장 변수
  
  if (newCLK != oldCLK) {         // CLK 값 변한 경우
    if (oldCLK == LOW) {          // LOW에서 HIGH 경우
      direct = oldDT * 2 - 1;     // direct 값 변경 
    }
  }
  
  oldCLK = newCLK;  // 갱신
  oldDT = newDT;
  
  return direct; // 시계방향 = -1, 반시계방향 = +1 반환
} 
 
// LED 위치 조절 함수
void changeLED() {
  if(location%2 == 1) {               // 변수를 2로 나눈 나머지 = 1
    analogWrite(LED_T, brightness);   // 위 LED만 ON
    analogWrite(LED_B, LOW);          
  }
  else {                              // 나머지 = 0
    analogWrite(LED_T, LOW);          
    analogWrite(LED_B, brightness);   // 아래 LED만 ON
  }
}

실행 결과

 

'Arduino' 카테고리의 다른 글

TCS3200 컬러 감지 센서 2  (0) 2022.08.29
TCS3200 컬러 감지 센서 1  (0) 2022.08.29
피에조 부저  (0) 2022.08.19
리드 스위치 모듈 KY-025 (Dry Reed Switch Sensor)  (0) 2022.08.19
적외선 PIR센서 (인체 감지 모션 센서)  (0) 2022.08.19