코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-10-08 14:17:08
본 튜토리얼에서는 http://kocoafab.cc/k-download 에 공개된 안드로이드 채팅 어플리케이션으로 오렌지보드 BLE와 안드로이드 디바이스 간에 간단하게 메시지를 송수신 해보겠습니다.
여러분은 채팅 예제를 통해, 안드로이드 디바이스에서 오렌지보드 BLE로 명령을 내려주거나, 반대로 오렌지보드 BLE 에서 전송되는 데이터를 안드로이드 디바이스에서 수신하는 등의 통신 방법을 배우실 수 있습니다.
먼저 블루투스 4.0 (Bluetooth Low Energy: BLE)에 대하여 간단히 알아보도록 하겠습니다.
블루투스 4.0은 저전력 관점에서 설계되어 베터리 소모가 매우 적습니다. IoT 환경에서 짧은 베터리 수명은 항상 이슈가 되었기 때문에 이러한 문제점을 보완한 기술입니다.
블루투스에 대하여 찾아보면, LOW ENERGY, SMART, SMART READY 같은 단어가 눈에 띄는데요. LOW ENERGY가 SMART로 이름이 변경되었다고 보시면 됩니다. 그리고 SMART(4.0: 싱글 모드) 또는 SMART READY(3.0 이하 + 4.0: 듀얼 모드) 는 블루투스 SIG 인증을 받은 제품에 붙일 수 있는 블루투스 브랜드로 인증 마크 정도로 보시면 됩니다.
블루투스 4.0 기술은 3.0 이하를 대체하는 기술이 아닙니다. 블루투스 4.0은 저전력 관점에서 재설계되어, 베터리 소모를 최소화하는 대신에 데이터 전송 효율을 낮추었습니다. 그렇게 때문에 음성이나 오디오와 같은 실시간의 빠른 데이터 전송에는 적합하지 않습니다. (단, 4.2 이상에서는 4.0 대비 수배나 빨라져 그 활용도는 더욱 높아질 것입니다.)
아래 그림에서 보시는 것과 같이 기존 블루투스 클래식(3.0이하: Classic)과 블루투스 스마트(4.0: SMART or LOW ENERGY)와는 활용 범위가 다릅니다.
오렌지보드 BLE는 주변 장치 (Peripheral) 모드로 동작하며, 안드로이드 디바이스는 중앙 장치(Central) 모드로 동작합니다. 아래 그림을 보시면 두 가지의 모드가 서로 어떻게 동작하시는지 쉽게 이해하실 수 있습니다.
1. 중앙장치(Central)에서는 블루투스 기능이 ON으로 설정되면, 주변장치(Peripheral)로 부터 들어오는 Advertisement 메시지를 수신하여, 주변장치의 정보(이름, 장치 고유 ID, 프로파일)를 획득합니다. 여러분이 채팅 앱을 실행하고, 우측 상단의 “연결" 버튼을 누르면 동일한 동작을 수행합니다.
2. 주변장치(Peripheral)에서는 블루투스 기능이 ON으로 설정되면, 중앙장치로 부터 검색될 수 있도록 Advertisement 메시지를 송신합니다. 오렌지보드 BLE에 전원이 들어오면 동일한 동작을 수행합니다.
3. 중앙장치(Central)에서 주변장치가 검색되면, 연결을 요청을 할 수 있습니다. 채팅 앱에서 오렌지보드 BLE가 검색이 되면, 클릭하세요. 그러면 채팅 앱에서 오렌지보드 BLE로 연결요청을 보내고 연결이 맺어집니다.
4. 연결이 되었다면 중앙장치(Central)와 주변장치(Peripheral)에서 서로 간에 데이터를 보내고 받을 수 있는 상태가 된 것입니다. 채팅 창이나 시리얼 모니터에서 메시지를 입력해보면 메시지가 전달되는 것을 확인하실 수 있습니다.
다음은 아두이노 소스코드 입니다.
// 블루투스 통신을 위한 SoftwareSerial 라이브러리
#include <SoftwareSerial.h>
// SoftwareSerial(RX, TX)
SoftwareSerial BTSerial(4, 5);
void setup() {
Serial.begin(9600);
Serial.println("Hello! OrangeBoard");
BTSerial.begin(9600);
}
void loop() {
// 블루투스로 부터 수신된 데이터를 읽는다.
if (BTSerial.available()) {
char buf[20];
Serial.print("recv: ");
// 블루투스로부터 데이터를 수신한다.
byte len = BTSerial.readBytes(buf, 20);
// 수신된 데이터를 시리얼 모니터에 출력한다.
for (int i = 0 ; i < len ; i++) {
Serial.write((byte)buf[i]);
}
Serial.println();
}
// 시리얼 모니터로 부터 입력 받은 데이터를 블루투스로 송신한다.
if (Serial.available()) {
char buf[20];
byte len = Serial.readBytes(buf, 20);
for (int i = 0 ; i < len ; i++) {
BTSerial.write((byte)buf[i]);
}
// 입력받은 데이터 길이가 20보다 작다면 20byte를 end of text문자열로 송신 버퍼를 채워준다.
if (len < 20) {
for (int i = len ; i < 20 ; i++) {
BTSerial.write(0x03);
}
}
Serial.print("send: ");
for (int i = 0 ; i < len ; i++) {
Serial.write((byte)buf[i]);
}
Serial.println();
}
}
코드벤더 IDE의 왼쪽 상단의 소스 이름을 클릭하면, 코드벤더 전체 IDE를 확인가능하며, 우측 상단에 시리얼모니터 버튼이 있습니다.
이 버튼을 클릭하여 시리얼모니터를 활성화 시킵니다.
또는 아래와 같이 아두이노 IDE의 시리얼모니터나 채팅창에서 메시지를 입력해보세요.
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!