見出し画像

iPhoneで自動周回プレイ ④仮想キーボードの製作

前記事では画面タップせずにスイッチコントロールを実行するためにBluetoothキーボードを使用した方法をまとめた。
あとは自動周回用に一定間隔でキーを叩けば24時間戦える。
今回はその仕組みと専用の機能を持った機械の製作方法についてまとめる。

警告

多くのゲームではスイッチコントロールなどによる自動操作は規約によっては禁止事項となっている。最悪の場合アカウント削除処分となるので使用する際には十分確認とリスクを承知した上で使用すること。
高額課金してても消される場合あるよ。

まとめ結論

ESP32ボードで仮想Bluetoothキーボードの製作。
ページが長くて複雑そうに見えても意外と簡単に作れるよ。




キーを自動入力させる方法

スイッチコントロールのスイッチに割り当てたキーを定期的に送信する方法には下記の2つがある。

  • キーボードを改造して一定間隔でキーを操作できるように改造する

    • タイマーIC555などを使ってキーのパターンをショートさせる

    • タイミング調整できるようにしておくと便利

  • マイコンボードを使用して仮想キーボードを製作する

    • キー送信するだけの機械を作る

    • プログラム次第で正確で細かい制御ができる

改造はハンダ付けや制御回路の作成も必要、その後キーボードとしても使いにくくなってしまう。
今回はマイコンボードを活用して仮想キーボードを製作する。



機能要件とマイコンボードの選定

機能要件

  1. 特定のキーを一定間隔で押下する

  2. iPhoneとの接続にはBluetoothを使用する

  3. iPhone側からはキーボードとして認識されるようにする

  4. できるだけハンダ付け作業などは行わないようにしたい

以上を満たすものとして、今回は無線モジュールが標準で組み込まれているものが多いESP32シリーズのマイコンボードを使用する。

ESP32シリーズとボード選定

ESP32シリーズは Wi-FiとBluetoothを内蔵する低コスト、低消費電力なSoCのマイクロコントローラである。

https://ja.wikipedia.org/wiki/ESP32

早い話が無線機能内蔵の超小型PC。
簡単なプログラムでBluetoothキーボードとして動作させることができる。
今回はCPU性能は不要なため、できるだけ安くて小さいものを探して見つけたのがコレ。

ESP32ボード Seeed Studio XIAO ESP32C3

補足
ESP32S3というのもある。
S3は高性能版のボードで、C3よりほんのちょっと高いだけで大幅に性能がアップする。
今回は軽量な処理しかしないのでケチります。

このサイズでボード上にBluetooth機能どころかWi-Fiまで乗っている。USB-Cケーブルを接続するだけで動作可能。
電源LEDは付いているが、その他のプログラム制御できるLEDやボタンなどは付いていない。
今回は単純に電源投入したらプログラム実行するだけの機能のみとしたが、動作LEDやボタン押すだけで動作間隔時間を変更したりできる機能を追加するなど拡張できる。今後の状況次第で改造するかもしれない。



必要なもの

マイコンボード
ESP32ボード Seeed Studio XIAO ESP32C3

開発環境
Arduino IDE
記事作成時の最新バージョンは 2.3.1

USB-Cケーブル
ESP32ボードに含まれていない。
データ通信対応のケーブルを用意する。

新しい事に取り込もうとする小さな気持ち
初めてのESPボード開発は敷居が高いと考えてしまいがち。
今回は複雑なことはしていないので、まずは次の項目の1だけやってみよう!気が向いたら2以降に進めて行けばOK。



Arduino IDEのインストール

1. Arduino IDEのダウンロード
下記のサイトにアクセスし「DOWNLOAD OPTIONS」から自分の環境に合わせたものをダウンロードする。
親父はWindows10 64bitを使用しているので「Windows Win 10 and newer, 64 bits」を選択する。途中の画面では必要情報を入力するか「JUST DOWNLOAD」を選択する。

2. インストール
ダウンロードしたファイルを実行してインストールする。インストール先などにこだわりがなければそのまま進めていけばよい。
インストールが終わったらチェックが入っている状態で完了を選択。Arduino IDEを起動する。

補足
起動後にIDE自身やインストールされているライブラリにアップデートがある場合にメッセージが表示されるが、特に問題が出ていない場合はアップデートしない方が無難。
後記でも注釈があるが、最新版を使用したら問題が発生した。

3. 追加ボードマネージャのURL指定
今回使用するESPボードのボードマネージャを追加するため、下記の方法で基本設定を開く。
・[ファイル] → [基本設定…] を選択
・Ctrl + カンマ を押下

[設定] タブの [追加のボードマネージャのURL] に下記のURLを追加する。https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json


補足

・今後他のボードで開発したい場合、URL入力欄右横のアイコンを選択するとウィンドウが開くので、ボードマネージャのURLを1行ずつ入力すると複数対応可能。

・今回に限って言えば指定しなくても開発はできるが、最新版や古いバージョンなど標準より選択肢が増えるので設定した。

4. ボードマネージャを開く
下記の方法でボードマネージャを開く。
・左サイドメニューの上から2番目を選択(推奨。楽)
・[ツール] → [ボード] → [ボードマネージャ] を選択
・Ctrl + Shift + B を押下

検索欄に「esp」と入力して「esp32 by Espressif Systems」を見つける。「2.0.9 installed」と表示されていない場合は、下のプルダウンから「2.0.9」を選択後に [インストール] を選択してアップデート or ダウンデートする。

補足
※記事作成時点
esp32 by Espressif Systemsのバージョンは2.0.9を指定してインストールする。2.0.10~2.0.14では下記の問題が発生した。
・iPhoneのBluetooth機能をオフ/オンにした際に自動再接続されない
・タップして再接続しようとしても接続できない

5. NimBLEのインストール
標準のBLEライブラリの動作が不安定なため、接続が切れたり、接続できてもキー送信されない、と問題が多い。この解消のために今回はNimBLEというライブラリを使用する。

下記の方法でライブラリマネージャーを開く。
・左サイドメニューの上から3番目を選択(推奨。楽)
・[スケッチ] → [ライブラリをインクルード] → [ライブラリを管理…] を選択
・Ctrl + Shift + I を押下

先ほどと同様に検索欄に「nimble」と入力して「NimBLE-Arduino by h2zero」を見つけるてインストールする。
記事作成時のバージョンは 1.4.1。



Bluetoothキーボードライブラリのインストールと設定変更

ESPボード上でBluetoothキーボードを仮想的に作成するためのライブラリをインストールする。これを用いるとものすごく簡単に開発ができる。
記事作成時の最新バージョンは 0.3.2-beta。ベータ版だが2022年から正式リリース版が出ておらず追加修正もなさそうなので、このバージョンを使用する。

ESP32 BLE Keyboard library
https://github.com/T-vK/ESP32-BLE-Keyboard

1. ESP32 BLE Keyboard libraryのダウンロード
下記URLの [Assets] にある「esp32-ble-keyboard.zip」をダウンロードする。

https://github.com/T-vK/ESP32-BLE-Keyboard/releases/tag/0.3.2-beta

補足
正式版の最終リリースを使用したい場合は [ <> Code] 内にある [Download ZIP] から取得する。

2. ESP32 BLE Keyboard libraryのインストール
[スケッチ] → [ライブラリをインクルード] → [zip形式のライブラリをインストール…] を選択する。
ファイル選択ダイアログが表示されたら、先ほどダウンロードした「esp32-ble-keyboard.zip」を指定する。
問題なければインストールが完了する。

3. Arduino IDEの終了
次項で設定ファイルの編集があるため、Arduino IDEを終了する。

4. BleKeyboard.h の修正
上記でインストールしたライブラリのBleKeyboard.hを開いて下記のように修正する。
ファイルは検索すれば見つかるが、標準であれば下記のパスに配備されている。

C:\Users(ログインユーザー名)\Documents\Arduino\libraries\ESP32_BLE_Keyboard\BleKeyboard.h

修正前

// uncomment the following line to use NimBLE library
//#define USE_NIMBLE

修正後(コメントを外す)

// uncomment the following line to use NimBLE library
#define USE_NIMBLE

5. platformio.ini への追記
platformio.iniにNimBLEを使用できるよう下記の内容をファイルの最後に追加する。
このファイルも検索すれば見つかるが、標準であれば下記のパスに配備されている。

C:\Users(ログインユーザー名)\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\libraries\LittleFS\examples\LITTLEFS_PlatformIO\platformio.ini

補足
上記のパスはボードマネージャのバージョンが2.0.9の場合。今後のバージョンで問題が修正された場合はインストールしたバージョンに読み替えて開く。
また、ボードマネージャのアップデートやダウンデートすると既存のファイルは削除されるので都度修正する。

追記内容

lib_deps = NimBLE-Arduino
build_flags = -D USE_NIMBLE



ボードとポートの選択

1. Arduino IDEの起動
デスクトップ上のショートカットアイコンやスタートメニューからArduino IDEを起動させる。

補足
ボードマネージャをダウンデートしているためアップデートの案内が表示される。[後で] を選択してアップデートしないこと!
実施した場合は再度platformio.iniファイルの修正が必要。

2. ESP32ボードをUSB-CケーブルでPCに接続
問題なく接続されれば [コンピュータの管理] の [ポート] に「USB シリアル デバイス」が追加されているはず。合わせてCOMポート番号を確認する(接続タイミングで変化しやすい)。
現れない場合はUSBケーブルが充電専用の可能性がある。

3. ボードとポートの選択
初期状態では適当なボードが選択されている。今回使用するボードに変更する。
[他のボードとポートを選択…] を選択する。

ボードに「xiao_esp32c3」と入力して下のリストから同じ名前のものを選択してチェックを付けた状態にする。
ポートは2で確認したCOMポートを選択してチェックを付ける。
選択したらOKボタンを選択する。



ソースコードの入力・転送

心臓となる仮想キーボードのプログラムを入力する。
サンプルは用意してあるので、コピー&ペーストして必要部分だけ修正すればOK。

1. 新規スケッチの作成
下記の方法で新規スケッチを作成する。
・[ファイル] → [新規スケッチ] を選択
・Ctrl + N を押下

2. ソースコード入力
下記のコードをコピー&ペーストする。

//BLEキーボードライブラリを読み込む
#include <BleKeyboard.h>

// ■ 要修正箇所 ■
// このBLEキーボードのデバイス名を命名する(Bluetoothデバイスの検索結果として表示される)
BleKeyboard bleKeyboard("BLEKB");

// 起動処理部分
void setup() {
  // デバッグ用コード:起動完了するとシリアルポートにメッセージ送信
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  // BLEキーボード機能を起動する
  bleKeyboard.begin();
}

// メインループ部分
void loop() {

  // 相手側と接続ができているか確認する
  if(bleKeyboard.isConnected()) {
    
    // 接続できている場合
    // 下記以降の処理でキー送信を行う
    
    // デバッグ用コード:シリアルポートにメッセージ送信
    Serial.println("Sending...");

    // ■ 要修正箇所 ■
    // 左シフトキーを送信(押して離す)
    // write で press と releaseAll が実行される
    bleKeyboard.write(KEY_LEFT_SHIFT);

	// 動作安定用に0.2秒待機する
    delay(200);
  }

  // 相手側と接続できていない場合、または、上記のキー送信処理終了後

  // ■ 修正箇所 ■
  // デバッグ用コード:シリアルポートにメッセージ送信
  // (修正しなくても動作影響はなし)
  Serial.println("Waiting 10 seconds...");

  // ■ 要修正箇所 ■
  // 10秒待機する(10秒=10×1,000ms)
  delay(10000);
}

補足
修正箇所は■ 要修正箇所 ■の3箇所。2箇所はコメント通りなので解説省略する。

送信するキー
上記のソース内では左シフトキーを割り当てているが、別のキーでも問題ない。実際に操作したいアプリ上にてBluetoothキーボードで操作を行い、影響がないことを確認しておくこと。特にスペースキーや改行キー、方向キーなどはタッチパネル操作しか対応していないアプリでも操作できる場合がある
ちなみに、シフトキーを割り当てた際の問題点は、Bluetooth接続されているとスイッチコントロールを使用していない場合でもタイミングが重なるとSafariでリンクを開いた際にリーディングリストに追加されてしまう場合がある。

送信したいキーの指定方法はこの資料を参考にする。

// 文字送信 1文字指定する
bleKeyboard.write('a');

// スペースキー送信 半角の空白を指定すればよい
bleKeyboard.write(' ');

// 特殊キー関係 KEY で指定された名前を指定する
bleKeyboard.write(KEY_LEFT_SHIFT);

3. ソースの保存
一旦入力したソースコードを適当な名前で保存する。
・[ファイル] → [Save] を選択
・Ctrl + S を押下

4. 検証・コンパイル
ソースコードに問題がないか下記のいずれかの手順で確認を行い、転送できる形式に変換(コンパイル)する。
・[検証] ボタンを押下
・[スケッチ] → [検証・コンパイル] を選択
・Ctrl + R を押下

結構時間かかるのでのんびり待つ。
問題なく終われば出力に下記のようなメッセージが出力される。

最大1310720バイトのフラッシュメモリのうち、スケッチが489114バイト(37%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が22940バイト(7%)を使っていて、ローカル変数で304740バイト使うことができます。

5. ESPボードにプログラムを転送
実際のESP32ボードにプログラムを転送して実行可能状態にする。
下記のいずれかの手順で転送する。
・[書き込み] ボタンを押下
・[スケッチ] → [書き込み] を選択
・Ctrl + U を押下

再度コンパイルするので少し時間がかかるが、問題なく転送できれば下記のようなメッセージが出力される。
この状態になればすでに動作を開始している。

eaving...
Hard resetting via RTS pin...



作成した仮想キーボードを使用する

上記までの流れでこの小さな基盤にキーボードの機能の組み込みができている。
あとはiPhoneに繋いでスイッチコントロールのスイッチに追加するだけだ。
基本的な作業は前記事で紹介した内容と同じため画面は一部のみ掲載している。

iPhoneとのペアリング

iPhoneの [設定] → [Bluetooth] を開く。
[デバイス] に今回製作したBLEKBの名前が表示されると思われるので、タップしてペアリングする。
ペアリングが完了すれば接続済みとなる。

念のため自動再接続の試験を行う。
[Bluetooth] を [オフ] に変更してBluetooth機能を無効に切り替える。
少し時間をおいて再度 [オン] にしてBLEKBが自動的に接続済みになるか確認する。
自動再接続されない場合は(恐らく)ESP32のボードマネージャのバージョンが異なっている。

この問題の調査に1日無駄にしました…


スイッチ動作の割り当て

1. [設定] → [アクセシビリティ] を選択。

2. [スイッチコントロール] を選択。

3. [スイッチ] を選択。

4. [新しいスイッチを追加…] を選択。

5. [外部] を選択。

6. 外部スイッチのアクティベート画面となる。BLEKBからキーが送信されるまでしばらく待つ。

7. [新しいスイッチ] ダイアログが表示されるので登録したい名前を指定する。

8. [システム] にある [タップ] を選択。

9. [スイッチ] に追加されたのを確認。


作成済みレシピのスイッチを一括変更する

先ほどまでと同じく前記事と全く内容同じ。

1. [スイッチ] にある [編集] を選択。

2. 今回作成したスイッチ以外の左側の削除アイコンを選択。

3. [削除] を選択して削除を実行。

4. 削除されたら [完了] を選択。

5. スイッチが1つだけになる。



動かしてみる

ここも前記事でまとめた内容と同じ。
スイッチコントロールを起動して待っているとレシピが自動起動する。
本項目では起動しない場合の対処方法を記載する。

Bluetoothペアリングが解除されていないか
iPhoneの設定画面内のBluetoothからペアリング状況を確認する。
接続済みになっていれば問題なし。
未接続の場合は、ESP32のボードマネージャのバージョンを変えて再度転送して動作確認してみる。

スイッチコントロールを起動すると外部キーが見つからないと表示される
Bluetooth接続できていない。使っている中で数秒表示されることはたまにあるが、表示が消えない場合は接続が切れているので仮想キーボードの機械のUSB-Cケーブルを抜き差しして再起動させる。
再起動しても解決しない場合は上記のペアリングの確認手順を行う。

ボード側が動作しているか分からない
仮想キーボード側に状態表示されるのは電源LEDのみのためプログラムの実行状況は見えない。PCと接続している状態でArdiuno IDEのシリアルモニタを使用すれば少しは状況を確認できる。
メッセージ内容は下記の通り。

Starting BLE work!
仮想キーボードが起動した際に表示される。
表示されない場合は起動ができていない(ボード故障?)。

Sending...
キー送信処理時に表示される。
これが出たらキーはiPhoneに送信されている。

Waiting 10 seconds...
待機時間に入った際に表示される。
その上に「Sending...」と表示されていればiPhone側にキー送信がされている。
繰り返し表示されている場合はiPhoneとの接続ができていない。



アンテナの接続とケースに入れる

接続しなくても1,2m程度は電波が届くようだが、安定動作させるためには付属のアンテナを接続した方が良い。
また、基盤剥き出し状態で使い続けるのもショートの危険がある。適当なケースに組み込んで完成させる。

完成した「スイッチコントロール用仮想Bluetoothキーボード BLEKB」(弐号機)

基板裏側。MiniSDカードと同サイズ。
アンテナ側。
内部状態。



最後に

本記事では一定間隔でキー送信する専用の機械を製作し、動作確認を行った。
あとは周回プレイできるようにレシピの調整をしつつゲームを進めて行こう!くれぐれもバレてアカウント削除にだけはならないように!


..
...
....え?サービス終了?!

補足
外部に割り当てできるのはゲームパッドも可能。キーボードより他のアプリに影響なさそうだが使用しなかったのはキー入力監視の方がデバッグが楽だからという理由。
作り方はさほど変わらないので、興味ある人は自力で調べてみよう!

補足2
もっと複雑な制御を行いたい場合、下記のソフトを使用すればPC上に画面表示とマウス操作ができる。
・ApowerMirror
・Duowan
PCでのマウスの自動化は色々なツールが出ているので組み合わせて使用する。
ただ、手軽に実行させることができなかったり、PCも電源付けっぱなしにしないといけない、など欠点が多くて親父は使用してない。


この記事が気に入ったらサポートをしてみませんか?