NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    iOS×ESP32でBLE接続して制御するための準備

    概要

    iPhone®とESP32をBLEで接続し、制御するための準備方法をご紹介します。
    ここではBLEやBluetooth(classic)の違いなどは説明しませんのでその辺りを知りたい方は別の記事を参考にしていただければと思います。
    今回の目標としてはiPhone®とESP32をBLE接続を行うまでが目標です。

    環境

    この記事は以下のバージョン環境のもと作成されたものです。
    【Arduino IDE】2.0.0
    【iOS】16.0.2
    【macOS】Monterey バージョン 12.5

    準備するもの(物理)

    iOS×ESP32でBLE接続して制御するためESP32とiPhone®は必須となります。
    ESP32に関しては今回Espressif Systems製のESP-WROOM-32を使用しましたがメーカーはどこでも良いかと思います。
    iPhone®に関してはBLE接続ができればどのシリーズでも良いです。

    ESP32とは

    ESP32について少し説明します。
    Arduinoと同じくマイコンの一種ですがWiFiとBLEを搭載しています。
    またデュアルコア、動作クロックは240MHz、RAMは520KB、フラッシュメモリは64MBなどとなっており、非常に高いスペックを持ちながら1000円以下で購入することができます。

    iPhone®とESP32をBLEで接続する

    iPhone®とESP32をBLEで接続するための準備を行なっていきます。
    流れとしては以下の通りです。

    • Arduino IDEのダウンロード
    • ESP32のボードを追加
    • スケッチ例からサンプルコード起動
    • nRF Connect for Mobileを使用してBLE接続する

    以上です。

    Arduino IDEをダウンロード

    Arduino IDEは以下からダウンロードできます。
    特段セットアップなどもなく、必要なOSのIDEをダウンロードしてインストールし、起動するだけです。

    www.arduino.cc

    ESP32のボードを追加

    デフォルトではESP32に対応するボードが用意されていないので追加する必要があります。
    Arduino IDE → 基本設定... → 追加のボードマネージャのURL → 以下URL記入
    https://dl.espressif.com/dl/package_esp32_index.json

    続いてツール → ボードマネージャで"ESP32"を検索してライブラリをインストールします。

    これでESP32のボードを追加することができましたので確認して、以下のボードに設定しておきます。

    スケッチ例からサンプルコード起動

    Arduino IDEではスケッチ例から様々なサンプルコードを生成することが可能です。
    以下BLE接続を行うためのサンプルコードを生成する方法です。
    ファイル → スケッチ例 → ESP32 BLE Arduino → BLE_server

    生成されるサンプルコードは以下の通りです。

    #include <BLEDevice.h>
    #include <BLEUtils.h>
    #include <BLEServer.h>
    
    // See the following for generating UUIDs:
    // https://www.uuidgenerator.net/
    
    #define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
    #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
    
    void setup() {
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      BLEDevice::init("Long name works now");
      BLEServer *pServer = BLEDevice::createServer();
      BLEService *pService = pServer->createService(SERVICE_UUID);
      BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                             CHARACTERISTIC_UUID,
                                             BLECharacteristic::PROPERTY_READ |
                                             BLECharacteristic::PROPERTY_WRITE
                                           );
    
      pCharacteristic->setValue("Hello World says Neil");
      pService->start();
      // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
      BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
      pAdvertising->addServiceUUID(SERVICE_UUID);
      pAdvertising->setScanResponse(true);
      pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
      pAdvertising->setMinPreferred(0x12);
      BLEDevice::startAdvertising();
      Serial.println("Characteristic defined! Now you can read it in your phone!");
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      delay(2000);
    }
    

    nRF Connect for Mobileを使用してBLE接続する

    最後にESP32とiPhone®を接続していきたいと思います。
    接続には以下のようなBLEを検知して接続する専用のAppが必要です。

    nRF Connect for Mobile

    nRF Connect for Mobile

    • Nordic Semiconductor ASA
    • ユーティリティ
    • 無料
    apps.apple.com

    接続にAppを使用する理由ですが、かなり古いですが以下スタックオーバーフローでこのような記載があります。

    Bluetooth Low Energy デバイスは、[設定] -> [Bluetooth] ページで検出できません。これは、キーボードやヘッドセット/ハンズフリー デバイスなどの Bluetooth 2.1/3.0 デバイス専用です。

    stackoverflow.com

    よって標準の [設定] → [Bluetooth] ではBLEは検出することができません。
    またBLE接続をするにはCoreBluetoothを使用する必要があるようです。
    ここでは一旦BLE接続ができることが確認できればいいのでCoewBluetoothを使用してアプリを作る前に、接続を検証したかったのでBLEを検出できるアプリを使用しました。

    接続している様子

    まとめ

    以上ESP32をBLE接続する方法でした。
    設定がやや面倒に感じるかもしれませんが、ボードは一度追加すれば今後追加の必要が無いので実際そこまで手間ではないかなという印象でした。
    それ以上にスケッチ例からのサンプルコード生成が非常に強力だなと思いました!

    執筆者岡優志

    iOSエンジニア
    iOSを専門とし、モバイルアプリの開発を行なっています。

    Twitter