Back Ground

아두이노 - 블루투스 본문

아두이노

아두이노 - 블루투스

Back 2016. 6. 22. 09:03



1.블루투스 통신



근거리 무선 통신 기술

http://www.bluetooth.com

블루투스 HC-06 모듈

3.3V에 연결





2-1.블루투스 HC-06 모듈 동작 테스트






스케치



/* Arduino Uno에는 UART(Universal Asynchronous Receiver Transmitter)

* 시리얼 통신을 위한 포트가 하나뿐이라 시리얼 연결을 사용하는

* 두 개 이상의 장치를 연결할 수 없다. 이런 한계를 보완하기 위해

* 아두이노는 소프트웨어적으로 가상의 UART 시리얼 포트를 생성하여

* 시리얼 통신을 지원하는 SoftwareSerial 라이브러리를 제공하고 있다.

* 소프트웨어 시리얼을 사용하기 위해 라이브러리를 include 해야 한다.

**/

#include <SoftwareSerial.h>

/* 소프트웨어 시리얼 포트를 사용하기 위해 선언하고 있다.

* SoftwareSerial(RX, TX) 형식으로 블루투스 모듈과 교차하여 연결된다.

* 블루투스 HC-06 모듈의 RX 핀에 연결된 디지털 8번은 아두이노 보드의

* TX 핀이 되고 블루투스 HC-06 모듈의 TX 핀에 연결된 디지털 7번은 아두이노

* 보드의 RX 핀이 된다. 블루투수 모듈을 초기화 하고 생성할 때

* BTSerial(RX, TX)의 첫 번째 인수로 블루투스 HC-06 모듈의 TX에 연결된

* 아두이노 보드의 RX 핀을 지정하고 두 번째 인수로 블루투스 HC-06 모듈의

* RX에 연결된 아두이노 보드의 TX핀을 지정하면 된다.

**/

SoftwareSerial BTSerial(7, 8);

// SoftwareSerial BTSerial = SoftwareSerial(7, 8);

void setup() {

// 컴퓨터와 시리얼 통신을 위한 하드웨어 통신포트 초기화

Serial.begin(9600);

// 블루투수 HC-06 모듈과 통신을 위한 소프트웨어 시리얼 통신포트 초기화

BTSerial.begin(9600);

}

void loop() {

/* 하드웨어 시리얼 통신 포트의 버퍼에 수신된 데이터가 존재하면

* 시리얼 모니터 --> 아두이노 보드 --> 블루투스 모듈

**/

if(Serial.available()) {

/* 시리얼 모니터로 부터 넘어온 "AT" 명령을 하드웨어 시리얼 통신 포트를

* 통해 아두이노 보드로 전달되고 아두이노 보드는 수신된 데이터를

* 1Byte씩 읽어 아두이노 보드의 소프트웨어 시리얼 전송 포트(TX)인

* 디지털 8번 핀을 통해 블루투수 HC-06 모듈의 RX 핀으로 전송하게 된다.

**/

byte b = Serial.read();

BTSerial.write(b);

}

/* 소프트웨어 시리얼 통신 포트의 버퍼에 수신된 데이터가 존재하면

* SoftwareSerial 클래스의 available() 함수는 Serial 클래스의 available()

* 함수와 마찬가지로 블루투스 모듈에서 사용하는 소프트웨어 시리얼

* 포트의 수신 버퍼에 저장된 데이터의 바이트 수를 반환한다.

* 버퍼에 데이터가 존재하지 않으면 0을 반환한다.

* 블루투수 모듈 --> 아두이노 보드 --> 시리얼 모니터

**/

if(BTSerial.available()) {

/* "AT" 명령을 받은 블루투스 HC-06 모듈은 응답 데이터인 "OK"를

* 아두이노 보드의 소프트웨어 시리얼 수신 포트(RX)인 디지털 7번 핀으로

* 보내고 아두이노 보드는 수신된 데이터를 1Byte씩 읽어 하드웨어

* 시리얼 통신 포트를 통해 시리얼 모니터로 보내 출력하게 된다.

**/

byte b = BTSerial.read();

Serial.write(b);

}

}


시리얼모니터에서 AT 명령어를 치면 OK라고 나온다.(성공)



이제 블루투스의 이름을 정해준다.

시리얼 모니터에 AT+NAMEmyfirstBT 이라고 써주면 블루투스는

OKsetname 이라고 응답하고, 이제 블루투스의 이름은 myfirstBT라고 스마트 폰에서 볼 수 있다. (이제 자신만의 이름을 정해서 블루투스에 이름을 붙여보자-연이어서 써주어야한다.)

* AT 명령어들


AT+PIN1234 : 블루투수 모듈의 비밀번호를 1111로 변경 (OKsetPIN으로 응답)

AT+BAUD4 : 통신속도를 변경(4–9600, 5–19200, 7-57600, 8-115200) OK9600으로 응답








2-2.블루투스가 없는 컴퓨터에 동글이 연결


이제 블루투스는 세팅이 끝났다.

컴퓨터의 장치관리자에서 블루투스 동글이를 세팅하자!

불행이도, 노트북이 아닌 데스크탑이라서 블루투스가 없다. ...쩝..

동글이(중국산)을 대충 붙이고, 네이버에서 Bluesoleil 이라고 치면, 평가판 드라이버가 나온다. 디립따 설치하자!

(재부팅을 해야 잘 설치가 되는 경우가 있다.)

(네이버 검색결과)

재부팅하고 나면 장치관리자에 블루투스가 올라온다.





블루투스 장치간의 통신을 위해서는 먼저 두 장치를 마스터-슬레이브 한 쌍으로 묶어 주는 페

어링(Pairing)이라는 과정을 거쳐야 한다. 블루투스 장치를 페어링 할 때는 보안 연결을 위해 암

호를 입력해야 페어링이 이루어지는 경우도 있으며 암호 입력 없이 페어링이 이루어지는 경우도

있다. 우리가 사용하는 블루투수 HC-06 모듈의 비밀번호는 “1234”, 통신 속도는 9600(Baud),

8비트 데이터 비트와 1비트의 정지 비트 그리고 패리티 비트 없음으로 설정되어 있다.



블루투수 HC-06 모듈과 컴퓨터를 페어링 해 보자. 먼저 블루투스 기능이 꺼져 있는지 확

인하기 위해 작업표시줄의 숨겨진 아이콘을 표시하는 화살표(▲)를 마우스로 클릭하면 숨겨진 아이콘들이 나타난다.

여기서 블루투스 아이콘이 꺼진 상태로 표시된다면 이 아이콘을 마우스로 클릭하거나

마우스 오른쪽 버튼을 클릭하여 메뉴를 선택해 블루투스 기능을 활성화 시킨다







이 화면 중앙에 위치한 공 모양의 노란색 아이콘을 더블클릭 하던가 마우스 오른쪽 버튼을 클릭

하여 나타난 컨텍스트 메뉴의 [장치 검색(D)]을 선택하면 프로그램이 연결 가능한 블루투스 장

치를 검색하여 “?”표 새겨진 아이콘이 생성된다. 이 아이콘을 마우스 오른쪽버튼을 클릭하여

[페어링]을 선택하면 보안 연결을 위해 페어링에 필요한 암호를 물어보는 화면이 나타난다.

  => 

HC-06 모듈의 암호인 “1234”를 입력하고 “확인” 버튼을 클릭하면 컴퓨터(마스터)와 블루투수 HC-06 모듈(슬레이브) 간의 페어링이 이루어진다.



이름 새로고침을 하면 장치이름도 나온다.



연결직렬포트를 확인해보자.(예 com6 연결됨)





2-3.컴퓨터에서 아두이노로 블루투스 연결을 테스트


회로와 스케치를 그대로 사용하고 아두이노에 장착된 블루투스

HC-06 슬레이브 모듈과 컴퓨터의 블루투수 동글을 통해 블루투수 통신으로 메시지를 주고는 것을 확인하자!

시리얼 모니터 2개를 사용해야 메시지를 주고받을 수 있으므로 컴퓨터와 아두이노 간의 메시지를 송/수신은 시리얼 모니터를 사용하고 컴퓨터와 블루투수 HC-06 슬레이브 모듈 간의 메시지 송/수신은 Hercules SETUP utility를 사용하여 실습한다.

Hercules SETUP utility는 http://www.hw-group.com/products/hercules/index_en.html

에서 다운받을 수 있다. 이 에뮬레이터는 다운로드 되는 파일이 실행 파일이므로 별도의 설치과

정 없이 바로 실행하여 사용할 수 있다.






아두이노는 Com3으로 연결, 블루투스는 COM6번으로 연결된 화면이다.


그림과 같이 아두이노와 컴퓨터가 USB 연결을 통해 COM3번 포트를 사용하고

블루투수 HC-06 모듈이 컴퓨터의 USB 포트에 장착한 블루투수 동글과 연결되어 COM6번 포트를 사용한다.


즉 시리얼 모니터에서 입력한 메시지가 COM3번 시리얼 포트를 통해 아두이노 보드로 전달되고 스케치 프로그램에서 작성한 프로그램에 의해 다시 블루투수 HC-06 모듈로 전달된 후 블루투스 무선 통신을 이용해 컴퓨터에 연결된 동글을 통해 컴퓨터로 데이터가 전달된다.

이 때 블루투스 동글로 수신된 데이터는 COM6번 시리얼 포트를 사용해 컴퓨터에서 데이터를 읽을 수 있다.

다시 말해 COM3번 시리얼 포트 통신은 아두이노에서 제공하는 시리얼 모니터를 사용해 메시지를 주고받고 COM6번 시리얼 포트의 통신은

Hercules SETUP utility를 사용해 메시지를 주고 받는다.




2번째 시트의 시리얼를 클릭하면, 오픈 메뉴가 보인다.



이 에뮬레이터를 처음 실행하면 UDP Setup 탭이 선택되어 있는데 그림과 같이 Serial 탭을 선택하고

그림에서와 같이 Serial 포트에 대한 정보를 설정한 후 “Open” 버튼을 클릭하여

메시지 출력 창에 “Serial pot COM6 Opened”라는 메시지가 출력되면 COM6번 포트에 정상적

으로 연결된 것이다.


그림과 같은 에러 메세지를 보았다면 COM포트 세팅을 안한 것이다.




이렇게 나오면 성공이다.



이제 연결된 Hercules SETUP utility에서 메시지를 보내면, 아두이노의 시리얼 모니터에서 출력이 되고,

아두이노 시리얼 모니터에서 보낸값이 Hercules SETUP utility의 상태창에 보여진다.







2-4 스마트폰에서 아두이노와의 통신


기본적으로 스마트폰과 연결을 위해서는 장치관리자에서 PC 연결을 취소시키고, 장치제거을 한다.

1. 스마트 폰에서 블루투스를 연결해준다. (각자의 폰 세팅에 따라 다름)

2. 서로 데이터를 보내고 받기위해서는 스마트폰에서 툴을 다운받는다.

(Bluetooth spp tools pro)이라는 앱을 다운받아 스마트폰에 설치한다.

  



UART(Universal Asynchronous Receiver Transmitter)


블루투스(Bluetooth)는 1994년 에릭슨(Ericsson)이 개발하여 1999년 5월 블루투스 SIG(Special

Interest Group)에 의해 공식 발표 된 근거리 무선통신(Personal Area Network, PAN)을 위

한 산업 표준으로 RS-232를 대체하기 위한 저가격, 저 전력의 무선 통신 기술이다.


실습에 사용하는 블루투스 HC-06 모듈은 여러 가지 프로파일 중에서 시리얼 통신을 사

용하기 위한 SPP(Serial Port Profile) 프로파일이 구현된 모듈이다.

블루투스는 무선 연결이고 시리얼 통신과는 방식이 다르지만 블루투수 HC-06 모듈에서 무선

통신을 담당하고 SPP(Serial Port Profile)를 지원하기 때문에 유선을 사용한 시리얼 통신과 동

일한 방법으로 블루투스 통신을 구현할 수 있다.


우리는 그림 5-1과 같은 HC-06 슬레이브 모듈을 사용해 아두이노 보드와 컴퓨터 또는 아두이

노 보드와 스마트폰 사이의 블루투스 통신을 실습하게 될 것이다.


블루투수 HC-06 슬레이브 모듈은 그림 5-1과 같이 4개의 핀(Vcc, GND의 전원 핀과 시리얼

통신을 위한 RX, TX 핀)을 가지고 있다. 이 블루투스 HC-06 모듈을 연결 할 때는 TX, RX 핀

을 아두이노 보드의 RX, TX 핀과 교차하여 연결해야 하므로 블루투수 HC-06 슬레이브 모듈의

TX 핀은 아두이노의 RX 핀에 연결하고 RX 핀은 아두이노 보드의 TX 핀에 연결해야 한다.


이 방식은 우리가 그 동안 사용해 온 컴퓨터와 아두이노 보드의 시리얼 통신과 동일한 방식으로

아두이노 보드의 디지털 0번(RX) 핀과 1번(TX) 핀을 연결해 사용해야 하지만 디지털 0번과 1번

핀은 이미 컴퓨터와 USB 연결을 통한 시리얼 통신에 사용되고 있으므로 이 핀들을 이용한 하

드웨어 시리얼 방식은 사용할 수 없다. 그러므로 우리는 블루투스 HC-06 슬레이브 모듈을 디지

털 0번 핀과 1번 핀 이외의 핀에 연결하고 아두이노에서 제공하는 소프트웨어 시리얼 방식을

사용하여 블루투스 통신을 구현하게 될 것이다.


Arduino Uno에는 UART(Universal Asynchronous Receiver Transmitter) 시리얼 통신을

위한 포트가 하나뿐이라 시리얼 연결을 사용하는 두 개 이상의 장치를 연결할 수 없다.

이런 한계를 보완하기 위해 아두이노는 소프트웨어적으로 가상의 UART 시리얼 포트를 생성하

여 시리얼 통신을 지원하는 SoftwareSerial 라이브러리를 제공하고 있다.




2-5 스마트폰에서 아두이노와 연결된 LED를 켜고 꺼보자!


이 예제를 테스트하기 위해서는 먼저 안드로이드 폰에서 블루투스를 통해 LED를 제어할 앱을 설치해야 한다.

(스마트폰에서 bluetooth Controller을 다운받아서 설치하자!)



스케치


/* Arduino Uno에는 UART(Universal Asynchronous Receiver Transmitter)

* 시리얼 통신을 위한 포트가 하나뿐이라 시리얼 연결을 사용하는

* 두 개 이상의 장치를 연결할 수 없다. 이런 한계를 보완하기 위해

* 아두이노는 소프트웨어적으로 가상의 UART 시리얼 포트를 생성하여

* 시리얼 통신을 지원하는 SoftwareSerial 라이브러리를 제공하고 있다.

* 소프트웨어 시리얼을 사용하기 위해 라이브러리를 include 해야 한다.

**/

#include <SoftwareSerial.h>

/* 블루투수 HC-06 모듈의 TX 핀과 RX 핀에 연결할 디지털 2번 핀과

* 3번 핀을 지정하고 LED에 전원을 공급할 디지털 12번 핀을 지정하고 있다.

**/

int rxPin2 = 2;

int txPin3 = 3;

int ledPin12 = 12;

// RGB LED 출력 핀 정의

int redPin5 = 5;

int greenPin6 = 6;

int bluePin7 = 7;

/* 소프트웨어 시리얼 포트를 사용하기 위해 선언하고 있다.

* SoftwareSerial(RX, TX) 형식으로 블루투스 모듈과 교차하여 연결된다.

* 블루투스 HC-06 모듈의 RX 핀에 연결된 디지털 3번은 아두이노 보드의

* TX 핀이되고 블루투스 HC-06 모듈의 TX 핀에 연결된 디지털 2번은 아두이노

* 보드의 RX 핀이 된다. 블루투수 모듈을 초기화 하고 생성할 때

* bluebooth(RX, TX)의 첫 번째 인수로 블루투스 HC-06 모듈의 TX에 연결된

* 핀을 지정하고 두 번째 인수로 블루투스 HC-06 모듈의 RX에 연결된 핀을

* 지정하면 된다.

**/

SoftwareSerial bluetooth(rxPin2, txPin3);

//SoftwareSerial bluetooth = SoftwareSerial(rxPin2, txPin3);

void setup() {

// 컴퓨터와 시리얼 통신을 위한 하드웨어 통신포트 초기화

Serial.begin(9600);

delay(100);

// 블루투수 HC-06 모듈과 통신을 위한 소프트웨어 시리얼 통신포트 초기화

bluetooth.begin(9600);

// LED에 전원을 공급할 디지털 12번 핀을 출력모드로 지정하고 있다.

pinMode(ledPin12, OUTPUT);

// RGB LED 출력모드 정의

pinMode(redPin5, OUTPUT);

pinMode(greenPin6, OUTPUT);

pinMode(bluePin7, OUTPUT);

/* 초기 시작시 R, B, B색상의 LED가 모두 꺼진 상태로 시작한다.

* 우리가 사용하는 RGB LED는 공통 애노드 방식으로 R, G, B 단자를 GND에

* 연결하므로 각 단자에 0을 출력하면 최대 밝기가 되고 255를 출력하면

* 최소 밝기가 된다.

**/

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, HIGH);

}

void loop() {

char cmd;

/* 소프트웨어 시리얼 통신 포트의 버퍼에 수신된 데이터가 존재하면

* SoftwareSerial 클래스의 available() 함수는 Serial 클래스의 available()

* 함수와 마찬가지로 블루투스 모듈에서 사용하는 소프트웨어 시리얼

* 포트의 수신 버퍼에 저장된 데이터의 바이트 수를 반환한다.

* 버퍼에 데이터가 존재하지 않으면 0을 반환한다.

**/

if(bluetooth.available()) {

/* 블루투수를 통해 수신된 데이터를 1Byte씩 읽어온다.

* 블루투수 HC-06 모듈의 TX 핀을 통해 아두이노 보드의

* RX 핀인 디지털 2번 핀으로 입력된 데이터를 읽어온다.

**/

cmd = (char) bluetooth.read();

/* 블루투수 HC-06 모듈에 수신된 데이터를 시리얼 모니터로 출력한다.

* 하드웨어 시리얼 포트를 통해 컴퓨터로 전달되고 시리얼 모니터에 출력된다.

**/

Serial.print("cmd : ");

Serial.println(cmd);

// 안드로이드 폰으로 부터 수신된 데이터가 1이면 LED를 ON

if(cmd == '1') {

// 시리얼 모니터로 LED가 켜진 것을 알리고 디지털 12번 핀에 HIGH를 인가한다.

Serial.println("LED ON");

digitalWrite(ledPin12, HIGH);

// 안드로이드 폰으로 부터 수신된 데이터가 2이면 LED를 OFF

} else if(cmd == '2') {

// 시리얼 모니터로 LED가 꺼진 것을 알리고 디지털 12번 핀에 LOW를 인가한다.

Serial.println("LED OFF");

digitalWrite(ledPin12, LOW);

// 안드로이드 폰으로 부터 수신된 데이터가 3이면 RGB LED의 RED ON

} else if(cmd == '3') {

Serial.println("RGB LED - RED ON");

digitalWrite(redPin5, LOW);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, HIGH);

while(true) {

digitalWrite(ledPin12, HIGH);

delay(100);

digitalWrite(ledPin12, LOW);

delay(100);

if(bluetooth.available()) {

break;

}

}

// 안드로이드 폰으로 부터 수신된 데이터가 4면 RGB LED의 GREEN ON

} else if(cmd == '4') {

Serial.println("RGB LED - GREEN ON");

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, LOW);

digitalWrite(bluePin7, HIGH);

while(true) {

digitalWrite(ledPin12, HIGH);

delay(500);

digitalWrite(ledPin12, LOW);

delay(100);

if(bluetooth.available()) {

break;

}

}

// 안드로이드 폰으로 부터 수신된 데이터가 5면 RGB LED의 BLUE ON

} else if(cmd == '5') {

Serial.println("RGB LED - BLUE ON");

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, LOW);

while(true) {

digitalWrite(ledPin12, HIGH);

delay(500);

digitalWrite(ledPin12, LOW);

delay(500);

if(bluetooth.available()) {

break;

}

}

// 안드로이드 폰으로 부터 수신된 데이터가 6이면 RGB LED OFF

} else if(cmd == '6') {

Serial.println("RGB LED - OFF");

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, HIGH);

}

}

}


- 어플 -








LED on/off






RGB - bule on







RGB - green on






RGB - red on








시리얼 모니터














Bluetooth spp tools pro활용한 예제







- ( 한글은 encoding 안되있어서 깨진다. ) -

Comments