4주 차 BLE를 활용한 Bluetooth 통신 및 RGB LED 제어 - park-02/2024-1_Smart-Devices GitHub Wiki

목차

  • Bluetooth
    • 무선통신
    • Bluetooth 통신 기술
    • Classic Bluetooth
    • BLE
  • PAN과 LAN
  • 주파수
  • 실습[1]
  • 실습[2]
  • 실습[3]
  • 후기

Bluetooth

무선 통신

무선통신은 전파를 이용하여 유선이나 케이블 없이 정보를 전송하는 통신 기술입니다. 이를 통해 데이터나 음성 신호 등등 이동성 있게 전송할 수 있습니다. 무선통신 기술에는 다양한 주파수대역과 통신 방식을 활용하여 효율적인 데이터 전송을 합니다. 이러한 기술은 휴대전화, 무선 인터넷, 블루투스, Wi-Fi 등 다양한 응용분야에서 사용되고 있습니다.

zxvsdf

Classic Bluetooth

Classic Bluetooth는 주로 오디오 및 비디오 스트리밍과 같은 고대역폭 애플리케이션을 위해 설계되었으며, 이를 위해 전력 요구 사항이 더 높은 장치를 지원합니다. 클래식 Bluetooth는 2.4GHz ISM(산업, 과학, 의료) 대역을 사용하며, 최대 데이터 속도는 3Mbps입니다. 이를 통해 높은 품질의 오디오 및 비디오를 전송할 수 있습니다.

zxvzbz

BLE

BLE(Bluetooth Low Energy)는 저전력 무선 기술로, 주로 에너지 효율적인 디바이스 간의 짧은 범위 통신에 사용됩니다. 주로 IoT 기기와 스마트 홈, 의료 기기, 웨어러블 장치 등에 활용되며, 블루투스 4.0 이상에서 지원되며, Classic Bluetooth와 비교하여 저전력 특성과 빠른 연결 설정 시간을 제공합니다.

zvxzxv

결론

Classic Bluetooth와 BLE는 모두 Bluetooth 프로토콜을 기반으로 한 무선 통신 기술이지만, 서로 다른 목적과 특성을 갖고 있습니다. 클래식 Bluetooth는 높은 데이터 전송 속도와 전력 소비가 높은 애플리케이션에 적합하며, 반면에 BLE는 저전력 및 단거리 통신이 필요한 IoT와 같은 애플리케이션에 적합합니다.

PAN과 LAN

PAN

PAN은 개인 영역 네트워크입니다. 개인 사용자 또는 소규모 그룹 간의 통신에 사용됩니다. 대부분 가까운 거리에서 동작합니다. 블루투스와 같은 기술을 사용하여 개인 장치 간의 직접적인 연결을 구축하는 데 사용됩니다.

LAN

LAN은 지역 영역 네트워크입니다. 단일 건물 또는 학교와 같이 상대적으로 작은 영역 내에서 컴퓨터 및 네트워크 장치 간의 통신에 사용됩니다. Wi-Fi 및 이더넷과 같은 기술을 사용하여 컴퓨터, 프린터, 서버 및 기타 장치를 네트워크에 연결하는 데 사용됩니다.

fdghjfj

주파수

주파수는 파동이 한 번 왕복하는데 걸리는 시간으로, 주기가 1초인 파동의 횟수를 나타냅니다. 일반적으로 주파수는 초당 주기의 횟수로 측정되며, 헤르츠(Hz) 단위로 표시됩니다. 주파수는 전자기파, 음파, 빛 등의 파동 현상에서 사용되며, 높은 주파수는 진동수가 빠르고, 낮은 주파수는 진동수가 느립니다. 주파수는 무선 통신, 라디오, 텔레비전, 음악 등 다양한 분야에서 중요한 역할을 합니다.

dghsdfg

실습[1]

실습[1] 내용

  • 이 실습에서는 ESP32를 활용하여 Classic Bluetooth 방식을 이용하여 스마트폰과의 통신을 설정하고 데이터를 주고받는 과정을 진행했습니다.

소스코드

#include "BluetoothSerial.h"

const char *pin = "1234"; // PIN 번호를 저장

String device_name = "ParkESP32-BT-Slave"; // 장치 이름 지정

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200); // 을 호출하여 시리얼 통신을 설정합니다.
  SerialBT.begin(device_name); 
  Serial.printf("The device with name \"%s\" is started.\nNow you can pair it with Bluetooth!\n", device_name.c_str());
 
  #ifdef USE_PIN
    SerialBT.setPin(pin);
    Serial.println("Using PIN");
  #endif
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read()); // 시리얼 포트에서 데이터를 읽어와 Bluetooth로 전송합니다. 
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read()); // Bluetooth 버퍼에서 데이터를 읽어와 시리얼 포트로 전송합니다.
  }
  delay(20);
}
  • 이 코드에서는 BluetoothSerial 라이브러리를 사용하여 Bluetooth 시리얼 통신을 설정합니다. setup() 함수에서는 Bluetooth 장치를 시작하고, loop() 함수에서는 시리얼 포트에서 Bluetooth로 데이터를 전송하고 Bluetooth에서 시리얼 포트로 데이터를 전송합니다.

아래는 "Serial Bluetooth terminal" 앱을 사용하여 ESP32와 블루투스로 연결하는 단계입니다.

  1. 먼저 Google Play Store 에서 "Serial Bluetooth terminal" 앱을 다운로드하고 설치합니다. (애플은 안됨)

  1. 앱을 실행한 후, Bluetooth를 활성화합니다.

  1. 찾은 ESP32를 탭하여 아래와 같이 연결을 시도합니다.

이러한 단계를 따르면 "Serial Bluetooth terminal" 앱을 사용하여 ESP32와 블루투스로 연결할 수 있습니다.


실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • 앱에서 데이터를 보내거나 받으면 ESP32에서도 해당 데이터를 읽거나 보낼 수 있습니다.
KakaoTalk_20240327_213900373.mp4

결과

  • 이 프로그램을 실행한 결과, ESP32와 블루투스를 사용하여 데이터를 주고 받을 수 있었습니다. "Serial Bluetooth terminal" 앱을 통해 ESP32와 블루투스로 연결하고 데이터를 전송하면 ESP32가 해당 데이터를 수신하고 처리할 수 있었습니다. 이를 통해 블루투스 통신이 원활하게 이루어지는 것을 확인할 수 있었습니다.
  • 주의사항 : 전송 속도를 꼭 일치하도록 설정해야 한다. 속도가 일치하지 않으면 데이터를 올바르게 해석하지 못할 수 있습니다.

실습[2] 내용

  • 이 실습에서는 RGB LED 모듈를 사용하여 빨강, 초록, 파랑, 백색 및 끄기 기능을 순환하면서 LED의 색을 변경하는 프로그램입니다.

준비물

  • ESP32, ESP32 확장 실드, RGB LED 모듈, 점퍼 케이블

회로 연결

소스코드

#define RED_PIN 4   // 빨간색 핀
#define GREEN_PIN 15 // 초록색 핀
#define BLUE_PIN 2  // 파란색 핀

void setup() {
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  
  // 모든 핀을 HIGH로 설정하여 LED를 꺼진 상태로 초기화합니다.
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, HIGH);
}

void loop() {
  // 빨강
  analogWrite(RED_PIN, 0);
  analogWrite(GREEN_PIN, 255);
  analogWrite(BLUE_PIN, 255);
  delay(1000);

  // 초록
  analogWrite(RED_PIN, 255);
  analogWrite(GREEN_PIN, 0);
  analogWrite(BLUE_PIN, 255);
  delay(1000);

  // 파랑
  analogWrite(RED_PIN, 255);
  analogWrite(GREEN_PIN, 255);
  analogWrite(BLUE_PIN, 0);
  delay(1000);

  // 백색
  analogWrite(RED_PIN, 0);
  analogWrite(GREEN_PIN, 0);
  analogWrite(BLUE_PIN, 0);
  delay(1000);

  // 끄기
  analogWrite(RED_PIN, 255);
  analogWrite(GREEN_PIN, 255);
  analogWrite(BLUE_PIN, 255);
  delay(1000);
}
  • 이 코드에서는 각 색상을 표현하기 위해 각 핀에 대해 analogWrite() 함수를 사용하여 PWM 신호를 보냅니다. 이를 통해 LED의 밝기를 조절하여 색상을 표현할 수 있습니다. 코드에서는 5가지 색을 각각 1초 동안 켜고 끕니다.

실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • RGB LED가 빨강, 초록, 파랑, 백색, 그리고 꺼진 순서로 반복하여 색상을 변경하고 LED가 깜박이는 것을 볼 수 있습니다.
KakaoTalk_20240327_222610636.mp4

결과

  • 이 프로그램을 실행한 결과, RGB LED가 빨간색, 초록색, 파란색, 백색, 그리고 LED가 꺼지는 순서로 LED의 색이 변경됩니다. 각 색상은 1초 동안 표시되며, 색상 간 전환은 1초의 딜레이가 있습니다. 이를 통해 LED가 깜박이는 효과를 확인할 수 있습니다.

실습[3] 내용

  • 이 실습에서는 Bluetooth Low Energy (BLE) 통신을 통해 RGB LED를 제어하는 예제입니다. BLE를 통해 스마트폰에서 RGB LED의 색상을 선택하고 제어할 수 있습니다.

준비물

  • ESP32, ESP32 확장 실드, RGB LED 모듈, 점퍼 케이블

회로 연결

소스코드

//라이브러리를 가져옵니다.
#include 
#include 
#include 
#include 
//서비스와 특성에 대한 UUID를 정의합니다.
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define RGB_CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define NOTYFY_CHARACTERISTIC_UUID "d501d731-f0f9-4121-a7f6-2c0f959f1583"
//RGB LED에 사용될 핀 번호를 정의합니다
#define RED_PIN   4
#define GREEN_PIN 15
#define BLUE_PIN  2
//BLE 관련 객체를 선언합니다.
BLEServer *pServer; //BLE 서버 객체
BLEService *pService; // BLE 서비스 객체
BLECharacteristic *pRGBCharacteristic = NULL; //BLE 특성 객체
BLECharacteristic* pCharacteristic = NULL; //BLE 특성 객체
//RGB 값을 저장할 변수들을 초기화합니
int redValue = 0;
int greenValue = 0;
int blueValue = 0;
//BLE 특성에 대한 콜백 클래스를 정의합니다.
class MyCallbacks : public BLECharacteristicCallbacks {
  //특성의 값을 읽어와 RGB 값을 파싱하고 LED를 제어합니다.
  void onWrite(BLECharacteristic *pCharacteristic) {
    String value = pCharacteristic->getValue().c_str(); //특성의 값을 문자열로 읽어옵니다.

    // 값이 유효한 경우에만 처리
    if (value.length() > 0) {
      // RGB 값을 파싱하여 각각의 변수에 저장
      int delimiterPos1 = value.indexOf(',');
      int delimiterPos2 = value.lastIndexOf(',');

      if (delimiterPos1 != -1 && delimiterPos2 != -1 \
             && delimiterPos2 < value.length() - 1) {
        redValue = value.substring(0, delimiterPos1).toInt();
        greenValue = value.substring(delimiterPos1 + 1, delimiterPos2).toInt();
        blueValue = value.substring(delimiterPos2 + 1).toInt();

        // RGB 값을 LED의 밝기로 변환하여 제어합니다.
        analogWrite(RED_PIN, 255 - redValue);
        analogWrite(GREEN_PIN, 255 - greenValue);
        analogWrite(BLUE_PIN, 255 - blueValue);
      }
    }
  }
};

void setup() {
  // BLE 초기화하고 이름을 "RGB LED Control"로 설정합니다
  BLEDevice::init("RGB LED Control");
  pServer = BLEDevice::createServer();
  pService = pServer->createService(SERVICE_UUID);
  
  // RGB 특성 생성 및 설정
  pRGBCharacteristic = pService->createCharacteristic(
    RGB_CHARACTERISTIC_UUID,
    BLECharacteristic::PROPERTY_WRITE
  );  
  pRGBCharacteristic->setCallbacks(new MyCallbacks());

  // Notify/Indicate 특성 생성 및 설정
  pCharacteristic = pService->createCharacteristic(
                      NOTYFY_CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_NOTIFY |
                      BLECharacteristic::PROPERTY_INDICATE
                    );
    // Create a BLE Descriptor
  pCharacteristic->addDescriptor(new BLE2902());

  // 서비스를 서버에 추가
  pService->start();

  // BLE 광고 시작
  BLEAdvertising *pAdvertising = pServer->getAdvertising();
  pAdvertising->start();

    // 모든 핀을 HIGH로 설정하여 LED를 꺼진 상태로 초기화합니다.
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, HIGH);
}

void loop() {
  // RGB 값을 16진수 형태로 변환하여 Notify
  char hexValue[8]; 
  sprintf(hexValue, "#%02X%02X%02X", redValue, greenValue, blueValue);
  //Notify 특성의 값을 hexValue로 설정합니다.
  pCharacteristic->setValue(hexValue); 
  pCharacteristic->notify(); //Notify를 통해 값을 전달합니다.

  delay(100);  // 알림 간격을 조절할 수 있습니다.
}
  • 이 코드를 사용하면 스마트폰 앱 또는 다른 BLE 장치를 사용하여 ESP32를 제어할 수 있습니다. 사용자가 특성을 쓰면 (예 : "255,0,0"과 같은 RGB 값을 포함하는 문자열), 해당 RGB 값에 따라 LED가 제어됩니다. 또한, Notify 특성을 통해 현재의 RGB 값을 지속적으로 알릴 수 있습니다.

아래는 "nRF Connect for Mobile" 앱을 사용하여 ESP32와의 연결하는 단계입니다.

  1. 먼저 Google Play Store 에서 “nRF Connect for Mobile” 앱을 다운로드하고 설치합니다. (애플은 안됨)

  1. 앱을 실행하고, 홈 화면에서 "Scan" 버튼을 탭하여 주변의 BLE(Bluetooth Low Energy) 장치를 검색합니다.

  1. 찾은 RGB LED 서비스 또는 특성을 사용하여 RGB LED의 색상을 변경하거나 제어할 수 있습니다. 이를 통해 ESP32와의 통신이 올바르게 설정되었는지 확인할 수 있습니다.

이러한 단계를 따르면 "nRF Connect for Mobile" 앱을 사용하여 ESP32와의 연결을 쉽게 설정할 수 있습니다.

실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • 스마트폰 앱에서 색상 값을 지정하면 ESP32는 해당 값을 수신하여 RGB LED를 제어하여 원하는 색상을 표시합니다.
KakaoTalk_20240327_231121800.mp4

결과

  • 앱에서 선택한 색상은 ESP32로 전송되어 RGB LED가 해당 색상으로 변합니다. 이를 통해 모바일 앱을 통해 LED의 색상을 쉽게 변경하고 제어할 수 있습니다.

번외(좋아하는 색깔 출력하기)

제가 좋아하는 색깔은 보라색입니다. 보라색을 출력하려면 빨간색과 파란색의 혼합으로 만들어집니다. 따라서 보라색을 출력하려면 빨간색과 파란색을 동시에 최대값으로 활성화해야 합니다.

KakaoTalk_20240327_233248799.mp4

결론 : BLE를 활용하여 빨간색, 녹색, 파란색의 값을 조절함으로써 다양한 색상을 출력할 수 있습니다. 예를 들어, 빨간색 최대값(255), 녹색 최소값(0), 파란색 최대값(255)으로 설정하면 보라색이 출력됩니다.

후기

ESP32를 사용하여 블루투스 통신을 구현하는 방법과 RGB LED를 제어하는 방법을 배웠습니다. 특히 Classic Bluetooth와 BLE를 사용하여 스마트폰과의 통신을 설정하고 LED의 색상을 변경하는 것은 매우 흥미로운 경험이었습니다. 또한 프로그래밍과 하드웨어 제어에 대한 이해도가 높아지고 블루투스 통신에 대한 이해도도 향상되었습니다. 이러한 경험은 앞으로의 학습에 많은 도움이 될 것 같습니다.

⚠️ **GitHub.com Fallback** ⚠️