fc2ブログ

ESP32 BLEとスマホアプリで遊ぶ! その2

ESP32とスマホアプリ「BLE Universal Pad」を使いPWMを試しました。
2019年5月30日の作品

その2

BLE_Universal_Pad2.jpg

3)スマホアプリのインストール

 ここではAndroid無料アプリ「BLE Universal Pad」をGoogle Playからダウンロードして利用します。
 ここをクリックするとGoogle Playのダウンロードページが開きます

4)BLE Universal Padの使い方

①アプリを起動するとBLE Universal Padの画面が開きます。上部右端の赤丸をタップすると
ConfigurationとExitの小窓が開くのでConfigurationをタップします。
注意:下部チェックボックスはZeroにのみチェックを入れます。
BLE_Universal_Pad.jpg
クリックすると拡大画像が見れます。


②次にDefine UUIDsの窓が開くので、ここにsketch内のUUIDを転記し、OKをクリックします。
BLE_Universal_Pad3.jpg
クリックすると拡大画像が見れます。


③下部赤丸をタップするとSelect a deviceの窓が開きます。
ESP32の電源がONの場合、アプリケーションのSCAN機能にりUART Serviceが認識され、
ここにUART Serviceが表示されます。次にその表示をタップするとESP32とConnectして
BLE Universal Padが使えるようになります。後は動画を参考にして下さい。
BLE_Universal_Pad4.jpg
クリックすると拡大画像が見れます。



動画をご覧下さい。




皆様の参考になれば幸いです。
2019.06.01  by Paradise

スポンサーサイト



テーマ : 電子工作
ジャンル : 趣味・実用

ESP32 BLEとスマホアプリで遊ぶ! その1

ESP32とスマホアプリ「BLE Universal Pad」を使いPWMを試しました。
2019年5月30日の作品

その1

スマホアプリBLE Universal Padは、Pad上をタッチスライドすることにより、ジョイスティックのような動作をします。
このため、単なるON/OFF操作ではなく、アナログ的にPad中央を0点としてxy方向に0~±100のタッチポイントを
数値として連続して出力します。 これを応用してモータのPWM制御やサーボモータの制御が行えるのため、
ロボットやラジコンカー等のリモコンとして有用です。
動作を解り易くするため、前回も使用のLEDボードにPad上の位置に対応したLEDの輝度変化を表示しました。
   (BLEとはBluetooth Lowpower Energyの略語でOld Bluetoothに比べて省電力通信が行えます)
BLE_Universal_Pad2.jpg

1)LEDボードの準備
LEDボードは以前に使った物ですが、今回はPWM信号により輝度変化を表示します。
BLE_LED_test2.jpg

LEDボード回路図を再掲載します。
BLE_LED_Board_B.gif

2)BLE Universal Padアプリに対応したsketchを作成
このsketchはESP32 BLE Arduinoのスケッチ例「BLE uart」を応用して機能を追加します。
①追加個所:各LEDにGPIOを定義。


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

//以下の赤字行追加
int LED_F = 32; // ↑ button to LED
int LED_B = 33; // ↓ button to LED
int LED_L = 25; // ← button to LED
int LED_R = 26; // → button to LED
int LED_1 = 27; // 1 button to LED
int LED_2 = 14; // 2 button to LED
int LED_3 = 12; // 3 button to LED
int LED_4 = 13; // 4 button to LED

*pCharacteristic;
BLEDescriptor *pDescriptor;
bool deviceConnected = false;
bool deviceNotifying = false;
uint8_t txValue = 0;


②スマホアプリからはx,y,z各軸の値(0~±100)がカンマ区切りのデータとして送られてきます。
これを、sscanf()関数を使って各軸の値をx_dat、y_dat、z_datとして取り出しています。
次に、map()関数を使って0~±100の値を0~±255に変換し、ledcWrite()関数に設定したGPIOから
LEDにPWM信号が与えられ、入力値に応じて輝度を変えます。


class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();

//以下の赤字行追加
   String strVal = value.c_str();
data = new char[strVal.length()];
strcpy(data, value.c_str());
sscanf(data, "%d,%d,%d", &x_dat, &y_dat, &z_dat);
Serial.print(x_dat) ; // シリアルモニターにて確認できます。
Serial.print( ',' ) ;
Serial.print(y_dat) ;
Serial.print( ',' ) ;
Serial.println(z_dat) ;
int val_R = map(x_dat, 0, 100, 0, 255);
int val_L = map(x_dat, 0, -100, 0, 255);
int val_F = map(y_dat, 0, 100, 0, 255);
int val_B = map(y_dat, 0, -100, 0, 255);
int val_1 = map(z_dat, 0, 100, 0, 255);
int val_2 = map(z_dat, 0, -100, 0, 255);
Serial.print(val_R) ; // シリアルモニターにて確認できます。
Serial.print( ',' ) ;
Serial.print(val_L) ;
Serial.print( ',' ) ;
Serial.print(val_F ) ;
Serial.print( ',' ) ;
Serial.print(val_B) ;
Serial.print( ',' ) ;
Serial.print(val_1 ) ;
Serial.print( ',' ) ;
Serial.println(val_2) ;

if (val_F > 0) { // Forward LED
ledcWrite(0, val_F);
ledcWrite(1, 0);
} else if (val_B > 0) { // Backward LED
ledcWrite(1, val_B);
ledcWrite(0, 0);
} if (val_R > 0) { // Turnright LED
ledcWrite(3, val_R);
ledcWrite(2, 0);
} else if (val_L > 0) { // Turnleft LED
ledcWrite(2, val_L);
ledcWrite(3, 0);
} else {
ledcWrite(0, 0);
ledcWrite(1, 0);
ledcWrite(2, 0);
ledcWrite(3, 0);
}
if (val_1 > 0) { // 1
ledcWrite(5, val_1);
ledcWrite(4, 0);
} else if (val_2 > 0) { // 2
ledcWrite(4, val_2);
ledcWrite(5, 0);
}
}
};


③setupにledcSetupとledcAttachPinの定義設定します。


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

//以下の赤字行追加
ledcSetup(0, 500, 8); // 0ch 500Hz 8bit resolution
ledcSetup(1, 500, 8); // 1ch 500Hz 8bit resolution
ledcSetup(2, 500, 8); // 2ch 500Hz 8bit resolution
ledcSetup(3, 500, 8); // 3ch 500Hz 8bit resolution
ledcSetup(4, 500, 8); // 2ch 500Hz 8bit resolution
ledcSetup(5, 500, 8); // 3ch 500Hz 8bit resolution
ledcAttachPin(LED_F, 0); // 0ch : GPIO 32pin
ledcAttachPin(LED_B, 1); // 1ch : GPIO 33pin
ledcAttachPin(LED_R, 2); // 2ch : GPIO 26pin
ledcAttachPin(LED_L, 3); // 3ch : GPIO 25pin
ledcAttachPin(LED_1, 4); // 4ch : GPIO 27pin
ledcAttachPin(LED_2, 5); // 5ch : GPIO 14pin


ここをクリックすると上記の変更済sketchを開きます。

動画をご覧下さい。


次回、その2へ続きます。



皆様の参考になれば幸いです。
2019.05.31  by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

ESP32を2個使ってP2P BLE通信でLEDコントロール その2

ESP32のBLEを使いpeer to peerでLEDをコントロールする。
2019年5月24日の作品

その2 BLE P2PのSWボード送信側

先日、5月19日から21日に連載しました。スマホアプリを使ってESP32をBLEコントロールのスマホに替え、
ESP32を使った専用リモコンに替える方法を紹介します。
ここでは単にLEDをON/OFFさせるテストですが、これが基本動作でありモータ制御などの基となります。
esp32_BLE_SW_TEST1S.jpg

1)SWボード
受信側のLEDボード対称するようにタクトスイッチ配置したSWボードを作りました。
BLE_SW_Board.jpg


SWボード回路図
BLE_SW_BOARD.gif

下はESP32開発ボードをESP32モジュールに置き換え、電池と一緒に木製ケースに入れたBLEリモコンです。
こちらのTJ5ロボットで実際に使ってるので参考にして下さい。
スマホやタブレットを使えない幼児や小さいお子さんでも簡単にロボットなどの操作が出来る利点が有ります。
esp32_BLE_SW_TEST2S.jpg

2)SWボード側のsketch例
ここをクリックするとSWボード側のsketchをご覧いただけます。

動画をご覧下さい。




皆様の参考になれば幸いです。
2019.05.26  by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

ESP32を2個使ってP2P BLE通信でLEDコントロール その1

ESP32のBLEを使いpeer to peerでLEDをコントロールする。
2019年5月24日の作品

その1 BLE P2Pの受信側

先日、5月19日から21日に連載しました。スマホアプリを使ってESP32をBLEコントロールのスマホに替え、
ESP32を使った専用リモコンに替える方法を紹介します。
ここでは単にLEDをON/OFFさせるテストですが、これが基本動作でありモータ制御などの基となります。
esp32_BLE_SW_TEST1S.jpg

1)LEDボード
LEDボードはスマホアプリを使ってESP32をBLEコントロールに使った物をそのまま使いますが、sketchが
P2P用に変わります。
BLE_LED_test2.jpg

LEDボード回路図を再掲載します。
BLE_LED_Board_B.gif

2)LEDボード側のsketch例
ここをクリックするとLEDボード側のsketchをご覧いただけます。

動画をご覧下さい。


次回、その2へ続きます。



皆様の参考になれば幸いです。
2019.05.25  by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

ESP32とスマホをBluetoothLE(BLE)で繋ぐ その3

スマホアプリを使ってESP32をBLEコントロール
2019年5月の作品

その3
4)Adafruit Bluefruit LE Con​​nectの使い方

ESP32にsketchwを書き込んだ後、スマホアプリ「Adafruit Bluefruit LE Con​​nect」を起動すると下記の
初期画面が表示されます。
①ESP32にPCからのUSBケーブルを接続するか、又はUSB電源を供給します。
②初期画面の1番下側にCentral ModeとPeripheral Modeの選択が有りますが、ここではCentral Modeを
使います。他のチェックボックスは下の画像の通りに設定してください。
③アプリのスキャン機能により、UART Serviceが表示されます。ここでCONNNECTボタンを選択します。
Application1.jpg

④この画面では、DEVICE名UART Serviceと電波強度などが表示と機能を選択するModules内の
Controllerを選択します。
Application2.jpg

⑤この画面では、下から2番目のControl Padを選択します。
Application3.jpg

⑥Control Padが開きました。ここでは理解しやすいようにボタンに対応したLEDのON/OFFのみですが、
プログラム次第でロボットや模型自動車のリモコン操作などに応用できます。
興味のある方は、実際にこのスマホアプリを使った例を参考にして下さい。
SP32のBluetooth BLEを使ったリモコン試すの第2章をご覧下さい。
Application4.jpg

5)操作ボタンに対応したコードを見る
上記の操作においてESP32とPCがUSBケーブルで接続され、かつArduinoIDEが開かれてる場合は
シリアルモニターにて操作ボタンに対応したコードが確認できます。
Arduino_IDE_SerialMonitor.gif

動画をご覧下さい。




最後までご覧頂きまして有難うございます。


皆様の参考になれば幸いです。
2019.05.21  by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

ESP32とスマホをBluetoothLE(BLE)で繋ぐ その2

スマホアプリを使ってESP32をBLEコントロール
2019年5月の作品

その2

3)LEDテスト用sketchを作る

 ここで使うsketchは、ESP32をArduinoIDEで使うためのlibrary「Arduino core for the ESP32」をインストールすると
AlduinoIDEのsketch例で見れるBLE_uartを応用したものです。
受信コードに対応したLEDを点灯させる単純な機能ですが、これがスマホからBLEを介してESP32をコントロールする
基本となり、ロボットを動かすモータ制御等へ発展させる原点となります。

sketch例のBLE uartにLED点灯機能を追加します。
①各LEDにGPIOを割り当てます。


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

//以下の赤字行追加
int LED_F = 32; // ↑ button to LED
int LED_B = 33; // ↓ button to LED
int LED_L = 25; // ← button to LED
int LED_R = 26; // → button to LED
int LED_1 = 27; // 1 button to LED
int LED_2 = 14; // 2 button to LED
int LED_3 = 12; // 3 button to LED
int LED_4 = 13; // 4 button to LED

*pCharacteristic;
BLEDescriptor *pDescriptor;
bool deviceConnected = false;
bool deviceNotifying = false;
uint8_t txValue = 0;


②rxValueにアプリの各ボタンに対応した受信コードを設定し、そのコードが
選択された時に行うLEDのON/OFFを設定します。


class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
Serial.print("Received Value: ");
for (int i = 0; i < rxValue.length(); i++)
Serial.print(rxValue[i]);

//以下の赤字行を追加
if (rxValue == "!B516") { // ↑ button push
digitalWrite(LED_F, HIGH); // LED ON
digitalWrite(LED_B, LOW); // LED OFF
digitalWrite(LED_L, LOW); // LED OFF
digitalWrite(LED_R, LOW); // LED OFF
} else if (rxValue == "!B507") { // ↑ button Release
digitalWrite(LED_F, LOW); // LED OFF
}
else if (rxValue == "!B615") { // ↓ button push
digitalWrite(LED_B, HIGH); // LED ON
digitalWrite(LED_F, LOW); // LED OFF
digitalWrite(LED_R, LOW); // LED OFF
digitalWrite(LED_L, LOW); // LED OFF
} else if (rxValue == "!B606") { // ↓ button Release
digitalWrite(LED_B, LOW); // LED OFF
}
else if (rxValue == "!B714") { // ← button push
digitalWrite(LED_L, HIGH); // LED ON
digitalWrite(LED_F, LOW); // LED OFF
digitalWrite(LED_B, LOW); // LED OFF
digitalWrite(LED_R, LOW); // LED OFF
} else if (rxValue == "!B705") { // ← button Release
digitalWrite(LED_L, LOW); // LED OFF
}
else if (rxValue == "!B813") { // → button push
digitalWrite(LED_R, HIGH); // LED ON
digitalWrite(LED_F, LOW); // LED OFF
digitalWrite(LED_B, LOW); // LED OFF
digitalWrite(LED_L, LOW); // LED OFF
} else if (rxValue == "!B804") { // → button Release
digitalWrite(LED_R, LOW); // LED OFF
}
if (rxValue == "!B11:") { // 1 button push
digitalWrite(LED_1, HIGH); // LED ON
digitalWrite(LED_2, LOW); // LED OFF
digitalWrite(LED_3, LOW); // LED OFF
digitalWrite(LED_4, LOW); // LED OFF
}
else if (rxValue == "!B10;") { // 1 button Release
digitalWrite(LED_1, LOW); // LED OFF
}
if (rxValue == "!B219") { // 2 button push
digitalWrite(LED_2, HIGH); // LED ON
digitalWrite(LED_1, LOW); // LED OFF
digitalWrite(LED_3, LOW); // LED OFF
digitalWrite(LED_4, LOW); // LED OFF
}
else if (rxValue == "!B20:") { // 2 button Release
digitalWrite(LED_2, LOW); // LED OFF
}
if (rxValue == "!B318") { // 3 button push
digitalWrite(LED_3, HIGH); // LED ON
digitalWrite(LED_1, LOW); // LED OFF
digitalWrite(LED_2, LOW); // LED OFF
digitalWrite(LED_4, LOW); // LED OFF
}
else if (rxValue == "!B309") { // 3 button Release
digitalWrite(LED_3, LOW); // LED OFF
}
if (rxValue == "!B417") { // 4 button push
digitalWrite(LED_4, HIGH); // LED ON
digitalWrite(LED_1, LOW); // LED OFF
digitalWrite(LED_2, LOW); // LED OFF
digitalWrite(LED_3, LOW); // LED OFF
}

else if (rxValue == "!B408") { // 4 button Release
digitalWrite(LED_4, LOW); // LED OFF
}
Serial.println();
}
}
};


③setupに各GPIOの入出力と初期値を設定します。


void setup() {
Serial.begin(115200);
//以下の赤字行を追加
pinMode(32, OUTPUT); digitalWrite(32, LOW); // ↑ LED
pinMode(33, OUTPUT); digitalWrite(33, LOW); // ↓ LED
pinMode(25, OUTPUT); digitalWrite(25, LOW); // ← LED
pinMode(26, OUTPUT); digitalWrite(26, LOW); // → LED
pinMode(27, OUTPUT); digitalWrite(27, LOW); // 1 LED
pinMode(14, OUTPUT); digitalWrite(14, LOW); // 2 LED
pinMode(12, OUTPUT); digitalWrite(12, LOW); // 3 LED
pinMode(13, OUTPUT); digitalWrite(13, LOW); // 4 LED


// Create the BLE Device
BLEDevice::init("UART Service"); // Device Name

// Create the BLE Server
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);

// Create a BLE Characteristic
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);

pDescriptor = new BLE2902();
pCharacteristic->addDescriptor(pDescriptor);

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);

pCharacteristic->setCallbacks(new MyCallbacks());
pDescriptor->setCallbacks(new MyDisCallbacks());

// Start the service
pService->start();

// Start advertising
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}


ここをクリックすると上記の変更済sketchを開きます。


次回、その3へ続きます。


皆様の参考になれば幸いです。
2019.05.20  by Paradise



テーマ : 電子工作
ジャンル : 趣味・実用

ESP32とスマホをBluetoothLE(BLE)で繋ぐ その1

スマホアプリを使ってESP32をBLEコントロール
2019年5月の作品

その1

スマートフォン・アプリ「Adafruit Bluefruit LE Connect」を使い、ESP32をBLEでコントロールする方法を
紹介します。 動作を解り易くするためにスマホアプリのボタン位置に対称する簡単なLEDボードを作りました。
ここではESP32開発ボードDOIT DEVkit V1を使い、ブレッドボードに片側のピンを差し込み抵抗を介して
LEDボードと接続する簡単な方法を用い ました。 (機器に組み込む場合はESP32モジュール単体を使用)
(BLEとはBluetooth Low Energyの略語でClassic Bluetoothに比べて大幅な省電力通信が行えます)
BLE_LED_test3.jpg

1)LEDテストボードを作る
LEDテストボードの回路図
BLE_LED_Board_B.gif

ブレッドボードにDOIT DEVkit V1とLEDボードを電流制限抵抗を介して接続
BLE_LED_test1.jpg

ユニバーサル基板の端材を使ったLEDボードとLEDの配置
BLE_LED_test2.jpg

2)スマホアプリのインストール

私はAndroidタブレットしか持ってないので、ここではAndroid無料アプリ「Adafruit Bluefruit LE Connect」を
Google Playからダウンロードして利用しました。 
ここをクリックするとGoogle Playのダウンロードページに移動します。

ここではControl Padしか使いませんが、他にも面白い機能が入ったアプリです。

動画をご覧下さい。




次回、その2へ続きます。



皆様の参考になれば幸いです。
2019.05.19  by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

プロフィール

CNC_Paradise

Author:CNC_Paradise
木工・彫刻・機械工作・電子工作が
大好きで自作のCNCを使って工作を
楽しんでます。

最新記事
最新コメント
月別アーカイブ
カテゴリ
何でも工作室
検索フォーム
RSSリンクの表示
リンク
QRコード
QR