차시 AS_02 대상 교육주제아두이노 LED 및버튼제어프로젝트교육시간 120 분 1. 아두이노를이용하여 LED 를제어할수있다. 교육목표 2. 아두이노를이용하여삼색 LED 를제어할수있다. 3. 아두이노에서버튼입력을수행하여프로그램에연동할수있다. 장비류는미리배분하고, 재료는각실험단계에서배분한다. Arduino 1.0 USB 케이블 1.0 교육자료 ( 준비물 ) 300Ω 5.0 LED-RED( 고휘도 ) 5.0 브레드보드 ( 소형 ) 1.0 텍스위치 3.0 10kΩ 3.0 LED-RGB( 고휘도 ) 1.0 점퍼케이블 (F/F) 12
< 부품이해하기 > 1. 저항 < 그림 1> 저항 < 그림 2> 과전류로인한부품고장 < 그림 3> 저항의역할 LED나전자부품을사용하는경우부품을보호하기위해저항과함께사용하는경우가많습니다. 만약 LED 등의부품에너무많은전류가통과하면망가질확률이높기때문입니다. 전자부품을저항과함께연결하면저항은전류의일부를열에너지로교체하여전류의양을조절합니다. 이때저항이전류를열에너지로바꾸는양은 ohm( 저항의단위 ) 에따라다릅니다. 만약저항값이필요한값보다작은경우에도전류가많이흘러부품이망가질수있으므로, 적당한값의저항을사용해야합니다.
2. LED < 그림 1> LED < 그림 5> LED 의극성 < 그림 6> 전류의흐름 LED는전류를빛으로변환하는부품입니다. 다양한모양, 크기, 색깔을가지고있습니다. 또한, LED는극성을갖습니다. 극성이란한방향으로만전류가흘러야하는특징을뜻합니다. LED의다리를살펴보면긴쪽이양극 (+) 이고, 짧은쪽이음극 (-) 입니다. 양극을다른말로애노드 (anode), 음극을캐소드 (cathode) 라고부릅니다. 전류는양극에서음극으로흘러야하므로브레드보드에조립할때유의해야합니다. LED는회로도에서 < 그림 3> 과같이표시합니다.
3. 옴의법칙 : 전압 (V) = 전류 (I) x 저항 (R) < 그림 7> LED 의필요사양 LED 와같은부품에는사용할때확인할수있는사양의값과옴의법칙을이용하여필요한저항의 값을구할수있습니다. (A) 전압 (V) = 전류 (I) x 저항 (R) (B) 저항 (R) = 전압 (V) / 전류 (I) 먼저옴의법칙 (A) 에서양변을전류로나눠 (B) 와같이만듭니다. (C) 저항 (R) = (5-1.7) / 전류 (I) 아두이노핀의출력전압이 5V 이고 LED 의필요전압이 1.7V 이기때문에 (B) 의전압부분에각 전압의차를넣습니다. (D) 저항 (R) = (5-1.7) / 0.01 LED 의필요사양에표시된전류값인 10mA 를전류에넣습니다. ma 는기존 A 의 1,000 분의 1 단위이므로 10 에서 1,000 을나눈 0.01 을전류부분에넣습니다. (E) 330 = (5-1.7) / 0.01 계산하면필요한저항값이 330 으로나옵니다. 이렇게계산된저항값을바로사용해도되지만보다 안전한사용을위해좀더높은값의저항을사용하는것이추천합니다.
< 실습 > 1. 파도치는 LED 구현하기 : LED 여러개를이용해파도처럼빛나도록만들어봅시다. (1) 재료 : LED 5 개, 510 ohm 저항 5 개 < 그림 8> 재료 (2) 회로도 < 그림 9> 회로도 회로는 < 그림 9> 와같이 2~6 번까지의핀에 510 ohm 저항과 LED 를연결합니다.
(3) 아두이노프로그래밍 < 코드 1> 파도치는 LED #define DELAY_TIME 100 void setup(){ pinmode(2, OUTPUT); pinmode(3, OUTPUT); pinmode(4, OUTPUT); pinmode(5, OUTPUT); pinmode(6, OUTPUT); void loop(){ digitalwrite(2, HIGH); delay(delay_time); digitalwrite(2, LOW); digitalwrite(3, HIGH); delay(delay_time); digitalwrite(3, LOW); digitalwrite(4, HIGH); delay(delay_time); digitalwrite(4, LOW); digitalwrite(5, HIGH); delay(delay_time); digitalwrite(5, LOW); digitalwrite(6, HIGH); delay(delay_time); digitalwrite(6, LOW); digitalwrite(5, HIGH); delay(delay_time); digitalwrite(5, LOW); digitalwrite(4, HIGH); delay(delay_time); digitalwrite(4, LOW); digitalwrite(3, HIGH); delay(delay_time); digitalwrite(3, LOW);
(4) 코드분석 1 #define DELAY_TIME 100 #define은매크로상수를선언하는명령어입니다. 상수란변수와비슷하지만일단한번값이정해지면다음에바꿀수없습니다. 매크로상수선언은변수선언과달리마지막에세미콜론을입력하지않습니다. (5) 확인하기 완성되었다면매 0.1 초마다 LED 가좌우순서대로켜지는것을볼수있습니다.
2. 3 색 LED 자동색변경 : 아날로그신호출력을이용해삼색 LED 를제어해봅시다. (1) 삼색 LED < 그림 10> 삼색 LED < 그림 11> 삼원색 < 그림 12> 전압을이용한색의양조절 빛의삼원색을이용해원하는색을표현할수있는 LED 입니다. 삼원색은빛을구성할때핵심이 되는세가지색을말합니다. TV 나 PC 모니터에서삼색 LED 를사용해삼원색으로색을표현합니다. 색의양은전압을조절해변경할수있으며 0V 에서 5V 사이중원하는값으로변경합니다. (2) PWM < 그림 13> 하드웨어의출력 아두이노와같은하드웨어는전압출력을오로지 LOW 또는 HIGH 로설정할수있습니다. 따라서 LOW 나 HIGH 가아닌아날로그값으로변경하기위해펄스폭변조 (PWM) 방식을사용합니다.
< 그림 14> PWM 의기준주기 PWM 을사용할때기준주기를고려해야합니다. 아두이노에서기준주기는대략 0.002 초입니다. 기준주기동안의전압과출력전압은동일합니다. < 그림 15> PWM의이용해전압을 25% 로조절하기만약주기의특정부분만 HIGH로설정하고나머지는 LOW로설정하면출력은그비율에따라변합니다. 예를들어 5V를 25% 로하고나머지 0V를 75% 로해서 5V의 25% 인 1.25V가됩니다. 이를통해전압출력을 0V에서 5V 사이원하는값으로바꿀수있습니다. (3) 재료 : 삼색 LED < 그림 16> 재료
(4) 회로도 < 그림 17> 회로도삼색 LED의 R, G, B를각각 11, 10, 9에연결하고아두이노 5V를삼색 LED의가장긴핀과연결합니다. 간혹 R과 B가잘못표시된삼색 LED가있는데이런경우위치를서로바꾸어연결합니다. 핀번호하단의물결 (~) 표시는 PWM 기능을사용할수있다는뜻입니다. (5) 아두이노프로그래밍 < 코드 2> 자동으로색바뀌게하기 #define RED 11 #define GREEN 10 #define BLUE 9 void setup(){ randomseed(analogread(0)); // 난수생성기초기화 void loop(){ analogwrite(red, random(255)); // 빨간색조절 analogwrite(green, random(255)); // 초록색조절 analogwrite(blue, random(255)); // 파란색조절 delay(1000);
(6) 코드분석 1 randomseed( 키값 ); 난수발생함수는프로그래밍에서자주사용합니다. 무작위수 ( 난수 ) 발생이필요한경우 randomseed 함수로초기화하고 random() 함수에서무작위수를생성해사용합니다. setup부분에보면 randomseed 명령어를볼수있습니다. randomseed는난수생성기를초기화시켜주는명령어입니다. 여기서 random이라는명령어를통해난수를사용하는데, 사용전에는꼭난수생성기를초기화해줘야합니다. 왜냐하면난수생성기를초기화하지않으면동일한순서로난수가만들어지기때문입니다. 따라서키값을사용해난수생성기를초기화합니다. 코드에서는키값으로 analogread(0) 이사용되었습니다. 2 analogread(0) analogread는아날로그입력값을읽는명령어입니다. 아날로그입력핀은 A0와같이표시하는데, 여기서 A는 Analog의약자이고 0은핀번호를의미합니다. 즉, analogread(0) 는 A0번핀의값을읽으라고명령하는것입니다. 아날로그입력핀은처음부터입력모드로설정되며플로팅상태입니다. 따라서전압이 LOW와 HIGH를사이를이동하면서 analogread라는명령어가실행됐을때무작위의값을읽습니다. 무작위로읽은값은다시난수생성기를초기화할때키값을사용합니다. 이러한방식으로똑같은값이키값으로사용되어난수생성기를초기화하는것을방지할수있습니다. 3 random( 최대값 ); random은실제난수를만드는명령어입니다. 0에서최대값사이에서무작위로값을뽑습니다. 예를들어 random(255) 는 0에서 254 중에무작위수를고릅니다. random 명령어는 random( 최소값, 최대값 ) 과같이최소범위또한줄수있습니다. (7) 확인하기 정상적으로만들었다면매 1 초마다무작위로색이변하면서빛나는것을볼수있습니다.
3. 버튼기초실습 : 버튼을사용해 LED 를제어해봅시다. (1) 재료 : 버튼, LED, 560ohm 저항, 10k ohm 저항 < 그림 18> 재료 (2) 회로도 < 그림 19> 회로도 12 번핀에 LED 를, 7 번핀에버튼을연결합니다. 버튼에는 10k ohm 저항을사용합니다.
(3) 풀업 & 풀다운 Pull up & Down < 그림 20> 풀다운 (Pull-Down) 저항회로연결을보면버튼을선 2개로연결하지않고저항을추가해선 3개로연결한것을볼수있습니다. 이와같이연결하는이유는핀모드를입력으로설정하면해당핀이플로팅상태가되기때문입니다. 플로팅상태란해당핀에항시소량의전류가흘러핀의전압이 LOW와 HIGH 사이를계속움직이는현상을말합니다. 이로인해올바른신호값을인식할수없다는문제점을갖고있습니다. 이러한문제점을해결하기위해저항을버튼에연결하여핀의전압을 LOW 또는 HIGH에고정합니다. LOW에고정시키는것을풀다운 (Full-Down), HIGH에고정시키는것을풀업 (Pull-Up) 이라고합니다.
1 풀업 < 그림 21> 풀업, 스위치가열려진상태 < 그림 22> 풀업, 스위치가닫힌상태입력핀과전원사이에저항을연결합니다. 스위치가열린상태인경우입력핀이전원과연결이되어있으므로전압이 5V가됩니다.(Pull-Up). 스위치가닫힌상태이면입력핀의전압은그라운드와동일한 0V가됩니다. 2 풀다운 < 그림 23> 풀다운, 스위치가열려진상태 < 그림 24> 풀다운, 스위치가닫힌상태 입력핀과그라운드사이에저항을연결합니다. 스위치가열린상태인경우입력핀이그라운드와 바로연결되므로전압이 0V 가됩니다.(Pull-Down).
(4) 아두이노프로그래밍 < 코드 3> 버튼사용하기 #define LED 12 #define BUTTON 7 void setup(){ pinmode(led, OUTPUT); pinmode(button, INPUT); void loop(){ if (digitalread(button) == HIGH){ // 버튼상태가 HIGH 인지확인한다. // 비교해서참이라면아래코드가실행된다. digitalwrite(led, HIGH); delay(500); digitalwrite(led, LOW); (5) 코드분석 1 if ( 조건 ) {... loop부분에보면위와같이 if문을볼수있습니다. if문은소괄호 () 안의조건이참인경우중괄호 { 안의코드를실행합니다예를들어. if (digitalread(button) == HIGH) {... 위코드를살펴봅시다. C언어에서 == 기호는좌우가동일한지비교합니다. 만약동일하면참이고다르면거짓이며, 프로그래밍에서는참을 true, 거짓을 false라고부릅니다. 따라서위코드는버튼의상태가 HIGH인지비교한다는뜻입니다. if ( 조건 ) {... else {... if문밑에 else가붙는경우가있습니다. 조건이거짓인경우 else 밑중괄호의코드가실행됩니다. (6) 확인하기 정상적으로연결했다면버튼이눌렸을때 LED 가켜졌다가 0.5 초뒤에꺼지게됩니다. (7) 도전하기 - 파도처럼반짝이는 LED 의순서를바꿔봅시다. - 버튼방식을풀업으로바꿔구현해봅시다.
4. 버튼으로 LED 제어 (1) 재료 : 삼색 LED, 버튼, 10k ohm 저항 < 그림 25> 재료 (2) 회로도 < 그림 27> 회로도 2~4 번까지버튼을연결하고, 9~11 번까지삼색 LED 에연결합니다.
(3) 아두이노프로그래밍 < 코드 4> 버튼을이용해제어하기 #define RED 11 #define GREEN 10 #define BLUE 9 #define RED_BUTTON 4 #define GREEN_BUTTON 3 #define BLUE_BUTTON 2 int r=255, g=255, b=255; void setup(){ pinmode(red_button, INPUT); pinmode(green_button, INPUT); pinmode(blue_button, INPUT); void loop(){ if(digitalread(red_button) == HIGH){ --r; // r 값을감소시킨다. if(r<0){ r=255; if(digitalread(green_button) == HIGH){ --g; // g 값을감소시킨다. if(g<0){ g=255; if(digitalread(blue_button) == HIGH){ --b; // b 값을감소시킨다. if(b<0){ b=255; analogwrite(red, r); analogwrite(green, g); analogwrite(blue, b); delay(10);
(4) 코드분석 1 ++a ( 증가연산자 ) ++ 기호는해당변수에 1 을더한다는뜻입니다. 2 --a ( 감소연산자 ) -- 기호는해당변수에 1 을뺀다는뜻입니다. 3 증감연산자는변수앞이나뒤에모두사용가능합니다. if(++a == HIGH){ vs if(a++ == HIGH){ ++ 기호의위치차이는 if문을통해비교할수있습니다. 전자같은경우 a의값을먼저증가하고 HIGH를비교합니다. 후자같은경우 HIGH와먼저비교를한뒤에 a의값을증가합니다. (5) 확인하기 정상적으로만들었다면각버튼을누를때마다빨강, 파랑, 초록의색양이변경됩니다. (6) 도전해보기 - 인터넷에서원하는색의 RGB 값을구해색을바꿔봅시다. - 색의값을감소시키도록변경해봅시다.