아두이노프로세싱 프로그래밍

초보자를 위한 “아두이노 코드에 의한 DUAL LED BLINKING: 전압 측정 및 전류 계산

coding art 2017. 6. 25. 18:32
728x90






아래의 배선도에 따라 아두이노 코딩에 의해서 두 개의 LED를 on OFF 해 보기로 한다.



이 그림에서는 0V 의 전압 기준이 되는  GND 가 위 회로도와는 다르게 윗 부분에 배선이 되었다.

이는 아두이노 우노 보드 회로 전체적으로  GND는 자체적으로 서로 연결되어 있으므로 아무런 문제가 되지 않는다.








발광 다이오드 LED 는 두 개의 다리 중 긴 쪽이 양극으로서 3.3V 나 5V의 + 전기를 공급하며 반대쪽은 반드시 전류 제한 저항을 연결해야 한다. 전류 제한 저항의 역할은 전기 배선에서 과도한 전류 흐름에 따라 끓어지는 퓨즈와 유사한 역할을 한다.
그림에서는 빨빨검  띠를 가진 저항 즉 220옴 저항이 사용되고 있다. 200∼470옴 사이의 저항이라면 사용이 가능하다.

LED는 전류제한 저항 없이 9V 전지에 연결하면 순간적으로 on 되나 과전압 및 과전류로 인해 타 버리게 된다. 5V나 3.3V 전원과도 전류제한 저항 없이 연결하면 순간적으로 on은 되지만 그래도 과전류로 인해 타 버릴 가능성이 높으므로 주의해야 한다. 전류 제한 저항은 2220옴, 330옴, 470옴이 많이 이용된다. 그렇다고 해서 그 이상의 값을 가지는 전류 제한 저항을 사용해서는 안 된다.


아울러 이 예제에서는 두 개의 LED 가 있음에도 불구하고 하나의 저항이 사용되고 있는 점은 LED on OFF  코딩에서 동시에 두 개의 LED 가 on 되지 않도록 코딩할 계획에 기인한다.
그렇다면 이 회로의 전체 저항 값은 직렬연결이므로 전류제한 저항 값과 LED 하나가 on 된 상태에서의 저항 값을 합하면 된다. 참고로 LED의 순간 저항 값은 전류 제한 저항에 비해 상당히 큰 편이다.

만약에 동시에 두 개의 LED를 on 하게 되면 LED 가 병렬로 연결되어 있어 이 둘의 합성 저항 값이 하나의 LED 저항 값의 반이 되므로 회로 전체 저항 값이 앞의 경우와 비해 상당히 작아지게 되며 전류 흐름이 증가하게 된다. 그냥 타버리지는 않으나 흐르는 전류 값이 크다는 점은 곧 LED 의 수명 단축과 직결되어 있다.

배선이 완성되었으면 코딩 단계로 넘어가기로 한다. PC에서 아두이노 편집기(Arduino IDE)를 열어서 새 파일을 열도록 한다.

새 파일을 열면 항상 void setup() 과 void loop() 문이 들어 있는데 이는 아두이노 편집기에서 bare minimum 이라 한다. 그 뜻은 아두이노 코드의 뼈대만 갖춘 그러나 아무런 코딩 내용이 없는 최소한의 양식이란 의미이다. 사용자는 여기서부터 코딩을 시작하면 된다.

void setup() 과 void loop() 이란 C/C++ 코딩 문법에서 유래된 바 void 란 말은 setup() 이나 loop()를 실행하더라도 결과적으로 특별한 변수 값을 되 돌려 줄 필요가 없는 코딩 구조에서 사용된다. 만약에 코드 내용 중에 특별한 함수 값을 계산하는 루틴을 호출 실행한다면 한수 루틴은 계산 결과 값을 되 돌려주어야 할 것이다. 이런 경우에는 void 란 용어가 사용되지 않으며 함수의 괄호 부분에 되돌려 주어야 할 변수 명을 지정하게 되는 것이다.
코딩 내용 중에 //⚫⚫⚫ 는 코딩에 주석 설명을 달아주는 역할이라 컴파일 할 때에 아무런 문제를 일으키지 않는다. 사용하는 언어 편집기 별로 다른데 아두이노 IDE 는 // , 라즈베리 파이선의 경우는 #를 사용하기도 한다.

사용자가 코딩을 완료하게 되면 적절한 경로를 지정하여 저장한 후에 컴파일 버튼을 눌러 문법이나 PC에서의 설정 환경을 체크한다. 주로 괄호를 열었으면 닫았는지 또는 한 줄 한 줄 명령마다 부리 기호 즉 세미콜론(;)을 사용했는지 변수들의 유형 정수 또는 실수 선언이 제대로 되었는지 체크하게 된다.



아무런 내용이 없는 bare minimum 도 컴파일이 가능하며 아래와 같으 곃과를 출력한다.



컴파일 된 내용을 아두이노 우노 AVR 칩에 업 로딩하기 위해서는 필수적인 준비 작업이 필요하다.

즉 아두이노  보드 지정과 함께 USB-2-Serial 로 연결된 포트 번호를 정확하게 지정해야 한다.




국네에 아두이노 우노 호환 보드가 맣이 보급되어 있는데 포트 명칭에 Mega 또는 Mega 2560  따위의 잔소리를 붙어 있는 사례가 많이 있는데 그냥 무시하면 된다.

업로딩하게 되면 아두이노 보드의 붙박이 LED 가 점멸하게 된다.


아두이노 코딩은 크게 3 가지 영역으로 구성된다.

첫째 헤더 부분인데 필요한 라이브러리를 불러 들이며 아울러 코드 수행에 필요한 전역 변수들을 설정하는 곳이다.

하지만 이 예제에서는 별도의 라이브러지 지원이 필요 없으며 두 개가 정수형 변수 즉 청색 LED 와 초록색 LED 배선이 연결되는 디지털 데이터 핀 번호 2와 3을 지정하였다.

전역 변수로 지정되면 setup() 이나 loop() 또는 설정된 루틴들이 있으면 어느 곳에서나 적용이 가능하다.
반면에 로컬 변수라는 것을 특정 루틴 애부에서 설정하게 되면 그 루틴 내부에서만 유효하게 된다.

setup() 에서는 코드 수행을 위해 한 번 설정 되어야 하는 즉 나중에 변경할 필요가 없는 통신 속도라든지 LED  핀별로 출력할 것인지 입력으로 사용할 것인지 등등의 여부를 설정한다.

Serial.begin(9600);은 아두이노 보드와 USB=2-Serial 로 COM 포트와 연결된  PC 사이에서 통신 속도를 baud rate 단위를 사용하여 설정한다.
pinMode(led_blue, OUTPUT);은 즉 아두이노 보드의 디지털 핀 2번을 청색 LED 출력용으로 설정한다. 마찬가지로 초록색 LED 용도 아울러 지정이 되어야 한다.

loop() 문에서 digitalWrite(led_blue,HIGH) 명령이 수행되면 즉 2번 핀이 HIGH가 되어 LED가 on 점등 된다. delay(300);은 시간지연을 뜻하며 숫자의 단위는 msec 이다. 이어서 digitalWrite(led_blue,LOW) 명령이 실행되면 청색 LED 가 OFF 소등된다. 즉 시간지연되는 0.3초 동안 청색 LED 가 on 상태를 유지한다.

반면에 청색 LED 가 OFF 되면 초록색 LED 가 on 되어 0.3초 지속하게 된다.

이렇게 loop() 문의 코드가 일회 수행되면 loop() 문의 특성에 의해서 전원이 제거되기 전까지 무한 반복을 하게 된다.


멀티메터로 LED 가 on 되었을 때 전압을 측정해 보자. 멀티 메터가 없는 경우에는 본문에 기술된 측정 결과를 자신이 측정한 것처럼 그대로 참고해도 된다. 전압을 측정하려면 시간 지연 요소를 10초 정도로 충분히 준 후에 쉽게 측정할 수 있다. 청색 LED 는 2.8V 반면에 초록색 LED 는 2.2V 가 걸린다. 즉 어느 LED 가 on  되었느냐에 따라서 전류 제한 저항에 걸리게 되는 전압도 변동된다. 즉 청색 LED on 시 저항에 1.8V 의 전압이 걸리며 초록색 LED 가 on 되면 2.4V 의 전압이 걸린다.

초록색 LED 에 가해진 전압이 낮고 전류 제한 저항에 걸린 전압이 높으므로 이때의 전류 값을 옴의 법칙( E = I⚫R: E-전압 V, I-전류 A, R-저항 ⚫Ω)에 의해서 알아보자. LED 허용 적정 전류는 20mA 로 알려져 있음을 참고하자.

전류 제한 저항에 흐르는 전류 I = 2.4V/220Ω = 0.011A = 11 mA 이다. 이 전류가 초록 색 LED 에 흐른다면  초록색 LED 의 순간 저항 값이 옴의 법칙 적용에 의해 계산 될 수 있다. R = E/I = 2.2V/0.011A = 200Ω 이 된다. 하지만 LED 는 상태에 따라서 전류 흐름과 순간 저항 값이 변동되므로 이 저항 값이 큰 의미는 없다.


만약에 두 개의 LED 가 동시에 on 되어 있을 겨우 코드를 수정하여 실험해 보기로 한다. 5초간 동시 on 후 5초간 동시 OFF 한다.
 
전류제한 저항에서의 전압은 2.4V LED 양단의 전압도 2.4V 로 측정되었다.


전류 제한 저항에 흐르는 전류 I = 2.4V/220Ω = 0.011A = 11 mA fh 앞의 경우와 별 차이는 없다. 다만 청색 LED는 2.8V 가 걸려야 충분한 밝기를 내는데 전압이 떨어져 상당히 어둡게 on 되었으며 초록색 LED 는 전압이 상당히 높아졌으므로 훨씬 밝아졌다.

LED를 각각 독자적으로 on OFF 하기를 원한다면 청색 LED는 220옴 전류 제한 저항을 그대로 사용하면 되며 초록색 LED는 적정 저항 값을 찾아야 할듯하다.


DUAL_LED_blinking_01


int led_blue = 2;
int led_green = 3;
int delaytime = 10000;

void setup() {
  Serial.begin(9600);//통신 속도
  pinMode(led_blue, OUTPUT);// LED 핀 출력 설정
  pinMode(led_green, OUTPUT);// LED 핀 출력 설정
}
void loop() {
  digitalWrite(led_blue,HIGH);//청색  LED on
  delay(delaytime);//LED on  지속 시간 지연
  digitalWrite(led_blue,LOW);//청색  LED OFF
  digitalWrite(led_green,HIGH);//초록색  LED on
  delay(delaytime);//LED on  지속 시간 지연
  digitalWrite(led_green,LOW);//초록색  LED OFF
}//끝