티스토리 뷰

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바이트 이상의 명령어들을 처리하기 위하여 이런 방법으로 구현하였다.


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

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

   


 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함