아두이노 DC 모터 리미트 스위치
이 아두이노 튜토리얼에서는 리미트 스위치와 L298N 드라이버를 사용하여 DC 모터를 제어하는 방법을 배우게 됩니다. 구체적으로, 다음 내용을 배울 것입니다:
- 한계 스위치에 닿았을 때 DC 모터를 멈추는 방법
- 한계 스위치에 닿았을 때 DC 모터의 방향을 바꾸는 방법
- 두 개의 한계 스위치에 닿았을 때 DC 모터의 방향을 바꾸는 방법
준비물
| 1 | × | 아두이노 우노 R3 | 쿠팡 | 아마존 | |
| 1 | × | USB 2.0 타입 A-to-B 케이블 (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 2.0 타입 C-to-B 케이블 (USB-C PC용) | 아마존 | |
| 1 | × | 리미트 스위치 Limit Switch (KW12-3) | 쿠팡 | 아마존 | |
| 1 | × | 리미트 스위치 Limit Switch (V-153-1C25) | 아마존 | |
| 1 | × | 리미트 스위치 Limit Switch (V-155-1C25) | 아마존 | |
| 1 | × | 리미트 스위치 Limit Switch (V-156-1C25) | 쿠팡 | 아마존 | |
| 1 | × | 5V DC 모터 | 아마존 | |
| 1 | × | 5V DC 모터용 전원 어댑터 | 아마존 | |
| 1 | × | DC 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 | |
| 1 | × | L298N 모터 드라이버 모듈 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Sensors/Servo Expansion Shield for Arduino Uno | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 브레드보드 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 케이스 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 | 아마존 |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
DC 모터 및 리미트 스위치에 대하여
DC 모터와 리미트 스위치(핀 아웃, 작동 방식, 프로그래밍 방법 등)에 대해 잘 모른다면, 다음 튜토리얼에서 배우십시오:
- 아두이노 - 리미트 스위치 튜토리얼
- 아두이노 - DC 모터 튜토리얼
선연결
이 튜토리얼은 두 가지 경우의 아두이노 코드를 제공합니다: 하나의 DC 모터 + 하나의 리미트 스위치, 하나의 DC 모터 + 두 개의 리미트 스위치.
DC 모터와 리미트 스위치 사이의 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
직류 모터와 두 개의 한계 스위치 사이의 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
아두이노 코드 - 리미트 스위치로 DC 모터 정지
아래 코드는 DC 모터가 무한대로 회전하게 하고 리미트 스위치에 닿는 즉시 정지하게 합니다.
/*
* 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다
* 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-dc-motor-limit-switch
*/
#include <ezButton.h>
#define ENA_PIN 7 // EN1 핀 L298N에 연결된 아두이노 핀
#define IN1_PIN 6 // IN1 핀 L298N에 연결된 아두이노 핀
#define IN2_PIN 5 // IN2 핀 L298N에 연결된 아두이노 핀
ezButton limitSwitch(A1); // A1 핀에 첨부된 ezButton 객체를 생성합니다.
void setup() {
Serial.begin(9600);
limitSwitch.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정합니다.
// 디지털 핀을 출력으로 초기화합니다.
pinMode(ENA_PIN, OUTPUT);
pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
digitalWrite(ENA_PIN, HIGH); // 최대 속도
digitalWrite(IN1_PIN, HIGH); // 모터 A가 시계 방향으로 회전하도록 제어합니다
digitalWrite(IN2_PIN, LOW); // 모터 A가 시계 방향으로 회전하도록 제어합니다
}
void loop() {
limitSwitch.loop(); // 반드시 loop() 함수를 먼저 호출해야 합니다.
if (limitSwitch.isPressed()) {
Serial.println(F("The limit switch: TOUCHED"));
digitalWrite(IN1_PIN, LOW); // 모터 정지
digitalWrite(IN2_PIN, LOW); // 모터 정지
}
}
사용 방법
- 아두이노를 USB 케이블을 통해 PC에 연결하세요.
- 아두이노 IDE를 열고, 올바른 보드와 포트를 선택하세요.
- 아두이노 IDE의 왼쪽 바에 있는 Libraries 아이콘으로 이동하세요.
- “ezButton”을 검색하여, ArduinoGetStarted.com에서 제공하는 버튼 라이브러리를 찾으세요.
- EzButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.

- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 아두이노에 코드를 업로드
- 배선이 올바른 경우, 모터가 시계 방향으로 회전하는 것을 볼 수 있습니다.
- 리미트 스위치를 누르세요
- 모터가 즉시 정지하는 것을 볼 수 있습니다
- 시리얼 모니터의 결과는 아래와 같습니다
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The limit switch: TOUCHED
The DC motor is STOPPED
The DC motor is STOPPED
The DC motor is STOPPED
The DC motor is STOPPED
코드 설명
위의 아두이노 코드의 주석 라인에서 설명을 찾을 수 있습니다.
아두이노 코드 - 리미트 스위치로 DC 모터의 방향 변경
아래 코드는 DC 모터가 무한히 회전하게 하고, 리미트 스위치에 닿으면 그 방향을 바꾸게 합니다.
/*
* 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다
* 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-dc-motor-limit-switch
*/
#include <ezButton.h>
#define DIRECTION_CCW -1
#define DIRECTION_CW 1
// 상수는 변경되지 않습니다.
#define ENA_PIN 7 // EN1 핀 L298N에 연결된 아두이노 핀
#define IN1_PIN 6 // IN1 핀 L298N에 연결된 아두이노 핀
#define IN2_PIN 5 // IN2 핀 L298N에 연결된 아두이노 핀
ezButton limitSwitch(A1); // A1 핀에 연결된 ezButton 객체 생성
int direction = DIRECTION_CW;
void setup() {
Serial.begin(9600);
limitSwitch.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정
// 디지털 핀을 출력으로 초기화합니다.
pinMode(ENA_PIN, OUTPUT);
pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
digitalWrite(ENA_PIN, HIGH); // 최대 속도
digitalWrite(IN1_PIN, HIGH); // 모터 A가 시계 방향으로 회전하도록 제어
digitalWrite(IN2_PIN, LOW); // 모터 A가 시계 방향으로 회전하도록 제어
}
void loop() {
limitSwitch.loop(); // loop() 함수를 먼저 호출해야 합니다.
if (limitSwitch.isPressed()) {
Serial.println(F("리밋 스위치: 접촉함"));
direction *= -1; // 방향 변경
Serial.print(F("방향 -> "));
if (direction == DIRECTION_CW) {
Serial.println(F("시계 방향"));
digitalWrite(IN1_PIN, HIGH); // 모터 A가 시계 방향으로 회전하도록 제어
digitalWrite(IN2_PIN, LOW); // 모터 A가 시계 방향으로 회전하도록 제어
} else {
Serial.println(F("반시계 방향"));
digitalWrite(IN1_PIN, LOW); // 모터 A가 반시계 방향으로 회전하도록 제어
digitalWrite(IN2_PIN, HIGH); // 모터 A가 반시계 방향으로 회전하도록 제어
}
}
}
사용 방법
- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino로 업로드하기
- 배선이 올바르면 모터가 시계 방향으로 회전하는 것을 볼 수 있습니다.
- 리미트 스위치를 누르세요
- DC 모터의 방향이 반시계 방향으로 변경된 것을 볼 수 있습니다
- 다시 리미트 스위치를 누르세요
- DC 모터의 방향이 시계 방향으로 변경된 것을 볼 수 있습니다
- 시리얼 모니터의 결과는 아래와 같습니다
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The limit switch: TOUCHED
The direction -> ANTI-CLOCKWISE
The limit switch: TOUCHED
The direction -> CLOCKWISE
아두이노 코드 - 두 개의 리미트 스위치로 DC 모터의 방향 변경
아래 코드는 DC 모터가 무한히 회전하게 하고, 두 개의 리미트 스위치 중 하나가 접촉될 때 방향을 변경합니다.
/*
* 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다
* 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-dc-motor-limit-switch
*/
#include <ezButton.h>
#define DIRECTION_CCW -1
#define DIRECTION_CW 1
#define ENA_PIN 7 // EN1 핀에 연결된 아두이노 핀
#define IN1_PIN 6 // IN1 핀에 연결된 아두이노 핀
#define IN2_PIN 5 // IN2 핀에 연결된 아두이노 핀
ezButton limitSwitch_1(A0); // A0 핀에 연결된 ezButton 객체 생성
ezButton limitSwitch_2(A1); // A1 핀에 연결된 ezButton 객체 생성
int direction = DIRECTION_CW;
int prev_direction = DIRECTION_CW;
void setup() {
Serial.begin(9600);
limitSwitch_1.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정
limitSwitch_2.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정
// 디지털 핀을 출력으로 초기화.
pinMode(ENA_PIN, OUTPUT);
pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
digitalWrite(ENA_PIN, HIGH); // 최대 속도
digitalWrite(IN1_PIN, HIGH); // 모터 A가 시계 방향으로 회전하도록 제어
digitalWrite(IN2_PIN, LOW); // 모터 A가 시계 방향으로 회전하도록 제어
}
void loop() {
limitSwitch_1.loop(); // 반드시 loop() 함수를 먼저 호출해야 함
limitSwitch_2.loop(); // 반드시 loop() 함수를 먼저 호출해야 함
if (limitSwitch_1.isPressed()) {
direction *= -1; // 방향 변경
Serial.println(F("The limit switch 1: TOUCHED"));
}
if (limitSwitch_2.isPressed()) {
direction *= -1; // 방향 변경
Serial.println(F("The limit switch 2: TOUCHED"));
}
if (prev_direction != direction) {
Serial.print(F("The direction -> "));
if (direction == DIRECTION_CW) {
Serial.println(F("CLOCKWISE"));
digitalWrite(IN1_PIN, HIGH); // 모터 A가 시계 방향으로 회전하도록 제어
digitalWrite(IN2_PIN, LOW); // 모터 A가 시계 방향으로 회전하도록 제어
} else {
Serial.println(F("ANTI-CLOCKWISE"));
digitalWrite(IN1_PIN, LOW); // 모터 A가 반시계 방향으로 회전하도록 제어
digitalWrite(IN2_PIN, HIGH); // 모터 A가 반시계 방향으로 회전하도록 제어
}
prev_direction = direction;
}
}
사용 방법
- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino에 업로드하십시오.
- 배선이 올바르면 모터가 시계 방향으로 회전하는 것을 볼 수 있습니다.
- 리미트 스위치 1을 누르십시오.
- DC 모터의 방향이 반시계 방향으로 변경된 것을 볼 수 있습니다.
- 리미트 스위치 2를 누르십시오.
- DC 모터의 방향이 시계 방향으로 변경된 것을 볼 수 있습니다.
- 시리얼 모니터의 결과는 아래와 같습니다.
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The limit switch 1: TOUCHED
The direction -> ANTI-CLOCKWISE
The limit switch 2: TOUCHED
The direction -> CLOCKWISE
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.