프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

무드 램프를 만들어 봅시다.

2014-09-04 19:12:00

개요


무드 램프라고 아십니까? 밑의 사진에 있는 램프가 무드램프의 종류 중 하나 입니다.


출처 : Drop bath Light

다양한 색상과 아름다운 모양으로 사람들에 사랑을 받고 있는데요, 이 무드 램프를 단순한 3색 LED를 가지고 만들 수 있습니다.

이 컨텐츠에서는 아두이노와 7smd RGB LED를 이용하여 간단하면서도 분위기 있는 무드 램프를 직접 만들어 보겠습니다.

또한 안드로이드와 연결하여 자신이 원하는 색상의 LED를 켤 수 있게 하며 램프에 멋있는 효과를 넣어 봅시다.(여기서는 랜덤으로 빛나게 해보겠습니다.)
이 컨텐츠를 보시기 전에 시리얼통신으로 제어하는 Mood Lamp 를 보시면 편하게 하실 수 있습니다.
 


시작전 개념 이해하기

 - 안드로이드와 아두이노 간의 블루투스 통신 기초
 - 디지털 출력을 통해서 RGB LED를 밝혀봅시다.
 - 시리얼통신으로 제어하는 Mood Lamp

부품 목록

NO 부품명 수량 상세설명
1 오렌지보드 1 오렌지보드
2 7smd RGB LED 1 LED
3 블루투스 모듈(HC-05) 1 블루투스
4 브레드보드 1 브레드보드
5 점퍼케이블 8 점퍼케이블

부품명 오렌지보드 7smd RGB LED 블루투스 모듈 브레드보드 점퍼케이블
파트  


하드웨어 Making

회로도


브레드보드









이 컨텐츠에서 사용한 7smd rgb LED는 3색 LED와 원리는 같습니다. 7smd rgb LED는 3색 LED를 여러개 묶어서 하나로 사용하기 편하게 만든 것입니다.

각 조그마한 네모 안에 R, G, B 3색의 LED가 각각 들어있어서 3색의 LED의 밝기를 조절 함으로써 다양한 색을 만듭니다.



소프트웨어 Coding

#include <SoftwareSerial.h> // 블루투스 통신을 위한 SoftwareSerial 라이브러리를 불러온다.

SoftwareSerial BTSerial(2, 3); // SoftwareSerial(RX, TX)
byte buffer[1024]; // 데이터 수신 버퍼
int bufferPosition; // 버퍼에 기록할 위치

int redLed = 10;  
int blueLed = 11;
int greenLed = 9;
// 각각의 LED와 연결된 핀번호

boolean redState = 0;
boolean blueState = 0;
boolean greenState = 0;
// 각 부품을 제어하기 위한 상태 값(이 값을 조절하는 걸로 부품을 제어한다.)

int redLight = 0;
int greenLight = 0;
int blueLight = 0;
// 각 색상의 값을 저장 한다.
String lightValue; void setup () { pinMode(redLed, OUTPUT); pinMode(blueLed, OUTPUT); pinMode(greenLed, OUTPUT); BTSerial.begin(9600); Serial.begin(9600); bufferPosition = 0; } void loop () { if (BTSerial.available()) { byte data = BTSerial.read(); buffer[bufferPosition++] = data; Serial.println(data); if (data == 'q') { // Red 막대바를 조정했을 경우 해당 값에 맞게 LED를 조절 합니다. if (bufferPosition == 4) { redLight = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48); lightOn(); redState = 1; } else if (bufferPosition == 3) { redLight = (buffer[0]-48)*10 + (buffer[1]-48); lightOn(); redState = 1; } else if (bufferPosition == 2) { redLight = buffer[0] - 48; lightOn(); if (redLight == 0) { redState = 0; } else { redState = 1; } } } if (data == 'w') { // Blue 막대바를 조정했을 경우 해당 값에 맞게 LED를 조절 합니다. if (bufferPosition == 4) { blueLight = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48); lightOn(); blueState = 1; } else if (bufferPosition == 3) { blueLight = (buffer[0]-48)*10 + (buffer[1]-48); lightOn(); blueState = 1; } else if (bufferPosition == 2) { blueLight = buffer[0] - 48; lightOn(); if (blueLight == 0) { blueState = 0; } else { blueState = 1; } } } if (data == 'e') { // Green 막대바를 조정했을 경우 해당 값에 맞게 LED를 조절 합니다. if (bufferPosition == 4) { greenLight = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48); lightOn(); greenState = 1; } else if (bufferPosition == 3) { greenLight = (buffer[0]-48)*10 + (buffer[1]-48); lightOn(); greenState = 1; } else if (bufferPosition == 2) { greenLight = buffer[0] - 48; lightOn(); if (greenLight == 0) { greenState = 0; } else { greenState = 1; } } } if (data == 'r') { // red LED가 꺼져있을 경우 키고, 켜 있을 경우 끕니다. if (redState == 0) { redLight = 128; redState = 1; lightOn(); } else { redLight = 0; redState = 0; lightOn(); } delay(150); } if (data == 'b') { // blue LED가 꺼져있을 경우 키고, 켜 있을 경우 끕니다. if (blueState == 0) { blueLight = 128; blueState = 1; lightOn(); } else { blueLight = 0; blueState = 0; lightOn(); } delay(150); } if (data == 'g') { // green LED가 꺼져있을 경우 키고, 켜 있을 경우 끕니다. if (greenState == 0) { greenLight = 128; greenState = 1; lightOn(); } else { greenLight = 0; greenState = 0; lightOn(); } delay(150); } if (data == 'd') { // LED를 랜덤으로(RGB 조합을 랜덤으로 섞는다) 반복합니다. byte data1 = 10; do { if (BTSerial.available()) { data1 = BTSerial.read(); } if (data1 == 10) { setLight(random(1, 256), random(1, 256), random(1, 256)); lightOn(); delay(300); } else { break; } } while (1); setState(1, 1, 1); } if (data == 'o') { // LED를 모두 끕니다. setState(0, 0, 0); setLight(0, 0, 0); lightOn(); delay(150); } if (data == 't') { // 현재 LED 의 RGB값을 안드로이드로 보냅니다. BTSerial.print(redLight); BTSerial.print(','); BTSerial.print(blueLight); BTSerial.print(','); BTSerial.println(greenLight); } if (data == '\n') // 명령이 다 들어왔을 경우 버퍼 위치를 초기화 합니다. { bufferPosition = 0; } } } void lightOn() { // 3개의 LED 밝기를 조절 하는 함수 analogWrite(redLed, redLight); analogWrite(blueLed, blueLight); analogWrite(greenLed, greenLight); } void setState(boolean red, boolean blue, boolean green) { // 3개의 LED의 상태를 저장하는 함수 redState = red; greenState = blue; blueState = green; } void setLight(int red, int blue, int green) { // 입력 받은 LED의 밝기를 저장 하는 함수 redLight = red; blueLight = blue; greenLight = green; }
 

소프트웨어 설명



안드로이드 어플받으신 후(MoodLamp.apk) 실행 하여 블루투스에 연결을 하면 위의 화면이 나타납니다. 각각 RGB의 색 켜기 모든 LED끄기 현재의 LED의 상태값보기 LED를 랜덤으로 켜기, RGB의 상태 보기 + 조정 하는 막대바가 있습니다.

RGB버튼을 누르게 되면 밝기 128로 각각의 LED를 키게 되고, off 를 누르면 모든 불이 다 꺼집니다. 현재값을 누르면 밑의 막대바에 현재 켜져있는 LED의 색상 밝기 정도를 표시해 주고, 랜덤버튼을 누르게 되면 0.3초 단위로 색을 랜덤으로 바뀌게 됩니다. 

밑의 막대바를 조절 하게 되면 그에 맞는 각각의 LED의 밝기가 조절 됩니다.

* 이 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.


if (data == 'q') { // Red 막대바를 조정했을 경우 해당 값에 맞게 LED를 조절 합니다.
      if (bufferPosition == 4) {
        redLight = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
        lightOn();
        redState = 1;
      } else if (bufferPosition == 3) {
        redLight = (buffer[0]-48)*10 + (buffer[1]-48);
        lightOn();
        redState = 1;
      } else if (bufferPosition == 2) {
        redLight = buffer[0] - 48;
        lightOn();

        if (redLight == 0) {
          redState = 0;
        } else {
          redState = 1;
        }
      }
    }

    if (data == 'w') { // Blue 막대바를 조정했을 경우 해당 값에 맞게 LED를 조절 합니다.
      if (bufferPosition == 4) {
        blueLight = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
        lightOn();
        blueState = 1;
      } else if (bufferPosition == 3) {
        blueLight = (buffer[0]-48)*10 + (buffer[1]-48);
        lightOn();
        blueState = 1;
      } else if (bufferPosition == 2) {
        blueLight = buffer[0] - 48;
        lightOn();

        if (blueLight == 0) {
          blueState = 0;
        } else {
          blueState = 1;
        }
      }
    }

    if (data == 'e') { // Green 막대바를 조정했을 경우 해당 값에 맞게 LED를 조절 합니다.
      if (bufferPosition == 4) {
        greenLight = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
        lightOn();
        greenState = 1;
      } else if (bufferPosition == 3) {
        greenLight = (buffer[0]-48)*10 + (buffer[1]-48);
        lightOn();
        greenState = 1;
      } else if (bufferPosition == 2) {
        greenLight = buffer[0] - 48;
        lightOn();

        if (greenLight == 0) {
          greenState = 0;
        } else {
          greenState = 1;
        }
      }
    }
    if (data == 'r') { // red LED가 꺼져있을 경우 키고, 켜 있을 경우 끕니다.
      if (redState == 0) {
        redLight = 128;
        redState = 1;
        lightOn();
      } else {
        redLight = 0;
        redState = 0;
        lightOn();
      }
      delay(150);
    }

    if (data == 'b') { // blue LED가 꺼져있을 경우 키고, 켜 있을 경우 끕니다.
      if (blueState == 0) {
        blueLight = 128;
        blueState = 1;
        lightOn();
      } else {
        blueLight = 0;
        blueState = 0;
        lightOn();
      }
      delay(150);
    }

    if (data == 'g') { // green LED가 꺼져있을 경우 키고, 켜 있을 경우 끕니다.
      if (greenState == 0) {
        greenLight = 128;
        greenState = 1;
        lightOn();
      } else { 
        greenLight = 0;
        greenState = 0;
        lightOn();
      }
      delay(150);
    }

    if (data == 'd') { // LED를 랜덤으로(RGB 조합을 랜덤으로 섞는다) 반복합니다.
      byte data1 = 10;
      do {         
        if (BTSerial.available()) {
          data1 = BTSerial.read();
        }

        if (data1 == 10) {
          setLight(random(1, 256), random(1, 256), random(1, 256));
          lightOn();
          delay(300);
        } else {
          break;
        }
      } 
      while (1);
      setState(1, 1, 1);
    }

    if (data == 'o') { // LED를 모두 끕니다.
      setState(0, 0, 0);
      setLight(0, 0, 0);   
      lightOn();   
      delay(150);
    }

    if (data == 't') { // 현재 LED 의 RGB값을 안드로이드로 보냅니다.
      BTSerial.print(redLight);
      BTSerial.print(',');
      BTSerial.print(blueLight);
      BTSerial.print(',');
      BTSerial.println(greenLight);
    }   

    if (data == '\n') // 명령이 다 들어왔을 경우 버퍼 위치를 초기화 합니다.
    {
      bufferPosition = 0;
    }


안드로이드에서는 q, w, e, r, g, b, d, o, t을 보냅니다. 스케치에서 이 데이터를 받게 되면 각 명령에 맞는 동작을 실행 합니다.

이 스케치에서는 막대바를 조절 했을 때의 해당하는 값을 한글자씩 받아 버퍼에 저장하여 전부다 들어왔을 때 버퍼에 저장된 데이터를  가지고 값을 확인 합니다.
(블루투스 통신을 하게되면 한번에 한글자씩 데이터를 받게 됩니다.)

랜덤의 경우 1~255까지의 값을 random함수를 사용하여 0.3초마다 무작위로 불을 킵니다.

판다마니아

아두이노, LED, 블루투스, 안드로이드