[아두이노] Bluetooth 통신 제어

IOT/아두이노|2019. 4. 22. 09:00

[아두이노] Bluetooth 통신 제어



오늘은 Bluetooth 통신을 주제로 이야기를 할가 합니다. 원래는 나중에 할 예정이였는데 Servo Motor를 조이스틱으로 제어하고 스위치 버턴으로 제어하는 포스프를 쓰다 보니깐 나중에 Bluetooth를 포스트하고 응용 예제로 LED나 Servo Motor를 복습차원을 포스팅을 할 것 같아서 이참에 한번에 해버리는게 좋을 것 같아서 오늘의 포스트 주제로 선정했네요. 이제 본격적으로 Bluetooth 통신으로 들어 가겠습니다.


1. Bluetooth HC-06 모듈



  • Rx - 데이터 읽기
  • Tx - 데이터 보내기

두 개의 Rx, Tx만 무슨 핀인지만 아시면 됩니다. 두 핀만 잘 아두이노에 연결하면 무선 통신을 할 수 있게 됩니다.

하지만 이 Bluetooth HC-06 모듈을 아두이노에 연결할 때 잘 생각하고 연결하셔야 합니다. 물론 아무 핀에다 연결해도 상관은 없습니다만 아두이노에 연결 했을 때 해당 핀이 어떤 핀인지에 대한 정의를 머리속에서 내리셔야 합니다.

다음 회로도에서 설명하겠지만 Bluetooth Rx핀은 아두이노에서 사용 할 Tx핀에 연결해야 하고 Bluetooth Tx핀은 아두이노에서 사용 할 Rx핀에 연결해야 합니다. 이 부분만 주의하시면 됩니다. 즉, 아두이노가 보내는 데이터 핀은 아두이노 자체니깐 Tx핀이겠죠. 그게 Bluetooth가 읽으니간 Rx에 연결하는 것이고 Bluetooth가 보내는 데이터는 Bluetooth의 Tx핀에서 나와서 아두이노가 그 데이터를 읽기 위해서는 아두이노의 Rx핀에서 읽어들이겠죠. 이렇게 생각하시면 될 듯 싶네요.

2. 회로도 구성


  • 준비물 : - Bluetoooth HC-06 1개, 아두이노우노
  • 내용 : 0,1핀을 제외한 아무핀에다 연결하시오.

0,1 은 아두이노 자체 시리얼통신 핀입니다. 이곳에 Bluetooth를 연결해도 되긴 하는데 처음에 따로 연결해 주세요.


Bluetooth Tx 핀은 아두이노의 Rx 2번핀에 연결하고 Bluetooth Rx 은 아두이노의 Tx 3번핀에 연결합니다. 왜 이렇게 복잡하게 말하냐면 나중에 SoftwareSerial 라이브러리를 통해서 통신을 할 때 통신 함수의 인자 변수명을 일치시키기 위해서 입니다.

SoftwareSerial::SoftwareSerial(uint8_t rxPin, uint8_t txPin, bool inverse_logic)
  • SoftwareSerial(rxPin, txPin) : 시리얼통신 핀을 세팅합니다.

여기서 인자값은 bluetooth의 Tx=rxPin, Rx=txPin으로 넘겨지기 때문입니다.

const int rxPin = 2;
const int txPin = 3;

SoftwareSerial mySerial(rxPin, txPin);
  • Bluetooth Rx -> Arduino txPin
  • Bluetooth TX -> Arduino rxPin

대충 변수명은 SoftwareSerial 생성자 함수의 인자 명하고 일치 시켜 유사한 이름을 써주세요.

간혹 Bluetooth 이름으로 짓는 경우가 많은데 그러면 혼동이 생길 수 있습니다.

int BT_TX = 2;
int BT_RX = 3;

이럴때

SoftwareSerial mySerial(BT_TX, BT_RX);

이렇게 이름을 짓는 경우가 많습니다. Bluetooth 관점으로 핀이름을 만들다 보니 이렇게 되죠. 엄밀히 말하면 생성자 함수의 인자 네임음 (rx, tx)입니다. 그런데 들어가는 값이 블루투스의 (tx, rx)다고 해서 이렇게 이름 만들면 혼동할 수 있습니다. 될 수 있으면 함수 인자의 네임을 일치시켜 주세요.

3. 코딩


  • 내용 : 스마트폰 연결 Bluetooth를 연결하여 간단히 스마트폰에서 입력한 값을 아두이노에서 읽고 아두이노 IDE 시리얼모니터로 읽은 값을 출력을 해보자.

함수

  • Serial.begin(9600) : 시리얼통신 시작
  • Serial.write(출력값) : 시리얼모니터로 출력

SoftwareSerial 통신

#include <SoftwareSerial.h>
  • SoftwareSerial mySerial (rx, tx) : 소프트시리얼 객체선언(rx(수신), tx(전송))
  • mySerial.begin(9600) : 시리얼 통신 시작(예로 9600 통식속도를 사용해 봤네요.)
  • mySerial.write(값) : 데이터 전송
  • mySerial.available() : 데이터 들어왔는 확인
  • mySerial.read() : 전송된 데이터 1byte 읽기

SoftwareSerial 라이브러리에서 제공되는 기본 예제로 테스트




해당 소스에서 2,3핀을 시리얼통신 핀으로 사용 했습니다. 그리고 전송속도는 9600으로 둘 다 해버렸네요.

  • 전송 속도 : 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600, 115200
    다른 속도로 하셔도 됩니다.

[기본 소스] : 이 코딩은 위 아두이노공식홈페이지에 있는 기본 예제를 기반으로 약간만 수정한 소스입니다. 제가 만든게 아니라 위 아두이노 공식홈페이지에서 제공되는 오픈 예제 소스입니다.

#include <SoftwareSerial.h>

const int rxPin = 2;
const int txPin = 3;

SoftwareSerial mySerial(rxPin, txPin); // RX, TX

void setup()  
{
  Serial.begin(9600);
  while (!Serial) {
    ; 
  }
  Serial.println("Bluetooth Start!");
  mySerial.begin(9600);  
}

void loop() 
{
  if (mySerial.available()) Serial.write(mySerial.read()); 
  if (Serial.available()) mySerial.write(Serial.read()); 
}

딱히, 어려운 건 없습니다. 링크 예제를 안하더라도 대부분 Bluetooth 샘풀 테스트를 하면 위 소스와 비슷한 방식으로 다들 실험을 합니다.

(1) SoftwareSerial 헤더파일 연결
(2) SoftwareSerial 객체변수 선언
(3) 객체변수.begin(전송속도)
(4) if(객체변수.available()) { byte ch = 객체변수.read(); }
(5) Serial.write(ch);

누가 실험을 하든 이게 젤 처음 다들 하는 Bluetooth 실험 소스입니다. 그냥 자연스럽게 이렇게 코딩하게 됩니다.

여기서 loop()문은 통신을 수행하는 문장입니다.

예전에 시리얼 통신을 할 때 시리얼모니터에서 데이터를 입력하면
if (Serial.available()) {
byte ch = Serial.read();
}

이렇게 읽었습니다. 시리얼 모티터로 출력 한다면
Serial.write(출력값); 
이렇게 사용했습니다. 블루투스 통신에서도 이와 같습니다. 

if (mySerial.available()){
    Serial.write(mySerial.read()); 
}

블루투스를 통해 들어온 데이터를 시리얼모니터로 출력하는 문장입니다. 이것과 반대로 시리얼모니터로 입력한 데이터를 블루투스로 반대로 보내는 동작은 다음과 같습니다.

  if (Serial.available()) {
        mySerial.write(Serial.read()); 
    }

이전에 시리얼 통신을 해왔던 방식 그대로 표현 하시면 됩니다. 단지 블루투스를 SoftwareSerial 라이브러리를 이용하기 때문에 따로 SoftwareSerial 의 객체 변수를 선언해주고 그 객체명으로 시리얼통신함수를 사용하시면 됩니다.

간단히 정리하자면 평소 Serial 통신에서 시리얼모니터에 아두이노의 결과물을 출력했던 방식으로 동일하게 Bluetooth도 동일한 방식으로 푠현한다고 생각하시면 됩니다.

4. Bluetooth 통신을 하기 위한 세팅


1) 스마트폰에서 Bluetooth 등록


위 그림 처럼 HC-06의 이름을 가진 Blutooth가 잡힙니다. 등록하기 위해서는 비번을 쳐야 하는데 초기 비번은 "0000", "1234" 둘 중 하나로 초기 비번으로 설정 되어 있습니다. 둘 중 하나니깐 두 개 다 입력해서 잡히면 그걸로 등록하시면 됩니다. 참고로 AT 명령어로 비번을 변경할 수 있습니다.

2) 스마트 폰 Bluetooth 통신 앱 설치

전 느낌 오는 걸로 구글스토어에서 블루투스 컨트롤을 쳐서 아래 그림의 어플을 설치했네요. 결과만 보기 위해서 대충 선택했네요. 다른 것들도 많으니간 편한 걸로 설치 하시면 됩니다.


혹시, 직접 만드시고자 하시는 분들은 웹인벤터에서 앱을 만들 수 있습니다. 스크래치 방식으로 블록으로 배치하여 직접 만들 수 있는데 구글 검색 키워드로 "bluetooth 앱인벤터"로 치시면 동영상하고 블로그 게시물이 엄청 많습니다. 유튜브에서 검색하셔도 됩니다. 동영상을 보고 따라 만드시면 나중에 자신이 원하는 스타일로 개조 할 수 있습니다.

3)실행



Bluetooth를 잡아놓은 상태어서 HC-06으로 제가 현재 쓰는 Bluetooth 모듈 명이 검색 되어 있네요. 초기 이름울 AT명령으로 Bluetooth 이름을 변경 할 수 있습니다. 그냥 초기 이름을 그대로 사용합니다. 클릭을 하면 옆 그림처럼 선택 목록이 있는데 젤 위의 Controller mode를 누르면 다음과 같이 조종기가 나옵니다.



오른쪽 상단에 톱니모양을 누르면 환경 설정을 할 수 있습니다.


간단히 방향버턴을 1,2,3,4 로 세팅했네요.

이제 아두이노 IDE를 열고 결과를 테스트 하면 됩니다.

5. 결과



스마트폰에서 방향 스위치를 누르면 아두이노에 연결된 Bluetooth가 방향 스위치 값을 읽고 그 값을 아두이노에서 PC에 연결된 아두이노 IDE 시리얼모니터로 결과가 출력된다.

아래 실험 영상 녹화는 데스크탑 PC에서 녹화한 영상입니다. PC에서 스마트폰을 원격접속하여 스마트폰을 PC에서 볼 수 있게 하였고, 아두이노는 라즈베리파이에 연결되어 작동하고 라즈베리파이에 설치된 아두이노 IDE 의 시리얼모니터로 Bluetooth에서 들어온 데이터를 출력하도록 해놓았습니다. 참고로 라즈베리파이도 데스크탑 PC에서 원격 접속을 하였습니다. 결론은 녹화를 하기 위해서 PC가 스마트폰과 라즈베리파이를 동시에 원격접속하여 PC 모니터에 띄워서 둘을 동시에 조정하여 그 결과를 녹화한 영상물입니다.


위 그림처럼 스마트폰과 라즈베리파이를 원격 접속하여 창을 띄운 화면입니다. 참 번거롭게 녹화을 했네요. 스마트폰으로 찍자니 그러면 Bluetooth 어플 조정을 못하니깐 어쩔 수 없이 원격 접속하여 PC로 녹화를 하게 되었습니다.


아 'Start' 단어에 오타가 다시 녹화 하기 귀찮아서 그냥 올립니다. 참고로 영상에서 처음 실행이 되면 "AT"라는 단어를 쳐보세요 그리고 보내면 "OK"라는 단어로 리턴된 값이 시리얼모니터로 출력됩니다. 이 말은 Bluetooth가 정상적으로 동작한다는 의미가 되겠습니다.

6. AT 명령어



구글 검색하시면 레퍼런스가 많습니다. 제가 봤던 사이트 레퍼런스인데 명령어들을 잘 살펴보시면 됩니다.

Bluetooth 설정된 값을 변경할 수 있는 명령어입니다. 현재 Bluetooth 버전, 이름, 비번, 전속속도, Master와 Slave 설정 등을 할 수 있습니다. 참고로 버전이 낮을 경우 Master와 Slave은 고정되어 있는데 구매하실 때 자신이 쓰는 모델이 고정인지 겸용인지를 꼭 확인하세요.

  • AT : "OK" 메세지가 나오면 Bluetooth 정상
  • AT+VERSION : 현재 Bluetooth 사양 정보
  • AT+NAMEaaa 이름(aaa)
  • AT+PIN1234 비번(1234)
  • AT+BAUE1 전송속도(1200) 1~9,A,B,C(레퍼런스참조)

이름과 비번만 바꿔주시고 사용하시면 돼요. 추가적으로 레퍼런스를 읽어보시기 바랍니다.

마무리


if (mySerial.available()) Serial.write(mySerial.read()); 

이 한줄의 명령을 수행하기 위해서 엄청 글을 썼네요. 이 한줄이 오늘 동작하는 명령의 전부입니다. 이걸 하기 위해서 세팅하는 과정이 꽤 길었네요.

지금까지 Serial 통신으로 시리얼모니터로 결과를 출력했던 방식으로 Serial 대신에 여러분들이 작명한 이름으로 변경만 하면 통신을 할 수 있게 됩니다.

마지막으로 방향 버턴을 1,2,3,4 로 값을 세팅했잖아요. 그 값을 기준으로 Servo 머턴을 제어를 코딩해 보세요. 어제 스위치 버턴으로 Servo Motor를 제어 했는데 그 소스랑 오늘 통신 소스를 합쳐서 코딩해보시면 아마도 쉽게 코딩을 할 수 있을 거라 생각됩니다.

이걸 또 내일 포스팅하기 그러니깐요 이 부분은 여러분들이 Servo Motor를 제어하는 하는 걸로 마무리 할까 합니다.

나중에 다른 주제에 오늘 사용한 Bluetooth를 활용하는 것을 포스트 하겠습니다.


댓글()