아두이노2016.02.25 13:00

아두이노에 블루투스 모듈을 추가하면 시리얼통신을 이용하여 데이터 값을 받거나 보낼 수 있다. 블루투스는 10미터 정도에서 무선으로 데이터를 보내거나 받을 수 있으므로 이를 활용하면 릴레이, 모터, 전등 등을 동작시켜 무선으로 기기를 제어하는 것이 가능하게 된다. 예를 들어 블루투스 기능이 있는 스마트폰, 노트북 등으로 아두이노에 연결된 블루투스 모듈로 신호를 보내 침대에 누워서도 집안의 전등을 무선으로 끄고 켤 수 있게 할 수 있다. 단, 통신거리 10M 정도라는 제한이 있으므로 멀리 떨어지면 블루투스 모듈과의 연결이 끊겨 작동이 되지 않을 수도 있다.


아두이노를 위한 블루투스 모듈은 여러가지가 있지만 가장 싼 값에 사용할 수 있는 것이 HC-06이라고 불리는 모듈이다. 국내에서도 1만원 이하로 다양한 제품을 구할 수 있으며 성능도 좋아서 가장 많이 사용하고 있다.


HC-06 블루투스 모듈의 모습



HC-06 블루투스 모듈의 핀이다. 총 4개의 핀이 있으며 위에서부터 신호를 받기위한 핀인 RX 핀, 신호를 전송하기 위한 TX핀, GND(Ground), VCC 핀이 있다. 모듈의 전원은 3.6V ~ 6V 사이에서 동작하므로 VCC핀은 아두이노의 5V 단자에 연결하면 된다. 모듈에 따라 3.3V에서 동작하는 모듈도 있으므로 규격을 꼭 확인하여 전원을 연결해야 한다. 



아두이노와 연결된 모습이다. 처음 연결하면 블루투스 모듈의 LED가 깜빡인다.(페어링 되지 않음 표시) 하지만 스마트폰이나 노트북과 블루투스 페어링이 되면 깜빡이지 않게 되고 계속 켜져 있는 상태가 된다. 아두이노와의 연결은 다음과 같이 연결을 하였다.

RXD ---------------------- D3

TXD ---------------------- D2

GND --------------------- GND

VCC --------------------- 5V


해도 되고 안해도 되지만 먼저 블루투스 모듈의 이름과 페어링 암호(PIN)를 바꿔 주었다. 기본값은 이름이 'HC-06' 이고 페어링 PIN은  '1234' 이다. 이를 'DENEB' 와 '2016' 으로 바꾸어 주었다. 혹시 모르지만 다른 사람이 내 장치를 가로챌 수 있으므로 바꾸어 주는 것이 좋다. 바꾸는 방법은 다음과 같다.


블루투스 모듈 이름 및 PIN 의 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
 
int blueTx=2;   //Tx (보내는핀 설정)at
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
 
void setup() 
{
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼
}
void loop()
{
  if (mySerial.available()) {       
    Serial.write(mySerial.read());  //블루투스측 내용을 시리얼모니터에 출력
  }
  if (Serial.available()) {         
    mySerial.write(Serial.read());  //시리얼 모니터 내용을 블루추스 측에 WRITE
  }
}
cs


위의 소스코드를 입력하고 아두이노에 업로드 해 주고 아두이노 IDE의 시리얼 모니터를 연다.


먼저  시리얼 모니터 입력창에 'AT' 라고 입력하고 전송 버튼을 누른다. 'OK' 라는 블루투스 모듈로 부터의 답변이 온다. 이는 블루투스 모듈과의 통신이 정상적으로 되었다는 의미이다.


AT를 입력하여 OK를 받았으면 블루투스 모듈의 이름을 변경하기 위하여 'AT+NAME원하는이름'  을 입력하고 전송버튼을 클릭하면 'OKsetname' 라는 메시지를 블루투스 측에서 보내주며 이름이 정상적으로 변경이 된다.


블루투스 페어링 암호인 PIN의 변경은 'AT+PIN원하는숫자' 를 입력하고 전송 버튼을 클릭하면 'OKsetPIN' 이라는 메시지와 함께 PIN이 정상적으로 변경되었음을 알려준다.


이제 스마트폰, 노트북 등에서 HC-06이 아닌 자신이 설정한 이름과 PIN으로 블루투스 모듈과의 페어링이 이루어지게 되는 것이다. 


아래는 나의 스마트폰과 블루투스 모듈과의 페어링하는 모습이다. 기기에 따라 다르겠지만 일반적으로 기기의 블루투스 설정메뉴에 들어가서 기기검색을 한 후 선택하면 PIN 을 요구하는데 이때 설정한 PIN 을 입력하면 된다.



이로써 블루투스 모듈의 이름과 PIN 을 변경완료 하였다.


이제 블루투스 모듈의 설정과 스마트폰과의 페어링이 끝났으므로 시리얼 통신을 통하여 문자열을 전송해 보겠다.


스마트폰과 블루투스 모듈과의 통신을 통한 문자열 전송

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
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
 
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=""//받는 문자열
 
void setup() {
  Serial.begin(9600);   //시리얼모니터 
  mySerial.begin(9600); //블루투스 시리얼 개방
 
}
 
void loop() {
  while(mySerial.available())  //mySerial에 전송된 값이 있으면
  {
    char myChar = (char)mySerial.read();  //mySerial int 값을 char 형식으로 변환
    myString+=myChar;   //수신되는 문자를 myString에 모두 붙임 (1바이트씩 전송되는 것을 연결)
    delay(5);           //수신 문자열 끊김 방지
  }
  if(!myString.equals(""))  //myString 값이 있다면
  {
    Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력
    myString="";  //myString 변수값 초기화
  }
}
cs


위의 소스는 페어링된 스마트폰에서 문자열을 보내면 아두이노 시리얼모니터에서 그 내용을 표시해 주는 소스이다. 이를 테스트 하려면 안드로이드폰 기준으로 구글스토어에서 앱을 하나 다운로드 받아야 한다. 'bluetooth serial controller' 라고 검색하면 맨위에 뜨는 앱을 설치하면 된다.




앱을 설치 후 실행하면 위와 같은 화면이 나온다. 'CONNECT' 를 눌러서 블루투스 모듈과 연결을 한다. 페어링 요청이 올 경우 PIN을 입력하면 된다. 블루투스 모듈과의 연결이 완료되면 위와 같이 'connected to 블루투스명' 이라고 블루투스 모듈과의 연결이 되었음을 알 수 있다. 연결이 되면 블루투스 모듈의 깜빡이던 LED가 연결이 되었음을 뜻하는 계속켜짐 상태가 된다.

이 상태에서 아두이노의 시리얼모니터를 열고 앱의 아래쪽에 있는 입력창에 아무 문구나 입력하고 Send 버튼을 눌러본다. 아래와 같이 무선으로 문자열이 블루투스 모듈을 통해 아두이노의 시리얼 모니터에 표시되는 것을 볼 수 있다.




여기에서 조금 더 응용하여 아두이노에 연결된 LED를 ON 또는 OFF  할 수도 있다. 이 의미는 무선으로 LED 뿐만 아니라 모터, 릴레이 등의 제어도 가능하므로 응용한다면 다양한 기능의 장치를 만들 수도 있는 것이다.


블루투스 모듈을 이용하여 LED 켜고 끄기

먼저 위의 블루투스 모듈과 아두이노의 연결에서 추가로 LED 를 13번 PIN 에 직접 꼽아 주었다. 

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
32
33
34
35
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
 
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=""//받는 문자열
 
void setup() {
  Serial.begin(9600);   //시리얼모니터 
  mySerial.begin(9600); //블루투스 시리얼 개방
  pinMode(13, OUTPUT);  //Pin 13을 OUTPUT으로 설정 (LED ON/OFF)
}
 
void loop() {
  while(mySerial.available())  //mySerial 값이 있으면
  {
    char myChar = (char)mySerial.read();  //mySerial int형식의 값을 char형식으로 변환
    myString+=myChar;   //수신되는 문자열을 myString에 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
    delay(5);           //수신 문자열 끊김 방지
  }
  
  if(!myString.equals(""))  //myString 값이 있다면
  {
    Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력
 
      if(myString=="on")  //myString 값이 'on' 이라면
      {
        digitalWrite(13, HIGH); //LED ON
      } else {
        digitalWrite(13, LOW);  //LED OFF
      }
      
    myString="";  //myString 변수값 초기화
  }
}

cs


소스는 위의 문자열 전송 소스에서 LED 부분만 추가하여 코딩하였다. 'on' 이라는 문자열이 아두이노로 전송되어 온다면 13번 핀에 연결된 LED 가 켜지는 것이다. 테스트를 쉽게 하기 위하여 bluetooth serial controller 앱의 버튼을 미리 정의해 준다면 쉽게 문자열 입력이 아닌 버튼 클릭으로 LED를 켜고 끌 수가 있다. 앱을 실행하고 preference 를 눌러서 들어가면 된다.

스마트폰으로 아두이노에 연결된 LED 를 켜고 끄는 모습



이상으로 블루투스 모듈 HC-06를 아두이노와 연결하여 활용하는 방법을 알아보았다. 여기에 사용된 라이브러리인 SoftwareSerial 라이브러리에 대해서 더 알고 싶은 사람은 다음의 URL을 들어가보면 더욱 많은 함수들의 사용법을 알 수 있을 것이다.


https://www.arduino.cc/en/Reference/SoftwareSerial


SoftwareSerial 라이브러리의 Function 리스트


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 대네브 (deneb)

티스토리 툴바