前回の「ESP32 ArduinoとAccelStepperでステッピングモーターを動作させます。」にBluetooth LE 通信で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),
);
};