スマホ、タブレット(Android) からESP32とBluetooth通信でステッピングモーターを制御します。

前回の「ESP32 ArduinoとAccelStepperでステッピングモーターを動作させます。」にBluetooth LE 通信でAndroidから制御するように変更します。

完成図

Androidからステッピングモーターを制御する完成図

ESP32での設定

ArduinoBLEを利用します。
【公式】ArduinoBLE

インストール方法

platformio.iniにlib_deps = arduino-libraries/ArduinoBLEを追加します。 特定のバージョンにするにはlib_deps = arduino-libraries/ArduinoBLE@1.3.3とします。

サンプルコード

#include <ArduinoBLE.h>
#define SERVICE_UUID "XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
#define CHARACTERISTIC_UUID "XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

BLEService bleService(SERVICE_UUID);
BLECharacteristic  bleCharacteristic(CHARACTERISTIC_UUID, BLERead | BLEWrite, 32);

/**
 * 書き込み時のイベントハンドラ
 */
void written(BLEDevice central, BLECharacteristic characteristic) {
  std::string value = "";
  for (int i = 0; i < characteristic.valueLength(); i++) {
    value += (char)characteristic.value()[i];
  }
  Serial.println(value.c_str());
}

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

  if (!BLE.begin()) {
    Serial.println("Failed to initialize BLE!");
    while (true);
  }
  BLE.setLocalName("DEMO");
  BLE.setAdvertisedService(bleService);

  bleService.addCharacteristic(bleCharacteristic);

  // add service
  BLE.addService(bleService);
  bleCharacteristic.setEventHandler(BLEWritten, written);

  // start advertising
  BLE.advertise();
}

void loop()
{
  BLE.poll();
  delay(1);
}

React Nativeでの設定

react-native-ble-managerのインストール

npm install react-native-ble-manager

Android パーミッションの設定

android/app/src/main/AndroidManifest.xml のファイルを変更します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
 <uses-permission android:name="android.permission.BLUETOOTH" tools:remove="android:maxSdkVersion" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" tools:remove="android:maxSdkVersion" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28"/> <uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> </manifest>

サンプルコード

/**
 * コマンドを送ります。
 * @param {string} commandText コマンド文字列
 */
const command = async (bleManager: any, commandText: string) => {
  await bleManager.connect(UUID);
  await bleManager.retrieveServices(UUID);
  await bleManager.write(
    UUID,
    SERVICE_UUID,
    CHARACTERRISTIC_UUID,
    stringToBytes(commandText),
  );
};
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。