/

USB Key Sender2 - M5 AtomS3UでROM領域に書き込んだ文字列(書き換え可能)をキー入力としてPCに送る

M5
M5 AtomS3U

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で使用するならあった方がいい)

M5
M5 AtomS3Uとクッションゴム

クッションゴムについてはバージョン1を見てください。

コンパイル方法


  1. ソースコードはhttps://github.com/syagawa/usb-key-sender2/tree/v2.6.5に置いてあります。git cloneしてください。

  2. VS Codeでcloneしたレポジトリを開きます。

  3. VS CodeにDev ConainersExtensionをインストールします。

  4. F1キーを押してDev Containers - Reopen in Containerを選ぶと初回はesp-idfのイメージのダウンロードが行われ、devcontainerで再度VS Codeが開きます。

  5. AtomS3UをPCに接続します。

  6. AtomS3Uのリセットボタンを長押しします。

  7. VS Codeでターミナルを開き、idf.py -p /dev/ttyACM0 erase-flashを実行します。AtomS3Uが見つからないというエラーが出たらVS Codeを閉じ、再度開きDev Containers - Reopen in Containerを実行して下さい。

  8. VS Codeのesp-idfエクステンションのBuild Project (スパナのアイコン) ボタンを押します。

  9. AtomS3Uのリセットボタンを長押しします。

  10. VS Codeのesp-idfエクステンションのFlash デバイス (雷のアイコン) ボタンを押します。

  11. AtomS3UをPCから外します

  12. AtomS3Uのボタンを押しながらPCに接続します。

  13. おそらくPCがUSBメモリとして認識してフォルダーが開きます。SETTINGS.TXTを編集します。

  14. AtomS3Uを安全に取り外します。Windowsの場合ハードウェアを安全に取り外してメディアを取り出すからEspressif Deviceを選べばOKです。Linuxの場合は5秒ほど待ってから実際にUSBを抜いてください。

使い方

  1. M5AtomS3Uの中央のボタンを押したままPCに接続

  2. しばらく待つとUSBストレージ(ATOMS3U_MSC)として認識され、SETTINGS.TXTファイルが表示されます

  3. SETTINGS.TXTをメモ帳で開くとJSONファイルとなっています

  4. jsonを編集する

#例1 IDとパスワードを入力してログイン ※<id>と<password>の部分に実際の値を入力する
{"keys": ["<id>", {"key": "TAB"}, "<password>", {"key": "ENTER"}]}
  1. 保存する。

  2. 取り出しでPCから外してください。これをやらずにPCから取り外すと変更がうまく保存されません。取り出して数秒経つとWindowsの場合LEDが光ります。Linuxの場合は5秒くらい待ってから外してください。

  3. 再度PCに接続、中央ボタンを押す(押して離す)と4.で設定したkeysの1番目が入力されLEDライトが点灯して消えます。

  4. 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 複合キーの入力機能について追加