UGOKU Lab

UGOKU Pad

UGOKU Padは、ESP32などのマイコンとBluetoothでスマートフォンを接続し、簡単に操作できるアプリです。
ジョイスティックやスライダー、ボタンなど、色々なウィジェットを組み合わせて、自分だけの操作パネルを作成できます。
モーターの操作やセンサー値の表示など、様々な用途でつかえます。

特徴

操作パネル(Console)上に、トグルスイッチやジョイスティックなどの入力ウィジェット、Value Monitor や Line Chart などのモニターウィジェットを任意の位置やサイズで配置できます。
各ウィジェットには任意のチャンネル番号を設定できます。

UGOKU Pad Features

スタートガイド

UGOKU Pad overview

UGOKU PadのArduinoライブラリをインストールすることで、ESP32搭載ボードを使って簡単にUGOKU Padと通信できます。
最小コード例:

#include <UGOKU-Pad_Controller.h>
UGOKUPadController UGOKUPad;

void setup() {
  UGOKUPad.begin("UGOKU Pad ESP32");
}

void loop() {
  if (!UGOKUPad.update()) return; // 受信値を更新
  uint8_t value = UGOKUPad.read(1); // ch1 の値を取得
  UGOKUPad.write(2, 123); // ch2 に 123 の値を送信
  delay(50);
}

サンプルスケッチ: UGOKU Pad で ESP32 に接続したサーボモーターを操作する / UGOKU PadでADC読取値を表示する

ESP32の準備

ESP32 配線サンプル

ESP32とUGOKU Padを接続するための配線例です。

機能 ピン
デジタル出力 27
測距モジュール 26
RCサーボ 14
ローテーションサーボ 12

Arduino IDE の準備

ESP32ボードのインストール

BOARD MANAGER で esp32 をインストール

Board Manager screenshot

ライブラリのインストール

LIBRARY MANAGER で UGOKU-Pad, ESP32Servo をインストール

UGOKU Pad Arduino Library Library Manager screenshot

ボードの選択

Select Other Board and Port で ESP32 Dev Module を検索して選択

Board Selection screenshot

サンプルスケッチの書き込み

下記のサンプルスケッチをESP32に書き込みます。

#include <UGOKU-Pad_Controller.h>
#include <ESP32Servo.h>

UGOKUPadController UGOKUPad;
bool isConnected = false;

Servo servo2;
Servo servo3;

//UGOKU PadがESP32に接続したときに実行されます。サーボを指定ピンに接続して(attach)、中央の90度に動かします。ローテーションサーボの場合は停止させます。
void onConnect() {
  isConnected = true;
  servo2.attach(12);
  servo3.attach(14);
  servo2.write(90);
  servo3.write(90);
}

//UGOKU Padが切断されたら呼ばれる関数。フラグを下ろして(false)、LEDなどの出力を消し、サーボの制御を止めて安全にします。
void onDisconnect() {
  isConnected = false;
  digitalWrite(27, LOW);
  servo2.detach();
  servo3.detach();
}

//起動時に一度だけ動く部分です。
void setup() {
  UGOKUPad.begin("My ESP32");
  UGOKUPad.setConnectionHandlers(onConnect, onDisconnect);
  pinMode(26, INPUT);
  pinMode(27, OUTPUT);
}

//繰り返しの処理
void loop() {
  //接続していないときにループに入らないようにしています。
  if (!isConnected) return;

  //アプリから来た最新データを受け取ります。データに問題があれば中断します。
  if (!UGOKUPad.update()) return;
  
  //アプリの ch1(トグルスイッチ)を読み取りピン27をオン/オフします。
  digitalWrite(27, UGOKUPad.read(1)); 
  
  //アプリの ch2 と ch3 の値(0〜180)をサーボ角度(ローテーションサーボの場合は速度)にして動かします。
  servo2.write(UGOKUPad.read(2)); 
  servo3.write(UGOKUPad.read(3));
  
  //アナログ入力ピンの値を読み、0〜4095の値を0〜100のパーセントに変換してからでアプリに送ります。
  uint8_t percent = (analogRead(26) * 100U) / 4095U; // 0-100 from ADC.
  UGOKUPad.write(5, percent); // Send 0-100 value.

  delay(50);
}

アプリの操作

  1. 左上のメニューボタンをタップ
  2. Console をタップ
  3. Sample: ESP32 Arduino Sampleを選択
  4. Selectをタップした後Scan Deviceをタップ
  5. My ESP32を選択する
  6. 接続のアイコンが表示されるのを確認する
  7. 戻るボタンから操作画面に戻る
sample-useage

BLE通信について

Flutterflutter_blue_plus ライブラリを用いて、Android/iOS の標準BLEに対応しています。
1回(1パケット)の通信は 19バイト固定 です。
(チャンネル, バリュー) のペア9組と、全体のチェックサム1バイトで構成することでBLE通信を効率化し、低遅延を実現しています。

要素 役割 サイズ
データペア (x9) (チャンネル, バリュー) のペア × 9組 18バイト (2バイト×9)
チェックサム 上記18バイトの排他的論理和 (XOR) 1バイト
合計 19バイト

50msごとに呼び出される periodicSend() により、以下を実行します。