고급 예제

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

안드로이드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

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

블루투스, 아두이노