본문 바로가기
코딩/아두이노

아두이노로 DC모터 속도 제어하기 _ PWM이용

by DIYver 2021. 3. 31.

 

 

 

<목표>

 

 

- 모터를 사용하다보면 모터 출력을 조금만 더 낮추고 싶거나, 내 마음대로 조절하고 싶을때가 많다.

아두이노로 모터 회전속도를 제어할 수 있는데,

PWM 을 이용하여 모터드라이버에 신호를 주면 된다.

그 방법을 한번 알아보도록 하자.


<준비물>

 

 

- 아두이노(우노, 나노, 메가), 모터드라이버(L298N, L9110)

(모터 드라이버마다 사용법이 다를 수 있음)


<회로도>

 

< 12V 이하의 건전지 사용 시 회로 >

< 컴퓨터 USB 전원 사용 시 회로 >

 

 


<코드>

 

int motor_1 = 10;
int motor_2 = 9;

void setup() {
  // put your setup code here, to run once:
  pinMode(motor_1, OUTPUT);
  pinMode(motor_2, OUTPUT);


}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  analogWrite(motor_1, 255/3);
  digitalWrite(motor_2, 0);

  delay(2000);
  analogWrite(motor_1, 255*2/3);
  digitalWrite(motor_2, 0);

  delay(2000);
  analogWrite(motor_1, 255);
  digitalWrite(motor_2, 0);
  delay(1000);
}

 


<실행 결과>

 

youtu.be/nSYL2PLpLiI

위의 영상을보면 처음 2초 동안은 느리게

그다음 2초 동안은 중간 속도로

그다음 2초 동안은 모터 최고 속도로 회전하는 작동을 볼 수 있다.

 

코드를 보면 analogWrite( ) 함수를 사용하는 것을 볼 수 있다.

analogWrite( ) 함수를 사용함으로써 짧은 시간동안 제어신호를 보내고 끊고를 반복할 수 있는데,

analogWrite( ) 함수를 이용하기 위해서는 아두이노에서 PWM 핀을 확인해야 한다.

 

기본적으로 아두이노 우노와 나노는 핀맵이 똑같기 때문에, 아두이노 핀맵을 참고하면 된다.

아두이노 우노에서는

3, 5, 6, 9, 10, 11번 핀에서만 PWM 제어가 가능하다.

나머지 핀들은 출력할 때, HIGH 또는 LOW만 가능하다는 뜻이다.

 

 

위에서 소개한 방법은 PWM 제어가 가능한 핀들이 여유가 있을 때 사용하면 된다.

그런데 핀들이 많아지고 PWM 제어 핀이 여유가 없다면 다른 방법으로 모터 제어를 해야한다.

 

 

 

 

 

L298N 모터드라이버에서는 PWM 제어를 하는 방법은 두가지가 있다.

 

여태 필자가 위에서 사용한 방식 그대로 사용하는 방법이 있고,

다른 방법은 L298N 과 같은 모터드라이버에서만 가능한 방법이다.

 

모터드라이버에 있는 ENA 점퍼핀을 제거해야 한다.

 

점퍼핀을 제거하고 해당 핀에 아두이노 PWM제어 가능 핀을 연결시켜주어야 한다.

 

 

그리고 나머지 핀

IN 1, IN 2 핀은 아두이노의 아무 digital Pin 에 연결해주면 된다.

 

 

필자의 경우

IN 1 - 8번

IN 2 - 7번

ENA - 9번 핀에 연결해 주었다.

 

코드는 아래 코드를 이용하면 된다.

 

int motor_1 = 8;
int motor_2 = 7;

int motor_pwm = 9;

void setup() {
  // put your setup code here, to run once:
  pinMode(motor_1, OUTPUT);
  pinMode(motor_2, OUTPUT);
  digitalWrite(motor_1, HIGH);
  digitalWrite(motor_2, LOW);
  pinMode(motor_pwm, OUTPUT);
  analogWrite(motor_pwm, 0);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  analogWrite(motor_pwm, 255/3);


  delay(2000);
  analogWrite(motor_pwm, 255*2/3);


  delay(2000);
  analogWrite(motor_pwm, 255);

  delay(1000);
}

 

youtu.be/bIjKJjXAUyg

시연 영상은 위 동영상을 확인하면 된다.

 

앞선 시연과 같다는 것을 볼 수 있다.

 

 

 

 

 

모터드라이버는 모스펫을 가지고 모터를 제어한다고 생각하면 된다.

위의 문구도 이해하기 어렵다면 스위치를 가지고 제어한다고 생각하면 된다.

 

스위치를 짧은 시간동안 여러번 켰다 껐다 하면서 모터에 전원을 공급해 주는 것이다.

그렇게 해서 모터에 인가되는 전압을 조절할 수 있는 것이다.

 

 

 

PWM에 대한 이해를 하려면 위의 그림을 이해해야 한다.

5V 전원에서 스위치를 켰다 껐다를 1초동안 몇 퍼센트로 반복하는지로 이해하면 된다.

 

제일 위에부터 보면 

0%는 1초 동안 스위치를 켜지 않은 것으로 0V가 된다.

25%는 1초 동안 스위치를 켰다 껐다를 25%의 비율로 반복한 것으로 5V * 25% = 1.25V 로 출력된 것 처럼 보인다.

아두이노에서는 64/255 = 25% 이므로, analogWrite() 에서는 64 값을 주어야 한다.

 

DUTY 비에 대해서 알았으니

이제 모터드라이버 내부를 살펴보자.

 

일단 우리가 제거했었던 ENA 점퍼핀의 역할은

모터 A를 사용할 것이냐 말것이냐를 정하는 핀인데

평소에는 점퍼핀으로 연결되어 있어서 무조건 모터 A를 사용하는 것으로 설정되어 있다.

그래서 IN1 과 IN2 에 analogWrite() 를 이용한 PWM 신호로 모터 속도를 제어할 수 있었다.

모터드라이버 내부에서 모터를 사용하는 것으로 받아들이고 IN1 과 IN2 에 따라서 모터속도를 결정하기 때문이다.

 

 

ENA 점퍼핀을 제거하게 되면 아무리 IN1 과 IN2 에 신호를 보내줘도 모터는 작동하지 않는데,

내부 회로에서 모터 A를 사용하는 회로가 끊겨있기 때문이다.

 

대신 ENA 핀에 아두이노의 PWM 핀을 연결해주고,

IN1 에는 HIGH 신호를, IN2 에는 LOW 신호를 준다면

모터는 IN1 과 IN2 에서 회전방향을 인지를 한 상태이지만, ENA 의 신호를 대기하고 있는 상황인 것이다.

여기서 ENA 신호를 PWM 제어로 보내주게 되면 전류가 흘렀다 말았다 하면서 모터속도를 제어해주게 되는 것이다.

 

 

너무 잡소리가 많았다.

그냥 위의 코드를 그대로 따라하면 사용가능하니 따라하면 된다.

L298N 의 경우 ENA 과 ENB 핀이 있지만

L9110 의 경우 ENA과 ENB핀이 없다고 해서 모터 속도 제어가 안 되는 것이 아니니 

위에서 설명한 방법대로 사용하면 된다.

 

 

 


※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!

 

 

 

 

댓글