아두이노에서 로터리 엔코더를 입력을 받는 예제 입니다.
작동환경은 Arduino Nano를 이용했습니다.
실제 연결상황은 아래와 같습니다.
지난번 엔코더 동작 분석을 통해 신호파형은 미리 파악해 놓았기때문에
바로 코딩을 진행했습니다.
FALLING Egde 인터럽트 처리를 위해 attachInterrupt()함수를 사용하였는데,
아두이노 NANO에서는 INT0로 설정하면 D2핀의 인터럽트를 수신하는 것입니다.
다른 보드를 사용하신다면, 아래의 내용을 참조하세요.
https://www.arduino.cc/reference/pt/language/functions/external-interrupts/attachinterrupt/
#define ENC_A (2) #define ENC_B (3) volatile int location_cur = 0; volatile int location_old = 0; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); pinMode(ENC_A, INPUT); pinMode(ENC_B, INPUT); digitalWrite(ENC_A, HIGH); digitalWrite(ENC_B, HIGH); // int.0 for D2 Pin, int.1 for D3 pin attachInterrupt(INT0, falling_enc_a_isr, FALLING); Serial.println("Volume Encoder Test"); } void loop() { // put your main code here, to run repeatedly: if(location_cur != location_old) { location_old = location_cur; Serial.println(location_cur); } } void falling_enc_a_isr() { bool pin = digitalRead(ENC_B); if(pin == false) { location_cur ++; } else { location_cur --; } } |
문제가 발생했습니다.
엔코더를 한단계 돌리는경우에 인터럽트가 한번 떠야하는데,
여러번 뜨는 경우가 있더군요.
ENC_A핀의 파형을 살펴보니, 역시나 채터링이 발생하는것 같습니다.
Chattering이란 신호가 바뀌는 시점에서 노이즈처럼 떨리는것을 말합니다.
이신호를 감지해서 한번의 변화에 여러번의 인터럽트가 감지되는 것입니다.
소프트웨어로 처리하기도 하는데,
저는 그냥 병렬로 콘덴서를 추가해주었습니다.
많은 용량은 필요없으니 103(0.01uF)를 아래의 회로처럼 추가해줍니다.
이후 증상이 사라졌습니다!
![](https://t1.daumcdn.net/keditor/emoticon/friends2/large/013.png)
아래는 좌우로 돌리는경우 출력되는 로그입니다.
마지막으로 사용했던 아두이노 소스를 공유합니다.
[주의사항] 검토했던 엔코더(https://retromakers.tistory.com/26)에 맞춤코드로,
다른 종류의 엔코더를 사용하신다면 신호 모양이 다르기 때문에
동작이 안될 수 있습니다.
감사합니다!
'전자공작' 카테고리의 다른 글
STM32CubeIDE 프로젝트 GITHUB 연동하기 (0) | 2023.06.18 |
---|---|
ATMEL 7.0(Microchip Studio 7.0) STK500관련 인식 문제 점검 (0) | 2023.02.14 |
로터리 엔코더(Rotary Encoder)의 작동 원리 및 사용 방법 (0) | 2023.01.17 |
MP3 모듈을 이용한 휴대용 MP3/라디오 스피커 만들기 (0) | 2021.05.24 |
충전 가능 초소형 손전등 DIY (0) | 2021.05.04 |