스마트의류 배우기

릴리패드 아두이노

릴리패드 아두이노 - LED, 부저 그리고 광센서

Contents

릴리패드 아두이노 LED, 부저 그리고 광센서


릴리패드 아두이노에 LED를 추가하거나, 부저로 간단한 소리음을 만들고, 간단한 멜로디를 연주할 수 있습니다. 또한, 광센서를 사용하여 주변환경 빛의 밝기를 감지할 수 있어서, 주변환경에 따라 다르게 반응하는 IT 기능을 만들 수 있습니다. 아래 세부 실습들을 참고해서 스마트의류 제작을 배워나가기 바랍니다.


아래 세부 내용들을 살펴볼 수 있습니다.

1) 아두이노 입출력(I/O)핀으로 LED 불켜기

2) PWM 아날로그 방법으로 LED 불빛세기 조절하기

3) 부저 연결하여 소리내기

4) 광센서 사용하기


여기서는 아두이노에 외부장치로 LED를 한 개 또는 두 개 이상을 연결하고, 단순히 ON/OFF 상태만을 변경하는 디지털제어 뿐만아니라, PWM 방식으로 LED 불빛 밝기의 세기를 조절하는 아날로그제어 방식을 배웁니다. 부저음으로 간단한 소리를 내거나, 멜로디를 연주하는 방법 그리고 광센서의 동작을 통하여 또 다른 센서를 릴리패드 아두이노에 연결하고 동작할 수 있습니다. 상세한 내용은 연결링크를 사용해도 좋습니다.



1) 아두이노 입출력(I/O)핀으로 LED 불켜기


아두이노에서 외부로 직접 연결할 수 있는 입/출력 핀은 9개의 디지털I/O핀, 4개의 PWM 아날로그 출력핀(3,9,10,11) 및 4개의 아날로그 입력핀(A2,A3,A4,A5)입니다. 상세한 핀번호와 핀위치는 그림을 참고하기 바랍니다. 우선 아두이노의 외부전원을 공급하는데 사용되는 두 개 핀(+핀과 -핀)을 제외한 나머지 모든 핀들을 디지털 입출력(I/O)핀으로 사용할 수 있습니다. 디지털 입/출력 핀으로 릴리패드 LED를 전기적으로 연결할 수 있는데, 다음 사항들을 참고해서 연결하십시오.


그림의 릴리패드 LED에는 이미 LED와 직렬로 연결해야할 저항이 내장되어 있어서, 별도의 저항을 사용하지 않아도 좋습니다. 다만, 제품에 표시된 양극(+)과 음극(-)을 구분하여 아두이노와 전기적으로 연결하면 됩니다. 아두이노에서 선택한 디지털 핀을 릴리패드 LED의 양극(+)과 연결하고, 릴리패드 LED의 음극(-)은 아두이노의 음극(-)과 연결합니다.

 


여기 모든 실습에서 부품간의 전기적 연결은 악어클립으로 합니다. 여러분은 실습의 내용을 동일하게 스마트 의류에서 구현하기 위해 악어클립으로 연결된 전기적 연결을 전도성 실로 연결상태를 변환하기만 하면 스마트의류에 적용할 수 있습니다.


               


실습에 사용한 아두이노 스케치는 하드웨어 구성에서 LED의 양극을 A5 연결핀에 연결하였으므로, 스케치에서도 디지털 핀 번호를 A5로 작성하면 됩니다. 이제 나머지 모든 아두이노 연결핀들(2,3,9,10,11,A2,A3,A4,A5)들을 디지털핀으로 사용함에 있어서, 연결 핀들 중 하나 또는 여러 개를 선택하여 아래 스케치와 같은 방법으로 디지털 LED 출력을 표현할 수 있습니다.


void setup() {

  pinMode(A5, OUTPUT);

}

void loop() {

  digitalWrite(A5, HIGH);  

  delay(1000); // LED ON 시간

  digitalWrite(A5, LOW);   

  delay(1000); // LED OFF 시간

}


     PWM 아날로그 출력에 대해서는 다시 설명할 것이므로, 여기서는 설명을 생략합니다. 릴리패드 아두이노 USB 보드의 경우 외부로 연결할 수 있는 최대 LED 개수는 9개입니다. 준비된 LED 들을 모두 연결하고 싶지 않은가요? 다음에서 여러 개의 LED를 연결하는 방법에 대하여 설명합니다.


LED 개수 늘려 실습하기

아두이노에 LED를 추가로 연결해봅시다. 이어서 스케치를 변경된 하드웨어 형태에 맞도록 수정하면 됩니다. 앞 절의 LED 동작을 중복 사용하는 방법으로 여러 개의 LED를 동시에 동작시킬 수 있습니다. LED 개수를 2개 3개 또는 더 많은 개수를 아두이노에 연결하고, 다양한 방법으로 동작시켜 봅시다.


여러 개의 LED를 켜고 끄는 방법은 매우 다양하게 구현할 수 있습니다. 먼저 아래 방법으로 여러 개의 LED를 아두이노에 악어클립을 사용하여 연결하여 봅시다. 실습에 사용하는 릴리패드 LED에는 이미 저항이 포함되어 있어서, 추가로 저항을 사용하지 않아도 됩니다. 다만, LED의 양극(+)과 음극(-)을 구분하여 아두이노에 연결하면 됩니다.


           

           


void setup() {

  pinMode(A5, OUTPUT);

  pinMode(2, OUTPUT);

  pinMode(9, OUTPUT);

}

void loop() {

  digitalWrite(A5, HIGH);  

  digitalWrite(2, HIGH); 

  digitalWrite(9, HIGH);   

  delay(1000); // LED ON 시간

  digitalWrite(A5, LOW);   

  digitalWrite(2, LOW);   

  digitalWrite(9, LOW);   

  delay(1000); // LED OFF 시간

}


당신은 현재 여러 개의 LED가 아두이노의 어떤 핀에 연결되어 있는지를 반드시 확인해야 합니다. 이때 하드웨어 구성에 사용된 아두이노 핀번호를 스케치에서 그대로 반영해야 합니다. 하나의 LED를 켜고 끄는 것과 동일한 방법으로 스케치를 작성하되 순대대로 모두 나열하면 됩니다.


스케치에서 LED 핀번호 나열순서를 다르게 작성하면 LED 동작이 다르게 표현되는지 살펴봅시다! 어떤 변화가 생기는지 살펴보는 것으로 스케치에 대한 이해가 증가할 것입니다. 아마도 이런 저런 변화를 만들어서 표현하면서 여러분의 스케치 프로그램 실력도 쑥쑥 늘어날 것이라고 생각합니다. 예를 들어 아래와 같이 순서를 바꿔도 LED 동작이 다르게 표현될 것입니다.


void setup() {

  pinMode(A5, OUTPUT);

  pinMode(2, OUTPUT);

  pinMode(9, OUTPUT);

}

void loop() {

  digitalWrite(A5, HIGH);  

  delay(1000); // LED ON 시간

  digitalWrite(A5, LOW);   

  delay(1000); // LED OFF 시간


  digitalWrite(2, HIGH);  

  delay(1000); // LED ON 시간

  digitalWrite(2, LOW);   

  delay(1000); // LED OFF 시간


  digitalWrite(9, HIGH);  

  delay(1000); // LED ON 시간

  digitalWrite(9, LOW);   

  delay(1000); // LED OFF 시간

}


먼저 실습내용을 따라 해보고, 다시 나만의 변화를 만들어보는 것을 잊지 말고 시도해봅시다! 여러분은 여러 개의 LED가 켜지는 순간과 꺼지는 순간 그리고 LED불빛의 ON 지속시간과 OFF 지속시간을 다양하게 조립하는 방법으로 여러 가지 종류의 표현들을 만들어 낼 수 있습니다.


당신의 옷 어느 부분에 LED를 부착할 것인지, 부착된 LED가 어떤 순서로 어떤 동작을 하도록 할지를 모두 사전에 설계하여 아두이노 스케치에 반영할 수 있습니다. 아마도 바느질할 수 있을 정도의 초등학생 이상 학생이면 충분히 따라할 수 있는 흥미로운 실습이 될 것입니다.



2) PWM 아날로그 방법으로 LED 불빛세기 조절하기


아두이노로 LED 불빛을 제어하는 방법은 크게 두 가지입니다. 한가지 방법은 지금까지 다뤄본 디지털 출력방법으로 LED의 ON 또는 OFF 동작만 제어하는 것입니다. 또 다른 한가지 방법은 아날로그 출력방법으로 LED의 불빛 세기를 0~255 단계로 세분화하여 불빛의 세기를 다양하게 표현하는 LED 제어방법입니다.


여기서 설명하는 PWM 제어라는 것은 불빛의 세기를 다양하게 표현하는 방법에 관한 것입니다. 기술적으로 PWM 아날로그는 아두이노 5V의 일정한 출력전압을 사용하여 아날로그 효과를 만드는 공학적 수단이며, 짧은 시간 간격으로 5V 전압을 단속하는 방법에 의해 실제로 5V 보다 낮은 전압이 LED에 공급되는 효과를 만드는 기술입니다.


             

                  


그림처럼 LED에 5V 전압을 공급하여 가장 밝은 상태를 표현하려면 맨 아래쪽에 표시된 신호처럼 아두이노의 출력을 계속 인가하면 됩니다. LED에 5V 의 절반인 2.5V 전압을 공급하여 밝기를 절반 정도로 표현하려면 아두이노의 출력전압을 2.5V 로 조절할 수 있으면 되겠지만, 아두이노의 출력전압은 5V 로 고정된 값이어서 가능하지 않습니다. 따라서 그림처럼 한번의 클락주기 절반시간 동안은 5V를 공급하고 나머지 절반시간 동안은 0V의 전압을 공급하는 수단을 사용하는데 이러한 방식을 PWM 제어라고 부릅니다. 2.5V 전압을 표현하는 PWM 제어 스케치 표현은 analogWrite(127) 입니다.


아두이노 동작 주파수는 16MHz 이므로 한주기의 시간은 매우 짧은 시간이어서 한번의 클락주기동안 전압이 공급되는 시간과 공급되지 않는 시간을 사람의 감각기관으로는 구분할 수 없습니다. PWM 아날로그 제어에 대한 아두이노 스케치 표현으로 analogWrite() 함수를 사용하는데, 함수내의 값은 0~255 사이에서 선택하여 불빛의 세기를 조금씩 다르게 표현할 수 있습니다.


릴리패드 아두이노에 내장된 디지털핀 13번 LED는 디지털 출력이외에 PWM 아날로그 출력도 표현할 수 있습니다. 다음 스케치를 아두이노에 업로드하여 빛의 밝기를 비교해봅시다.


void setup() {

  pinMode(13, OUTPUT);

}

void loop() {

  analogWrite(13, 255);  

  delay(2000);

  analogWrite(13, 191);  

  delay(2000);

  analogWrite(13, 127);  

  delay(2000);

  analogWrite(13, 64);  

  delay(2000);

}


2초마다 LED 빛의 밝기가 점차 어두워지도록 표현되면 정상적으로 동작하는 것입니다. 이제 릴리패드 아두이노의 3번, 9번, 10번 그리고 11번 중에서 임의로 3번핀을 선택해서 릴리패드 LED를 직접 외부에서 연결한다면 스케치에서도 핀번호를 13번에서 3번으로 변경하여 업로드하면 됩니다.

      

아두이노 IDE프로그램 예제에 포함된 PWM 아날로그 출력을 실습해봅시다. 릴리패드 아두이노의 9번핀에 LED를 연결합니다. 그리고 다음 순서로 예제를 클릭하여 동작시켜봅시다. 파일메뉴에서 예제메뉴를 선택한 다음 Basics --> Fade 를 선택하면 됩니다. 하드웨어 연결이 정상적으로 수행되었다면 아마도 여러분의 LED 밝기가 단계별로 다르게 표현될 것입니다.


       


3) 부저 연결하여 소리내기


이제 LED 대신 소리낼 수 있는 부저의 사용법에 대하여 살펴봅시다. 부저는 교류신호를 사용하는 스피커와는 다르게 직류신호를 사용하여 소리낼 수 있는 부품으로 가장 간단하게 다룰 수 있습니다. LED를 켜고 끄기위하여 digitalWrite() 함수 또는 analogWrite() 함수를 사용했던 것처럼, 부저를 소리나게 하려면 tone() 함수를 사용할 수 있습니다. 물론 tone() 함수를 사용하지 않고도 부저음을 다룰 수 있지만, 여기서는 생략합니다. tone() 함수는 3개의 변수값을 사용합니다.


      tone(pin, 5000, 1000);

      delay(2000);

       

위의 스케치에서 tone() 함수 내의 pin은 디지털핀 번호를 나타내고, 5000 값은 주파수를 나타내며, 세 번째 값 1000은 소리음이 지속되는 시간을 나타냅니다. 1000값은 1000ms 이므로 1초에 해당합니다. 그리고 delay() 함수로 쉬는 시간을 표현할 수 있습니다. 또한, 스케치의 tone() 함수에서 세 번째 값을 생략하고, 이어서 소리음의 지속시간을 delay() 함수로 표현할 수도 있습니다.


      tone(pin, 5000);

      delay(2000);

              

릴리패드 부저에는 양극(+)과 음극(-)이 표시되어 있으므로, 극성을 구분하여 릴리패드 아두이노의 디지털핀과 음극(-)에 서로 연결하면 됩니다.


         



void setup() {

}

void loop() {

  tone(3, 5000, 1000);

  delay(2000);

}


부저를 아두이노에 연결한 다음 스케치를 업로드하면, 짧게 부저가 울리고 2초동안 쉬는 동작을 반복할 것입니다. tone()함수에서 사용하는 값들을 다른 값을 바꾸면서 실습을 반복해봅시다.



부저로 멜로디 만들기

부저로 다양한 음계를 표현하려면 음계에 적합한 주파수를 사용해야만 합니다. 노래를 표현하기 이전에 도/레/미/파/솔/라/시/도 음계를 만들어 봅시다. 아래 그림을 참고하여 tone() 함수의 주파수 값을 각 음계에 맞도록 표현하면 됩니다.


      

            


아래 스케치를 사용하여 도/레/미/파/솔/라/시/도 음계를 표현해 봅시다.


void setup() {

}

void loop() {

  tone(3, 1047, 1000); //도 C6

  delay(1000);

  tone(3, 1175, 1000); //레 D6

  delay(1000);

  tone(3, 1319, 1000); //미 E6

  delay(1000);

  tone(3, 1397, 1000); //파 F6

  delay(1000);

  tone(3, 1568, 1000); //솔 G6

  delay(1000);

  tone(3, 1760, 1000); //라 A6

  delay(1000);

  tone(3, 1976, 1000); //시 B6

  delay(1000);

  tone(3, 2093, 1000); //도 C7

  delay(1000);

}


음계표현이 정상적으로 잘 이루어졌다면 다음 순서로 “반짝반짝 작은별” 노래를 만들어 봅시다. 노래를 표현함에 있어서 조금은 복잡해질 수 있는 프로그램을 배열을 사용하여 간략하게 표현할 수 있습니다. 아래 스케치를 참고하여 노래를 연주해봅시다.


 int BuzzerPin = 9;

 char noteNames[] = {'z','x','c','v','b','n','m'};

 int frequency[] = {1047,1175,1319,1397,1568,1760,1976};

 byte noteCount = sizeof(noteNames);

 

 void setup(){

     Serial.begin(9600);

 }

 void loop(){

     if (Serial.available()>0){

     int duration = 333;

     char score = Serial.read();

     playNote(score, duration);

     }

 }

 void playNote(char note, int duration){

     for (int i=0 ; i<noteCount ; i++){

         if (noteNames[i] == note)

             tone(BuzzerPin, frequency[i], duration);

     }

     delay(duration);

 }


4) 광센서 사용하기


릴리패드 아두이노에 LED 출력장치 이외에 다양한 센서를 입력신호로 연결할 수 있습니다. 여기서 광센서를 연결하는 방법 그리고 광센서 입력신호와 광센서 입력신호에 따라 출력신호가 반응하는 방법에 대하여 살펴봅시다.


(1) 광센서를 사용하여 아날로그 센서값 읽기

릴리패드 광센서는 주변 빛의 세기에 따라 0~5V 사이의 전압을 출력합니다. 야외 햇빛에 노출되면 5V 의 전압을 출력하고, 손으로 감싸쥐면 거의 0V 전압을 출력합니다. 실내 조명환경에서는 약 1~2V 사이의 전압을 출력할 수 있습니다.   릴리패드 아두이노의 아날로그 입력핀(A2,A3,A4,A5)중 하나를 선택하여 광센서를 아래와 같이 연결해봅시다. 아래 그림에서는 아날로그핀(A3)를 사용하였습니다.


        

             

    

      


하드웨어 구성방법은 광센서의 양극(+)은 아두이노의 양극(+) 표시 전극에 연결하고, 광센서 음극(-)은 아두이노 음극(-) 표시 전극에 연결합니다. 그리고 광센서의 S 표시 전극을 아두이노 아날로그 입력핀에 연결하면 됩니다. 이제 하드웨어 구성이 완료되었다면 아두이노에 다음 스케치를 업로드합니다.


void setup() {

   Serial.begin(9600);

}

void loop() {

   int senVal = analogRead(A3);

   Serial.println(senVal);

   delay(200);

}


아날로그 센서값을 PC에서 읽으려면 아두이노와 PC 사이에서 USB 케이블을 연결하고 시리얼 통신으로 모니터에 표시할 수 있습니다. 사용방법은 스케치에서 사용한 방법과 같이 Serial.begin(9600); 표현과 Serial.println(senVal); 표현을 사용합니다. 여러분도 항상 PC에서 아두이노의 데이터를 표시하고자 한다면 위 표현들을 활용할 수 있습니다.


아날로그 센서로부터 아두이노가 어떤 감지 값을 입력받으려면 analogRead() 함수를 사용할 수 있습니다. 스케치는 analogRead() 함수로 읽은 감지 값을 시리얼출력함수 Serial.println() 함수를 통하여 PC에서 표시합니다. analogRead() 함수로 읽어들이는 값의 범위는 0~1023 사이의 값입니다. 태양 빛처럼 외부의 밝은 빛이 가장 밝은 상태이면 5V 에 가까운 전압을 광센서에서 출력하므로 시리얼모니터에 표시되는 값은 1023에 가장 근접한 값이 됩니다. 반면에 어두운 실내여서 빛이 거의 없는 상태 또는 손으로 광센서를 감싸쥐어 빛이 거의 없는 상태가 되면 센서에서 출력되는 값은 거의 0V 에 가까워지고, 따라서 analogRead() 함수에서 읽어서 시리얼모니터에 표시하는 값도 거의 0 에 가까워집니다. 만약 중간정도의 실내 조명이라면 적정한 광센서에서 출력되는 전압이 1~2V 사이의 전압일 수 있고, 시리얼모니터에 표시되는 값도 512 부근의 값을 표시할 수 있을 것입니다.


(2) 센서 입력 값에 따라 LED 출력하기

광센서와 연결되어 반응하는 출력장치로 LED를 사용할 수 있지만, 이전에 사용해본 부저를 사용할 수도 있습니다. 당연히 두 개의 출력장치를 모두 사용할 수도 있습니다. 여기서는 광센서 감지값의 범위에 따라 LED가 반짝이는 상태를 다르게 표현하거나 ON/OFF 상태로 구분할 수 있고, 만약 부저를 사용한다면 실내와 실외를 구분하는 장치로 응용할 수 있습니다.


스케치 작성을 위하여 앞부분에서 살펴본 LED 동작방법이나 부저 동작방법을 그대로 가져와서 활용할 수 있습니다. 또한, 한가지 입력상태에 따라 출력장치가 다르게 반응하도록 하려면, 여러분은 if 조건문에 대하여 살펴보아야 합니다. 아래 조건문은 가장 간단한 조건문을 사용한 예제입니다. 아래 스케치에서 “센서값이 512 이상인 경우” 공간에 여러분만의 LED 제어문장을 넣고, “센서값이 512 미만인 경우” 공간에 또 다른 LED 제어문장을 넣으면 센서 값의 변화에 따라 각각 다르게 반응하는 장치를 구현할 수 있습니다.


void setup() {

   Serial.begin(9600);

}

void loop() {

   int senVal = analogRead(A3);

   Serial.println(senVal);

   if (senVal >= 512) {

     센서값이 512 이상인 경우

   }

   else {

     센서값이 512 미만인 경우

   }

   delay(200);

}


물론 아두이노와 센서 그리고 출력장치로 사용할 LED, 부저 등을 연결하고 각각의 부품에 대한 스케치를 포함해서 작성하기만 하면 됩니다. 다음 실습예제를 따라해봅시다!

아래 실습은 광센서가 태양 빛처럼 밝은 환경을 감지하면 LED를 자동으로 끄고, 실내 조명이나 깜깜한 밤 조건이 되면 LED를 자동으로 켜는 동작을 위한 것입니다. 그림을 참고하여 릴리패드 아두이노 A3 핀에 광센서를 연결하고, 3번핀에 LED를 연결하여 봅시다.


      

      

      


하드웨어 구성방법은 이전의 내용을 참고하십시오. 하드웨어 구성이 모두 완성되었다면, 아래 스케치를 릴리패드 아두이노로 업로드합니다. 스케치가 업로드되면 현재 실습장소가 야외인지 또는 실내인지에 따라 다르게 반응하겠지만, 대부분 실내환경이라고 예상됩니다. 스케치 업로드가 성공하는 순간 LED에 불이 들어올 것입니다. 여러분의 스마트폰에 내장된 불빛을 켜서 광센서에 비춰봅시다. 그러면 LED의 불빛이 꺼질 것입니다. 만약 그렇게 동작하지 않으면 여러분의 실습조건들을 다시 검토해보아야 합니다.


기본적인 동작상태를 점검하였으므로 전기적 연결을 위해 사용중인 악어클립 연결선을 대신하여 바느질로 전도성 실을 사용하여 의류에 부착하여 전기적 연결을 완성하면, 동일한 동작상태를 의류에 아두이노를 부착한 상태에서도 재현할 수 있습니다.


void setup() {

   Serial.begin(9600);

   pinMode(3, OUTPUT);

}

void loop() {

   int senVal = analogRead(A3);

   Serial.println(senVal);

   if (senVal >= 512) {

     digitalWrite(3, LOW);

   }

   else {

     digitalWrite(3, HIGH);

   }

   delay(200);

}