1편 HC-06 블루투스 모듈을 설정하는 방법에 이어서 이번에는 안드로이드에 연동하는 방법에 대하여 공유하겠다. 

아래는 HC-06 모듈을 달고 있는 아두이노로 메세지를 보내면 그것을 되돌려 받는 안드로이드 앱의 스샷이다.

구글 플레이 스토어 앱 : https://play.google.com/store/apps/details?id=kr.re.Dev.BluetoothEcho

Github 안드로이드 프로젝트 소스 : https://github.com/ice3x2/HC-06_Arduino_Echo


  우선 안드로이드에서 블루투스를 시리얼 포트 모드로 이용하기 위한 간단한 모듈을 작성 하였는데, 관련 내용은 이 포스팅에서 볼 수 있다.






동작하는 원리는 아주 간단하다. 그냥 안드로이드에서 문자열을 보내면 아두이노에서 잠깐 버퍼에 저장했다가 그대로 되돌려 주는 방식이다.

  다만, Android 의 자바에서는 String 객체를 byte 배열로 바꾸게 되면 문자열 끝을 구분하기 위한 널 포인터 문자 '\0' 이 포함되지 않는다. 그래서 문자열을 아두이노로 전송하는 시점에 직접 널 포인터 문자 '\0' 을 추가하여 아두이노에서 문자열 메시지의 끝을 구분할 수 있도록 하였다.

 (예를들어 Hello~!! 를 입력하고 아두이노로 보내기 전에 Hello~!!\0  와 같은 형태로 문자열 끝에 \0 을 붙인다는 이야기다.)

이제 아두이노의 스케치 코드를 살펴보겠다.

#include <SoftwareSerial.h>

// Digital Pin 2
#define rxPin 2 
// Digital Pin 3
#define txPin 3 
// 내장 LED
#define ledPin 13 

// 데이터(문자열)을 받을 버퍼의 크기.
#define BUFF_SIZE 256 

SoftwareSerial swSerial(txPin, rxPin);

// 데이터 버퍼
uint8_t buffer[BUFF_SIZE];
uint8_t index = 0;
uint8_t data;

void setup() {
  swSerial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, LOW);
  // 데이터가 들어올때 까지 대기.
  while(!swSerial.available());
  digitalWrite(ledPin, HIGH);
  while(swSerial.available()) {
    data = swSerial.read();
    buffer[index++] = data;
    // 버퍼가 꽉 찼거나 문자열이 끝났을 때,
    // 루프에서 나간다.
    if(index == BUFF_SIZE || data == '\0') break;
    // 9600bps 기준으로 delay 를 1ms 을 줘야 한다.
    delay(1);
  }   
  // 블루투스를 통하여 받은 데이터를 되돌려준다.
  for(uint8_t i = 0; i < index; ++i) {
    swSerial.write(buffer[i]);
  }
  index = 0;
}

 

 아주 간단하다. 그냥 데이터가 들어오면 버퍼에 쌓았다가 한꺼번에 전송하는 방식이다. 다소 비효율적이지만 추후에 진행할 프로젝트에서 문자열이나 1바이트 이상의 명령어들을 처리하기 위하여 이런 방법으로 구현하였다.


  사용하고 있는 블루투스 모듈과 아두이노와의 연결 방법이다.

  참고로, 위 회로는 예제에 불과하고 여러 타입의 블루투스 모듈이 있으니 각각 모듈에 맞게 연결해 줘야한다.

   


 

Posted by 범 범2

댓글을 달아 주세요

  1. 2014.07.03 21:03 Address Modify/Delete Reply

    비밀댓글입니다

    • 범 범2 2014.07.04 21:26 신고 Address Modify/Delete

      참, 제가 한 가지 빠뜨린 사실이 있는데요, 제가 작성한 소스 코드는 소프트웨어 시리얼을 사용합니다. 네이티브 시리얼 통신 포트보다 느린 소프트웨어 시리얼 통신을 사용하여 데이터를 가장 빠른 115200 속도로 주고 받으면 타이밍 문제로 싱크가 맞지 않아 데이터가 제대로 전송되지 않는 문제가 발생할 수 있습니다.
      해결 방법은 https://learn.sparkfun.com/tutorials/using-the-bluesmirf/example-code-using-command-mode 이 페이지에 나와있는 코드를 이용하여 bluetoothmate 의 전송 속도를 9600 으로 바꿔주거나, 또는 기존의 시리얼 통신 포트를 이용하는 방법이 있어요.
      누구나 처음에는 예제 소스 짜집기로 시작합니다. 예제 소스 짜깁기를 하더라도 단 한 줄이라도 이해하면서 한다면 점차 코드를 스스로 짤 수 있는 능력을 갖추게 될거에요

  2. 2014.07.03 21:03 Address Modify/Delete Reply

    비밀댓글입니다

    • 범 범2 2014.06.28 00:41 신고 Address Modify/Delete

      안녕하세요.
      꼭 HC-06 이 아니라도 시리얼 통신이 가능한 (RX, TX 단자가 있는) 모든 블루투스 모듈에서 사용 가능합니다.
      안드로이드와 블루투스 모듈과 정상적인 커넥션은 되었지만 데이터 송수신이 안 된다는 것은 아두이노와 블루투스 모듈간의 연결에 문제가 있을 가능성이 높습니다. 제가 공개한 아두이노쪽 코드를 고현주님께서 사용 하시는 블루투스 모듈에 맞게 수정해서 사용해 주세요.

      예를들어 블루투스 모듈의 RX 단자를 디지털 I/O 핀 2번에,
      TX 단자를 디지털 I/O 핀 3번에 연결하시고 (Sofrtware 시리얼 대신에 기본 시리얼을 사용해도 상관 없습니다.)
      begin 함수로 시리얼 보 레이트 초기화시 9600 에서 bluetoothmate 의 기본 값인 115200 으로 바꿔보세요.

  3. 김병주 2014.11.03 16:45 신고 Address Modify/Delete Reply

    아두이노 우노에 hc-06 모듈을 쓰지않고 아두이노 브루노에 하면 tx rx는 어떻게 처리하죵???ㅠㅠ

    • 범 범2 2014.11.03 16:59 신고 Address Modify/Delete

      위 코드에서 SoftwareSerial swSerial(txPin, rxPin); 를 지워버리고,
      모든 swSerial 를 그냥 Serial 로 바꿔주세요.
      참,

      swSerial.begin(9600);



      Serial.begin(115200); 으로 바꿔주세요.

      또는 아두이노 브로노는 전용 코드를 사용해보세요.
      https://github.com/DFRobot/BlunoBasicDemo



  4. won 2015.11.13 20:14 신고 Address Modify/Delete Reply

    hc-06에서 데이터를전송해서 hc 06이 연결되어 있는 아두이노에서 받을 수 있나요?

    • 범 범2 2015.11.17 08:36 신고 Address Modify/Delete

      HC-06 은 슬레이브 모드만 지원하므로 서로 연결할 수 없습니다. 마스터 모드를 지원하는 HC-05를 사용하세요.

  5. 2016.03.19 01:45 Address Modify/Delete Reply

    비밀댓글입니다

  6. 2016.05.01 18:07 Address Modify/Delete Reply

    비밀댓글입니다

  7. 송씨 2016.07.15 11:06 신고 Address Modify/Delete Reply

    저 아두이노 우노를 쓰지않고 프로 미니를 쓰는데 바꾸는건 어떻게 처리합니까?