/

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

M5
M5 AtomS3U

M5 AtomS3Uを使って設定した文字列をキー入力としてUSB経由でPCに送信します。

PCに送る文字列は、AtomS3Uのロム領域に記録するので書き換え可能です。

AtomS3Uの形状はUSBメモリタイプのため、USB-AでPCと接続できます。

機能 / 仕様

  • 設定したキー入力をホストPCに送信する
  • 設定はROM領域にJSONファイルとして保存
  • キー入力は最大で10個の文字列を配列として設定可能
  • ボタンを押した際のLEDの色を変更可能
  • ボタンを押すと、設定された配列内の1番目(0番目)の文字列を送信
  • 設定秒数内にボタンをもう一度押すと、配列内の2番目の文字列を送信
  • Windows10(11)に対応 Linux・Mac(キーの送信はOK、ROM領域の書き換えができない)

必要なもの

  • M5 AtomS3U
  • PC(Windows10もしくは11)
  • 100均のクッションゴム ※ノートPCで使用するならあった方がいい

コンパイル方法


  1. ソースコードはgithubに置いてあります。git cloneしてからgit resetなどで当該コミット(28654da2c8c2717f3743b471d4a6de501ac2007a)に移動してください。またVS CodeにPlatformIOをインストールしておいてください。
$ git clone https://github.com/syagawa/m5-atoms3u-examples.git
$ cd m5-atoms3u-examples
$ git checkout main
$ git reset --hard 28654da2c8c2717f3743b471d4a6de501ac2007a
  1. PlatformIOでcloneしたレポジトリのディレクトリ(m5-atoms3u-examples)内にあるusb_key_senderディレクトリを開きます。

  2. 依存ライブラリのインストールなどで数分待つ必要があるかもしれません

  3. M5AtomS3UをPCに接続して、リセットボタンを長押ししてからPlatformIOでcompileしてください

※PlatformIOの使い方や操作方法は公式のドキュメントなどを参照してください。

使い方

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

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

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

  4. jsonを編集する

#例1 IDとパスワードを入力してログイン ※idとpasswordの部分に実際の値を入力する
{"color": "red", "keys": ["id", "press:KEY_TAB", "password", "\n", ], "waitSecnds":3}

#例2 Windowsにログインし、Chromeを開く例 ※passwordの部分に実際の値を入力する
{"color": "red", "keys": ["\n", "password", "\n", "open:chrome"], "waitSecnds":3}
  1. 保存する。メモリ領域を確保するため、}以降にスペースが入っていますが、スペースは消さないようにしてください

  2. USBメモリを取り外すのと同様にちゃんと取り出しでPCから外してください。これをやらずにPCから取り外すと変更がうまく保存されません。取り出して数秒経つとLEDが光ります、それから取り外してください。

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

  4. keysの長さが2以上の場合、LEDライトが点灯し続けます。その状態でボタンを押すとkeysの2番目が入力されます。keysの次の値が存在する限りこれが繰り返され、keysの長さまで達すると、LEDライトは消灯します。

  5. LEDライトが点いていない状態でボタンを押すとkeysの1番目が入力され、LEDライトが点灯します。

  6. LEDライトが点灯している状態でwaitSecondsの秒数を過ぎてもボタンを押さない場合LEDライトは消えます。その次にボタンを押すとkeysの1番目が入力されます

Ctrl + Vなどのキーを組み合わせた入力

CtrlやShiftキーを組み合わせた入力は下記となります。

{"color": "red", "keys": ["press:KEY_LEFT_CTRL,v"], "waitSecnds":3}

press:の後にKEY_LEFT_CTRLvがあり,(カンマ)で繋げられています。

この場合はCtrlキーが押された状態でさらにvが押されることになり、結果的にCtrl + Vの入力となります。

なおさらにShiftなどを使いたい場合は"press.KEY_LEFT_CTRL,KEY_SHIFT_CTRL,v"となります。

最後の文字(この場合v)が押された後はキーのプレス状態が解除されます。

認識がうまく行かないとき

Windowsのデバイスマネージャーを開き当該デバイスを削除してください。

対応OSについて

開発はWindows10で行いました、なのでWindows10環境では使用可能です。

またWindows11環境でもテストを行いましたが問題はありませんでした。

ただ、Linux(Ubuntu)とMacOS(Sonoma)ではキー入力をPC側に送ることは可能なのですが、設定ができません。

SETTINGS.TXTを開くことはできて書き換えまでできるのですが保存ができません。

以前のバージョンでは出来たように記憶しているのですが。

現状は下記となります。

  • Windows10/11
    • キーの送信 - ok
    • 設定の保存 - ok
  • Linux(Ubuntu)/MacOS Sonoma
    • キーの送信 - ok
    • 設定の保存 - ng

実際に使うとどんな感じか

ノートPCで使うのであればAtomS3Uの背面部にこんな感じのクッションゴムを貼っておくとよいです。

写真のクッションゴムはダイソーで買ったものです。

ダイソーのクッションゴム
ダイソーのクッションゴム

貼り付けるとこんな感じです。大きいのを下に貼って、その上に小さいのをポチっと貼ってます。

クッションゴム2個貼った
クッションゴム2個貼った

ノートPCのUSB-Aポートに差し込むとこんな感じです、テーブルとの接地面ができてるのがわかると思います。

少し浮いてますが、この状態でAtomS3Uを押すとクッションが突っ張り棒の役割をしてくれて、USBポートへの負荷が減ります。 クッション無しで何回も押すとポート側が多分壊れます。 ノートPCによってはテーブルとの接地距離が違うのでクッションゴムの数で調整してください。

クッションゴムでテーブルと接地
クッションゴムでテーブルと接地

なお、ノートPCで使わない場合はこのクッションは必要ありません。

下記は上記の例1のIDとパスワードを入力している例です。 ID、タブ、パスワード、Enterの順に押しています。 分かりにくいかもしれませんが、4回ボタンを押しています。

IDとパスワードを入力してログイン
IDとパスワードを入力してログイン

何で作ろうと思ったか

私がビデオ通話のみで使っている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についての説明を追加