본문 바로가기

아두이노우노 R4

Bluetooth HM-10 BLE module 서로 통신하는 방법

반응형

 

Bluetooth HM-10 BLE module 서로 통신하는 방법  

 

Bluetooth HM-10 Bluetooth 4.0 BLE module 다음 프로젝트를 무선으로 만드세요 

 

HM-10 Bluetooth 4.0 BLE 모듈은 저전력, 저처리량, 저렴한 무선 장치입니다. 이 튜토리얼에서는 HM-10 Bluetooth 4.0 BLE 모듈을 사용하는 방법을 보여드리겠습니다. 두 개의 HM-10 모듈을 프로그래밍하고 페어링하여 서로 연결하는 과정을 살펴봅니다. 페어링이 완료되면 HM-10 모듈을 사용하여 무선으로 두 개의 마이크로 컨트롤러(예: Arduino UNO) 간에 통신할 수 있습니다. 두 개의 HM-10 모듈 간에는 두 가지 기술을 사용하여 통신할 것입니다. 첫 번째는 단방향 통신입니다. 즉, 하나의 아두이노 + HM-10 쌍은 순전히 두 번째 아두이노 + HM-10 쌍으로 전송됩니다. 두 번째 아두이노 + HM-10 쌍은 순전히 첫 번째 아두이노 + HM-10 쌍으로부터 수신하게 됩니다. 그런 다음 두 쌍을 동시에 통신합니다. 첫 번째 쌍은 두 번째 쌍으로부터 송신 및 수신하고, 두 번째 쌍은 첫 번째 쌍으로부터 수신 및 송신합니다. 

 

전체 학습 목표

  • AT 명령어로 HM-10을 프로그래밍하는 방법
  • 두 대의 HM-10 장치를 페어링하는 방법
  • 단방향 통신 기술
  • 양방향 통신 기술 

목차

01. HM-10 블루투스 모듈 소개

02. 하드웨어 설정 및 구성

03. AT 명령으로 HM-10 블루투스 모듈 페어링하기

04. HM-10 무선 통신 테스트

05. HM-10과의 단방향 통신 06 HM-10과의 양방향 통신 

 

01 HM-10 Bluetooth 모듈 소개

 

목표

 

HM-10 Bluetooth 모듈의 기능과 한계에 대해 알아봅니다. 마이크로컨트롤러(예: Arduino UNO)와 HM-10 간의 통신 방법을 이해합니다. UART와 소프트웨어 UART에 대해 알아봅니다.

 

HM-10 Bluetooth 모듈 소개

 

Bluetooth HM-10은 TI CC2540/CC2451 RF 트랜시버 IC를 기반으로 하는 무선 Bluetooth 모듈입니다. HM-10 Bluetooth SOC(System on a Chip)는 Jinan Huamao에서 제조합니다. 무선 작동은 2.4GHz ISM 대역에서 이루어집니다. 데이터 신호 변조 방식은 GFSK(Gaussian Frequency Shift Keying)입니다. AT 명령은 HM-10 모듈과 인터페이스하고 통신할 수 있도록 해주는 명령입니다.

 

 

 

HM-10은 3.3V에서 전원을 공급하고 출력 전류는 50mA(매우 낮음)로 하는 것이 좋습니다! 그러나 광범위한 테스트를 통해 5V에서 작동하면 장치에 안전하고 잘 작동한다는 것이 입증되었습니다. 이 장치는 마스터 또는 슬레이브 모듈로 구성할 수 있어 트랜시버가 매우 유연합니다. 연결 상태에 대한 정보를 나타내는 온보드 LED가 있습니다. 깜박이면 장치가 연결을 기다리고 있지만 현재는 연결되지 않았습니다. 연결이 설정되면 깜박이는 LED가 켜집니다. 연결이 유지되는 한 LED는 켜진 상태를 유지합니다. 연결이 끊어지면 LED가 깜박이는 상태로 돌아갑니다.

 

1. HM-10 모듈이 연결되지 않음(깜박임 유지)

2. HM-10 모듈이 연결됨(켜짐)

 

총 6개의 핀이 있습니다: STATE, VCC, GND, TX, RX, BRK. STATE나 BRK는 중요하지 않습니다. VCC는 3.3V 또는 5V로 전원을 공급할 수 있습니다. GND는 일반적으로 회로의 공통 GND에 연결되는 간단한 GND입니다. TX 및 RX 핀은 다음 섹션에서 설명합니다.

 

HM-10 pin Description  
VCC 3.3V-5V
GND Common GND
TX Serial UART transmit pin
RX Serial UART receive pin. May need voltage divider (see note below)
STATE Connection status. LOW for not connected. HIGH for connected
BRK Break connection. When driven LOW, this will break the connection

 

HM-10 핀 설명

* VCC를 5V에 연결할 때는 전압 분배기를 사용하여 HM-10의 RX 핀에 3.3V를 공급해야 합니다.

 

 

 

UART 직렬 통신

 

UART(Universal Asynchronous Receiver-Transmitter)는 직렬 통신을 구현하는 회로 블록입니다. 내부적으로는 마이크로컨트롤러가 관리하는 병렬 데이터 라인과 제어 핀의 버스가 있습니다. 외부적으로는 사용자가 사용하는 것은 마이크로컨트롤러 또는 직렬 장치의 간단한 TX 및 RX 핀입니다. 오늘날 대부분의 마이크로컨트롤러에는 하나 이상의 UART가 함께 제공됩니다. Arduino UNO의 ATMEGA328p에는 하나가 있습니다. 비동기적 측면은 데이터가 외부 클록 신호를 활용하지 않고 전송된다는 것을 의미합니다. 이것이 전송을 위한 TX와 수신을 위한 RX의 두 핀만 필요한 이유입니다. 이것이 잘 작동하기 위해 마이크로컨트롤러는 전송 시 데이터를 프레이밍하고 패키징하여 신뢰성을 높이는 데 노력을 기울입니다.

 

* TX 및 RX 핀은 장치 자체와 관련하여 레이블이 지정됩니다. 따라서 한 장치의 TX는 상호 장치의 RX에 연결되고 그 반대의 경우도 마찬가지입니다. 즉, 장치 A의 송신기는 장치 B의 수신기와 통신하고 장치 B는 장치 A의 수신기로 전송합니다.

 

일부 마이크로컨트롤러에는 UART가 없지만(예: 대부분의 ATtiny) 소프트웨어 UART를 사용할 수 있습니다. 하드웨어 UART가 있지만 다른 직렬 통신 인터페이스가 필요한 마이크로컨트롤러조차도 전용 UART 외에도 소프트웨어 UART를 사용할 수 있습니다. 소프트웨어 UART는 프로세서에서 직접 제어되며 전용 UART만큼 신뢰할 수 없으며 프로세서 집약적입니다. SoftwareSerial 라이브러리를 활용하여 Software UART를 사용합니다. Arduino UNO의 전용 UART를 사용할 수 있지만, 그렇게 하면 Arduino UNO에 업로드하기 어려워지고 직렬 모니터에서 디버깅 인쇄 명령문을 사용하는 것이 어렵습니다.

 

Arduino를 조금 다루었다면 직렬 모니터에 노출되었을 것입니다. 직렬 모니터는 우리를 Arduino UNO에 연결하는 터미널입니다. 이것은 명령문을 디버깅하는 데 편리하고 사용자와 Arduino 또는 컴퓨터와 Arduino 간의 통신을 위한 보다 강력한 수단입니다. 일반적으로 직렬 모니터를 사용할 때는 컴퓨터와 Arduino 간에 USB 케이블이 연결되어 있어 기본적으로 직렬 통신이 가능하기 때문에 Arduino 핀을 사용하여 추가 연결이 필요하지 않습니다. 프로그램에 적절한 코드를 추가하기만 하면 됩니다.

 

마찬가지로 HM-10도 이런 방식으로 작동합니다. Arduino UNO로 HM-10과 통신하고 싶을 것입니다. Arduino 프로그램은 HM-10에 수신 장치로 무엇을 보내거나 전송할지 알려줍니다. Arduino UNO와 HM-10 간의 통신 방식은 UART를 통한 것입니다. 여기서는 SoftwareSerial을 사용하여 명시적으로 직렬 UART를 사용하지만 프로젝트의 최종 설계에서는 전용 UART를 사용할 수 있습니다. 마지막으로, UART를 사용하여 블루투스 모듈을 프로그래밍하기 위해 HM-10과도 인터페이스합니다.

 

02 하드웨어 설정 및 구성

 

목표

 

HM-10 Bluetooth 모듈을 Arduino UNO에 연결합니다. HM-10의 RX 핀에 전압 분배기가 필요한 이유를 이해합니다.

 

하드웨어 설정

 

Arduino UNO를 Bluetooth HM-10 모듈에 연결하는 회로도를 구성합니다. Arduino의 I/O 핀에서 HM-10의 RX 핀으로 전압 분배기를 사용했습니다. Arduino UNO의 3.3V 전원 레일을 통해 HM-10에 전원을 공급하기 때문에 이 방법이 강력히 권장됩니다. 그러나 Arduino UNO I/O 핀은 5V 논리 레벨입니다. Arduino UNO의 5V 논리 레벨 I/O 핀을 HM-10의 RX 핀에 연결하여 HM-10의 안전을 보장할 수 없습니다. 따라서 전압 분배기를 사용하여 HM-10을 보호합니다.

 

전압 분배기가 약 3.3V의 전압을 생성한다면 다른 저항 값을 사용해도 됩니다.

 

NC는 연결되지 않음 또는 연결되지 않음을 나타냅니다.

 

 

Arduino UNO HM-10 Bluetooth
3.3V VCC
GND GND
D3 TX
D2 RX

 

 

소프트웨어 시리얼 RX 핀은 HM-10 TX 핀에 연결됩니다! 

소프트웨어 시리얼 TX 핀은 전압 분배기를 통해 HM-10 RX 핀에 연결됩니다! 

 

HM-10의 BRK 또는 STATE 핀을 연결할 필요가 없습니다. 사용할 수 있지만 이 튜토리얼에서는 사용하지 않습니다. HM-10 모듈의 전원을 켜면 온보드 빨간색 LED가 계속 깜박여 어떤 장치에도 연결(또는 페어링)되지 않았음을 나타냅니다. 

 

 

03 AT 명령으로 HM-10 Bluetooth 모듈 페어링

 

목표

 

AT 명령과 AT 명령을 사용하여 HM-10과 인터페이스하는 방법을 소개합니다. HM-10 모듈에서 정보를 수집하고 프로그래밍합니다. 각각의 MAC 주소를 사용하여 두 HM-10 모듈을 서로 페어링합니다.

 

AT 명령 세트

 

다음 표에는 여러 AT 명령이 나와 있습니다. 이 중 일부를 사용하여 HM-10 Bluetooth 모듈과 상호 작용합니다. 여기에는 두 개의 Arduino UNO 간에 무선 통신을 하기 위해 두 개의 HM-10 Bluetooth 모듈을 페어링하는 방법이 포함됩니다.

 

 

NAME SEND RECEIVE PARAMETER DESCRIPTION
Test Command AT OK None Simple test command to see if a response is received.
Query Module Name AT+NAME? OK+NAME:[para1] para1: Module name,
max length is 12.
Querys for the HM-10 module name.
Set Module Name AT+NAME[para1] OK+Set:[para1] para1: Module name,
max length is 12.
Default: HMSoft
Sets the HM-10 module name.
Query Module (MAC) Address AT+ADDR? OK+ADDR:[para1] para1: MAC address
MAC Address format: 0123456789AF
Querys for the HM-10 module MAC address.
Query Baud Rate AT+BAUD? OK+Get:[para1] para1: Baud rate speed.
Default: 0 -> 9600
Querys for the HM-10 module's current baud rate.
Set Baud Rate AT+BAUD[para1] OK+Set:[para1] para1: Baud rate speed.
AT+BAUD0 -> 9600
AT+BAUD1 -> 19200
AT+BAUD2 -> 38400
AT+BAUD3 -> 57600
AT+BAUD4 -> 115200
AT+BAUD5 -> 4800
AT+BAUD6 -> 2400
AT+BAUD7 -> 1200
AT+BAUD8 -> 230400
Sets the HM-10 module baud rate.
If Baud rate set to 7 (1200), module will not support any AT commands, until PIO0 is pressed, then module will change Baud rate to 9600.
Try to connect to a (MAC) address AT+CON[para1] OK+CONN:[para2] para1: MAC address.
para2: A, E, F
A: Connecting
E: Connect error
F: Connect fail
Method to pair one HM-10 module to another HM-10 module or device.
Restore all setup to factory setup AT+RENEW OK+RENEW None Restore HM-10 module to factory settings.
Restart module AT+RESET OK+RESET None Closes any active connection and reboots the HM-10 module.
Query Software Version AT+VERR?
AT+VERS?
Version information None Returns the software version of the HM-10 module.

 

AT 명령을 보낼 때 '['와 ']'를 포함하지 마십시오.

 

전체 AT 명령 세트는 데이터시트에서 찾을 수 있습니다.

 

AT 명령 및 Arduino를 사용하여 HM-10과 인터페이스하기

 

다음 코드를 Arduino에 업로드합니다.

 

// Serial communication with Bluetooth HM-10
// Uses serial monitor for communication with Bluetooth HM-10
//
//  Arduino to HM-10 connections
//  Arduino pin 2 (TX) to voltage divider then to HM-10 RX
//  Arduino pin 3 to HM-10 TX
//  Connect GND from the Arduiono to GND on the HM-10
//
// When a command is entered in to the serial monitor on the computer 
// the Arduino will relay the command to the HM-10


// Library to make a Software UART
#include <SoftwareSerial.h>

#define RX 3
#define TX 2

#define BAUDRATE 9600

char c = ' ';
boolean new_line = true;

// Instantiation of a Software UART
SoftwareSerial BTSerial(RX, TX); // (RX, TX)

void setup() {  

  // Start Serial Monitor for feedback
  Serial.begin(BAUDRATE);
  
  // HM-10 default speed in AT command mode
  BTSerial.begin(BAUDRATE);
  
  Serial.println("Enter AT commands:");
}

void loop() {
  
  // Keep reading from HM-10 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HM-10
  if (Serial.available()) {

    // Read from the Serial buffer (from the user input)
    c = Serial.read();

    // Do not send newline ('\n') nor carriage return ('\r') characters
    if(c != 10 && c != 13)
      BTSerial.write(c);

    // If a newline ('\n') is true; print newline + prompt symbol; toggle
    if (new_line) { 
      Serial.print("\r\n>");
      new_line = false;
    }

    // Write to the Serial Monitor the bluetooth's response
    Serial.write(c);
    
    // If a newline ('\n') is read, toggle
    if (c == 10)
      new_line = true;
  }
}

 

 

이 프로그램을 사용하면 HM-10과 직접 통신할 수 있습니다. 즉, 직렬 모니터를 열고 터미널에 입력하면 메시지 내용이 HM-10 모듈로 직접 전송됩니다. Arduino UNO는 메시지를 장치로 전달하는 수단입니다. 물론 HM-10에 쓰레기(또는 알 수 없는) 명령을 보내면 쓰레기 응답이 제공됩니다. 이 경우 장치는 아무 응답도 하지 않습니다(피드백을 제공하지 않음). 이 프로그램을 사용하면 HM-10 모듈에 대한 정보를 수집하고 프로그래밍할 수 있습니다.

 

직렬 모니터를 열면 다음과 같은 메시지가 표시됩니다.

 

 

직렬 모니터에서 전송 속도를 9600으로 설정합니다.

 

직렬 모니터에서 줄 끝을 NL 및 CR 둘 다로 설정합니다.

 

HM-10과 통신할 때 터미널 입력에 AT 명령을 입력하고 Enter 키를 누르거나 오른쪽 상단의 보내기 버튼을 클릭하여 명령을 실행합니다. 이 프로그램은 입력을 기다렸다가 HM-10 모듈로 전송합니다. 명령이 유효하면 장치가 적절한 응답을 제공합니다.

 

AT 테스트 명령

 

HM-10과 통신을 시작해 보겠습니다. 테스트 명령 AT를 HM-10으로 보냅니다. Terminal Input에 다음 명령을 입력하고 Enter 키를 누릅니다.

 

AT

 

다음 응답이 표시되어야 합니다.

 

 

 

더 나아가 Terminal Input은 표시하지 않고 결과 출력만 표시합니다.

 

AT 명령은 본질적으로 HM-10에 대한 ping 또는 웨이크업입니다. 특별한 상황에서는 다른 기능이 있습니다(자세한 내용은 리소스 및 참조에 링크된 데이터시트 참조).

 

위에 표시된 응답을 받지 못하는 경우 하드웨어 설정, 직렬 모니터 전송 속도 및 라인 종료 설정을 확인하세요.

 

HM-10 페어링 절차

 

이제 두 개의 HM-10 모듈을 페어링할 준비가 되었습니다. 각 블루투스 모듈에 대해 구별해야 합니다. 블루투스 모듈 A와 블루투스 모듈 B를 참조합니다. 이전에 구성한 것과 동일한 회로를 사용하여 HM-10 모듈을 프로그래밍하는 모든 작업을 수행할 수 있습니다. 페어링 절차를 수행할 때 한 번에 하나의 모듈만 전원을 공급하면 됩니다(일반적으로 두 장치가 동시에 활성화되는 블루투스 장치와 휴대전화를 페어링하는 것과는 약간 다릅니다).

 

블루투스 모듈 A의 경우 다음과 같이 먼저 장치 이름을 쿼리합니다.

 

AT+NAME?

 

 

 

다음으로 이름을 변경합니다(이렇게 하면 혼동될 경우 어느 것이 무엇인지 추적할 수 있습니다. 각 모듈에 테이프를 붙이고 구분하기 위해 표시하는 것이 좋습니다). 모듈 A의 이름을 다음과 같이 설정할 수 있습니다.

 

AT+NAME[NAME_OF_MODULE]

 

 

 

장치 이름은 원하는 대로 지정할 수 있습니다.

 

이름이 변경되었는지 확인하려면 장치 이름을 다시 쿼리하는 것이 좋습니다.

 

다른 HM-10(모듈 B)과 페어링하려면 모듈 B의 MAC 주소를 확인하고 모듈 A에 연결하도록 알려야 합니다(기본적으로 켜져 있는 자동 페어링으로 작동). 마찬가지로 모듈 A의 MAC 주소를 확인하고 모듈 B에 연결하도록 알려야 합니다. 이렇게 하면 두 모듈이 서로 페어링되고 전원이 켜지면 즉시 페어링됩니다. 자동 페어링이 활성화되어 있으므로 코드에서 페어링할 코드가 필요하지 않습니다!

 

MAC(Media Access Control) 주소는 네트워크에서 장치를 고유하게 식별하는 하드웨어 식별 번호입니다.

 

모듈 A의 MAC 주소를 확인하려면 장치의 MAC 주소를 쿼리합니다.

 

AT+ADDR?

 

 

 

모듈 A의 반환된 MAC 주소를 기록해 둡니다. 나중에 다시 불러와야 합니다!

 

HM-10 모듈의 MAC 주소는 다르며 MAC 주소는 고유합니다.

 

Bluetooth 모듈에는 역할이 있습니다. 주어진 Bluetooth 모듈은 마스터(또는 중앙) 장치 또는 슬레이브(또는 주변 장치) 장치 역할을 합니다. 기본적으로 HM-10 모듈은 슬레이브(주변 장치) 장치입니다. 두 Bluetooth 모듈을 연결하려면 모듈 중 하나가 마스터(중앙) 역할을 해야 하며, 이를 통해 모듈이 슬레이브(주변 장치) Bluetooth 모듈을 검색할 수 있습니다.

 

모듈 A는 기본 슬레이브(주변 장치) 역할로 둡니다. 하지만 다음 명령으로 우리 자신을 설득해 보자.

 

AT+ROLE?

 

 

 

 

역할 0은 슬레이브(주변) 역할을 의미합니다.

역할 1은 마스터(중앙) 역할을 의미합니다.

 

예상대로 모듈 A는 슬레이브(주변) 역할을 합니다.

 

모듈 A에서 필요한 정보를 얻었습니다. 모듈 B를 모듈 A의 MAC 주소로 프로그래밍하고 모듈 B의 MAC 주소를 받은 후 모듈 A로 돌아갑니다.

 

회로에서 모듈 A를 모듈 B와 바꿉니다.

 

블루투스 모듈 B의 경우 이전에 모듈 A에서 한 것과 동일한 지침을 따라 장치의 이름을 지정하고 MAC 주소를 가져옵니다.

 

모듈 B의 반환된 MAC 주소를 기록합니다. 나중에 다시 불러와야 합니다!

 

여기서 차이점은 모듈 B의 역할을 마스터(중앙)로 설정해야 한다는 것입니다.

 

역할을 마스터(중앙)로 설정하는 것을 잊고 두 모듈을 모두 슬레이브(주변) 장치로 두면 두 모듈이 연결되지 않습니다!

 

모듈 B의 역할을 마스터(중앙) 장치로 설정합니다.

 

AT+ROLE[0 또는 1]

 

역할이 0이면 장치가 슬레이브(주변) 장치로 설정됩니다.

역할이 1이면 장치가 마스터(중앙) 장치로 설정됩니다.

 

 

 

역할이 0이면 슬레이브(주변) 역할을 의미합니다.

역할이 1이면 마스터(중앙) 역할을 의미합니다.

 

앞서 사용한 role query 명령으로 역할이 설정되었는지 다시 한 번 확인하는 것이 좋습니다.

 

모듈 A의 MAC 주소가 있으므로 다음과 같이 모듈 B가 모듈 A에 연결되도록 프로그래밍할 수 있습니다.

 

AT+CON[MAC_ADDRESS]

 

 

 

 

여기에 모듈 A의 MAC 주소를 불러와 삽입하세요!

 

모듈 B에 대한 작업이 끝났습니다. 모듈 B가 모듈 A에 연결되도록 프로그래밍하는 즉시 모듈 A에 연결할 준비가 됩니다.

 

회로에서 모듈 b를 모듈 A와 바꿉니다.

 

이제 모듈 B의 MAC 주소가 있으므로 모듈 A를 프로그래밍하여 모듈 B에 연결할 수 있습니다.

 

AT+CON[MAC_ADDRESS]

 

 

 

 

여기에 모듈 B의 MAC 주소를 불러와 삽입하세요!

 

끝입니다! 두 블루투스 모듈을 전원에 연결할 수 있습니다(TX + RX 연결은 필요 없음). 두 모듈 모두 즉시 연결됩니다. 빨간색 LED가 켜진 상태로 표시됩니다.

 

모듈이 연결되지 않았거나 모듈이 연결되지 않은 경우 HM-10 모듈의 LED가 계속 깜박입니다.

 

주의: 블루투스 모듈이 연결되면(빨간색 LED 켜짐) 이전처럼 AT 명령을 사용하여 HM-10과 통신할 수 없습니다. 모듈이 연결되면 모든 AT 명령이 (송신/수신) 데이터로 처리됩니다. 유일한 예외는 연결을 끊는 AT 명령입니다. (그러나 연결을 끊는 즉시 모듈이 즉시 다시 연결됩니다. 자동 페어링 모드에 있기 때문입니다.)

 

이제 모듈이 연결되었으므로 무선으로 통신할 시간입니다!

 

 

 04 HM-10 무선 통신 테스트

 

목표

 

이제 두 개의 HM-10 모듈을 페어링할 수 있습니다. 이 모듈을 가지고 놀았다면 두 모듈 모두 전원이 공급되는 한 페어링이 된다는 것을 알아차렸을 것입니다. TX나 RX와 연결할 필요가 없습니다. 물론 데이터를 전송하지는 않지만 페어링되어도 유휴 상태를 유지할 수 있다는 것은 흥미로운 관찰입니다.

 

이 모듈에서는 HM-10 모듈이 무선으로 통신할 수 있는지 확인하는 간단한 예를 보여드리겠습니다. 이 통신은 단방향이지만 이 동일한 기술을 사용한 양방향 통신은 작동합니다(하지만 곧 알게 되겠지만 거의 쓸모가 없습니다). 또한 보여드리려는 통신 방법의 주요 함정도 살펴보겠습니다. 다음 모듈에서는 더 복잡하고 흥미로운 프로젝트로 확장할 수 있는 더욱 견고하고 의미 있는 통신 방법을 만들기 위해 여러 기술 중 하나를 살펴보겠습니다!

 

HM-10을 사용한 단방향 통신: Hello World

 

무선 통신 하드웨어 설정을 시작해 보겠습니다.

 

이전에 두 개의 별도 Arduino로 HM-10 블루투스 모듈 둘 다에 HM-10 모듈을 프로그래밍할 때와 동일한 회로를 만들어야 합니다.

 

단방향 또는 양방향 통신에서 어느 HM-10 모듈이 마스터(중앙)인지 슬레이브(주변)인지는 중요하지 않습니다. 두 Arduino 장치 간에 통신할 때는 모두 동일하게 처리됩니다.

 

간단히 하기 위해 한 Arduino와 HM-10 블루투스를 각각 Arduino A와 (HM-10 블루투스) 모듈 A(또는 세트 A)라고 합니다. 다른 세트는 Arduino B와 (HM-10 블루투스) 모듈 B(또는 세트 B)라고 합니다.

 

세트 A로 구성된 하드웨어에서는 이 세트를 송신 장치로 지정합니다. 세트 A가 송신하는 예제 코드를 Arduino IDE에 복사하여 Arduino A에 업로드할 수 있습니다.

 

// Serial communication with Bluetooth HM-10
// Transmit a trivial string through the Bluetooth HM-10
//
//  Arduino to HM-10 connections
//  Arduino 3.3V or 5V to VCC of HM-10
//  Arduino pin 2 (TX) to voltage divider then to HM-10 RX
//  Arduino pin 3 to HM-10 TX
//  Connect GND from the Arduino to GND on the HM-10
//
// When a command is entered in to the serial monitor on the computer 
// the Arduino will relay the command to the HM-10


// Library to make a Software UART
#include <SoftwareSerial.h>

#define RX 3
#define TX 2
 
SoftwareSerial BTSerial(RX, TX); // (RX, TX)

#define BAUDRATE 9600

String message = "Hello World";
 
void setup() {

  // Start Serial Monitor for feedback
  Serial.begin(BAUDRATE);

  // HM-10 default speed in AT command mode
  BTSerial.begin(BAUDRATE);
}
 
void loop() {
  // Send a string for the bluetooth module to transmit
  BTSerial.print(message);

  // Print the same string to the Serial Monitor for feedback
  Serial.println(message);
  
  delay(1000);
}

 

마찬가지로 세트 B로 구성된 하드웨어에서는 이 세트를 수신 장치로 지정합니다. Set B가 전송하는 예제 코드는 Arduino IDE에 복사하여 Arduino B에 업로드할 수 있습니다.

 

// Basic serial communication with Bluetooth HM-10
// Receive a trivial string through the Bluetooth HM-10
//
//  Arduino to HM-10 connections
//  Arduino 3.3V or 5V to VCC of HM-10
//  Arduino pin 2 (TX) to voltage divider then to HM-10 RX
//  Arduino pin 3 to HM-10 TX
//  Connect GND from the Arduino to GND on the HM-10
//
// When a command is entered in to the serial monitor on the computer 
// the Arduino will relay the command to the HM-10


// Library to make a Software UART
#include <SoftwareSerial.h>

#define RX 3
#define TX 2

#define BAUDRATE 9600

char c = ' ';
 
SoftwareSerial BTSerial(RX, TX); // (RX, TX)
 
void setup() {

  // Start Serial Monitor for feedback
  Serial.begin(BAUDRATE);

  // HM-10 default speed in AT command mode
  BTSerial.begin(BAUDRATE);
}
 
void loop() {
  
  // Keep reading from HM-10 and send to Arduino Serial Monitor  
  while(BTSerial.available() > 0) {

    // Read from the bluetooth buffer
    c = BTSerial.read();

    // Write the received bluetooth data to the Serial Monitor
    Serial.println(c);
  }
  Serial.println();
  delay(1000);
}

 

코드가 무엇을 하는지 조금 논의한 다음 동작을 관찰해 보겠습니다. 전송 측인 Set A의 코드는 두 개의 직렬 인터페이스를 설정합니다. 하나는 Serial이라고 하며, Arduino에 내장된 직렬 모니터에 대한 일반적인 키워드입니다. BTSerial이라는 두 번째 직렬 인터페이스는 HM-10 모듈이 사용하는 가상 직렬 인터페이스를 만드는 SoftwareSerial 객체에 연결됩니다. 루프에서 우리는 단순히 직렬 모니터에 Hello World를 인쇄하고(사용자 - 여러분의 - 피드백을 위해), 우리가 설정한 블루투스 링크를 통해 Hello World를 무선으로 Set B로 보냅니다.

 

수신 측인 Set B의 코드는 동일한 직렬 인터페이스를 설정합니다. 루프에서 우리는 BTSerial.available() 함수가 있는 while 루프를 가지고 있는데, 이 함수는 HM-10 블루투스 모듈이 버퍼에서 모듈 A로부터 데이터를 수신했는지 확인합니다. 수신하지 않았다면 루프를 계속 진행합니다. Set A로부터 데이터를 수신했다면 버퍼에서 읽기를 진행합니다. 버퍼에서 읽을 때 한 번에 한 문자(또는 바이트)씩 char 변수로 읽어들입니다. 그런 다음 이 문자를(별도의 줄에) 직렬 모니터에 인쇄합니다(사용자 - 여러분의 - 피드백을 위해).

 

세트 A: 전송

 

세트 B: 수신

 

좋습니다! 작동합니다. HM-10 모듈을 통해 한 Arduino에서 다른 Arduino로 무선으로 데이터를 전송합니다. 이 방법은 일반적으로 단일 변수, 다양한 값 또는 이러한 문자 코드 중 하나에 따라 실행할 명령에 해당하는 256개의 고유한 값(0~255의 바이트 값)을 전송하려는 경우 허용됩니다. 그러나 두 개 이상의 데이터(예: 두 개의 다른 센서)를 전송하려는 경우 매우 제한적입니다. 이러한 센서가 넓은 범위(예: >255)에서 다양한 데이터를 수신하는 경우 이 방법은 복잡해집니다. 다음에 무엇을 보낼지 나타내는 플래그나 신호를 생각하고 전송이 완료되면 전송이 완료되었음을 나타내는 신호를 생각할 것입니다. 또한 오류, 간단한 전송에는 큰 지연이 있었지만(그래서 직렬 모니터에서 쉽게 볼 수 있었습니다), 일부 데이터는 문자를 놓칠 것입니다. 오류는 데이터를 안정적으로 전송하는 데 큰 문제를 일으킬 수 있습니다.

 

이러한 모든 문제를 해결하는 것은 매우 복잡해집니다. 빠르고 안정적이며 비교적 간단한 솔루션이 있습니다. 확실히 유일한 방법이나 최상의 방법은 아닙니다. 먼저 이 모듈에서 한 것처럼 단방향 통신으로 시작하겠습니다.

 

05 HM-10을 사용한 단방향 통신

 

목표

 

이 모듈에서는 HM-10 모듈을 사용한 단방향 통신 방법을 시연합니다. 여기서 사용하는 방법은 확장 가능하고 수신하기 쉽습니다. 안타깝게도 HM-10 모듈과 Arduino의 제한으로 인해 속도가 매우 빠르지 않지만 많은 애플리케이션에서 이는 놀라운 솔루션입니다.

 

이 솔루션은 이전에 구현한 것과 달리 우아하다는 점을 간략히 언급하고 싶습니다. 원래는 'Hello World' 텍스트를 전송할 때 마지막 모듈과 유사한 통신 프로토콜을 사용했습니다. 차이점은 전송 패킷에 전송이 시작되고 종료되는 시점(예: 사람들이 'over'라고 말할 때의 라디오 대화)을 나타내는 표시기를 포함하여 더 많은 복잡성을 추가했다는 것입니다. 이 방법은 효과가 있었지만 수신된 패킷을 구문 분석하는 데 전념하는 수많은 코드가 필요했습니다. 게다가 확장성이 매우 힘들었습니다. 추가 데이터(즉, 다른 변수)를 전송하려면 변경을 위해 추가해야 하는 여러 줄의 코드가 있었습니다.

 

우리가 제시하는 솔루션은 확장하고 확장하기가 매우 쉽습니다. 이것의 단점은 이 프로세스가 작동하는 방식의 개념적 아이디어를 이해하는 데 시간이 걸리고 난해해 보일 수 있다는 것입니다. 그럼에도 불구하고 두 솔루션 모두 전송하려는 데이터가 많을수록 추가해야 하는 지연 시간이 늘어납니다. 그러나 이 솔루션으로 정말 강력한 작업을 수행할 수 있으며 이 기술에 대한 좋은 이해는 메이커 경력에 큰 도움이 될 것입니다.

 

HM-10을 사용한 단방향 통신: C 구조체 전송 및 수신

 

마지막 모듈에서 코드 한 줄로 블루투스를 통해 전체 데이터 문자열을 전송했습니다. 그러나 데이터를 읽을 때는 한 번에 한 바이트씩 데이터를 읽어야 했습니다. 알겠습니다. 여러 바이트를 읽을 수 있는 readBytes라는 함수를 사용할 수도 있지만 읽어야 할 바이트 수를 알아야 합니다. 그러나 메시지에서 메시지로 다른 길이의 다른 문자열 메시지를 보내고 싶을 수 있으며 이는 다른 바이트 수에 해당하며 이 프로토콜에 적응하는 코드가 필요합니다. 그리고 이것은 귀하의 애플리케이션을 진행하는 좋은 방법이 될 수 있습니다.

 

그러나 일반적으로 전송하려는 데이터가 센서 값이고 여러 개의 센서일 수 있다고 가정합니다. 마찬가지로 다른 장치에서 값을 수신하고 그에 따라 작동하고 싶을 수 있습니다. 즉, 센서가 액추에이터를 직접 제어하도록 해당 값을 액추에이터에 쓰는 것입니다. 풀 듀플렉스로 양방향으로 전송하고 싶을 수 있으며 여기에서 아이디어를 사용하면 매우 쉽게 확장할 수 있습니다.

 

전송하고 수신할 것은 패킷입니다. 이는 컴퓨터 네트워킹에서 일반적으로 사용되는 용어입니다. 전송할 패킷에는 수신 장치와 통신하려는 모든 데이터가 포함됩니다. int, float 및 byte와 같은 몇 가지 데이터 유형을 전송하는 예를 보여드리겠습니다.

 

이를 위해 C 데이터 유형인 struct를 사용합니다. struct는 변수 목록을 하나의 이름으로 연속된 메모리 블록에 그룹화하는 도구 또는 데이터 유형입니다. 메모리 블록은 struct에 저장된 데이터만큼 커집니다. 따라서 우리가 제공하는 데이터 유형(예를 들어 앞서 나열한 대로)에 따라 구조체의 크기는 연속적으로 저장됩니다. 이는 중요한데, 데이터를 전송할 때 바이트 스트림만 전송하기 때문입니다. 전송된 패킷을 수신하면 바이트로 읽습니다. 블루투스 모듈은 우리가 char, int 또는 float를 전송하는지 전혀 모릅니다. 바이트만 봅니다. 따라서 데이터를 어떻게 해석해야 하는지는 사용자에게 달려 있습니다. 이를 쉽게 만드는 열쇠는 구조체입니다! 구조체는 데이터 또는 바이트를 어떻게 해석해야 하는지 알고 있습니다. 따라서 메시지를 수신하면 원시 바이트를 이 연속된 메모리 블록에 넣기만 하면 됩니다. 그리고 구조체는 우리가 각각의 데이터 유형을 적절히 복구할 수 있도록 해석하는 방법을 알고 있습니다.

 

따라서 이 중 일부에는 속도라는 단점이 있습니다. 블루투스 모듈이 안정적으로 송수신하려면 약간의 지연이 필요합니다. 매우 작고 거의 감지할 수 없습니다. 그러나 더 많은 데이터를 보내면 지연이 증가해야 할 수 있습니다. 우리는 약 20-30ms의 지연으로 빠져나가는 듯합니다. 이는 대부분의 애플리케이션에서 여전히 매우 빠릅니다.

 

그럼 지금 시도해 보겠습니다. 다음은 전송 코드의 예입니다.

 

// Custom one-way communication with Bluetooth HM-10
// Transmitting data in the form of a struct to receiver
//
// Writes (hardcoded) data to the software UART 
//  and prints the transmitted packet


// Library to make a Software UART
#include <SoftwareSerial.h>

#define TX 2
#define RX 3
 
SoftwareSerial BTSerial(RX, TX); // (RX, TX)

#define BAUDRATE 9600

// Struct to hold the data we want to transmit
struct Packet {
  byte a;
  int b;
  float c;
  int d;
} pkt; // Instantiate a Packet struct
 
void setup() {
  // Start Serial Monitor for feedback
  Serial.begin(BAUDRATE);

  // HM-10 virtual UART
  BTSerial.begin(BAUDRATE);  
}
 
void loop() {  
  // Transmit data via bluetooth
  bluetooth_transmit();  

  // Necessary forced delay, if we transmit too fast (no delay)
  //  the error rate increases
  delay(1);
}

// Function responsible for transmitting data over bluetooth
void bluetooth_transmit() {
  // Update data to be transmitted
  pkt.a = 0;
  pkt.b = 255;
  pkt.c = 888.888;
  pkt.d = -100;
  
  // Write packet data to the bluetooth - and transmit
  BTSerial.write((byte *) & pkt,sizeof(Packet));

  // Print packet (debug)
  print_packet();
}

// Function to print packet data (debug)
void print_packet() {  
  Serial.print("TX: (a,b,c,d)=(");
  Serial.print(pkt.a); Serial.print(",");
  Serial.print(pkt.b); Serial.print(",");
  Serial.print(pkt.c); Serial.print(",");  
  Serial.print(pkt.d);
  Serial.println(")");
}

 

이 전송 코드에는 많은 일이 진행 중이므로 코드가 무엇을 달성하려고 하는지 이해하기 위해 살펴보겠습니다. 그런 다음 수신 코드를 보여주고 논의하겠습니다.

 

우리는 Packet이라는 C 구조체를 정의했습니다. 이 패킷에는 무선으로 통신하려는 데이터가 포함됩니다. 따라서 이 예에서는 a, b, c, d라는 네 개의 변수를 보내고자 합니다. 다양한 데이터 유형에 유의하세요. 우리는 bluetooth_transmit 함수를 호출하는데, 여기서 모든 마법이 일어납니다. 우리는 함수 외부에서 또는 다른 함수 호출을 통해 수행될 수 있는 변수 할당을 합니다. 데이터는 동적일 수도 있는데, 즉 센서에서 읽어서 Packet의 멤버 중 하나에 할당하는 것입니다. write 함수는 우리를 위해 모든 힘든 작업을 수행합니다. 코드 줄은 난해해 보이지만, 지금 분석해 보겠습니다.

 

UART write 함수에서 우리는 Packet 구조체를 전송할 버퍼로 보냅니다. 우리가 이를 수행하는 방법은 Packet의 메모리 주소(연속된 메모리 블록의 시작을 가리킴)를 얻는 것입니다. 따라서 &가 있습니다. 그런 다음, 이 연속된 메모리 블록을 바이트 *(바이트 포인터)로 캐스팅합니다. 이는 write 함수가 기대하는 것입니다. 함수의 두 번째 매개변수에서 버퍼에 쓸 바이트 수를 씁니다. 이는 sizeof 함수 다음에 데이터 바이트(또는 변수)를 입력하면 편리하게 수행됩니다.

 

또한 주목할 점은 각 전송 후에 발생하는 지연입니다. 안타깝게도 소프트웨어 UART(하드웨어가 아님)를 사용하므로 속도가 느려집니다. 게다가 블루투스 모듈에 제한이 있을 수 있습니다. 그러나 통신을 빠르고 안정적으로 하려면 전송(및 수신) 측의 지연을 신중하게 조정해야 합니다. 구현한 지연은 매우 작지만 지연이 없고(그리고 다른 처리 오버헤드가 없음) 오류가 발생하고 가비지 정보를 받을 가능성이 높을 수 있습니다.

 

더 많은 데이터를 전송/수신하는 경우 한쪽 또는 양쪽에서 지연을 늘려야 할 수 있습니다.

 

수신 코드도 마찬가지입니다.

 

// Custom one-way communication with Bluetooth HM-10
// Receiving data in the form of a struct from transmitter
//
// Reads from the software UART and prints the received packet


// Library to make a Software UART
#include <SoftwareSerial.h>

#define RX 3
#define TX 2

#define BAUDRATE 9600
 
SoftwareSerial BTSerial(RX, TX); // (RX, TX)

// Struct to hold the data we want to receive
struct Packet {
  byte a;
  int b;
  float c;
  int d;
} pkt; // Instantiate a Packet struct
 
void setup() {
  // Start Serial Monitor for feedback
  Serial.begin(BAUDRATE);

  // HM-10 virtual UART
  BTSerial.begin(BAUDRATE);
}
 
void loop() {
  // Receive data from the bluetooth
  bluetooth_receive();  

  // Necessary forced delay, if we receive too fast (no delay)
  //  the error rate increases
  delay(1);
}

// Function responsible for receiving data over bluetooth
void bluetooth_receive() {
  // Check the software serial buffer for data to read
  if(BTSerial.available() >= sizeof(Packet)) {
    // Read in the appropriate number of bytes to fit our Packet
    BTSerial.readBytes((byte *) & pkt,sizeof(Packet));
    
    // Print packet (debug)
    print_packet();
  }   
}

// Function to print packet data (debug)
void print_packet() {  
  Serial.print("RX: (a,b,c,d)=(");
  Serial.print(pkt.a); Serial.print(",");
  Serial.print(pkt.b); Serial.print(",");
  Serial.print(pkt.c); Serial.print(",");
  Serial.print(pkt.d);
  Serial.println(")");
}

 

추측할 수 있듯이 이 코드는 전송 코드의 이중입니다. Packet 구조체에서 가장 중요한 부분은 구조체의 정의가 정확히 동일하다는 것입니다. 마찬가지로 bluetooth_receive 함수가 있습니다. 이 함수에서 serial available 멤버 함수는 소프트웨어 직렬 버퍼에 사용 가능한 데이터가 있는지 확인합니다. 버퍼에서 사용 가능한 바이트 수를 반환합니다. 패킷 크기에 맞는 적절한 바이트 수가 있을 때 이 버퍼를 확인하고 싶습니다. 기본적으로 블루투스를 통해 실제로 데이터를 수신했는지 확인합니다(아직). 데이터를 수신했다면 데이터를 읽습니다. 무엇을 기대하는지 정확히 알고 있으므로 전송 코드에서 write와 동일하지만 버퍼에서 읽는 readBytes 함수를 사용할 수 있습니다. readBytes 함수는 기본적으로 두 번째 매개변수에서 제공하는 적절한 크기의 버퍼에 있는 데이터로 Packet 구조체를 채웁니다.

 

전송 및 수신 코드의 Packet 구조체가 정확히 동일한지 확인하세요! 순서가 중요합니다.

 

이전과 같은 이유로 지연이 필요합니다. 지금은 매우 작지만 더 많은 데이터를 확장하면 일관되고 빠른 데이터 전송의 균형을 맞추기 위해 지연을 늘려야 할 수 있습니다.

 

더 많은 데이터를 전송/수신하는 경우 한쪽 또는 양쪽에서 지연을 늘려야 할 수 있습니다.

 

코드의 동작을 보여드리겠습니다.

 

세트 A: 전송

 

세트 B: 수신

 

처음 몇 개의 전송은 쓰레기 정보와 함께 나타날 수 있지만 지연을 적절히 조정하면 매우 빠르게 완벽한 전송으로 전환될 것입니다.

 

이렇게 하면 Arduino에서 Arduino로 한 방향으로 의미 있는 데이터를 전송할 수 있습니다. 훨씬 더 강력한 아이디어는 두 개의 Arduino에서 앞뒤로 전송하는 것입니다. 바로 그렇게 할 수 있습니다! 다음으로 양방향 통신을 살펴보겠습니다!

 

06 HM-10을 사용한 양방향 통신

 

목표

 

이 모듈에서는 Arduino와 Bluetooth HM-10 모듈이 풀 듀플렉스, 즉 양방향으로 통신하도록 합니다. 단방향 케이스의 이전 코드와 거의 동일하지만 두 코드 세트 모두 메인 루프에서 송수신합니다. 그러나 작은 문제가 있습니다. Bluetooth가 송신할 때 동시에 수신이 잘 되지 않습니다. 따라서 구현해야 할 것은 교대로 송신하는 것입니다. 한 세트가 수신할 때 메시지를 완전히 읽은 후 차례로 송신합니다. 이렇게 하면 적절한 안정성과 속도로 양방향 통신이 가능해집니다.

 

HM-10을 사용한 양방향 통신

 

설명한 대로 단방향 통신 케이스에서 새로운 개념은 없습니다. 우리는 송신 및 수신 프로세스를 결합하여 두 장치에서 모두 실행되도록 합니다. 이렇게 하면 양쪽의 코드가 동일합니다. 물론, 귀하의 애플리케이션에서는 각 측에서 다른 정보를 보내고 다른 프로세스를 수행할 가능성이 높습니다. 이 책임은 귀하에게 있습니다!

 

목표에 설명된 대로 통신 프로토콜을 조금 더 효율적으로 만들기 위해 작은 변경 사항을 추가합니다. 하지만 먼저 코드를 시연하고 코드의 작은 변경 사항에 대해 논의해 보겠습니다.

 

// Custom two-way communication with Bluetooth HM-10
// Transmitting & receiving data in the form of a struct
//
// Writes and reads (hardcoded) data to the software UART 
//  and prints the transmitted & received packet


// Library to make a Software UART
#include <SoftwareSerial.h>

#define RX 3
#define TX 2
 
SoftwareSerial BTSerial(RX, TX); // (RX, TX)

// Struct to hold the data we want to transmit/receive
struct Packet {
  byte a;
  int b;
  float c;
  int d;
} pkt_tx, pkt_rx;

#define BAUDRATE 9600
 
void setup() {
  // Start Serial Monitor for feedback
  Serial.begin(BAUDRATE);

  // HM-10 default speed in AT command mode
  BTSerial.begin(BAUDRATE);
}

void loop() {  
  // Receive data from the bluetooth
  bluetooth_receive();

  // Necessary forced delay, if we transmit too fast (no delay)
  //  the error rate increases
  delay(50);
}

// Function responsible for transmitting data over bluetooth
void bluetooth_transmit() {
  // Update data to be transmitted
  pkt_tx.a = 0;
  pkt_tx.b = 255;
  pkt_tx.c = 888.888;
  pkt_tx.d = -100;

  // Write packet data to the bluetooth - and transmit
  BTSerial.write((byte *) & pkt_tx,sizeof(Packet));

  // Print the Packet contents
  Serial.print("TX: (a,b,c,d)=(");
  Serial.print(pkt_tx.a); Serial.print(",");
  Serial.print(pkt_tx.b); Serial.print(",");
  Serial.print(pkt_tx.c); Serial.print(",");
  Serial.print(pkt_tx.d); 
  Serial.println(")");  
}

// Function responsible for receiving data over bluetooth
void bluetooth_receive() {
  // Counting variable to fix a lost connection
  static byte count = 10;
  
  // Check the software serial buffer for data to read
  if(BTSerial.available() >= sizeof(Packet)) {
    // Read in the appropriate number of bytes to fit our Packet
    BTSerial.readBytes((byte *) & pkt_rx,sizeof(Packet));

    // Print the Packet contents
    Serial.print("RX: (a,b,c,d)=(");
    Serial.print(pkt_rx.a); Serial.print(",");
    Serial.print(pkt_rx.b); Serial.print(",");
    Serial.print(pkt_rx.c); Serial.print(",");
    Serial.print(pkt_rx.d); 
    Serial.println(")");

    // Flush the serial buffer
    while(BTSerial.available() > 0)
      BTSerial.read();   
    
    // Transmit data via bluetooth
    bluetooth_transmit();
  } else {
    // If a disconnect happens, start transmitting
    if(count >= 10) {
      count=0;  // Reset counter
      // Transmit to revive process
      bluetooth_transmit();
    }
    count++;
  }
}

 

약속한 대로 코드는 매우 유사합니다. 여기서의 차이점은 수신하고 플러시한 후에 전송한다는 것입니다. 플러시는 본질적으로 새 패킷을 수신하기 전에 직렬 버퍼를 비웁니다. 이렇게 하면 기다려야 하는 시간이 약간 줄어들지만 읽기가 조금 더 일관되게 됩니다. 또 다른 추가 사항은 증가되고 특정 MAX_COUNT 임계값에 도달하면 전송을 강제로 실행하는 흥미로운 카운트 변수입니다. 그 이유는 두 가지입니다.

 

  1. 블루투스 중 하나와 연결이 끊어지면(범위를 벗어났거나 전원이 꺼짐) 블루투스가 범위로 ​​돌아오거나 전원이 다시 켜지면 모듈이 복구되고 프로그램이 정상적으로 다시 시작됩니다.
  2. 코드를 주의 깊게 살펴보면 수신할 때만 전송하므로 어느 쪽도 전송하지 않으면 수신하지 않습니다(따라서 전송합니다). 누군가가 먼저 가서 통신 링크를 시작하고 설정해야 합니다.

 

동작 중인 코드는 다음과 같이 동작합니다.

 

세트 A

 

세트 B

 

실제로 일부 오작동 코드가 있음을 관찰하세요. 양쪽에서 수신된 패킷 중 일부는 가비지입니다. 애플리케이션에 따라 이는 해로울 수 있습니다. 이를 수정하는 몇 가지 방법이 있습니다. 수신된 패킷에 오류가 없을 확률이 더 높은지 확인하는 오류 검사 코드나 패킷을 전송에 추가할 수 있습니다. 또 다른 방법은 사용자인 여러분이 어떤 데이터를 기대해야 하는지 알아야 하며, 아마도 데이터는 특정 범위 내에 있을 것입니다. 수신 데이터의 평균을 사용하여 일부 이상을 걸러낼 수도 있습니다. 여기서는 구체적으로 살펴보지 않겠지만, 일부 프로젝트에서는 애플리케이션에 적합하도록 이러한 개념을 심층적으로 다룹니다.

 

마지막으로, 연결 해제 및 재연결 기능이 작동한다는 것을 보여드리고자 합니다. 한쪽에서만 보여드리지만 대칭적으로 양쪽에서 작동합니다.

 

그리고 그게 전부입니다! 다음 무선 프로젝트를 위해 Bluetooth HM-10을 사용하여 무한한 가능성을 볼 수 있기를 바랍니다!

 

리소스 및 참조

 

 

 

Arduino Software Serial Example
Arduino's example page for their built-in SoftwareSerial library.
Arduino Forum
Open Source community contribution to advice on transmitting/receiving data across different computer architectures.
Arduino Forum
Open Source community contribution to advice on structs and unions.

 

 

 

결론

 

이제 블루투스 HM-10 모듈을 사용하여 멋진 애플리케이션을 만들 준비가 되었습니다! 안심하세요. 대부분의 블루투스 모듈과 다른 무선 장치는 종종 비슷합니다. 일부에는 AT 명령 세트가 있습니다. 여기서 다루지는 않았지만 HM-10 모듈은 모바일 애플리케이션에서 휴대전화에 연결할 수도 있습니다(곧 여기에서 제공!). 사물 인터넷(IoT) 기술은 방대하고 빠르게 성장하고 있으며, 블루투스와 Wi-Fi는 대부분의 IoT 기술이 작동하는 방식의 기반입니다. 무선 및 IoT 프로젝트를 만들어 보세요. 우리가 만들지 않을 수 없었던 프로젝트는 무선 블루투스 리무버 컨트롤 카(BT RC Car)입니다. 아래에 더 많은 프로젝트가 있습니다!

 

연결 프로젝트 - Bluetooth RC Car

 

폰 문서의 참고 링크는 언제나 늘 항상 그렇듯이 이 링크를 따라가시면 만날 수 있습니다. 

 

다른 문서를 참고하시려면 이곳입니다. HM-10 Bluetooth 4 BLE Modules

 

배움을 멈추지 마세요. 절대 포기하지 마세요.

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^