Embedded/Arduino

아두이노 나노(Arduino Nano 33 IoT) BLE 사용하기 – 1 (연결하기)

변화의 물결1 2024. 6. 18. 00:03

 

 

안녕하세요.

 

  아두이노 나노 33 IoT 모듈에는 WiFi 기능이 있고 BLE(Bluetooth) 기능도 있습니다. 이전 내용은 WiFi를 다루어 보았고 이번에는 BLE 관련된 내용으로 해보려고 합니다.

 

 진행은 간단하게 Nano 33 IoT에서 BLE를 사용해 보고 여러 개 데이터를 전달하는 것을 해보려고 합니다. 그리고 추가로 공개된 안드로이드 앱 소스를 수정해서 값까지 받아 보는 것을 해보려고 합니다.

 


 

1. BLE(Bluetooth Low Energy) 란

 

1) 정의

 

  블루투스 저전력 프로토콜(Bluetooth Low Energy)또는 줄여서 BLE은 블루투스 4.0(Bluetooth Smart) 스펙이 2010년 6월 30일에 채택된 이후로 배포되는 저전력 블루투스이다.

 

 이로서 기존의 블루투스 통신 프로토콜은 '클래식 블루투스'라는 명칭으로 구별될 뿐만 아니라 사실상 또 다른 블루투스 통신을 의미하기도 하지만 통신 보안의 기술적 측면이나 데이터 처리의 호환성 측면에서는 역시 클래식 블루투스와 같은 계열의 버전이라고 할 수 있다.

 - https://ko.wikipedia.org/wiki/Bluetooth_Low_Energy 참고

 

2) 통신 방법

 

  BLE를 지원하는 디바이스들은 기본적으로 Advertise(Broadcast)과 Connection이라는 방법으로 외부와 통신한다.

 

  Advertise Mode ( = Broadcast Mode)

 

  특정 디바이스를 지정하지 않고 주변의 모든 디바이스에게 Signal을 보낸다. 다시 말해, 주변에 디바이스가 있건 없건, 다른 디바이스가 Signal을 듣는 상태이건 아니건, 자신의 Signal을 일방적으로 보내는 것이라고 생각하면 된다. 이때, Advertising type의 Signal을 일정 주기로 보내게 된다.

 

Advertise 관점에서, 디바이스의 역할은 다음과 같이 구분된다.

 

 Advertiser ( = Broadcaster) : Non-Connectable Advertising Packet을 주기적으로 보내는 디바이스

Observer : Advertiser가 Advertise를 Non-Connectable Advertising Packet을 듣기 위해 주기적으로 Scanning 하는 디바이스

 

 

https://neos518.tistory.com/142  참고

 

 

2. BLE 설치하기

 

BLE 라이브러리 설치하기

"툴-> 라이브러리 관리” arduinoBLE 검색해서 설치합니다.

 

 

 

3. 아두이노 프로그래밍

 

BLE와 연결이 되면 아두이노 LED가 켜지는 것을 만들어 볼 것입니다.

BLE를 사용할 수 있도록 라이브러리를 해더 파일을 추가해 줍니다.

 

#include <ArduinoBLE.h>

 

 

Setup() 함수에서 시리얼 통신 초기화하고 LED 제어하기 위해 출력 포트 설정 그리고 BLE 시작할 수 있도록 합니다.

 

while (!Serial);  부분에서 모니터링을 위한 시리얼 포트가 시작될 때까지 기다립니다. 바로 시작하게 하려면 주석 처리합니다.

 

Serial.begin(115200);
  while (!Serial);
  pinMode(LED_BUILTIN, OUTPUT);

   // begin initialization
   if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
   }

 

 

  setLocalName()으로 BLE 장비의 이름을 설정해 줍니다. 그리고 setAdvertisedServiceUuid() 함수로 BLE UUID를 설정해 줍니다. (128bit로 계산되어 있습니다. 아무 값이나 넣을 수도 있지만, 생성기를 통해서 만들어서 정상적인 고유한 장비 값으로 생성하는 것을 추천드립니다.)

https://www.guidgenerator.com/online-guid-generator.aspx

 

  참고로 몇몇 BLE UUID 경우는 지정되어 사용되는 것이 있으므로 확인이 필요합니다.

 https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/

 

 What is a GUID?

 GUID (aka UUID) is an acronym for 'Globally Unique Identifier' (or 'Universally Unique Identifier'). It is a 128-bit integer number used to identify resources. The term GUID is generally used by developers working with Microsoft technologies, while UUID is used everywhere else.

 

 현재 UUID는 블루투스 프로토콜과 상관없이 임의 값을 생성해서 넣었습니다.

 

  BLE.setLocalName("HelloBLE");
  BLE.setAdvertisedServiceUuid("3de2545d-9de6-47ce-84a9-68c5ead85c67");

  // start advertising
  BLE.advertise();
  Serial.println("Bluetooth device active, waiting for connections...");
}

  

 

  loop 함수에서 스마트폰 같은 블루투스 리더 장비에게 탐색될 수 있기 기다립니다.

즉, central이라는 객체 개념은 스캐닝하는 스마트 폰과 같은 장비라고 보면 됩니다.

 

 Peripheral이라는 개념은 서버의 역할로 여기서는 센서장치로 나노 33 Iot로 보면 됩니다. 그래서 central 객체를 하나 생성해서 연결을 기다리다가 스마트폰과 같은 클라이언트가 스캔하고 센서장치에 연결(connect)하면 객체를 통해서 정보를 주고받을 수 있는 형식입니다.

 

void loop() {
  // wait for a BLE central
  BLEDevice central = BLE.central();

 

 

  BLE Central 장치를 기다리고 있습니다. 소켓 프로그래밍이라면 Listen 상태가 일 것입니다.

그리고 스마트폰과 연결이 되면 장치의 주소를 받아옵니다. 그리고 연결되었다는 표시로 LED가 켜지고, while()에서 연결되어 있을 동안 할 일 없이( do nothing) 대기 상태가 됩니다.

 

  if (central) {
    Serial.print("Connected to central: ");
    Serial.println(central.address());
    digitalWrite(LED_BUILTIN, HIGH);
    while (central.connected()) {
    // do nothing
    }

 

 

  연결이 끊어지면 while(central.connected) 함수를 빠져나오면서 LED가 꺼지고 접속에서 나간 장비의 주소를 한번 더 출력해 줍니다.

 

  digitalWrite(LED_BUILTIN, LOW);
  Serial.print("Disconnected from central: ");
  Serial.println(central.address());
  }
}

 

 

4. 프로그램 테스트해 보기

 

   그러기 위해서는 스마트폰의 playstore에서 nRF Connect 앱을 다운로드합니다. 다른 몇 개의 프로그램을 실행해 봤는데, 스캔해도 나타나지 않는 프로그램들이 있습니다.

 

 

  nRF 스캔하기 전에 아두이노 프로그램에서 시리얼 모니터링을 실행시킵니다. 그러면 스캔에 나타날 수 있도록 대기상태가 됩니다.

 

 

 

 

  nRF Connect 프로그램에서 스캔을 실행하면 BLE DEMO1이라고 아두이노 나노 장치가 나타납니다.  그리고 CONNECT를 누릅니다.

 

 

 

  아두이노 나노에서 연결되었다고 스마트폰의 블루투스 주소를 줍니다. 그리고 스마트폰에서도 연결이 된 것을 확인할 수 있습니다. 그리고 DISCONNECT를 누릅니다.

 

 

 

  

 

  접속이 종료가 되면 스마트폰 블루투스 주소를 나타내고 종료됩니다.

 

 

 

 다음에는 블루투스로 LED를 제어하는 것을 해보겠습니다.

 

감사합니다.

 

 

 

<참고 사이트>

1. BLE

https://ko.wikipedia.org/wiki/Bluetooth_Low_Energy

2. Bluetooth Low Energy(BLE)란?

https://neos518.tistory.com/142

3. 안드로이드 Ble Central/Peripheral 구현 예제

https://bacassf.tistory.com/95

4. Beginning Arduino Nano 33 IoT - Apress

 

 

반응형