본문 바로가기

라즈베리파이

7. 라즈베리파이 DC 모터 제어하기 1

7. 라즈베리파이 DC 모터 제어하기 1

오늘은 라즈베이파이를 활용하여 DC 모터를 제어하는 방법에 대해서 알아봅시다.


DC 모터는 이전 포스팅에서 다루었던 서보 모터(Servo Motor)와 달리 연속 회전이 가능하고 속도 및 회전 방향을 제어할 수 있는 모터입니다.


어릴 적 가지고 놀던 건전지로 움직이는 자동차를 생각하면 됩니다.

라즈베리파이 DC 모터 제어1


DC 모터를 제어하기 위해서는 서보 모터 제어하는 것 보다 조금 더 복잡한 과정이 필요합니다.


서보 모터를 제어하기 위해서는 라즈베리파이 GPIO 핀에 직접 모터를 연결하여 제어 하였지만 DC 모터는 회전 속도 및 방향을 제어하기 위해서 별도로 DC 모터를 제어하기 위한 드라이버가 필요합니다.

저는 흔히 구할 수 있는 L298N를 사용하겠습니다.


L298N 모터 드라이브의  사양을 간단히 살펴보면

  • 입출력 채널 : 2개 → 2개의 모터 제어 가능
  • 모터 구동 입력 전압 : 5 Volt 또는 12 Volt
  • 최대 전력 : 25W
  • 최대 허용 전류 : 2A(모터 당)

※ DC 모터의 회전 방향을 제어 방법 

DC 모터는 전류가 흐르는 방향에 따라 모터의 회전 방향이 변경됩니다.

+에서 -로 흐르는 전류의 방향을 -에서 +로 변경하면 회전 회전 방향이 반대가 됩니다.


※ DC 모터의 속도를 제어하는 방법

전압의 크기로 DC 모터의 속도를 변경할 수 있습니다.

입력 전압이 높으면 모터의 속도가 빨라지고 입력 전압이 낮으면 모터의 속도가 낮아지게 됩니다.

다시 말해서 입력 전압의 크기에 비례하여 DC 모터의 속도가 변경됩니다. 이러한 전압의 크기를 가변 할 수 있는 방법이 PWM 제어 입니다.


◆ 여기서 잠깐 ! !  ☞ PWM 제어란 무엇인가?


PWM(Pulse Width Modulation)은 펄스 폭 변조 방식으로 쉽게 말해서 일정한 주기 내에서 신호를 On 시키는 시간을 임의로 제어하여 신호의 출력 레벨을 가변 할 수 있도록 하는 제어 방식입니다.


예를 들면 1초 주기에서

On 시간이 1초이면 Full Duty가 되는 것이고 출력 레벨은 Full이 된다.

만약 On 시간이 0.5초로 제어(Off 시간은 0.5초)를 하면 50%(Half) Duty가 되고 출력 레벨은 50% 감소하게 된다.

만약 On 시간이 0.2초로 제어(Off 시간은 0.8초)를 하면 20% Duty가 되고 출력 레벨은 80% 감소하게 된다.


모터 속도는 이렇게 PWM 신호를 이용하데 되면 쉽게 제어를 가능하게 도와 준다.

그리고 우리가 흔히 알고 있는 LED 제어에서도 같은 방식으로 LED의 밝기를 조정할 수가 있다.



이해가 되었으면 회로를 구성해봅시다.


우선 DC 모터 한 개만 연결하여 모터 제어 동작을 확인해 봅시다.

회로는 아래 그림과 같이 구성하였습니다.

  • 외부 전원 6 Volt 사용(1.5 Volt 4개 직렬 연결)
  • L298N 모터 드라이브 GND는 라즈베리파이의 Ground와 외부 전원의 (-) 극과 연결
  • L298N 모터 드라이브의 +5V 는 외부 전원의 (+)극과 연결
  • L298N 모터 드라이브의 OUT1과 OUT2는 DC 모터의 2개의 선과 연결(순서에 상관없이 연결 후 모터 회전 방향이 생각했던 방향과 반대로 회전하면 연결하였던 선의 순서를 변경하면 됩니다.)
  • L298N 모터 드라이브의 IN1과 라즈베리파이 GPIO 20 핀과 연결
  • L298N 모터 드라이브의 IN2와 라즈베리파이 GPIO 21 핀과 연결


라즈베리파이 DC 모터 1개 제어 회로도


준비기 완료되었으면 파이썬으로 코드를 작성해보자.

라즈베리파이 DC 모터 파이썬 코드 1


5초 주기로 반복하여 DC 모터가 방향을 바꾸어가면 회전 할 것이다.


이번에는 DC 모터의 속도를 변경해보자.

위에서 PWM 제어하면 모터의 입력 전압이 가변 되어 속도가 변경된다고 하였는데 PWM 제어는 어떻게 하면 될까요?

코드를 보면 간단합니다.

motor.forward() / motor.backward() 함수의 인자 하나만 추가하면 가능합니다.

바로 speed라는 인자인데 0 에서 부터 1 까지의 수를 지정해주면 됩니다.

speed=1 이라고 하면 최대 속도이며 speed=0.5라고 하면 최대 속도의 50% 로 속도가 줄어듭니다.

라즈베리파이 DC 모터 파이썬 코드 2


DC 모터의 속도가 최대 속도의 30%로 정회전하고 50%로 역회전하는 코드입니다.(간단하죠?)


오늘은 라즈베리파이에서 파이썬 코드를 작성하여 DC 모터의 회전 방향 제어 및 속도 제어를 해보았습니다.

다음 포스팅에서는 2개의 모터를 동시에 방향과 속도를 제어할 수 있도록 회로 구성 및 파이썬 코드에 대해서 알아봅시다.


오늘 포스팅한 내용 중에 잘 안되는 부분 있으면 댓글 남겨 주세요.