고급 예제

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

(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

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

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

이재기 2015-04-28 10:31:37

안드로이드 소스파일을좀 구할 수 있을까요..?

이지현 2015-11-16 10:43:53

안드로이드 소스 파일 보내주실수 있으신가요? 공부할 때 참고하려구요
shah1994@naver.com

박태용 2015-11-23 19:53:42

안드로이드 소스 파일 보내주실수 있나요?ㅠㅠ
보내주시면 정말 좋은 참고가 될 것 같습니다 ㅠㅠ
pty5656@gmail.com

이영재 2015-11-26 23:30:15

안녕하세요~ 참조하면서 공부하고있는 공대생입니다
안드로이드 소스파일을 알고싶어서 그런데
babo0992@naver.com 보내주시면 정말 감사하겠습니다!

이정안 2016-02-24 03:29:10

안드로이드 소스파일을좀 구할 수 있을까요..?
jacomyl@gmail.com

대식 2016-05-12 02:46:17

안녕하세여 공부하는데 알고싶은 소스같은데 혹시 알수 있을까요 ?? kimde46@naver.com 입니다

탁혜진 2016-05-27 16:52:49

혹시 안드로이드 소스파일 구할 수 있을까요??
thj0905@naver.com 입니다.

조용현 2016-05-31 19:02:59

좋은 자료 감사드려요~
통신연결 공부하고있는데 안드로이드 소스 참고해서 공부하고싶습니다
소스좀 보내주실수 있을까요? 메일은 jjkws1234@naver.com 입니다.
감사드립니다!

윤태웅 2016-07-11 21:18:41

안녕하세요 좋은 자료 감사합니다.
참고할 부분이 있는데 안드로이드 소스 좀 부탁드리겠습니다.
inspo@nate.com

감사합니다.

김정욱 2016-07-19 10:20:58

안녕하십니까! 좋은 글 감사합니다!!
저도 어플 소스를 좀 보내주시면 도움이 많이 될 것 같습니다!!
kimmail93@naver.com 로 시간이 가능하실 때 보내주시길 바랍니다!
감사합니다!!!

박기담 2016-08-12 12:42:53

안녕하세요 안드로이드 공부를 하고 있는 컴공과 학생입니다. 조심스럽게...실례가 안된다면 BT_Button.apk 소스 코드를 공유받을수 있을까요? 독학으로 하고 있는데 아직 모르는 것이 많아 많이 답답한 상황에 정말 큰 힘이 될것 같습니다. rkdgus81576@naver.com 입니다

강상호 2016-09-12 14:15:58

안녕하세요
이번에 아두이노 관련 프로젝트를 하고 있습니다.
이번 예제의 안드로이드 소스코드를 보면서 공부하고 싶습니다.
sh21kang@naver,com 으로 안드로이드 소스좀 부탁드립니다.

최유란 2016-10-11 18:16:21

안녕하세요 무선인터넷을 이용해서 led를 제어하려고 하는데 어플소스가 필요해서 그런데 ㅠㅠ
dbfks0177@naver.com 으로 시간 있으시면 어플소스 좀 보내주시면 정말정말 감사하겠습니다 꼭 좀 부탁드립니다. ♡

윤현욱 2016-10-26 13:08:15

안녕하세요 블루투스로 안드로이드에서 아두이노 LED 제어를 연습하고 싶은 학생입니다 혹시 가능하시다면 어플소스를 받아볼 수 있을까요? john9231@naver.com 입니다. 감사합니다.

강한솔 2016-11-18 15:48:53

안녕하세요!! 아듀이노공부하고 있는 대학생 입니다.
이번 예제의 안드로이드 소스코드를 보면서 공부하고 싶습니다.
gksthfdldldl@naver.com 으로 안드로이드 부탁드려도 될까요?? ㅠㅠ 감사합니다!!!

김남렬 2017-02-14 03:03:11

안녕하세요! 아두이노와 안드로이드를 공부하고 있는 대학생입니다.
블루투스로 어플을 이용해 led를 제어하는 어플 소스를 얻고자 합니다 ㅠㅠ
안드로이드 어플 소스를 kaee4@naver.com 으로 보내주시면 감사하겠습니다!

kyu 2017-03-27 17:28:10

안녕하세요. 아두이노를 이용해 졸업작품을 만들고 있습니다

안드로이드 소스 코드 부분이 궁금해서 그런데 소스 코드좀 보내주시면 감사하겠습니다..

tigerk9212@gmail.com

kthhit 2017-04-21 15:13:23

안녕하세요 아두이노와 안드로이드를 공부하고 있는 대학생입니다.
이 어플리케이션 소스코드를 참고하여 공부하고 싶습니다.
공유해주실수 있다면 kthhit@naver.com 으로 보내주시면 감사하겠습니다!

kthhit 2017-04-21 15:13:56

안녕하세요 아두이노와 안드로이드를 공부하고 있는 대학생입니다.
이 어플리케이션 소스코드를 참고하여 공부하고 싶습니다.
공유해주실수 있다면 kthhit@naver.com 으로 보내주시면 감사하겠습니다!

위버 2017-04-23 20:39:57

안녕하세요 현재 전공수업에서 아두이노를 배우고 있는 학생입니다.
어플리케이션 소스 코드를 알려주실 수 있으신가요??
알려주실 수 있으시면 dpswpf97@gmail.com으로 부탁드립니다. 감사합니다

gkshsh 2017-06-09 00:09:20

안녕하세요, 아두이노와 안드로이드를 공부하고 있는 학생입니다.
안드로이드 소스코드를 참고하여 공부하고 싶습니다.
혹시 공유해주실 수 있다면 tjdrnr962@naver.com으로 보내주시면 감사하겠습니다!!.

skehroqkf 2017-08-18 14:46:09

안녕하세요 아두이노와 안드로이드 통신을 공부중인 학생입니다. 안드로이드에서 데이터 수신받는 소스가 너무 궁금합니다 메일로 보내주실수 있을까요? jsm119jsm@naver.com 부탁드립니다

jongwan 2018-06-07 21:47:41

아두이노와안드로이드통신을공부하고있습니다 안드로이드소스부탁드리겠습니다 op1201@naver.com

지구 2018-06-25 22:15:43

안드로이드 소스파일 받을 수 있을까요?? 부탁드리겠습니다!! 9721005@naver.com

안드로이드창시자 2018-11-15 03:33:38

안드로이드 소스파일을 응용해보고 싶습니다! junwoo9559@naver.com

김용준 2018-12-02 22:53:09

임베디드 시스템 공부하고 있는 학생입니다.
어플 소스 부탁드립니다
yog0810@naver.com

LIM 2018-12-07 14:05:10

안녕하세요 안드로이드를 공부하는 대학생입니다. 혼자 프로젝트를 진행하다가 좋은 자료를 본거같아서 이렇게 글을 남깁니다. 앱의 소스코드를 참고 하고 싶습니다. cryatsr00@naver.com으로 보내주신다면 감사하겠습니다. 부탁드립니다.

이은애 2019-03-12 14:56:14

안녕하세요 졸업작품때문에 어플제작을 하려합니다. 이쪽을 저혼자 맡고있는지라 소스가 필요한데 보내주시면 감사하겠습니다.
jing6175@kpu.ac.kr

구르미 2019-06-24 02:44:26

안녕하세요. 지금 아두이노와 안드로이드 통신 공부를 하고 있는 학생입니다. 혹시 안드로이드 코드를 받을수 있을까요??
qkrwnsgh741@naver.com 메일입니다.
보내주신다면 감사하겠습니다.

몽키몽키매직 2019-08-06 19:53:44

안녕하세요 어플공부하고 있는 대학생입니다. 통신에 관련해 현재 문제점이 생겨 어려움을 겪고있는데
만드신 어플의 소스코드를 보고 문제점을 찾고싶습니다. 혹시 보내주실 수 있을까요
aldzl6797@naver.com으로 보내주시면 정말 ! 감사하겠습니다!

강준호 2019-08-14 13:41:10

안녕하세요 안드로이앱으로 아두이노를 제어하는 공부를 하고 있습니다.
어플의 소스코드가 있다면 조금 수정해서 제가 하려는 팬을 제어하는 것을 할 수 있을것같습니다.
junhofun456@naver.com 으로 보내주시면 정말 많은 도움이 될것같습니다. 감사합니다.

검케 2019-11-06 15:40:21

안녕하세요 안드로이드앱으로 아두이노를 제어하는 공부를 하고 있습니다.
어플의 소스코드가 있다면 조금 수정해서 led 밝기 제어하는 것을 할 수 있을것같습니다.
qudgus3348@naver.com 으로 보내주시면 정말 많은 도움이 될것같습니다. 감사합니다.

tkdtkd 2020-05-12 21:02:14

안녕하세요!!!시간이 많이 지났지만..!지금 안드로이드 앱으로 아두이노 제어하는걸 공부하고있습니다.
다름이 아니라 제가 안드로이드를 코딩하는데 자꾸 오류가 나서 ..혹시 fhdodl@naver.com으로 보내주신다면 열심히 공부해서 해보겠습니더ㅜㅠㅠ부탁드립니다! 감사합니다.!

아이 2020-05-28 00:50:02

안녕하세요!
졸업작품때문에 아두이노와 안드로이드를 공부하고 있는 학생입니다.
안드로이드 어플의 소스코드를 참고해서 보고싶은데 받을 수 있을까요?
psb04027@naver.com

이하은 2020-06-09 17:09:00

안녕하세요!! 안드로이드앱으로 아두이노 제어하는 공부를 하고있는 학생입니다!
다름이 아니라 혹시 어플 소스 받을 수 있을까요..??? gkdms509@naver.com 으로 보내주시길 부탁드립니다ㅠㅠㅠ

wjdhoon 2020-11-08 19:44:03

안녕하세요!
졸업작품때문에 아두이노와 안드로이드를 공부하고 있는 학생입니다.
안드로이드 어플의 소스코드를 참고해서 보고싶은데 받을 수 있을까요?
wjdhoon@naver.com

시작이반 2021-02-05 07:33:43

안녕하세요, 스스로 안드로이드 어플을 만드려고 하는데, 힘든점이 많아
안드로이드 소스코드를 부탁드리려고 답글 남깁니다.
아래 메일로 자료 보내주신다면, 정말 감사드리겠습니다.
cogksmf153@naver.com