아두이노 나노와 로터리 인코더로 만드는 정밀 측정 바퀴
부품 및 준비물
| 부품 | 수량 |
| 아두이노 나노 R3 | 1 |
| 16x2 문자 LCD (백색/청색) | 1 |
| 로터리 인코더 (푸시버튼 내장) | 1 |
| 10kΩ 포텐셔미터 (LCD 콘트라스트용) | 1 |
| 220Ω 저항 (LCD 백라이트용) | 1 |
필요 도구
사용 소프트웨어
프로젝트 개요
측정 바퀴(measuring wheel)는 바퀴 회전수를 이용해 두 점 사이의 거리를 측정하는 도구입니다. 회전 운동학 공식 s = rθ를 적용합니다.
동작 원리
- 로터리 인코더가 회전 스텝 수 측정
- 한 바퀴(360°)당 스텝 수 = N (인코더 사양에 따라 8~48)
- 바퀴 반지름 = R
- 한 바퀴 이동 거리 = 2πR
- 한 스텝당 이동 거리 = 2πR / N
이 공식을 코드에 적용하여 이동 거리를 센티미터 단위로 LCD에 표시합니다. 사용 부품에 맞게 N과 R 값을 수정하면 됩니다. 본 프로젝트에서는 바퀴를 3D 프린터로 출력하고 알루미늄 봉에 조립했습니다.
소스 코드
/* Measuring Wheel
* by Mirko Pavleski
* https://www.youtube.com/channel/UCHLzc76TZel_vCTy0Znvqyw
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(5, 6, 7, 8, 9, 10); // RS, E, D4, D5, D6, D7
int pin1 = 2; // 인코더 A상
int pin2 = 3; // 인코더 B상
int Pos = 0; // 누적 스텝
int State, LastState;
const float pi = 3.14;
const float R = 3.25; // 바퀴 반지름 (cm) - 본인 바퀴에 맞게 수정
const int N = 40; // 한 바퀴당 스텝 수 - 인코더 사양에 맞게 수정
float distance = 0;
void setup() {
pinMode(pin1, INPUT_PULLUP);
pinMode(pin2, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.print("MEASURING WHEEL");
LastState = digitalRead(pin1);
}
void loop() {
State = digitalRead(pin1);
if (State != LastState) {
if (digitalRead(pin2) != State) Pos++; // 정방향
else Pos--; // 역방향
}
distance = ((2 * pi * R) / N) * Pos;
lcd.setCursor(0, 1);
lcd.print(distance);
lcd.setCursor(5, 1);
lcd.print("cm ");
LastState = State;
}
회로도
응용 아이디어
- 바퀴 크기와 인코더 해상도에 따라 mm 단위 정밀도 가능
- 리셋 버튼(인코더 푸시버튼 활용) 추가하여 0점 초기화
- SD 카드 모듈 추가로 이동 거리 로깅
- 블루투스 모듈로 스마트폰에 데이터 전송