Skip to main content
Summary

아두이노가 움직임을 만들 때 달라지는 것

LED와 화면은 정보를 보여 줍니다. 모터와 릴레이는 한 단계 더 나아가 실제 물체를 움직입니다. 바퀴를 돌리고, 문을 열고, 팬을 켜고, 펌프를 작동시킵니다. 이런 부품을 액추에이터라고 부릅니다. 센서가 눈과 귀라면, 액추에이터는 손과 발에 가깝습니다.

하지만 움직이는 부품은 대부분 전류를 많이 씁니다. 여기서 중요한 규칙이 나옵니다.

아두이노 핀은 명령을 내리는 신호선이지, 모터에 힘을 공급하는 전원선이 아닙니다.

작은 DC 모터라도 처음 돌기 시작할 때 순간적으로 큰 전류를 요구합니다. 축이 막혔을 때는 전류가 더 크게 늘어납니다. 아두이노 입출력 핀으로 이런 전류를 직접 공급하려 하면 모터가 약하게 떨거나, 보드가 리셋되거나, 핀이 손상될 수 있습니다. 여러 교육 자료에서도 마이크로컨트롤러 핀은 큰 부하를 직접 구동하기보다 트랜지스터나 모터 드라이버를 통해 제어해야 한다고 설명합니다.1

이번 장의 목표는 단순히 모터를 돌리는 것이 아닙니다. 신호와 전원을 분리해서 안전하게 움직임을 만드는 방법을 익히는 것입니다.

모터와 액추에이터 안전하게 제어하기AI 생성 이미지

서보모터: 각도를 명령하는 모터

서보모터는 정해진 각도로 움직이는 모터입니다. 일반 DC 모터가 계속 빙글빙글 도는 바퀴라면, 서보모터는 팔을 원하는 위치로 옮기는 관절에 가깝습니다. 작은 로봇 팔, 문 잠금 장치, 센서 방향 조절에 자주 사용합니다.

입문용 SG90 서보모터는 보통 세 가닥 선을 가집니다.

서보 선 색상연결
갈색 또는 검정GND
빨강5V 전원
주황 또는 노랑아두이노 신호 핀

색상은 제조사마다 조금 다를 수 있으므로, 처음 쓰는 부품은 제품 설명을 확인하는 습관을 들이세요.

작은 서보 하나는 아두이노 5V 핀에서 잠깐 동작할 수도 있습니다. 그러나 서보가 떨리거나, 보드가 리셋되거나, USB 연결이 끊기는 증상이 보이면 전원이 부족한 것입니다. 서보 여러 개를 동시에 쓰거나, 무거운 구조물을 움직이거나, 서보가 힘을 많이 써야 하는 프로젝트라면 처음부터 서보 전용 5V 외부 전원을 준비하는 편이 좋습니다. 이때는 외부 전원 GND와 아두이노 GND를 함께 연결해야 서보가 아두이노의 신호를 제대로 알아들을 수 있습니다.

먼저 가장 작은 코드로 90도 위치로 이동시켜 보겠습니다.

#include <Servo.h>

Servo myServo;
const int servoPin = 9;

void setup() {
  myServo.attach(servoPin);
  myServo.write(90);
}

void loop() {
}

Servo는 서보를 다루기 위한 객체입니다. attach(9)는 9번 핀을 서보 신호 핀으로 사용하겠다는 뜻입니다. write(90)은 서보에게 90도 위치로 이동하라고 명령합니다.

다음은 0도에서 180도까지 천천히 움직이고 다시 돌아오는 예제입니다. Servo 라이브러리를 사용하는 기본 sweep 예제는 각도를 조금씩 바꾸고 짧게 기다리는 방식으로 구성됩니다.2

#include <Servo.h>

Servo myServo;
const int servoPin = 9;

void setup() {
  myServo.attach(servoPin);
}

void loop() {
  for (int angle = 0; angle <= 180; angle++) {
    myServo.write(angle);
    delay(15);
  }

  for (int angle = 180; angle >= 0; angle--) {
    myServo.write(angle);
    delay(15);
  }
}

서보가 끝까지 가지 않고 윙윙거리기만 하면 기계적으로 막혀 있을 수 있습니다. 손으로 억지로 축을 잡고 있거나, 연결된 구조물이 걸려 있으면 서보는 계속 힘을 쓰며 전류를 많이 먹습니다. 이 상태가 오래가면 서보와 전원이 뜨거워질 수 있으니 바로 전원을 빼고 구조물을 점검하세요. 서보는 코드만 맞는다고 안전하게 움직이는 부품이 아니라, 전원과 기계 구조까지 함께 맞아야 안정적으로 동작합니다.

DC 모터: 직접 연결하지 않는 이유

DC 모터는 전원을 연결하면 계속 회전하는 모터입니다. 선풍기, 바퀴, 펌프처럼 연속 회전이 필요한 곳에 어울립니다.

가장 하고 싶은 실수는 이것입니다.

아두이노 9번 핀 ─ DC 모터 ─ GND

이 연결은 피해야 합니다. DC 모터는 LED와 다릅니다. LED는 저항을 넣어 전류를 제한하면 작은 전류로 켤 수 있지만, 모터는 회전하기 위해 훨씬 큰 전류를 요구합니다. 특히 멈춰 있다가 처음 돌 때와 축이 막혔을 때 전류가 크게 증가합니다.

직접 연결했을 때 나타나는 증상은 다음과 같습니다.

  • 모터가 돌지 않고 떨기만 한다.

  • 아두이노가 반복해서 리셋된다.

  • USB 연결이 불안정해진다.

  • 보드의 전압 레귤레이터나 칩이 뜨거워진다.

  • 특정 핀이 더 이상 정상 동작하지 않는다.

해결책은 아두이노가 모터 전류를 직접 공급하지 않고, 트랜지스터나 MOSFET을 전자 스위치로 사용하는 것입니다. 아두이노 핀은 스위치를 켜고 끄는 역할만 하고, 실제 모터 전류는 외부 전원에서 흐르게 만드는 방식입니다.

트랜지스터와 MOSFET: 작은 신호로 큰 전류 켜기

트랜지스터는 수도꼭지와 비슷합니다. 손가락으로 물 전체를 밀어내는 것이 아니라, 수도꼭지를 살짝 열어 큰 물줄기가 흐르게 합니다. 아두이노 핀은 트랜지스터의 스위치를 여는 작은 신호만 담당하고, 모터 전류는 외부 전원에서 공급됩니다.

DC 모터를 한 방향으로만 돌릴 때는 NPN 트랜지스터나 N채널 MOSFET을 사용할 수 있습니다. 큰 전류를 다룰 때는 보통 로직 레벨 N채널 MOSFET이 더 적합합니다. 로직 레벨이라는 말은 아두이노의 5V 신호로 충분히 켜질 수 있다는 뜻입니다. MOSFET을 고를 때는 이름만 보고 고르지 말고, 데이터시트에서 허용 전류와 발열 조건도 함께 확인해야 합니다.

기본 연결은 다음과 같습니다.

외부 전원 +  ─ 모터 ─ MOSFET 드레인
MOSFET 소스 ─ GND
아두이노 9번 핀 ─ 저항 ─ MOSFET 게이트
MOSFET 게이트 ─ 풀다운 저항 ─ GND
아두이노 GND ─ 외부 전원 GND

게이트 앞의 작은 저항은 아두이노 핀과 MOSFET 게이트 사이의 순간 전류를 완화하는 역할을 합니다. 또한 게이트와 GND 사이에는 보통 10kΩ 정도의 풀다운 저항을 넣어 둡니다. 이 저항이 없으면 아두이노가 리셋되는 짧은 순간에 게이트가 떠 있는 상태가 되어 모터가 의도치 않게 켜질 수 있습니다.

모터 양단에는 보호 다이오드를 병렬로 연결합니다. 모터는 코일을 가진 부품이라 전원을 끊는 순간 반대 방향의 높은 전압, 즉 역기전력을 만들 수 있습니다. 이 전압은 트랜지스터나 MOSFET을 손상시킬 수 있으므로 플라이백 다이오드가 필요합니다.3

다이오드 방향은 중요합니다.

다이오드의 줄 표시가 있는 쪽 → 모터 전원 + 쪽
다이오드의 반대쪽 → MOSFET 드레인 쪽

줄 표시가 있는 쪽은 다이오드의 캐소드입니다. 평소에는 전류가 다이오드를 통해 흐르지 않다가, 모터 전원을 끊을 때 생기는 역기전력을 안전한 경로로 흘려 보내는 역할을 합니다.

다음 코드는 MOSFET으로 DC 모터 속도를 서서히 올리고 내립니다.

const int motorPin = 9;

void setup() {
  pinMode(motorPin, OUTPUT);
}

void loop() {
  for (int speed = 0; speed <= 255; speed++) {
    analogWrite(motorPin, speed);
    delay(20);
  }

  for (int speed = 255; speed >= 0; speed--) {
    analogWrite(motorPin, speed);
    delay(20);
  }
}

analogWrite()는 실제 전압을 연속적으로 바꾸는 것이 아니라 PWM 신호를 만듭니다. 아주 빠르게 켰다 껐다 하면서 평균적으로 전달되는 에너지를 조절합니다. LED 밝기 조절에서 배운 원리와 같습니다. 다만 이번에는 PWM 핀이 모터를 직접 구동하는 것이 아니라 MOSFET의 게이트를 제어합니다.

이 방식의 한계도 분명합니다. 모터를 켜고 끄거나 속도를 바꿀 수는 있지만, 회전 방향은 바꿀 수 없습니다. 방향을 바꾸려면 모터 양단의 전류 방향을 뒤집어야 합니다. 이때 사용하는 회로가 H-브리지이고, 이를 부품으로 만든 것이 모터 드라이버입니다.

모터 드라이버: 정회전, 역회전, 속도 제어

L293D와 L298N은 입문 실습에서 자주 쓰는 모터 드라이버입니다. 내부에 여러 개의 스위치가 들어 있어 DC 모터에 흐르는 전류 방향을 바꿀 수 있습니다. 즉, 코드로 정회전과 역회전을 제어할 수 있습니다.

대표적인 연결은 다음과 같습니다.

드라이버 핀역할
OUT1, OUT2DC 모터 두 선에 연결
IN1, IN2회전 방향 제어 신호
ENA속도 제어용 PWM 신호
VM 또는 VCC Motor모터용 외부 전원 +
5V 또는 VCC Logic드라이버 논리 회로용 5V
GND아두이노 GND와 외부 전원 GND에 공통 연결

L298N 모듈은 ENA 점퍼가 꽂혀 있으면 항상 최대 속도로 동작하는 경우가 많습니다. PWM으로 속도를 제어하려면 ENA 점퍼를 제거하고 아두이노의 PWM 핀에 연결해야 합니다. L298N 예제에서도 ENA는 PWM 속도 제어, IN1과 IN2는 방향 제어, OUT1과 OUT2는 모터 연결에 사용됩니다. 또한 모터 전원 GND와 아두이노 GND를 공통으로 연결해야 합니다.4

다만 L298N은 입문용으로 널리 쓰이지만, 최신 드라이버에 비해 전압 강하와 발열이 큰 편입니다. 작은 실습용 모터에는 괜찮아도, 전류가 큰 모터를 오래 돌리면 드라이버가 뜨거워질 수 있습니다. 손으로 만지기 어려울 정도로 뜨거워지면 전원을 끄고, 모터 전류와 드라이버 정격을 다시 확인하세요.

방향 제어의 기본은 다음과 같습니다.

IN1IN2동작
LOWLOW정지
HIGHLOW한 방향 회전
LOWHIGH반대 방향 회전
HIGHHIGH정지 또는 브레이크

모터가 예상과 반대로 돌면 고장이라고 판단하기 전에 두 가지를 확인하세요.

  1. OUT1과 OUT2에 연결한 모터 선을 서로 바꾼다.

  2. 코드에서 IN1과 IN2의 HIGH/LOW를 반대로 바꾼다.

다음은 L298N 한 채널을 사용하는 기본 코드입니다.

const int enPin = 9;
const int in1Pin = 6;
const int in2Pin = 5;

void setup() {
  pinMode(enPin, OUTPUT);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
}

void setMotor(int speed, bool forward) {
  speed = constrain(speed, 0, 255);

  if (forward) {
    digitalWrite(in1Pin, HIGH);
    digitalWrite(in2Pin, LOW);
  } else {
    digitalWrite(in1Pin, LOW);
    digitalWrite(in2Pin, HIGH);
  }

  analogWrite(enPin, speed);
}

void stopMotor() {
  analogWrite(enPin, 0);
  digitalWrite(in1Pin, LOW);
  digitalWrite(in2Pin, LOW);
}

void loop() {
  setMotor(180, true);
  delay(2000);

  stopMotor();
  delay(1000);

  setMotor(180, false);
  delay(2000);

  stopMotor();
  delay(1000);
}

여기서 setMotor(180, true)는 속도 180으로 정회전하라는 뜻입니다. setMotor(180, false)는 같은 속도로 반대 방향 회전입니다. stopMotor()는 PWM을 0으로 만들고 방향 핀도 모두 LOW로 내려 모터를 멈춥니다.

코드를 업로드하기 전에 모터 전원과 아두이노 전원을 헷갈리지 않는지도 확인하세요. 모터 드라이버의 모터 전원 단자에는 모터에 맞는 외부 전원을 넣고, 아두이노의 출력 핀은 IN1, IN2, ENA 같은 제어 입력으로만 들어가야 합니다.

릴레이: 전기 스위치를 코드로 누르기

릴레이는 전자석으로 움직이는 스위치입니다. 아두이노가 릴레이 코일을 켜면 내부 접점이 움직이고, 별도의 회로가 연결되거나 끊어집니다. 작은 신호로 더 큰 전압의 장치를 켜고 끌 수 있다는 장점이 있습니다.

릴레이에는 보통 세 가지 접점 이름이 있습니다.

접점의미
COM공통 단자
NO평소에는 열려 있고, 릴레이가 켜지면 연결됨
NC평소에는 연결되어 있고, 릴레이가 켜지면 끊어짐

예를 들어 평소에는 꺼져 있다가 아두이노 명령으로 켜지는 장치를 만들려면 COM과 NO를 사용합니다. 평소에는 켜져 있다가 릴레이가 동작할 때 꺼지는 구조가 필요하면 COM과 NC를 사용합니다.

초보자는 낱개 릴레이보다 릴레이 모듈을 사용하는 편이 안전합니다. 모듈에는 보통 트랜지스터, 저항, 보호 다이오드가 함께 들어 있습니다. 그래도 다음 사항은 반드시 확인해야 합니다.

  • 릴레이 접점의 정격 전압과 정격 전류가 부하보다 충분히 큰가?

  • AC용 정격과 DC용 정격을 혼동하지 않았는가?

  • 코일 전압이 5V인지 12V인지 확인했는가?

  • 릴레이 코일을 아두이노 핀에 직접 연결하지 않았는가?

  • 코일 양단에 플라이백 다이오드가 있는가?

  • 모듈이 HIGH 신호에서 켜지는지, LOW 신호에서 켜지는지 확인했는가?

릴레이 모듈 중에는 입력 핀을 HIGH로 만들 때 켜지는 제품도 있고, 반대로 LOW로 만들 때 켜지는 제품도 있습니다. 코드가 맞는 것 같은데 릴레이가 반대로 동작한다면 고장으로 판단하기 전에 모듈 설명서의 active HIGH, active LOW 표시를 확인하세요.

릴레이 코일도 모터처럼 인덕터입니다. 전류가 갑자기 끊기면 높은 역전압이 생깁니다. 보호 다이오드는 코일 가까이에 병렬로 연결하고, 다이오드의 캐소드는 전원 + 쪽, 애노드는 트랜지스터 쪽에 둡니다.5

릴레이에서 한 가지 더 구분해야 할 점은 제어측과 접점측입니다. 제어측은 아두이노가 릴레이 코일이나 릴레이 모듈 입력을 켜는 부분입니다. 접점측은 COM, NO, NC로 다른 회로를 실제로 연결하거나 끊는 부분입니다. 접점측은 스위치처럼 동작하므로, 별도 배터리 회로를 켜고 끌 때 반드시 그 배터리의 GND를 아두이노 GND와 연결해야 하는 것은 아닙니다. 반면 릴레이 모듈의 제어 입력을 아두이노가 직접 판단해야 하는 구조라면, 보통 아두이노 GND와 모듈 GND는 공통으로 연결해야 합니다.

220V 같은 가정용 교류 전원을 다루는 실습은 이 책의 입문 범위를 넘어섭니다. 절연 케이스, 퓨즈, 접지, 전선 굵기, 단자 고정, 감전 방지까지 함께 고려해야 합니다. 처음에는 릴레이로 저전압 LED 스트립, 작은 5V 램프, 별도 배터리 회로를 켜고 끄는 정도에서 연습하세요. 브레드보드 위에 고전압 회로를 올리는 것은 피해야 합니다.

외부 전원을 쓸 때 GND를 공통으로 묶는 이유

모터 전원은 외부 어댑터나 배터리에서 공급하고, 아두이노는 USB나 별도 전원으로 동작하는 구성이 많습니다. 이때 자주 빠지는 선이 GND입니다.

아두이노의 9번 핀이 HIGH를 출력한다는 말은 9번 핀이 아두이노 GND를 기준으로 높은 전압이라는 뜻입니다. 그런데 모터 드라이버나 MOSFET 회로의 GND가 아두이노 GND와 연결되어 있지 않으면, 상대 회로는 그 HIGH가 얼마인지 제대로 판단할 기준이 없습니다.

비유하면 두 사람이 서로 다른 바닥 높이에서 키를 재고 있는 것과 같습니다. 한 사람은 170cm라고 말하지만, 바닥 기준이 다르면 실제 높이를 비교할 수 없습니다. 전압도 기준점이 같아야 의미가 있습니다.

따라서 일반적인 모터 제어에서는 다음 연결을 반드시 넣습니다.

아두이노 GND ─ 외부 모터 전원 GND ─ 드라이버 GND

MOSFET 스위치 회로에서도 마찬가지입니다. 아두이노가 게이트에 5V를 출력하더라도, MOSFET 소스 쪽 GND와 아두이노 GND가 연결되어 있지 않으면 그 5V가 MOSFET 입장에서 제대로 된 5V로 보이지 않을 수 있습니다.

단, 일부 절연형 릴레이 모듈처럼 의도적으로 회로를 분리하는 제품은 설명서의 연결 방식을 따라야 합니다. 또한 릴레이의 접점측처럼 단순히 스위치로만 분리되어 있는 회로는 상황에 따라 아두이노 GND와 묶지 않을 수도 있습니다. 그러나 모터 드라이버, MOSFET 스위치, 일반 센서 회로에서는 공통 GND가 기본입니다.

전원을 넣기 전 점검 목록

움직이는 회로는 코드보다 배선 점검이 먼저입니다. 업로드 전에 다음 항목을 확인하세요.

  • 모터를 아두이노 핀에 직접 연결하지 않았는가?

  • 모터 전원 전압이 모터 정격과 맞는가?

  • 드라이버의 GND, 아두이노 GND, 외부 전원 GND가 연결되어 있는가?

  • MOSFET 게이트에 풀다운 저항이 필요한 회로인가?

  • 모터나 릴레이 코일에 플라이백 다이오드가 필요한 회로인가?

  • 다이오드 방향이 전원 + 쪽을 향하고 있는가?

  • 드라이버 칩이나 MOSFET의 허용 전류가 모터의 동작 전류보다 충분한가?

  • 모터가 기계적으로 막혀 있지 않은가?

  • 릴레이 접점 정격이 실제 부하보다 충분히 여유가 있는가?

  • 전원을 넣은 뒤 부품이 빠르게 뜨거워지면 바로 전원을 뺄 준비가 되어 있는가?

문제가 생겼을 때는 한꺼번에 수정하지 마세요. 먼저 모터를 분리하고 드라이버 입력 핀만 LED나 멀티미터로 확인합니다. 그다음 외부 전원 전압을 확인하고, 마지막에 모터를 연결합니다. 코드를 의심하기 전에 전류가 흐르는 경로를 먼저 따라가면 문제를 훨씬 빨리 찾을 수 있습니다.

모터와 릴레이를 다룰 수 있게 되면 아두이노 프로젝트는 화면 속 숫자를 넘어 실제 세계를 움직이기 시작합니다. 이 단계에서 가장 중요한 실력은 강한 부품을 무리하게 켜는 능력이 아니라, 작은 신호와 큰 전원을 분리해 안전하게 제어하는 습관입니다.

참고

1Lab: Using a Transistor to Control High Current Loads with an Arduino

2Lesson 33: Servo Motor (SG90)

3Driving Motors with Arduino - SparkFun Learn

4Arduino - DC Motor | Arduino Tutorial

5Protecting Arduino from Solenoid Inductive Kickback Damage

책 목록

아두이노 학습: 기초 회로부터 IoT 캡스톤까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기