아두이노 - 로터리 엔코더 - 서보 모터 | Arduino - Rotary Encoder - Servo Motor
이 튜토리얼에서는 로터리 인코더의 출력 값에 따라 서보 모터를 회전시키는 방법을 배우는 방법에 대해 알아볼 것입니다.
준비물
1 | × | Arduino Uno | Amazon | |
1 | × | USB 2.0 cable type A/B | 쿠팡 | Amazon | |
1 | × | Servo Motor | 쿠팡 | Amazon | |
1 | × | Rotary Encoder | 쿠팡 | Amazon | |
1 | × | Breadboard | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (Optional) 9V Power Adapter for Arduino | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino Uno | Amazon |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
서보 모터 및 로터리 엔코더에 관하여
서보 모터와 로터리 엔코더(핀아웃, 작동 방식, 프로그래밍 방법 등)에 대해 잘 모른다면, 다음 튜토리얼에서 배우십시오:
선연결
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
아두이노 코드
/*
* 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다
* 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-rotary-encoder-servo-motor
*/
#include <Servo.h>
#define CLK_PIN 2
#define DT_PIN 3
#define SW_PIN 4
#define SERVO_PIN 9
#define DIRECTION_CW 0 // 시계 방향
#define DIRECTION_CCW 1 // 반시계 방향
int counter = 0;
int direction = DIRECTION_CW;
int CLK_state;
int prev_CLK_state;
Servo servo; // 서보 객체를 생성하여 서보를 제어합니다.
void setup() {
Serial.begin(9600);
// 인코더 핀을 입력으로 설정합니다.
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
// 로터리 인코더의 CLK 핀의 초기 상태를 읽습니다.
prev_CLK_state = digitalRead(CLK_PIN);
servo.attach(SERVO_PIN); // 서보 객체에 9번 핀의 서보를 연결합니다.
servo.write(0);
}
void loop() {
// 로터리 인코더의 CLK 핀의 현재 상태를 읽습니다.
CLK_state = digitalRead(CLK_PIN);
// CLK의 상태가 변경되면, 펄스가 발생한 것입니다.
// 이중 계산을 피하기 위해 하강 에지 (LOW에서 HIGH로)에만 반응합니다.
if (CLK_state != prev_CLK_state && CLK_state == HIGH) {
// DT 상태가 HIGH이면
// 인코더는 반시계 방향으로 회전하고 있습니다 => 카운터를 감소시킵니다.
if (digitalRead(DT_PIN) == HIGH) {
counter--;
direction = DIRECTION_CCW;
} else {
// 인코더가 시계 방향으로 회전하고 있습니다 => 카운터를 증가시킵니다.
counter++;
direction = DIRECTION_CW;
}
Serial.print("DIRECTION: ");
if (direction == DIRECTION_CW)
Serial.print("Clockwise");
else
Serial.print("Counter-clockwise");
Serial.print(" | COUNTER: ");
Serial.println(counter);
if (counter < 0)
counter = 0;
else if (counter > 180)
counter = 180;
// 카운터에 따라 서보 각도를 설정합니다.
servo.write(counter);
}
// 마지막 CLK 상태를 저장합니다.
prev_CLK_state = CLK_state;
}
사용 방법
- 아두이노를 USB 케이블을 통해 PC에 연결하십시오
- 아두이노 IDE를 열고, 올바른 보드와 포트를 선택하십시오
- 위의 코드를 복사하고 아두이노 IDE로 열기
- 아두이노 IDE에서 Upload 버튼을 클릭하여 아두이노에 코드를 업로드하십시오
- 시리얼 모니터 열기
- 로터리 엔코더를 돌리세요
- 서보 모터의 회전을 확인하세요
- 시리얼 모니터에서 결과를 확인하세요
COM6
DIRECTION: Clockwise | COUNTER/ANGLE: 19
DIRECTION: Clockwise | COUNTER/ANGLE: 26
DIRECTION: Clockwise | COUNTER/ANGLE: 34
DIRECTION: Clockwise | COUNTER/ANGLE: 46
DIRECTION: Clockwise | COUNTER/ANGLE: 53
DIRECTION: Counter-clockwise | COUNTER/ANGLE: 46
DIRECTION: Counter-clockwise | COUNTER/ANGLE: 34
DIRECTION: Counter-clockwise | COUNTER/ANGLE: 26
DIRECTION: Counter-clockwise | COUNTER/ANGLE: 16
DIRECTION: Counter-clockwise | COUNTER/ANGLE: 06
Autoscroll
Clear output
9600 baud
Newline
코드 설명
소스 코드의 주석 줄에 있는 줄별 설명을 읽으세요!
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.