見出し画像

ProMicroはもう古い!! ESP32-S3でキーボード&マウス作成 #1

こんにちは、Rcatです。
さて、最近触っているESP32-S3ですがこちらはUSBデバイス(キーボード、マウス)を作成することができます。
少し前まで、Arduinoでキーボード/マウスと言ったらProMicro / leonardoでしたが、値上がりが酷いですね…。少なくとも私が手を出したときは600円台で買えました。というわけでESP32-S3に乗り換えましょう。
本記事は上記動画のテキスト版となります。

スペック比較

まずはざっと両者の性能比較をしましょう

Pro Micro VS ESP32-S3 比較

これでまだPro Micro使いますか??って感じですね
なお、ESP32のフラッシュや不揮発領域についてはパーティション設定で変わるのでデフォルト値で最も大きいものをチョイスしています。
自分で弄ればスケッチ16MBとかも行けるかと思います(その場合512倍UP

新型Arduino比較

先日発売された新型Arduinoですが、こちらもUSBデバイス化できます。
というわけでこちらとも比較

Pro Micro相手よりはさが縮まりましたが、それでもESP32-S3の方が勝っていますね。
まぁ、新型Arduino wi-fiモデルはこのESPも同時搭載するとのことなので、出てきたらどうなるかはわかりませんが。
無線のためだけに使うのだとしたら、正直単体で使った方が良さそうですね。

パーティション設定って?

ちょっと脱線してパーティションを解説しておきます。上記で"~16MBデフォルトではうち1.2MB-3MB使用可能"や" ~3MB(デフォルト値)"というあいまいな表記になっているカ所はパーティション設定というもので変化する部分です。
設定は以下の部分となります。

ずらっと色々出てきますが、ここからパーティション構成を選択します。
一番上のデフォルトだとスケッチが1.2MB 不揮発領域(SPIFFS)が1.5MBになります。
私は持っているものは16MBですが、SPIFFSを使う都合上、画像では8M(3MBスケッチと1.5MB spiffsを使用しています。
16MBのESP32-S3を使う場合はこの8Mを選択しておけばよいでしょう。足りなくなるほどの大規模プロジェクトの場合は、パーティション構成を自分で作りましょう。
ちなみに4MB想定の物に対して1.2MBしかスケッチが入らないのはOTAの為です。
具体的には1.2MB + 1.2MB + 1.5MB = 3.9MBという構成です。
OTAは無線でスケッチを書き込む機能ですが、かわりばんこに書き込むため、領域がふたつ必要になります。

EEPROMとSPIFFSの違い

次は先ほどから不揮発領域と表現している EEPROMSPIFFSの違いです。
本家のArduinoから入ってきた方は、電源を切っても値を保持したい場合はEEPROMに値を書き込むと思います。
ESP32にはEEPROMは搭載されていませんが、スケッチを書き込むフラッシュ領域の一部をデータを書き込む領域として使用することができます。
使用方法は複数ありますが、一般的なものは spiffs というファイルシステムになります。
こちらはその名の通りパソコンと同じようにファイルを作って保存することができます。
そのため、EEPROMのように何バイト目から何バイト書き込むと言った複雑なことを考えなくても、ファイル名をつけて保存するだけで使用することができるので、非常に使い勝手が向上します。
※一応ESP32にもEEPROMとしてフラッシュを使用するためのライブラリはあります。

ESP32-S3に乗り換えるうまみ

ESP32-S3を使う旨味としては以下のようなものがあげられます。

  • マイコン自体が高性能

  • 巨大なプログラムが書き込める

  • ファイルシステムを使ったデータの保存ができる

  • Wi-Fiを使って操作できる

  • BlueToothを使って操作できる

  • より多くのボタンを搭載できる

パッとこのような感じでしょうか?この中で特に強力なものはWi-Fiとファイルシステムであると私は考えています。。
そもそもキーボードを自作するっていう時点で、ただ文字を入力するようなものを作る人はいないと思います。
例えばですが、私ならこういう使い方をします…。
というわけで絶対搭載しますよね、マクロ機能
一つのボタンを押すと、指定されたキーストロークを自動で入力したり、繰り返したり、連打したりすることができます。
このマクロ機能を動的に使用できるようにしたい場合、ProMicroではシリアル通信を使ってキーの入力に関する情報を渡してメモリに保持する必要があります。また、そのための専用ソフトが別途必要です
正直言うとこの時点でメモリが足りなくて、それなりの大きさのキーストロークになってくるともう耐えられません。
しかし、ESP32は巨大なメモリを搭載しています。先ほど比較したように150倍以上大きなメモリを搭載していますので、かなり長いキーストロークでも読み込むことができます
また、Wi-Fiを搭載しているため、Webサーバーキーボードなんてものにしてしまえばスマホやパソコンからブラウザ経由でアクセスしてその場で設定を作成することもできます。
この方法の場合、ブラウザを使用するので専用のソフトは不要です
また、広大なファイルシステムは多くのキーストロークを同時に保持しておくことで、必要に応じて保存したキーストロークを動的に呼び出すといったようなことも可能になるでしょう。
ちなみにWebサーバーを使えば物理的なキーボードを作る必要はなく、スマホでアクセスして、その画面にボタンを並べておくと言ったこともできます。まあ、そんなことをする理由はないと思いますが、単純にボタンではなく、ジョイスティックなど変わったインターフェースを搭載したいと思った場合はそういう使い方もありなのではないでしょうか。

旧ProMicroカスタムキーボード
ProMicroカスタムキーボード制御ソフト(Pythonで作成)

とりあえず基本のソース

まずはESP32-S3でキーボード化する基本のソースを紹介
以下のソースで単押し、長押し、複数押し、特殊キーの要素を網羅しています。
動作の方は動画をご視聴ください

#include "USB.h"
#include "USBHIDKeyboard.h"
#include "USBHIDMouse.h"
USBHIDMouse Mouse;
USBHIDKeyboard Keyboard;

void setup() {
    Keyboard.begin();
    USB.begin();

    //単発押し
    Keyboard.write('a');
    delay(1000);

    //押しっぱなし
    Keyboard.press('b');//押しっぱなし開始
    delay(1000);
    Keyboard.release('b');//離す
    //Keyboard.releaseAll();//これで全部離すこともできる

    //CTAL + A (全選択)
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.write('a');
    Keyboard.releaseAll();
    delay(1000);
    //削除
    Keyboard.write(KEY_DELETE);
}


void loop() {
}

まとめ

今回は仕様の比較と基本動作の確認を行いました
次回から実際に仕様を決めて制作していきます
次回もよろしくお願いします

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。