M5 AtomS3UでROM領域に書き込んだ文字列(書き換え可能)をキー入力としてPCに送る
M5 AtomS3Uを使って設定した文字列をキー入力としてUSB経由でPCに送信します。
PCに送る文字列は、AtomS3Uのロム領域に記録するので書き換え可能です。
AtomS3Uの形状はUSBメモリタイプのため、USB-AでPCと接続できます。
機能 / 仕様
- 設定したキー入力をホストPCに送信する
- 設定はROM領域にJSONファイルとして保存
- キー入力は最大で10個の文字列を配列として設定可能
- ボタンを押した際のLEDの色を変更可能
- ボタンを押して離すと、設定された配列内の1番目(0番目)の文字列を送信
- 設定秒数内にボタンをもう一度押すと、配列内の2番目の文字列を送信
- ボタン長押しすると、配列のindexをスキップできる
- Windows10(11)に対応 Linux・Mac(キーの送信はOK、ROM領域の書き換えができない)
必要なもの
- M5 AtomS3U
- PC(Windows10もしくは11)
- (100均のクッションゴム ※ノートPCで使用するならあった方がいい)
コンパイル方法
- ソースコードはgithubに置いてあります。git cloneしてからgit resetなどで当該コミット(fd370e0e0a92100367f903e49c4d21ea5b03b9f9)に移動してください。またVS CodeにPlatformIOをインストールしておいてください。
$ git clone https://github.com/syagawa/m5-atoms3u-examples.git
$ cd m5-atoms3u-examples
$ git checkout main
$ git reset --hard fd370e0e0a92100367f903e49c4d21ea5b03b9f9
-
PlatformIOでcloneしたレポジトリのディレクトリ(m5-atoms3u-examples)内にあるusb_key_senderディレクトリを開きます。
-
依存ライブラリのインストールなどで数分待つ必要があるかもしれません
-
M5AtomS3UをPCに接続して、リセットボタンを長押ししてからPlatformIOでcompileしてください
※PlatformIOの使い方や操作方法は公式のドキュメントなどを参照してください。
使い方
-
M5AtomS3Uの中央のボタンを押したままPCに接続
-
しばらく待つとUSBストレージ(ATOMS3U_MSC)として認識され、SETTINGS.TXTファイルが表示されます
-
SETTINGS.TXTをメモ帳で開くとJSONファイルとなっています
-
jsonを編集する
#例1 IDとパスワードを入力してログイン ※idとpasswordの部分に実際の値を入力する
{"color": "red", "keys": ["id", "press:KEY_TAB", "password", "\n", ], "waitSecnds":3, "keyboardLayout": "ja"}
#例2 Windowsにログインし、Chromeを開く例 ※passwordの部分に実際の値を入力する
{"color": "red", "keys": ["\n", "password", "\n", "open:chrome"], "waitSecnds":3, "keyboardLayout": "ja"}
-
保存する。メモリ領域を確保するため、
}
以降にスペースが入っていますが、スペースは消さないようにしてください -
USBメモリを取り外すのと同様にちゃんと
取り出し
でPCから外してください。これをやらずにPCから取り外すと変更がうまく保存されません。取り出し
て数秒経つとLEDが光ります、それから取り外してください。 -
再度PCに接続、中央ボタンを押す(押して離す)と4.で設定したkeysの1番目が入力されLEDライトが点灯して消えます。
-
keysの長さが2以上の場合、LEDライトが点灯し続けます。その状態でボタンを押す(押して離す)とkeysの2番目が入力されます。keysの次の値が存在する限りこれが繰り返され、keysの長さまで達すると、LEDライトは消灯します。
-
LEDライトが点いていない状態でボタンを押す(押して離す)とkeysの1番目が入力され、LEDライトが点灯します。
-
LEDライトが点灯している状態でwaitSecondsの秒数を過ぎてもボタンを押さない場合LEDライトは消えます。その次にボタンを押すとkeysの1番目が入力されます
ボタン長押しでの入力スキップ
通常はボタンを押して離すとkeysのindex番目が入力されますが、2秒ほど長押しするとkeysのindexが一つ進みます。
例えばkeys: ["A", "B", "C"]
となっていた場合、indexの初期状態は0
となっています。
ボタンを押して離すと"A"
が入力されindexは1となります。次に押して離すとindexが1の"B"が入力されることになります。
ボタンを長押しするとindexが進み、LEDの色も変わります。
keys: ["A", "B", "C"]
の場合に長押し(2-3秒程度)するとindexが0から1となり、その状態でボタンを離すとindexが1の状態で待ち状態になります。
その状態で再度ボタンを押して離すとindexが1の"B"が入力されます。
なお、長押しを続けるとindexはさらに進み2となり、LEDの色も変わります。
これによりkeys
に複数の値を設定しておき、場面に合わせて任意のindex番目の値を入力できることになります。
Ctrl + Vなどのキーを組み合わせた入力
CtrlやShiftキーを組み合わせた入力は下記となります。
{"color": "red", "keys": ["press:KEY_LEFT_CTRL,v"], "waitSecnds":3}
press:
の後にKEY_LEFT_CTRL
とv
があり,
(カンマ)で繋げられています。
この場合はCtrlキーが押された状態でさらにv
が押されることになり、結果的にCtrl + Vの入力となります。
なおさらにShiftなどを使いたい場合は"press.KEY_LEFT_CTRL,KEY_SHIFT_CTRL,v"となります。
最後の文字(この場合v)が押された後はキーのプレス状態が解除されます。
keyboardLayoutについて
入力されるキーがおかしい場合は、設定ファイルの"keyboardLayout":"ja"
を"keyboardLayout":""
にしてみてください。
現状版で想定される値は"ja"
かそれ以外となります。
入力の部分はまだ不明な点が多く今後も変更や修正が入る可能性があります。
認識がうまく行かないとき
Windowsのデバイスマネージャーを開き当該デバイスを削除してください。
対応OSについて
開発はWindows10で行いました、なのでWindows10環境では使用可能です。
またWindows11環境でもテストを行いましたが問題はありませんでした。
ただ、Linux(Ubuntu)とMacOS(Sonoma)ではキー入力をPC側に送ることは可能なのですが、設定ができません。
SETTINGS.TXTを開くことはできて書き換えまでできるのですが保存ができません。
以前のバージョンでは出来たように記憶しているのですが。
現状は下記となります。
- Windows10/11
- キーの送信 - ok
- 設定の保存 - ok
- Linux(Ubuntu)/MacOS Sonoma
- キーの送信 - ok
- 設定の保存 - ng
実際に使うとどんな感じか
ノートPCで使うのであればAtomS3Uの背面部にこんな感じのクッションゴムを貼っておくとよいです。
写真のクッションゴムはダイソーで買ったものです。
貼り付けるとこんな感じです。大きいのを下に貼って、その上に小さいのをポチっと貼ってます。
ノートPCのUSB-Aポートに差し込むとこんな感じです、テーブルとの接地面ができてるのがわかると思います。
少し浮いてますが、この状態でAtomS3Uを押すとクッションが突っ張り棒の役割をしてくれて、USBポートへの負荷が減ります。 クッション無しで何回も押すとポート側が多分壊れます。 ノートPCによってはテーブルとの接地距離が違うのでクッションゴムの数で調整してください。
なお、ノートPCで使わない場合はこのクッションは必要ありません。
下記は上記の例1のIDとパスワードを入力している例です。 ID、タブ、パスワード、Enterの順に押しています。 分かりにくいかもしれませんが、4回ボタンを押しています。
何で作ろうと思ったか
私がビデオ通話のみで使っているPCのキーボード入力がおかしくなり、キーボード入力してもちゃんと認識してくれないのでログインできないことが増えてストレスがたまりました。
これにパスワードを記憶しておけばボタンを押すだけでログインできるなと思い作ることにしました。
何に使うか
-
パスワードの入力
-
ショートカットキーをさらにショートカット
- Zoomとかmeetとかの音声のON/OFFとか
- アプリを起動したり、終了させたり
- ボリュームのON/OFFとか
-
他
苦労したところ
PlatformIOで開発を始めたのですが、USBストレージとして機能させる部分で保存させる部分が安定しませんでした。
なので、esp-idfでの開発を始めました。いいサンプルがあったため、USBストレージとして機能させる部分はかなり安定して動きました。
ただ、キーボード(HID)の機能を付加するとコンパイルがうまく行かなくなりました。
で、結局PlatformIOに戻ってきて元の不安定なUSBストレージの機能に対してキーボード(HID)の機能を足しました。
esp-idfへの寄り道は3から4か月くらいだったので結構な寄り道でした、いろいろ試していたので今後に何か活かせるのではないかと考えていますが、どうだろう。。。
あと、Wi-FiやBluetoothを使ってネットワーク経由で何かをするということはやらないことにしました。
せっかくPCとUSBでつながっているのにWi-Fiなどでデータをやり取りするのは本末転倒です。
M5AtomS3Uについて
ESP32-S3を直接USBに挿せるという構造が私はとにかく気に入っています。
PCでコードを書いて、コンパイルしてそれをESP32に送るのだからこの形になるのは必然だと思います。
ボタンとLEDが付いているのもセンスがいいです。
この形はM5Stackオリジナルのものなのかよくわかりませんが、デザインもいいです。
USBメモリっぽいというのもいいところです。
なので、私はUSBメモリっぽい動きをさせたいのです。
今後の予定
もうちょっと複雑なキー入力をしてみたいですが、現状ではPC側の状況を判定することができないためなんとも言えないです。
ESP32側にPCのなんらかの情報を伝えられればいいのですが、もちろんWi-FiとかBluetoothを使えばできるのはわかります、でもネットワークは使いたくないので違う方法を探します。
追記
- 2024/6/6 git cloneの方法を追加
- 2024/6/10 キーを組み合わせた入力の説明を追加
- 2024/6/14 対応OSについての説明を追加
- 2024/12/5 ボタン長押しでの入力スキップを追加
- 2024/12/23 keyboardMethodとkeyboardLayoutについてを追加
- 2024/12/26 keyboardMethodは無くし、keyboardLayoutについてのみの記述に変更
- 2025/1/1 keyboardMethodの記述が残っていたので修正