아두이노와 안드로이드간의 블루투스 통신 [2]:: 에코 메세지 전달.
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바이트 이상의 명령어들을 처리하기 위하여 이런 방법으로 구현하였다.
사용하고 있는 블루투스 모듈과 아두이노와의 연결 방법이다.
참고로, 위 회로는 예제에 불과하고 여러 타입의 블루투스 모듈이 있으니 각각 모듈에 맞게 연결해 줘야한다.