Skip to main content
Summary

센서가 느끼고, 모터가 움직인다

지난 장에서 센서는 로봇의 감각이라고 했다. 빛을 느끼고, 거리를 재고, 선을 구분하는 일이 센서의 역할이었다. 이제 그 감각을 실제 움직임으로 바꿀 차례다.

로봇에서 모터는 근육에 가깝다. 아두이노가 "앞으로 가라", "멈춰라", "왼쪽을 보라"처럼 명령을 내리면 모터가 회전하거나 특정 각도로 움직인다. 이때 중요한 점은 모든 모터가 같은 방식으로 움직이지 않는다는 것이다.

어떤 모터는 빠르게 계속 돈다. 어떤 모터는 정해진 각도까지만 움직인다. 또 어떤 모터는 아주 작은 각도씩 차근차근 움직인다. 로봇의 움직임은 어떤 모터를 고르느냐에 따라 크게 달라진다.

이 장에서는 로봇에서 자주 쓰는 세 가지 모터를 살펴본다.

  • DC 모터: 빠르게 계속 회전한다.

  • 서보 모터: 원하는 각도로 움직인다.

  • 스테퍼 모터: 일정한 간격으로 한 단계씩 움직인다.

모터로 움직임 만들기AI 생성 이미지

DC 모터: 바퀴를 빠르게 돌리는 모터

DC 모터는 건전지나 전원 장치에서 나오는 직류 전기를 사용해 회전하는 모터다. 여기서 직류는 전기가 한 방향으로 흐르는 전기를 말한다. 우리가 아두이노 실습에서 사용하는 5V, 9V 배터리 같은 전원이 대표적인 직류 전원이다.

DC 모터의 가장 큰 특징은 계속 회전한다는 점이다. 전원을 연결하면 축이 빙글빙글 돈다. 전압을 반대로 연결하면 회전 방향도 반대로 바뀐다. 그래서 DC 모터는 바퀴 로봇에 아주 잘 맞는다.

자동차를 떠올려 보자. 자동차 바퀴는 특정 각도까지만 움직이는 것이 아니라 계속 돌아야 앞으로 나아간다. 로봇 자동차도 마찬가지다. 왼쪽 바퀴와 오른쪽 바퀴에 DC 모터를 연결하면 앞으로 가기, 뒤로 가기, 회전하기 같은 움직임을 만들 수 있다.

DC 모터의 기본 제어는 크게 세 가지다.

제어 내용의미
켜기와 끄기모터를 돌리거나 멈춘다.
방향 제어앞으로 돌릴지, 반대로 돌릴지 정한다.
속도 제어빠르게 돌릴지, 천천히 돌릴지 정한다.

하지만 여기서 바로 중요한 문제가 나온다. DC 모터는 아두이노 핀에 직접 연결하면 안 된다.

아두이노 핀은 모터용 전원선이 아니다

아두이노의 디지털 핀은 HIGH와 LOW 신호를 내보낼 수 있다. 그래서 처음에는 "디지털 핀에 모터를 연결하면 켜고 끌 수 있지 않을까?"라고 생각하기 쉽다.

하지만 아두이노 핀은 작은 신호를 보내는 용도이지, 모터를 힘 있게 돌리는 전원선이 아니다. LED는 적은 전류로도 켜지지만, 모터는 처음 돌기 시작할 때 훨씬 큰 전류를 요구한다. 특히 바퀴가 바닥에 닿아 있거나, 모터가 멈춘 상태에서 출발할 때 전류가 순간적으로 크게 흐를 수 있다.

또 하나의 문제가 있다. 모터는 코일이라는 감긴 전선을 사용한다. 모터가 멈추거나 방향이 바뀔 때 순간적으로 전기적 충격이 생길 수 있다. 이를 역기전력이라고 한다. 쉽게 말해 모터가 되돌려 보내는 전기 충격이다. 이 충격이 아두이노 핀으로 들어가면 보드가 오작동하거나 손상될 수 있다.

그래서 모터를 사용할 때는 보통 다음 구성이 필요하다.

  • 아두이노: 모터에게 명령 신호를 보낸다.

  • 별도 전원: 모터를 실제로 돌릴 힘을 제공한다.

  • 모터 드라이버: 아두이노의 작은 신호로 모터 전원을 안전하게 제어한다.

  • 공통 GND: 아두이노와 모터 전원의 기준점을 맞춘다.

모터 드라이버는 아두이노와 모터 사이에 있는 중간 관리자라고 생각하면 된다. 아두이노가 직접 무거운 문을 여는 것이 아니라, "문을 열어라"라고 신호를 보내면 힘센 장치가 대신 문을 여는 구조다.

실제 바퀴 로봇 조립과 모터 드라이버 연결은 다음 장에서 자세히 다룬다. 이번 장에서는 먼저 모터가 어떤 방식으로 제어되는지 이해하는 데 집중하자.

PWM으로 속도를 조절한다

4장에서 PWM을 LED 밝기 조절과 연결해 배웠다. PWM은 전기를 아주 빠르게 켰다 껐다 하면서 평균 출력처럼 보이게 만드는 방식이다.

LED에서는 PWM 값이 작으면 어둡게 보이고, 값이 크면 밝게 보였다. 모터에서도 비슷하게 생각할 수 있다.

  • PWM 값이 작다: 모터가 천천히 돈다.

  • PWM 값이 크다: 모터가 빠르게 돈다.

  • PWM 값이 0이다: 모터가 멈춘다.

  • PWM 값이 255이다: 거의 최대 속도로 돈다.

아두이노에서는 analogWrite() 함수로 PWM 신호를 만든다. 이름에는 analog가 들어가지만, 실제로는 디지털 출력을 빠르게 켰다 끄는 방식이다. 아두이노 우노에서는 보통 핀 번호 앞에 ~ 표시가 있는 핀에서 PWM을 사용할 수 있다.

다음 코드는 DC 모터 드라이버에 속도 명령을 보내는 기본 형태다. 지금은 모터를 아두이노에 직접 연결하는 코드가 아니라, 모터 드라이버의 입력 핀을 제어하는 코드라고 이해하자.

const int speedPin = 5;   // PWM 가능 핀
const int in1 = 7;        // 방향 제어 핀 1
const int in2 = 8;        // 방향 제어 핀 2

void setup() {
  pinMode(speedPin, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
}

void loop() {
  // 앞으로 천천히 회전
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(speedPin, 100);
  delay(2000);

  // 앞으로 빠르게 회전
  analogWrite(speedPin, 220);
  delay(2000);

  // 정지
  analogWrite(speedPin, 0);
  delay(1000);

  // 반대 방향 회전
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(speedPin, 180);
  delay(2000);

  // 정지
  analogWrite(speedPin, 0);
  delay(1000);
}

여기서 in1, in2는 방향을 정하고, speedPin은 속도를 정한다. 실제 핀 이름은 사용하는 모터 드라이버에 따라 ENA, IN1, IN2처럼 다르게 적혀 있을 수 있다. 원리는 같다. 방향 신호와 속도 신호를 따로 보내는 것이다.

서보 모터: 원하는 각도로 움직이는 모터

DC 모터가 계속 회전하는 모터라면, 서보 모터는 원하는 각도로 움직이는 모터다. 일반적인 취미용 서보 모터는 0도에서 180도 사이의 각도를 지정해 움직일 수 있다.

서보 모터 안에는 작은 DC 모터, 기어, 위치를 확인하는 장치, 제어 회로가 함께 들어 있다. 그래서 사용자는 복잡한 내부 구조를 모두 제어하지 않아도 된다. 아두이노에서 "90도로 가라"라고 신호를 보내면 서보 모터가 스스로 그 위치까지 움직인다.

서보 모터는 이런 곳에 자주 쓰인다.

  • 로봇 팔의 관절

  • 초음파 센서를 좌우로 돌리는 회전대

  • 자동차형 로봇의 조향 장치

  • 작은 문이나 손잡이를 여닫는 장치

서보 모터는 보통 선이 세 개다.

선역할
전원선보통 5V 전원을 연결한다.
GND선전기가 돌아가는 기준선이다.
신호선아두이노의 제어 신호를 받는다.

작은 서보 모터 하나를 부하 없이 움직일 때는 아두이노 5V에서 동작하는 경우도 있다. 하지만 로봇에 실제로 붙이면 힘을 많이 쓰기 때문에 별도 5V 전원을 사용하는 편이 안전하다. 이때도 아두이노 GND와 서보 전원 GND는 반드시 연결해야 한다. GND가 연결되어야 신호의 기준이 같아진다.

서보 모터는 아두이노의 Servo 라이브러리로 쉽게 제어할 수 있다.

#include <Servo.h>

Servo headServo;

void setup() {
  headServo.attach(9);  // 서보 신호선을 9번 핀에 연결
}

void loop() {
  headServo.write(0);    // 0도
  delay(1000);

  headServo.write(90);   // 가운데
  delay(1000);

  headServo.write(180);  // 반대쪽 끝
  delay(1000);
}

이 코드는 서보 모터를 0도, 90도, 180도로 차례대로 움직인다. 초음파 센서를 서보 위에 올리면 로봇이 정면만 보는 것이 아니라 왼쪽과 오른쪽도 살펴볼 수 있다. 나중에 장애물 회피 로봇을 만들 때 이 방식이 유용하다.

서보 모터를 사용할 때는 무리하게 손으로 돌리지 않는 것이 좋다. 내부 기어가 손상될 수 있다. 또한 서보마다 실제로 움직일 수 있는 각도 범위가 조금 다를 수 있으므로, 처음에는 10도에서 170도 정도의 안전한 범위로 테스트하는 것이 좋다.

스테퍼 모터: 한 걸음씩 정확히 움직이는 모터

스테퍼 모터는 이름 그대로 step, 즉 단계 단위로 움직이는 모터다. DC 모터처럼 계속 부드럽게 도는 것이 아니라, 일정한 각도씩 끊어서 움직인다.

예를 들어 한 바퀴가 200단계인 스테퍼 모터가 있다고 하자. 그러면 한 단계는 1.8도다. 아두이노가 "10단계 움직여라"라고 명령하면 모터는 약 18도 움직인다. 이렇게 단계 수를 세면서 움직일 수 있기 때문에 정밀한 위치 제어에 좋다.

스테퍼 모터는 다음과 같은 곳에 쓰인다.

  • 3D 프린터의 축 이동

  • 카메라 회전 장치

  • 정밀한 위치 조절 장치

  • 일정한 양을 밀어내는 장치

스테퍼 모터도 아두이노에 직접 연결하지 않는다. 내부 코일을 순서대로 켜고 꺼야 하기 때문에 드라이버가 필요하다. 작은 28BYJ-48 스테퍼 모터는 ULN2003 드라이버 보드와 함께 자주 사용된다. 더 큰 NEMA 계열 스테퍼 모터는 A4988 같은 전용 드라이버를 사용하기도 한다.

다음 코드는 스테퍼 모터를 한 바퀴씩 움직이는 기본 형태다. 실제 단계 수는 모터 종류와 드라이버에 따라 달라질 수 있다.

#include <Stepper.h>

const int stepsPerRevolution = 2048;

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
  myStepper.setSpeed(10);  // 분당 회전 수 설정
}

void loop() {
  myStepper.step(stepsPerRevolution);   // 한 방향으로 한 바퀴
  delay(1000);

  myStepper.step(-stepsPerRevolution);  // 반대 방향으로 한 바퀴
  delay(1000);
}

DC 모터는 빠른 이동에 좋고, 서보 모터는 각도 제어에 좋으며, 스테퍼 모터는 단계별 정밀 제어에 좋다. 어느 하나가 항상 더 좋은 것이 아니라, 목적에 맞게 고르는 것이 중요하다.

세 가지 모터를 한눈에 비교하기

모터 종류움직임장점주로 쓰는 곳
DC 모터계속 회전빠르고 구조가 단순하다.바퀴, 팬, 컨베이어
서보 모터지정한 각도로 이동각도 제어가 쉽다.로봇 팔, 센서 회전대, 조향 장치
스테퍼 모터일정한 단계씩 이동위치를 정밀하게 제어하기 좋다.3D 프린터, 회전 장치, 정밀 이동 장치

바퀴 로봇을 만든다면 먼저 DC 모터를 떠올리면 된다. 센서를 좌우로 돌리고 싶다면 서보 모터가 적합하다. 아주 정확한 위치 이동이 필요하다면 스테퍼 모터를 생각해 볼 수 있다.

모터 실습 전 안전 점검

모터는 LED나 버튼보다 전류를 많이 사용한다. 그래서 회로를 만들기 전에 다음 사항을 꼭 확인해야 한다.

  1. 모터를 아두이노 핀에 직접 연결하지 않는다.

  2. 모터에 맞는 별도 전원을 준비한다.

  3. 모터 드라이버나 적절한 제어 회로를 사용한다.

  4. 아두이노 GND와 외부 전원 GND를 연결한다.

  5. 모터가 갑자기 움직일 수 있으므로 바퀴를 공중에 띄우고 먼저 테스트한다.

  6. 모터가 뜨거워지거나 이상한 냄새가 나면 즉시 전원을 끈다.

특히 바퀴 로봇을 테스트할 때는 처음부터 바닥에 내려놓지 않는 것이 좋다. 코드가 잘못되어 갑자기 빠르게 움직일 수 있다. 로봇을 손으로 들거나 바퀴가 바닥에 닿지 않도록 받친 상태에서 먼저 확인하자.

자주 생기는 문제

모터가 돌지 않을 때는 먼저 전원을 확인한다. 아두이노 코드가 맞아도 모터 전원이 연결되어 있지 않으면 당연히 움직이지 않는다. 다음으로 GND가 서로 연결되어 있는지 확인한다. 아두이노와 모터 드라이버가 같은 기준을 공유하지 않으면 신호가 제대로 전달되지 않을 수 있다.

모터가 반대로 돈다면 방향 제어 핀의 HIGH와 LOW를 바꾸면 된다. 바퀴 로봇에서는 왼쪽 모터와 오른쪽 모터가 서로 반대로 장착되는 경우가 많다. 이때 코드에서 한쪽 방향만 반대로 설정하면 된다.

서보 모터가 떨리거나 아두이노가 재부팅된다면 전원이 부족할 가능성이 크다. 서보는 순간적으로 많은 전류를 사용한다. 별도 전원을 사용하고 GND를 공통으로 연결했는지 확인하자.

스테퍼 모터가 덜덜거리기만 하고 돌지 않는다면 코일 순서나 드라이버 핀 순서가 맞지 않을 수 있다. 코드의 핀 순서와 실제 연결을 다시 비교해야 한다.

이번 장의 핵심

모터는 로봇의 움직임을 만드는 출력 장치다. DC 모터는 빠르게 계속 회전하므로 바퀴 구동에 적합하다. 서보 모터는 각도 단위로 움직이므로 로봇 팔이나 센서 회전대에 좋다. 스테퍼 모터는 일정한 단계씩 움직이므로 정밀한 위치 제어에 적합하다.

그리고 모든 모터 제어에서 가장 중요한 원칙은 안전한 전원 사용이다. 아두이노 핀은 명령 신호를 보내는 곳이지, 모터를 직접 돌리는 힘의 공급원이 아니다. 모터를 움직이려면 별도 전원과 드라이버가 필요하다.

다음 장에서는 이 원칙을 바탕으로 모터 드라이버를 연결하고, 실제 바퀴 로봇의 몸체를 조립해 볼 것이다. 센서가 느끼고, 아두이노가 판단하고, 모터가 움직이는 로봇의 기본 구조가 이제 점점 완성되어 간다.

책 목록

아두이노로 배우는 로봇의 기본

전체 목차 보기

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

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

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

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

참여하기