고급 예제

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

안드로이드x 아두이노 - 블루투스 통신 응용

2014-08-08 17:21:00

개요

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


이전 컨텐츠에서 아두이노 블루투스 쉴드를 연결 하여 안드로이드와 블루투스 통신을 해보았습니다. 그것을 응용하여 안드로이드로 각각의 부품을 제어해 봅시다.

(여기서는 피에조 부저 모듈(KY-006), LED(red, yellow, green), 서보모터(SG90)를 사용하였습니다.)
 

 

 

미리보기 동영상

 

 

 

부품목록

NO 부품명 수량 상세설명
1 아두이노 우노 R3 1 아두이노
2 블루투스 모듈(HC-05) 1 블루투스
3 피에조 버저 모듈(KY-006) 1 피에조
4 서보 모터(SG90) 1 서보 모터
5 Green LED 1 LED
6 Yellow LED 1 LED
7 Red LED 1 LED
8 330Ω 저항 3 저항
9 점퍼케이블 17 점퍼케이블
10 브레드 보드 1 브레드보드

 

 

 

부품명 아두이노 우노 R3 블루투스 모듈(HC-05) Red LED Yellow LED Green LED
파트 x1 x1 x1 x1 x1
부품명 피에조 버저 모듈(KY-006) 서보 모터(SG90) 330Ω 저항 점퍼케이블 브레드보드
파트 x1 x1 x3 x17 x1

 

 

 

하드웨어 making

회로도


 

브레드보드 레이아웃


소프트웨어 coding

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

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

Servo myservo; // 서보를 제어할 서보 오브젝트를 만듭니다.

int buzzer = 8 ;  // 피에조 보저와 연결된 핀번호
int redLed = A0;  
int yellowLed = A1;
int greenLed = A2;
// 각각의 LED와 연결된 핀번호

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

void setup (){
  pinMode(redLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode (buzzer, OUTPUT) ; // LED와 피에조 부저를 출력모드로 설정
  myservo.attach(9); // 서보모터를 9번 핀에 연결
  analogWrite(buzzer, 255);  // 피에조 부저를 끈 상태로 시작
  
  BTSerial.begin(9600);
  Serial.begin(9600);
  bufferPosition = 0; // 버퍼 초기화  
}

void loop (){
  if (BTSerial.available()){ // 블루투스로 데이터 수신
    byte data = BTSerial.read();
    Serial.write(data); // 수신된 데이터 시리얼 모니터로 출력
    buffer[bufferPosition++] = data; 
    
    // 안드로이드 프로그래밍시 1(red버튼), 2(yellow버튼), 3(green버튼), 4(up버튼), 5(down버튼), 6(right버튼), 7(left버튼)으로 정함
    // 각각 버튼 눌렀을시 그 버튼에 맞는 숫자(char형)가 전송 된다/
    // 이제부터 나오는 if문은 
    if(data == '1'){ // red 버튼을 눌렀을 경우
      if(redState == 0){ // red LED가 꺼져 있을 경우
        digitalWrite(redLed, HIGH); // red LED의 불을 킴
        redState = 1; // red LED의 상태를 켜진 상태로 세팅
        delay(150);
      }
      else{ // red LED가 켜져 있을 경우
        digitalWrite(redLed, LOW); // red LED를 끈다.
        redState = 0; // red LED의 상태를 꺼진 상태로 세팅
        delay(150);
      }
    }
    
    if(data == '2'){ // yellow 버튼을 눌렀을 경우
      if(yellowState == 0){ // yellow LED가 꺼져있을 경우
        digitalWrite(yellowLed, HIGH); // yellow LED의 불을 킨다.
        yellowState = 1; // yellow LED의 상태를 켜진 상태로 세팅
        delay(150);
      }
      else{ // yellow LED가 꺼져 있을 경우
        digitalWrite(yellowLed, LOW); // yellow LED를 끈다.
        yellowState = 0;  // yellow LED의 상태를 꺼진 상태로 세팅
        delay(150);
      }
    }
    
    if(data == '3'){  // green 버튼을 눌렀을 경우
      if(greenState == 0){ // green LED가 꺼져있는 경우
        digitalWrite(greenLed, HIGH);  // green LED의 불을 킨다.
        greenState = 1; // green LED의 상태를 켜진 상태로 세팅
        delay(150);
      }
      else{ // green LED가 꺼져 있을 경우
        digitalWrite(greenLed, LOW); // green LED의 불을 끈다
        greenState = 0; // green LED의 상태를 꺼진 상태로 세팅
        delay(150);
      }
    }
    
    if(data == '4'){ // up 버튼을 눌렀을 경우
        analogWrite(buzzer, 0);  // 피에조 부저의 소리를 킨다.
        delay(150);
      }
    
    if(data == '5'){  // down 버튼을 눌렀을 경우
        analogWrite(buzzer, 255);  // 피에조 부저의 소리를 끈다.
        delay(150);        
    }
    
    if(data == '6'){  // right 버튼을 눌렀을 경우
      if(servoState <= 150){  // 서보모터의 각도가 150이하일 경우
        servoState += 30; 
        myservo.write(servoState); // 서보모터의 각도를 30도 늘려 준다.
        delay(150);
      }
    }
    
    if(data == '7'){  // left 버튼을 눌렀을 경우
      if(servoState >= 30){ // 서보모터의 각도가 30도 이상일 경우
        servoState -= 30;
        myservo.write(servoState); // 서보모터의 각도를 30도 줄여 준다.
        delay(150);
      }
    }
  }
 }

 

 

 

소프트웨어 설명

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

우선 아두이노를 제어할 안드로이드 어플(BT_Button.apk)을 받으신 후, 실행 하면 밑에 그림(왼쪽)처럼 화면이 나옵니다.

맞는 블루투스 장치와 연결을 하게 되면 오른쪽 그림처럼 화면이 넘어가게 됩니다.

맨위에 3개의 버튼은 각각의 LED를 제어하고, 밑에 상하 2개의 버튼은(Up, Down) 피에조 부저 제어, 양옆 2개의 버튼은(Right, Left) 서보 모터를 제어합니다.
(맞지 않는 블루투스 장치를 연결 했거나, 취소를 눌렀을 시는 어플이 그냥 꺼집니다.)

 

 

 

 

 

 

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

블루투스 통신과, 서보모터 제어를 하기 위해서는 위의 두 라이브러리(SoftwareSerial, Servo) 가 필요합니다.

 

 

 

 

 

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

통신을 하기 위한 블루투스 모듈이 연결된 핀 번호와,  안드로이드로 부터 받은 데이터를 저장할 버퍼를 설정해 줍니다.

 

 

 

 

 

Servo myservo; // 서보를 제어할 서보 오브젝트를 만듭니다.

int buzzer = 8 ;  // 피에조 보저와 연결된 핀번호
int redLed = A0;  
int yellowLed = A1;
int greenLed = A2;
// 각각의 LED와 연결된 핀번호

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

각각 부품들이 연결된 핀번호를 설정하고, 부품들을 제어하기 위한 상태값을 만듭니다. 

 

 

 

 

 

  if (BTSerial.available()){ // 블루투스로 데이터 수신
    byte data = BTSerial.read();
    Serial.write(data); // 수신된 데이터 시리얼 모니터로 출력
    buffer[bufferPosition++] = data; 

안드로이드와 블루투스 통신이 가능하면, 안드로이드에서 보낸 데이터를 받아서 배열에 저장해 두고, 출력해 줍니다.

 

 

 

 

 

    // 안드로이드 프로그래밍시 1(red버튼), 2(yellow버튼), 3(green버튼), 4(up버튼), 5(down버튼), 6(right버튼), 7(left버튼)으로 정함
    // 각각 버튼 눌렀을시 그 버튼에 맞는 숫자(char형)가 전송 된다/
    // 이제부터 나오는 if문은 
    if(data == '1'){ // red 버튼을 눌렀을 경우
      if(redState == 0){ // red LED가 꺼져 있을 경우
        digitalWrite(redLed, HIGH); // red LED의 불을 킴
        redState = 1; // red LED의 상태를 켜진 상태로 세팅
        delay(150);
      }
      else{ // red LED가 켜져 있을 경우
        digitalWrite(redLed, LOW); // red LED를 끈다.
        redState = 0; // red LED의 상태를 꺼진 상태로 세팅
        delay(150);
      }
    }
    
    if(data == '2'){ // yellow 버튼을 눌렀을 경우
      if(yellowState == 0){ // yellow LED가 꺼져있을 경우
        digitalWrite(yellowLed, HIGH); // yellow LED의 불을 킨다.
        yellowState = 1; // yellow LED의 상태를 켜진 상태로 세팅
        delay(150);
      }
      else{ // yellow LED가 꺼져 있을 경우
        digitalWrite(yellowLed, LOW); // yellow LED를 끈다.
        yellowState = 0;  // yellow LED의 상태를 꺼진 상태로 세팅
        delay(150);
      }
    }
    
    if(data == '3'){  // green 버튼을 눌렀을 경우
      if(greenState == 0){ // green LED가 꺼져있는 경우
        digitalWrite(greenLed, HIGH);  // green LED의 불을 킨다.
        greenState = 1; // green LED의 상태를 켜진 상태로 세팅
        delay(150);
      }
      else{ // green LED가 꺼져 있을 경우
        digitalWrite(greenLed, LOW); // green LED의 불을 끈다
        greenState = 0; // green LED의 상태를 꺼진 상태로 세팅
        delay(150);
      }
    }

안드로이드에서 보내주는 데이터는 1~7번 까지 입니다. 각 숫자에 맞는 부품을 찾은 후 그에 맞는 제어를 해줍니다.
(순서 : 데이터를 가지고 부품을 찾는다 --> 해당 부품의 상태를 확인한다 --> 그 상태에 맞는 동작을 한다.)

1~3번 버튼은 LED 제어를 합니다.(1번 red, 2번 yellow, 3번 green) 각 LED의 상태를 보고 켜져있는 상태면 끄고(HIGH -> LOW), 꺼져있는 상태면 키게 됩니다.(LOW -> HIGH) 그리고 LED의 상태를 맞는 상태로 바꿔줍니다.

 

 

 

 

 

    if(data == '4'){ // up 버튼을 눌렀을 경우
        analogWrite(buzzer, 0);  // 피에조 부저의 소리를 킨다.
        delay(150);
      }
    
    if(data == '5'){  // down 버튼을 눌렀을 경우
        analogWrite(buzzer, 255);  // 피에조 부저의 소리를 끈다.
        delay(150);        
    }

4, 5번 버튼은 피에조 부저 모듈 제어를 합니다.(4번은 소리 키기(Up), 5번은 소리 끄기(Down)), 자신에게 맞는 데이터가 오면 analogWrite()를 이용하여 소리를 키거나 끕니다.
(피에조에 대해서는 여기를 참고하세요)

 

 

 

 

 

    if(data == '6'){  // right 버튼을 눌렀을 경우
      if(servoState <= 150){  // 서보모터의 각도가 150이하일 경우
        servoState += 30; 
        myservo.write(servoState); // 서보모터의 각도를 30도 늘려 준다.
        delay(150);
      }
    }
    
    if(data == '7'){  // left 버튼을 눌렀을 경우
      if(servoState >= 30){ // 서보모터의 각도가 30도 이상일 경우
        servoState -= 30;
        myservo.write(servoState); // 서보모터의 각도를 30도 줄여 준다.
        delay(150);
      }
    }

6, 7번 버튼은 서보 모터 제어를 합니다.(6번 키는 Right, 7번키는 Left). Right 키를 누르게 되면 각도를 30도 늘려 주고, Left키를 누르게 되면 각도를 30도 낮춰 줍니다.
(서보모터는 0~180도 까지만 가능 하기 때문에, Right키를 눌를 경우는 150도 이하만 , Left키를 눌를때는 30도 이상만 가능 하도록 해줍니다.)

 

kocoafabeditor

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

블루투스, 아두이노

오연화 2014-10-07 19:02:40

BT_Button.apk 어플을 받아서 한번 해보고 싶은데 없는 파일이라고 뜨네요..ㅜㅜ
혹시 어플 다운받을 수 있는 방법이 없을까요?

박정훈 2015-03-31 20:34:13

문의사항있어서 메일보냈습니다 ^^;;...확인좀부탁드려요

옺옺 2015-09-08 19:13:54

안녕하세요! 게시물이 정말 도움이 많이 되었습니다.! 너무너무 감사합니다!
다름이 아니라 이 게시물을 기반으로 졸업작품을 진행하고 있는 학생입니다!
혹시 민폐가 되지 않는다면 BT_Test.apk 소스를 공유 받고 싶습니다.
연락기다리겠습니다. 감사합니다.

호롱이 2015-12-10 19:47:28

안녕하세요 저는 프로그래밍에 대해서 공부하고 있는 대학생입니다.
공부하면서 참고해보고 싶은데 혹시 실례안된다면
kdw4150@naver.com 으로 소스 공유가 가능할까요....

권태영 2016-01-19 15:55:34

안녕하세요 코코아팹 덕분에 동아리 활동하는데 많은 도움을 받을 수 있었습니다.
다름이 아니라 위에 apk 소스를 공유 받고 싶어서요...
혹시 실례가 안된다면 rnjsxodud28200@daum.net으로 공유 받을 수 있을까요????
부탁드립니다.

효섭이 2016-04-02 00:42:47

안녕하세요 안드로이드 앱 공부하고 있는 학생입니다. 공부할때 참고해보고 싶은데 소스 공유 부탁드립니다!!
yoonah621@naver.com 으로 부탁드립니다!!

권말년 2016-04-22 14:46:44

수고하십니다~ 서보모터와 블루투스 관련된 앱을 만들려고하는데 대학생인데요! 이거와 관련된 공부를 좀 하고싶은데
소스공유좀 부탁드려도될까요? trx_scv@naver.com 입니다! 부탁드립니다!

후오카 2016-05-01 19:52:06

안녕하세요 현재 이 글과 비슷한 방법으로 졸업작품을 만들어야하는 대학생입니다.
이쪽으로는 지식이 별로 없어 블루투스연결소스와 버튼동작의 소스를 합치는 것이 어렵네요ㅠㅠ
실례가 되지 않는다면 BT_Button.apk의 소스를 radolvi@naver.com로 공유받고싶습니다..

이계완 2016-05-10 16:49:30

안녕하십니까 졸업작품에 참고하려고하는데 BT_Button.apk 의 소스좀 공유받을수 있을까요?
rpdhks681@naver.com 으로 부탁드립니다!!

박선영 2016-05-14 18:37:51

안녕하세요 졸업작품을 만들고 있는 학생입니다! 안드로이드와 아두이노를 배우고있는 단계라 아직 많이 부족해서서요ㅠㅠBT_Button.apk 소스 코드를 공유받을 수 있을까요?ㅠㅠ mina7737@naver.com 으로 부탁드립니다~!!

박선영 2016-05-14 18:37:56

안녕하세요 졸업작품을 만들고 있는 학생입니다! 안드로이드와 아두이노를 배우고있는 단계라 아직 많이 부족해서서요ㅠㅠBT_Button.apk 소스 코드를 공유받을 수 있을까요?ㅠㅠ mina7737@naver.com 으로 부탁드립니다~!!

윤민규 2016-05-26 19:48:02

안녕하세요 이번에 졸업작품을 만들고 있는 윤민규라고 합니다.. 안드로이드 앱으로 아두이노를 제어하는 것을 공부하고있는데 ㅠㅠ 해당 앱의 소스를 보면서 공부를 하고싶어서 이렇게 글을 남깁니다.. 정말 죄송하지만 저에게 큰 힘이 될수 있어서 꼭 부탁드립니다 alsrb3654@naver.com 입니다..

김도현 2017-01-20 16:43:38

안녕하세요 안드로이드 스튜디오 소스코드를 받고싶어서
죄송하지만 보내주시면 정말 감사하겠습니다
메일은 jjangalvin@naver.com 입니다
부탁드리겠습니다

김도현 2017-01-20 16:43:42

안녕하세요 안드로이드 스튜디오 소스코드를 받고싶어서
죄송하지만 보내주시면 정말 감사하겠습니다
메일은 jjangalvin@naver.com 입니다
부탁드리겠습니다

김정식 2017-03-24 11:49:48

안녕하세요
이번에 블루투스통신 공부를 하고 있는 대학생입니다.
죄송하지만 소스코드를 보고 참고하고 싶은데
죄송하지만 보내주실수 있으실까요?
메일은 cantona87@naver.com입니다.
부탁드리겠습니다.

mepisto 2017-05-05 14:16:09

안녕하세요 안드로이드와 아두이노를 공부하고 있는 학생입니다.
안드로이드 소스코드를 참고하고 싶은데 죄송하지만 보내주시면 감사하겠습니다.
메일은 apsxh65@gmail.com입니다.
부탁드리겠습니다

호로록 2017-05-24 17:15:50

안녕하세요. 안드로이드와 아두이노를 활용해서 프로잭트를 진행중입니다.
안드로이드 소스를 참고하고싶은데 소스를 받을수있을까요..
rlarnfkxjr@naver.com 입니다. 죄송합니다.

래퍼드 2017-05-29 15:28:17

안녕하세요. 안드로이드를 사용해서
공부하고잇는 학생입니다
소스를 참고하고싶습니다... 소스를 사용해도 되나요?
메일 ekfo453@naver.com 입니다. 부탁드립니다~~ ㅜㅜ

끼리 2017-06-15 00:04:23

안녕하세요 apk소스 좀 참고하고싶은데 공유받을수 없을까요? bando4166@naver.com입니다 부탁드립니다ㅠ

김준표 2017-08-10 11:59:52

안드로이드와 아두이노 프로젝트를 하고있는데 혹시 안드로이드 프로젝트 소스 파일이 필요한데 보내주실수 있으시나요? xjqh12@gmail.com 입니다 부탁드립니다.

윤주성 2017-09-01 14:32:35

apk소스를 참고하면 많은 도움이 될거 같은데 공유 가능할까요?? bestword1@naver.com 부탁드립니다.

최준호 2017-11-13 04:02:18

안녕하세요! 종합설계 관련하여 akp 소스 참고가 필요할 듯 합니다!! 공유 가능할까요?? premium501@naver.com입니다.. 부탁드리겠습니다!!!

hj 2018-02-13 11:39:13

안녕하세요 아두이노 프로젝트 준비하는 학생입니다. 안드로이드 akp 소스 공유 가능할까요? guwls555@hanmail.net 부탁드립니다...

Duby 2018-03-16 22:11:43

안녕하세요? 아두이노를 공부하는 학생입니다. 위에서 실습한 안드로이드 apk 소스 공유 부탁드립니다.
iupeace77@naver.com으로 부탁드립니다. 감사합니다.

주승호 2018-05-04 16:25:35

안녕하십니까 안드로이드스튜디오를 공부하는 학생입니다. 위 실습에서 사용하신 안드로이드 apk source를 나누어 주셨으면하여 댓글을 달아봅니다. wntmdgh100@naver.com입니다..

iot개발자 2018-05-26 17:52:05

안녕하세요 아두이노와 안드로이드를 공부하는 학생입니다. 실습을 위해 apk 소스 공유 부탁 드립니다.
woojin0417@naver.com로 공유해주시면 감사하겠습니다.

장민우 2018-09-18 18:25:53

안녕하세요
아두이노와 안드로이드를 블루투스 통신을 공부하는중 입니다. apk 소스 공유 부탁드립니다.
blueclover22@hanmail.net

김수지 2018-10-30 22:28:00

안녕하세요
아두이노와 안드로이드 간 블루투스 통신을 공부하고 있는 학생입니다. apk 소스 공유해주시면 감사하겠습니다. suji20th@naver.com

사타사타베이비 2018-11-23 14:07:32

안녕하세요 아두이노 블루투스 공부하고 있는 대학생입니다. apk 소스 공유가능하시면 보내주실수있을까요??ㅠㅠ chltkdfuf2@naver.com 꼭좀부탁드립니당^^

꽃련 2018-11-28 09:08:49

안녕하세요 아두이노 공부중인 학생인데요! apk 소스가 없어서요 공유좀 부탁드리겟습니다 wkdtnskfk@naver.com 꼭부탁드려요