USB Key Sender2 - M5 AtomS3UでROM領域に書き込んだ文字列(書き換え可能)をキー入力としてPCに送る
USB Key Sender(バージョン1)の後継のUSB Key Sender2です。
前バージョンはArduio/PlatformIO環境で作りましたが、今回はesp-idf環境で作りました。ROM領域の書き換え部分が不安定だったのですが、新バージョンでは少し改善されました。
タイトルに書いてありますが、メイン機能は下記の二つです。
- A. デバイスのROM領域に文字列(書き換え可能)を保存可能
- B. 文字列をキー入力としてPCに送る
機能 / 仕様
- 設定したキー入力をホストPCに送信する
- 設定はROM領域にJSONファイルとして保存
- キー入力は最大で10個のパターンを設定可能
- ボタンを押して離すと、設定された配列内の1番目(0番目)の文字列を送信
- ボタン長押しすると、配列のindexをスキップできる
- Windows10(11)、 Linux、Macに対応
バージョン1からの変更点
ボタン長押しをすると配列のindexをスキップできますが、時間が経つと勝手にindex:0に戻る機能をなくしました。
また、ボタンを押した際のLEDの色の調整は無くしました。
ソースコードは下記になります。 https://github.com/syagawa/usb-key-sender2/tree/v2.6.5
buildに必要なもの
- M5 AtomS3U
- PC(Windows11、Linux、Mac)
- Docker (Windowsの場合はDocker Desktop)
- VS Code
- (100均のクッションゴム ※ノートPCで使用するならあった方がいい)
クッションゴムについてはバージョン1を見てください。
コンパイル方法
-
ソースコードはhttps://github.com/syagawa/usb-key-sender2/tree/v2.6.5に置いてあります。git cloneしてください。
-
VS Codeでcloneしたレポジトリを開きます。
-
VS Codeに
Dev ConainersExtensionをインストールします。 -
F1キーを押して
Dev Containers - Reopen in Containerを選ぶと初回はesp-idfのイメージのダウンロードが行われ、devcontainerで再度VS Codeが開きます。 -
AtomS3UをPCに接続します。
-
AtomS3Uのリセットボタンを長押しします。
-
VS Codeでターミナルを開き、
idf.py -p /dev/ttyACM0 erase-flashを実行します。AtomS3Uが見つからないというエラーが出たらVS Codeを閉じ、再度開きDev Containers - Reopen in Containerを実行して下さい。 -
VS Codeのesp-idfエクステンションのBuild Project (スパナのアイコン) ボタンを押します。
-
AtomS3Uのリセットボタンを長押しします。
-
VS Codeのesp-idfエクステンションのFlash デバイス (雷のアイコン) ボタンを押します。
-
AtomS3UをPCから外します
-
AtomS3Uのボタンを押しながらPCに接続します。
-
おそらくPCがUSBメモリとして認識してフォルダーが開きます。SETTINGS.TXTを編集します。
-
AtomS3Uを安全に取り外します。Windowsの場合
ハードウェアを安全に取り外してメディアを取り出すからEspressif Deviceを選べばOKです。Linuxの場合は5秒ほど待ってから実際にUSBを抜いてください。
使い方
-
M5AtomS3Uの中央のボタンを押したままPCに接続
-
しばらく待つとUSBストレージ(ATOMS3U_MSC)として認識され、SETTINGS.TXTファイルが表示されます
-
SETTINGS.TXTをメモ帳で開くとJSONファイルとなっています
-
jsonを編集する
#例1 IDとパスワードを入力してログイン ※<id>と<password>の部分に実際の値を入力する
{"keys": ["<id>", {"key": "TAB"}, "<password>", {"key": "ENTER"}]}
-
保存する。
-
取り出しでPCから外してください。これをやらずにPCから取り外すと変更がうまく保存されません。取り出して数秒経つとWindowsの場合LEDが光ります。Linuxの場合は5秒くらい待ってから外してください。 -
再度PCに接続、中央ボタンを押す(押して離す)と4.で設定したkeysの1番目が入力されLEDライトが点灯して消えます。
-
keysの長さが2以上の場合、LEDライトの色が変わり点灯し続けます。その状態でボタンを押す(押して離す)とkeysの2番目が入力されます。keysの次の値が存在する限りこれが繰り返され、keysの長さまで達すると、LEDライトは消灯します。
ボタン長押しでの入力スキップ
通常はボタンを押して離すとkeysのindex番目が入力されますが、1秒ほど長押しするとkeysのindexが一つ進みます。
例えばkeys: ["A", "B", "C"]となっていた場合、indexの初期状態は0となっています。
ボタンを押して離すと0番目である"A"が入力されindexは1となります。次に押して離すとindexが1の"B"が入力されることになります。
ボタンを長押しするとindexが進み、LEDの色も変わります。
keys: ["A", "B", "C"]の場合に長押し(1秒程度)するとindexが0から1となり、その状態でボタンを離すとindexが1の状態で待ち状態になります。
その状態で再度ボタンを押して離すとindexが1の"B"が入力されます。
なお、長押しを続けるとindexはさらに進み2となり、LEDの色も変わります。
これによりkeysに複数の値を設定しておき、場面に合わせて任意のindex番目の値を入力できることになります。
Ctrl + Vなどのキーを組み合わせた入力
Ctrlを組み合わせた入力は下記となります。AltやShiftやGUIキーも同様になります。 全選択してコピーする例です。
{"keys": [{"mod": "CTRL", "key": "a"}, {"mod": "CTRL", "key": "c"}]}
対応している修飾キーは下記となります。
- Shiftキー: "SHIFT"または"RSHIFT"
- Controlキー: "CTRL"または"RCTRL"
- Altキー: "ALT"または"RALT"
- GUIキー: "GUI"または"RGUI"
また下記のように|(パイプ)でつなぐとShiftキー + Ctrlキーのような複合入力が可能です。下記でShiftキー + Controlキー + p の入力となります。
{"mod": "SHIFT|CTRL": "key": "p"}
JIS/US配列について
デフォルトでJIS配列となっています。
US配列にする場合は、下記のようにSETTINGS.TXTに"layout": "us"を追加してください。
{"keys": ["[]@:"], "layout": "us"}
UUIDの出力
下記のJSONをSETTINGS.TXTに入力することによってUUIDが出力できます。 UUIDのバージョンは4となります。
{
"keys": [
{"token": "UUID"}
]
}
乱数の出力
下記のJSONをSETTINGS.TXTに入力することによって乱数が出力できます。
デフォルトの範囲は0-9になっていますが、rangeキーで下記のように書くとすると範囲指定ができます。範囲は0以上の整数となります。最大値は9桁程度と考えてください。
{
"keys": [
{"token": "NUMBER", "range": "1-10"}
]
}
入力スピードの調整
"ABC"という文字列を入力するときに、Aを入力した後に2ms程度待つようにしました。以前は40ms待っていました。
また下記のようにdelaymsキーでキー入力の間隔を指定できます。1回のキー入力で2回待つようなコードになっているので下記だと100*2で200ms程度待ちます。
チャタリングなどが起きる場合にdelaymsの値を2以上にして調整してみてください。
{
"delayms": 100
}
認識がうまく行かないとき
Windowsのデバイスマネージャーを開き当該デバイスを削除してください。
対応OSについて
前バージョンはWindowsじゃないとROM領域の書き換え(SETTINGS.TXTの編集)ができませんでしたが、USB Key Sender2はLinuxでもROM領域の書き換え(SETTINGS.TXTの編集)が可能です。 なお、Macは手元になかったのでテストを行ってません。
主な用途
主な用途ですが下記でしょうか、キーボード入力をエミュレートできるので結構いろいろなことができる思います。
- パスワードの入力
- ショートカットキー(Chromeの起動など)
- 複雑なコマンドの実行(複雑なgrepとか)
- 面倒な操作の自動化(Excelの操作とか)
- 他
https://github.com/syagawa/usb-key-sender2/?tab=readme-ov-file#json-examplesにexamplesを載せているので参考にしてください。
更新
- 2026/1/5 US配列に対応
- 2026/1/12 UUID、乱数の出力に対応。またキー入力のスピードを上げて、調整機構も追加
- 2026/1/14 複合キーの入力機能について追加