suakii.egloos.com

suakii's log





아두이노 프로젝트 #7 - PWM 모터 제어 아두이노


PWM(Pulse Width Modulation)은 아두이노가 아날로그 출력을 만들어 낼 수 없기에 펄스의 폭을 빠르게 변화시킴으로써 평균 전압의 양을 조절하여 아날로그 출력을 만들어 내는 것이다. 아래 이미지(http://arduino.cc/en/uploads/Tutorial/pwm.gif)를 보면 알 수 있듯이 아날로그 출력 함수의 인자로서 0을 넘겨주면 0V의 전압이 나가게 되는 것이며 255까지의 값을 이용하여 그 전압의 크기를 조절한다. 그것도 매우 빠르게 결국 인자값이 달라져도 주파수는 변화가 없다. 아두이노의 PWM 주파수는 500Hz, 2ms 이므로 아주 빠르며 LED 점등에 사용하면 우리 눈은 그 차이를 거의 구별하지 못할 만큼 서서히 밝기를 조절할 수 가 있다. 또한 모터를 PWM 제어를 하게 되면 모터의 속도를 조절할 수 있게 된다. RobotC로 NXT의 모터를 제어하는 RobotC 코드는 그 파워를 0 ~ 100% 까지 줄 수 있는데 잘 생각해보면 결국 PWM인 것이다. 암튼~


이번에 작업할 것은 사용하지 않는 컴퓨터에서 분리해낸 팬을 PWM 제어해보는 것이다. 컴퓨터의 환풍에 사용되는 팬은 대부분 12V 이다. 아래 그림에서 보는 것처럼 DC 12V, 0.12A의 명세를 지니고 있으며, Brushless Fand 이며 엘레파츠에서 가장 싼것도 6~7천원하니 상당히 비싼 부품이라고 할 수 있다.^^ 


문제는 아두이노에서 이 팬을 제어하기 위해서는 팬을 구동시켜줄 수 있는 외부 전원이 있어야 한다는 것이다. 12V가 필요하므로 일반 충전기 이런것도 잘 안맞고 해서 역시나 사용하지 않는 컴퓨터의 파워를 과감하게 분리하고 두 단자를 연결해서 파워서플라이를 일단 켜주고 거기서 12V를 뽑아내었다. 파워서플라이의 12V는 참고로 노란색이다. 아래 그림에 절연테이프로 감은 부분이 보이는데 이 곳은 파워서플라이를 켜주게 해주는 것이며, 전원을 뽑아내기 위해서 케이블 2개를 연결한 것이 보인다.


1. 회로도
Fritzing의 브레드보드 뷰는 그리기가 점점 귀찮아 진다. 이번에도 패스하고 이글캐드로 회로도만 그려봤다. 컬렉터의 전류 0.12A를 기준으로 계산한 베이스의 전류를 계산하여(hFE= 1000) 베이스 측의 저항을 30K 옴으로 잡아주었고, 가변 저항 값을 Analog Input으로 읽어서 3번 포트를 이용하여 PWM 출력하였다. 모터의 Vcc 값은 12V, 모터의 역기전력 방지를 위해 1N4001 다이오드 연결, 찾아보니 컴퓨터 팬(Brushless Fan)인 경우 필요 없다고 하는데 달아 놓았다. ㅠ.ㅠ 사실 이번 작업은 코드보다도 하드웨어 구성이 더 복잡하다~ 

2. 실제 

- 지저분
- 모터가 돌아가는 것을 잘 보이게 하기 위해서 포스트잇 부착


3. 코드
- 회로를 꾸미는데 든 수고에 비하면 정말 허무한 코드이다.
가변 저항의 값을 아날로그 입력으로 받아들인 다음 4로 나눈다(0~255로 만들기 위해). 그리고 그 값을 트랜지스터에 연결된 3번 PWM 단자에 아날로그 출력으로 적어준다. 서서히 저항 값을 변화시켜보면 팬의 구동 속도가 달라진다. 완전히 멈춘 상태에서 움직일때 팬 자체에서 잡음이 발생한다.(캐피시터를 사용하면 없앨 수 있다는데 넘어간다.ㅠ)

int potPin = 0;
int trBasePin = 3;//pwm
int potValue = 0;

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

void loop() {
  potValue = analogRead(potPin) / 4;
  analogWrite(trBasePin, potValue);
}


4. 동작 영상
저항값에 따라 팬의 속도가 달라진다. 얼굴 가까이에 대면 시원하다.ㅠ.ㅠ 




덧글

  • hkmade 2012/07/18 09:06 # 답글

    이제 해야 할일은 온도센서를 달아서 각 온도대역별로 회전수를 달리하는걸 만들어보시오.
    예를들어 35도가넘어가면 자동으로 poweron해서 37도가 넘어가면 최대 RPM으로 동작하게 말이지..
    (내가 가지고 있는 수족관에 필요해서 음하하핫)
  • 수아기 2012/07/18 11:59 #

    그건 뭐 쉽지 온도 센서 하나 추가 해서 그 값 비교하면서 해주면 된다. 니가 만들어라~
  • 다세포 2012/12/10 20:35 # 삭제 답글

    잘보았습니다. 단지 pwm 주파수에대하여 설명 중 오타가 있어서 ^^
    500MHz -> 500Hz로 수정해주세요. 2ms이면 500Hz가 됩니다.
  • 수아기 2012/12/10 20:44 #

    네 감사합니다.
  • 스카이 2018/07/06 21:27 # 삭제 답글

    혹시 커페시터 장착해 보셨나요? 저도 같은 소음문제가 발생해서 Fan의 RPM에 맞게 아두이노의 PWM 주파수를 변경해 주었거든요 480HZ 에서 41.666Hz로요 아두이노가 PWM주파수가 480 980으로 고정되어있는데 변경 가능하다고 하더라구요 이렇게하니까 소음이 엄청 죽긴 죽었는데 커페시터를 이용해서 로우패스 필터를 만들면 죽을까요?
댓글 입력 영역