개발 관련/아두이노,IOT

아두이노에서 PWM 제어와 NPN 트랜지스터를 이용한 LED 밝기 및 모터 속도 조절.

snoworca 2014. 8. 10. 12:52

 3V 를 소비하는 LED 가 있다고 가정해 보자. 이 LED 의 밝기를 제어하기 위하여 전압을 변경할 수 있지만, 좀 더 간단한 방법으로 아두이노의 PWM 제어 기능을 이용하여 밝기를 조절할 수 있다. 만약 LED 에 전류를 1초간 공급했다가 다시 1초동안 끊고 또 다시 1초간 공급하는 과정을 반복한다면 우리 눈에는 LED 가 깜빡거리는 것으로 보인다. 하지만,  0.1 초 간격으로 신호를 끊고 다시 연결하고를 반복한다면 우리눈에는 LED 밝기가 원래 밝기에 비해 좀 어둡게 출력되는 것으로 보일 것이다. 이런 신호 폭을 조절하여 LED 의 밝기를 제어할 수 있다.


 PWM 제어에 대한 자세한 설명 :

  http://www.hanbit.co.kr/network/view.html?bi_id=1087


  아두이노 우노에서는 3,5,6,9,10,11 포트에서 이 PWM 제어를 사용할 수 있으며,  포트 번호 옆에 물결 (~) 모양이 인쇄되어 있어  PWM 사용 가능한 포트임을 알려주고 있다. 이 포트를 이용하여 PWM 제어를 사용하기 위해서는 analogWrite(핀번호, 0~255 값) 함수를  사용해야 한다.


  우선 PWM 으로 높은 전압이나 전류 제어를 위하여 NPN 트랜지스터가 필요하다.  

  (이 소자를 이용한다면  아두이노의 신호로 5v를 초과하는 높은 전압을 제어할 수 있다. )


  사실 LED 같은 경우에는 NPN 트랜지스터가 없어도 충분히 쓸 수 있지만 모터는 반드시 사용해야 한다.  아두이노의 디지털 신호의 전류는  고작 40mA 밖에 내지 못 하기 때문이다.


  디지털 회로에서 NPN 트랜지스터의 역할은 아래 그림과 같이 전류가 흐를 수 있도록 스위칭을 해준다.

  (반대로 PNP 트랜지스터는 전류가 흐르고 있을 때, Base 에 신호가 들어가면 스위치가 떨어진다.)

   

     


만약 위 그림에서 아두이노의 디지털 포트에 연결된 Base 에 전류가 흐르게 되면 스위치는 닫히게 된다. 

 (Collector 와 Base 와 Emitter 의 위치는 각 소자의 데이터 시트를 참고.) 여기서 주의할 점은 아두이노의 디지털 포트와 Base 사이에 저항을 달아야 한다는 것이다. 


  아래 회로에서는 2N2222 를 사용하였다, 또 전압이나 전류의 특성에 따라서 TIP120 과 같은 다른 소자를 사용할 수 있다.




   위 그림에 있는 아두이노는 USB연결등 몇 가지를 제외하면 아두이노 uno 와 스펙이 거의 같은 아두이노 나노의 호환 보드이다.



아두이노  VCC 5v ------------------------------ LED +

아두이노   GND -------------------------------- 2N2222  pin 3. (emitter) 

아두이노  6 번 포트 ------ 2.2KOhm --------- 2N2222  pin1   (base) 

LED- ---------------------- 680Ohm----------- 2N2222 pin 2 (collector)


     680Ohm 은 LED 특성에 맞춰서 사용한 것이다.


 



Code:

#define CTR_PIN 6 void setup(){ pinMode(CTR_PIN, OUTPUT); } void loop(){ for(int i = 0; i<180; i++){

// 점차 밝아졌다 낮아졌다를 반복하도록 한다. int val = (int)map((int)((sin(DEG_TO_RAD * i) * 1000.0f)), 0, 1000,0,255);

analogWrite(CTR_PIN, val); delay(5); } }


 이 코드에서는 PWM 의 제어 범위인 0~255 를 사용하지 않고, 0~128을 사용하였다. 128이상부터 255까지는 값이 차이가 무의미할 정도로 밝기가 비슷하므로 최대 값으로 128으로 주게 되었다.


결과: 



 


아래 예제에서는 블루투스와 안드로이드폰을 이용하여 밝기를 제어해 보는 것을 구현해 보았다.

  




  우선 아두이노의 코드이다. 소프트웨어시리얼로부터 0부타 255 까지의 값을 받아 PWM 포트로 출력해주는 코드이다. 


Code:

#include <SoftwareSerial.h> #define RX_PIN 3 #define TX_PIN 2 #define LED_PIN 13 #define PWM_PIN 6 SoftwareSerial swSerial(RX_PIN, TX_PIN); // 첫 번째 인자 : RX, 두 번째 인자 TX uint8_t data; void setup() { swSerial.begin(9600); pinMode(PWM_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, LOW); // 데이터가 들어올때 까지 대기. while(!swSerial.available()); digitalWrite(LED_PIN, HIGH); while(swSerial.available()) { data = swSerial.read(); analogWrite(PWM_PIN, data / 5); delay(1); } }

  

  data 는 0부터 255까지 받을 수 있는데, 일부러 5를 나누어 줬다. 낮은 값에서 값이 빛이 변할때는 변화가 커 보이고, 높은 값에서는 값의 변화에 따라 빛의 밝기가 별 차이가 없어보이기 때문이다.


Android Project: 

https://github.com/ice3x2/HC-06_Arduino_Echo/tree/SlideControl


이전에 만들었던 블루투스 에코 예제를 수정하였다. 


결과:




Tip120 을 활용하여 PC 용 쿨링팬을 컨트롤.

아래 쿨링팬은 12v 로 동작하며 2N2222 대신 좀 더 높은 전압(max 60v) 과 높은 전류(max 8A) 를 스위칭 할 수 있는 그리고 비싼 TIP120 을 이용하여 다음과 같은 회로를 구성하였다. 물론 2N2222 나 기타 다른 NPN 트랜지스터를 사용하여도 상관 없다.

(간혹 PWM 제어가 되지 않는 쿨링팬이 있다. 실제 예로 여러번 테스트 결과 싸구려 쿨러는 제어가 잘 되지만, 쿨러마스터 터빈 마스터는 제어가 안 된다.)



12v 아답터 +   ---------------------------------- 12v PC Fan +

GND -------------------------------------------- Tip120  pin 3. (emitter) 

아두이노  6 번 포트 ------ 2.2KOhm --------- Tip120  pin1   (base) 

12v PC Fan - ----------------------------------- Tip120 pin 2 (collector)


그 외의 블루투스 연결과 아두이노 코드와 안드로이드용 프로젝트는 위에서 소개한 것을 그대로 적용하면 된다.