고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

(2)안드로이드x아두이노 블루투스 통신- LED 제어

2015-03-18 17:23:20

개요

 

* 이 컨텐츠를 보시기 전에 안드로이드와 아두이노 간의 블루투스 통신 기초를 보고 오시기 바랍니다.

 

안드로이드와 아두이노 간의 불루투스 통신 기초에서 아두이노 블루투스 모듈을 이용하여 안드로이드와 블루투스 통신을 해보았습니다. 이제부터 간단한 예제들을 통해서 아두이노의 각 부품들을 제어해 보겠습니다.

 

지난번 컨텐츠에서는 버튼 하나로 아두이노의 LED를 깜박이는 예제를 실습해보았습니다. 이번 컨텐츠에서는 아두이노에서 3색 LED를 연결하고 안드로이드에서 3가지 색을 각각 제어하는 예제를 실습해 보겠습니다.

 

 

 

 

부품 목록

 

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

 

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

 

 

하드웨어 Making

 

회로도

 

브레드보드 레이아웃

 

 

소프트웨어 Coding

 


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


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

int redLed1 = 10;  
int blueLed1 = 11;
int greenLed1 = 9;
// 각각의 LED와 연결된 핀번호

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

int redLight = 0;
int greenLight = 0;
int blueLight = 0;
// 각 색상의 값을 저장 한다.

void setup () {
  pinMode(redLed1, OUTPUT);
  pinMode(blueLed1, OUTPUT);
  pinMode(greenLed1, 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 == '\n' || data == 'x') // 명령이 다 들어왔을 경우 버퍼 위치를 초기화 합니다.
    {
      bufferPosition = 0;
    }
  }
}

void lightOn() {  // 3개의 LED 밝기를 조절 하는 함수
  analogWrite(redLed1, redLight);
  analogWrite(blueLed1, blueLight);
  analogWrite(greenLed1, 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;
}


 

 

소프트웨어 설명

 

아두이노에 블루투스 모듈을 연결하고 안드로이드에서 블루투스 페어링 하는 방법은 이전 컨텐츠 '안드로이드와 아두이노 간의 블루투스 통신 기초 - 1.LED불 깜박이기'  에서 소프트웨어 설명을 보시기 바랍니다.

 

안드로이드에서 블루투스 모듈과 페어링 하셧으면 안드로이드 어플(BT_3LED.apk)을 받으셔서 설치 하신 후 실행하셔서 블루투스 연결까지 하셧으면 밑의 사진과 같이 화면이 나옵니다.

 

Red, Green, Blue 버튼은 각각 색깔을 중간값(128)으로 키거나 128일 경우 0으로 꺼줍니다. 밑의 막대바는 선택된 값으로 해당 색깔을 조정합니다.

(데이터 전송시 오류로 길게 슬라이드 하면 제대로 값이 전송이 안됩니다. 터치로 값을 맞추신 후 조금씩만 슬라이드로 이동하셔야 정상 작동 합니다.)

 

 

 

    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;
        }
      }
    }

 

안드로이드에서 막대바를 조정하면 해당 막대바의 값과 그 뒤에 색깔에 맞는 문자값(빨간색 - q, 파란색, - w, 녹색 - e)을 합쳐서 보냅니다.(EX : 150q -> 빨간색 150) 아두이노에서는 블루투스를 통해 한글자씩 데이터를 읽어서 해당 값이 q, w, e일 경우 앞에 있는 숫자를 읽어서 해당 값만큼 LED의 밝기를 조정합니다.

 

* 블루투스를 통해 데이터가 전송될 때 모두 문자 형태로 넘어오니 이를 숫자로 바꾸기 위해서는 -48을 빼주시면 됩니다.(밑의 아스키코드표를 참고하시면 숫자 0일 때 ASCII 코드값이 48입니다. 다시 말하면 '0'을 보내면 아두이노에서 읽을 때 48이 들어옵니다.)

출처 : http://skmagic.tistory.com/entry/ASCII-%EC%BD%94%EB%93%9C%ED%91%9C

 

이렇게 한자리씩 숫자로 바꿔서 자리수를 맞춰주면 안드로이드에서 보낸 값을 읽을 수 있습니다.  현재 버퍼의 크기(bufferPosition)을 이용하면 안드로이드에서 보낸 숫자의 자릿수를 확인할 수 있으니 이를 이용해서 몇자리인지 확인 후 제일 먼저 받은 숫자부터 자리수 만큼 곱해서 더해줍니다.

* 안드로이드에서 3자리 숫자를 보낼 경우 255q 가 날라오게 됩니다. q를 인식했을 때 총 4개의 문자가 날라왔으니 bufferPosition이 4일 경우는 3자리의 숫자가 날라오게 되는것입니다. 두자리도 마찬가지로 bufferPosition이 3일 경우가 되죠

 

이 컨텐츠를 응용하여 아두이노의 다른 부품을 제어하실 경우 위 막대바부터 q, w, e값이 기준이 되니. 위에서 숫자를 받는 코드를 참고하셔서 받은 숫자와 문자값을 이용해 제어하시면 됩니다.

(안드로이드 어플을 수정하실 수 있으셔서 어플에 대한 코드가 필요하신 분은 댓글로 문의 남기시면 직접 보내드립니다.)

* 다음 컨텐츠에서는 아두이노에 서보모터를 연결하여 안드로이드에서 버튼 + 기울기를 이용하여 각도를 제어해 보겠습니다.

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

블루투스모듈, 아두이노, 오렌지보드