라즈베리파이 dc모터 제어 파이썬 - lajeubelipai dcmoteo jeeo paisseon

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

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

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

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

라즈베리파이 dc모터 제어 파이썬 - lajeubelipai dcmoteo jeeo paisseon

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 핀과 연결

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

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

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

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

코드를 보면 간단합니다.

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

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

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

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

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

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

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

[라즈베리파이] DC모터를 작동 시키자. - L298N 모터 드라이버

이젠 DC모터를 라즈베리파이를 이용하여 돌려 보도록 하자. 이런 모터종류는 직접 라즈베리파이에 바로 연결하면 보드에 손상을 줄수 있다고 한다. 그래서 별도의 배터리 전원을 이용하기로 했다. 필요한 최소한의 구성품은 준비가 된것 같다. 

제일 저렴한 모터와 바퀴 셋트이다. 메탈기어 좀 좋은 기어를 사고 싶었지만 가격이... 일단 연습삼아서 가장 저렴한 제품으로 준비를 했다. 생각보다 크기가 있고 나쁘진 않은것 같다. 모터는 돌려 봐야 알 수 있겠지만 ...

모터 드라이버 L298N이라는 제품이다. 메인 칩의 이름이 L298N인 모양이다. 이름으로 검색해 보면 모양이 조금씩 다르다. 음~ 
이것을 모터 드라이버 모터 쉴드... 여러가지 용어로 사용되는것 같다. 암튼 별도의 전원을 공급받아서 모터를 제어하는 역활을 하는것 같다. 두개의 DC모터를 연결할 수 있다. 서보모터도 연결할 수 있는 제품도 있는것 같던데... 4륜 자동차를 만들겠다면 한번에 4개를 연결하는 드라이버를 사야하나, 이걸 두개 사야하나? 음~ 

< 정확하지 않음. 제품명이 혼란스러움>
- 타입 : Half-bridge DC 모터 제어 회로
- 입/출력채널 : 2개
- 모터 입력 전압 : 4.7~24V
- 작동 온도 : -25도씨~130도씨
- 최대 허용전류 : 채널당 2A

라즈베리파이 dc모터 제어 파이썬 - lajeubelipai dcmoteo jeeo paisseon

어떻게 연결하나 하고 찾아 보니 조금씩 달라서 확신이 안 선다. 어떤 사람은 배터리가 9V짜리를 사용하고 3번에도 연결해서 라즈파이에도 연결하고? 자료를 찾아 보면 아두이노에 연결하는 사례가 더 많다. 음~ 아두이노도 배워야 할까? 요즘 고민이다. 하나 하기도 힘들구만. 하지만 아누이노와 라즈베리파이의 역활이 좀 다르기 때문에 접해 보는게 좋을것 같다는 생각이다. 

라즈베리파이 dc모터 제어 파이썬 - lajeubelipai dcmoteo jeeo paisseon

이제 모두 연결했다. 모터를 작동 시키는 프로그램을 작성해 보자. 물론 파이썬으로 작성한다. 라즈베리파이2는 GPIO핀이 40개나 된다. 1에 비해 너무 많아... 어느게 어느건지 헷갈린다. 몇번째 핀인지 잘 세어야 한다. 그래서 이 핀을 따로 뽑아서 쉽게 사용할 수 있도록 해주는 악세사리도 있다. 하지만 지금은 몇번째 핀인지 잘 세어서 엉뚱한 곳에 연결하지 않도록 주의해야 겠다.

그런데 모두 연결하고 작동을 시켜 봤지만 전혀 반응이 없다. 이래저래 알아보고 판매자에게도 문의하고 구글링을 아무리 해봐도 답을 알 수가 없다. 
결국엔 알아낸 원인은 파이썬 코드안에 time.sleep()가 들어가면 작동이 되지 않는다. 

파이썬 뿐만 아니라 c로 작성을 해봐도 마찬가지 딜레이를 주면 작동이 안된다. 뭔가 잘못되서 그러것이겠지만 알수가 없는 일이다. time.sleep()나 delay()를 주석처리하고 실행해 보면 잘 돌아 간다.

1. 전원을 9V 배터리로 교체해서 시도했지만 역시 sleep()만 들어가면 작동을 안함. 배터리가 약해서는 아닌듯 하다.

*** 위 문제 해결됨!!! 맨 아래 하단에 영상을 추가함!

sleep나 delay가 되어야 모터가 일정시간 돌아가다가 역반향으로 돌아가는등의 동작이 가능한데 참 난감하다. 어디가 문제일까?

안되는 문제를 언제까지 끌어 안고 있을 순 없다. 그래서 웹브라우저에서 모터를 컨트롤 하는 작업을 해보았다. 모터에서 보드의 GIOP에 연결된 두개의 핀의 값, HIGH or LOW를 서로 바꾸어 주면 모터 회전방향이 반대로 바뀐다.

라즈베리파이 dc모터 제어 파이썬 - lajeubelipai dcmoteo jeeo paisseon


Webiopi를 이용하였다. 모터의 방향을 바꾸고 모터의 작동을 중지하는 간단한 기능이다. 이제 바퀴 두개를 연결하면 좌우 방향을 트는 동작도 가능하다. sleep()는 쓸일이 없을까? 
그리고 중요한 기능의 구현이 남았다. 바로 모터의 회전 속도를 조절해 보는 것이다. 그런데 이건 선을 어떻게 연결해야 하는지 당최(?) 알수가 없다. 자료를 찾아 보면 죄다(?) 아두이노로 하는 것 뿐이다. 라즈베리파이를 검색하면 아두이노 자료가 더 많다. 이런~ 나는 라즈베리파이로 돌리는 것을 원한다고...

앞으로 구현할 것
- 모터 속도조절
- 두개의 바퀴를 연결해서 좌우 방향 틀기
- DC모터용 강력한 배터리는 어떤게 있나?
- 자동운행?
- time.sleep() 로 인한 문제 해결책을 찾아 볼것.

time.sleep()가 들어 가면 모터가 동작하지 않던 문제가 해결되었다. 어제 스크립트를 실행시 파이썬3으로 실행을 하니 정상적으로 돌아 갔다. 그래서 파이썬 버전의 문제인줄 알았다. 그런데 다음날 다시 해보니 파이썬3에서 안된다. 농락당한 기분! 도무지 원인과 해결방법을 알 수 없어서 라즈비안을 다시 설치하기로 했다. 다른 작업을 하지 않고 제일 먼저 이녀석이 동작하는지만 체크 하기로 했다. 
삼바 설치하고 백업했던 작업폴더를 다시 라즈베리파이에 옮겨서 스크립트를 실행했다. 잘된다. 
파이썬2, 파이썬3 상관없이 모두 돌아 간다. 결국 버전의 문제도 아닌었던 것이다. 
아무래도 이것 저것 복잡한 모듈들 디립다 설치하였더니 그 녀석들간에 뭔가 트러블이 생긴게 아닐까 싶다. 그런데 어떤 것과 문제가 있었는지는 아직 파악을 하지 못했다. 다시 설치해 나가다 보면 알 수 있겠지... WebioPi가 의심 되기는 하는데... 
그런데 구글링을 아무리 해봐도 이 같은 문제를 제기한 사람은 세상 어디에도 없는 것으로 봐서 나만의 문제인듯 하다. ㅋㅋ