ESP32-WROOM-32Eを用いて、Bluetoothで接続したPCからLEDを制御する

で、結局○○って何に使うんですか?

皆さんどうもこんにちは。ブログの書き方を何も覚えていません。カンでいきます。

今回は、
ESP32
……WiFiやBluetoothを扱えるマイコン
Web Bluetooth API
……ウェブページからBluetoothデバイスを制御できる

の合わせ技で、ブラウザから直接マイコンを制御してLEDを光らせようと思います。

↓こーゆー感じです

専門用語が多く厳密に解説をしているとキリがありませんので、とにかく動かすまでの説明をします。細かいところはChatGPTやGoogle先生に聞こう。ココなりTwitterにコメントあれば駆け付けます。

必要なもの

ESP32

種類がたくさんあるので注意が必要です。いや、基本は同じなので違うやつでも動く可能性はあります。ですがひとまず私の使ってるやつを書いておきます。

ESP32−DevKitC−32E ESP32−WROOM−32E開発ボード 4MB: マイコン関連 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作ESP32−DevKitC−32E ESP32−WROOM−32E開発ボード 4MB秋月電子通商 電子部品通信販売

これの場合USB microB端子のケーブルが必要になります。
DIP化キットなどを買えばより安く済みますが、書き込みのできる環境等整える必要はあります。

その他電子部品

LEDを光らせたいのでLEDと抵抗が必要です。ESP32の電源の供給は3.3Vなので、それを使うなら330Ωの抵抗を使って10mA流すのがいいでしょうかね
別に1KΩとかでも光ると思います
他、ブレッドボードやジャンパー線が必要です ESP32の幅がデカいので、幅広めのブレッドボードにするか二個つなげるのがいいです

ブレッドボード BB-801

ブレッドボードの幅→穴がAからJ
→0.1インチ×11→1.1インチ→27.94mm
ESP32-DevKitC-32E(今回買ったやつ)のピンの幅
→25.4mm→穴一つしか余らない

どうしてこんなギリギリの設計に??そもそも収まってるだけでありがたいです!!!!!

プログラムについて

概要

プログラムはgithubに置いてあるのでそこからまとめてダウンロードできます。

GitHub - konsaibakudan/ESP32LEDBluetooth: ESP32 BLE Server for LED Control This Arduino code is designed to set up an ESP32 as a Bluetooth Low Energy (BLE) server. It's intended to communicate with a client device, such as a smartphone, via BLE and control a LED based on received commands.
ESP32 BLE Server for LED Control This Arduino code is designed to set up an ESP32 as a Bluetooth Low Energy (BLE) server. It's intended to communicate with...

ざっくり言うと、ESP32側のコードでBluetoothの設定をし、Valueの「on」「off」を受け取るかで25番ピンのHIGH/LOWを制御し、結果としてLEDが点灯/消灯します。

web_interfaceのHTMLでウェブページのボタンを作り、JavascriptでBluetoothの接続、ボタンを押したときのValueの受け渡しを行っています。

ESP32側

Arduino IDEから以下のコードをESP32に突っ込みます。

ボード:ESP32 Dev Module

ポート:USB差して増えた場所 デバイスマネージャー等から確認すると確実です

↑のCOM5のやつ 最初上手くいかなかったのでドライバ入れなおしたらうまくいったとかはありました

#include "BLEDevice.h"
#include "BLEUtils.h"
#include "BLEServer.h"

BLEServer *pServer = nullptr;
BLECharacteristic *pCharacteristic = nullptr;
bool deviceConnected = false;

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

void setup() {
  Serial.begin(115200);

  pinMode(25, OUTPUT);

  // BLEデバイスの初期化
  BLEDevice::init("ESP32_BLE");

  // BLEサービスの作成
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer->createService("YOUR_SERVICE_UUID");

  // BLEキャラクタリスティックの作成
  pCharacteristic = pService->createCharacteristic(
                      "YOUR_CHARACTERISTIC_UUID",
                      BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);

  pService->start();

  // BLE広告の開始
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(pService->getUUID());
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
}

void loop() {
  // デバイスが接続されている場合にコマンドを処理する
  if (deviceConnected && pCharacteristic->getValue().length() > 0) {
    String value = pCharacteristic->getValue().c_str();

    if (value == "on") {
      digitalWrite(25, HIGH); // 25番ピンをHIGHに設定
    }else if(value == "off"){
      digitalWrite(25, LOW);
    }
    }
  }

もうちょっと綺麗にソースコード貼れるはず……

ピン番号やBluetoothのUUIDは自分のものに合わせてください。UUIDは↓のサイトで生成したりするのがいいと思います。

Online UUID Generator Tool
Quickly and easily generate individual or bulk sets of universally unique identifiers (UUIDs).

ウェブページ側

HTMLは↓みたいなページが出てきます。

<!DOCTYPE html>
<html>
<head>
<title>ESP32 Bluetooth Control</title>
</head>
<body>
<button id="connect">Bluetooth接続</button>
<button id="on">点灯</button>
<button id="off">消灯</button>
<script src="script.js"></script>
</body>
</html>

Javascript(ファイル名:script.js)

let device, characteristic;

// Bluetooth接続を行う関数
document.getElementById('connect').addEventListener('click', async () => {
  try {
    // ユーザーにデバイスの選択を求める
    device = await navigator.bluetooth.requestDevice({
      acceptAllDevices: true,
      optionalServices: ['YOUR_SERVICE_UUID'] // ここにESP32のサービスUUIDを入れる
    });

    // 選択されたデバイスに接続
    const server = await device.gatt.connect();
    const service = await server.getPrimaryService('YOUR_SERVICE_UUID'); // ここにESP32のサービスUUIDを入れる
    characteristic = await service.getCharacteristic('YOUR_CHARACTERISTIC_UUID'); // ここにESP32のキャラクタリスティックUUIDを入れる

    console.log('Bluetoothデバイスに接続しました!');
  } catch (error) {
    console.log('Bluetooth接続に失敗しました: ' + error);
  }
});

// コマンドをESP32に送信する関数
function sendCommand(command) {
  if (device && characteristic) {
    characteristic.writeValue(new TextEncoder().encode(command));
  }
}

// 各方向ボタンにイベントリスナーを設定
['on', 'off'].forEach(direction => {
  document.getElementById(direction).addEventListener('click', () => {
    sendCommand(direction);
    console.log('コマンド送信: ' + direction);
  });
});

何かするたびにコンソールにいちいち出力して開発者ツールで見とくのをおすすめします

まとめ

LEDを光らせられるならモーターだって回る ラジコンでも作りましょうかね

コメント

タイトルとURLをコピーしました