/

M5 AtomS3Uでランダムな文字列をキー入力としてPCに送る

M5
M5 AtomS3U

M5 AtomS3Uを使ってランダムな文字列をキー入力としてUSB経由でPCに送信します。

USB Key senderの派生ツールです。

機能 / 仕様

  • ランダムなキー入力をホストPCに送信する
  • 設定はROM領域にJSONファイルとして保存
  • ボタンを押した際のLEDの色を変更可能
  • ボタンを押すと、設定されたランダムなint値をホストPC側にキー入力として送る
  • uuidの出力も可能(設定JSONに"randomMode": "uuid"を追加)
  • 最大値、最小値を設定可能(設定JSONに"randomMax","randomMin"で設定可能)
  • Windows10(11)に対応 Linux・Mac(キーの送信はOK、ROM領域の書き換えができない)

必要なもの

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

コンパイル方法


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

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

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

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

使い方

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

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

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

  4. jsonを編集する

#例1 0から100のランダムな整数を出力
{"color":"red", "randomMode":"", "randomMin":0,"randomMax":100,"seedPort":14}

#例2 {"uuid": "********" } という形でuuidを生成して出力
{"color":"red","keyboardLayout":"ja","randomMode":"uuid","randomMin":0,"randomMax":100,"prefix":"{\"uuid\":\"","suffix":"\"}","seedPort":14}
  1. 保存する。メモリ領域を確保するため、}以降にスペースが入っていますが、スペースは消さないようにしてください

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

  3. 再度PCに接続、中央ボタンを押すと4.で設定したランダムな数値またはuuidを出力します。

    ランダムな値
    ランダムな値

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

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

対応OSについて

SETTINGS.TXTの書き換えについてはWindows10 / 11のみ対応です。

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

現状は下記となります。

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

何で作ろうと思ったか

AtomS3Uにはマイクが付いているのでマイク入力をシードにしてランダムな値を出力出来たら面白いなと思い作りました。

USB Key senderから派生したと最初に書きましたが、ブログ公開の次期が逆になりましたが本当はUSB Key senderの方が"USB Key sender Random"から派生したツールです。

何に使うか

ランダムな数値や値を取得したいとき/dev/random/dev/urandomを参照するか、なんらかのプログラミング言語の乱数(疑似)生成メソッドを使って値を生成することになるでしょう。

使用するOSやプログラミング言語仕様に頼らずにランダムな値(疑似欄数値)を取得できるのがUSB Key sender Randomです。

仕組み

AtomS3Uの中央ボタンを押すと、GPIOの14番をanalogReadし、返ってきた値をseedとしてrandomSeedに渡します。

それから設定した最小値と最大値をC++のrandom関数に渡しランダムな整数値を取得します。

また、モードがuuidモードの場合はArduinoのUUIDのライブラリ(robtillaart/UUID)を使用します。

GPIOの14番をanalogReadし、返ってきた値をseedとしてuuidに渡し、uuidを生成します。

AtomS3U
AtomS3U 中央ボタン

keyboardLayoutについて

一部の記号が意図通りにPCに入力できないのでASCIIのキーマップを少しだけ変える処理を入れました。

"keyboardLayout"の値を"ja"とするとその処理が入ります。

現状版で想定される値は"ja"かそれ以外となります。

"ja"にしてダメな場合は値そのものを削除するか、空""としてください。

ASCIIコードの部分はかなり面倒な処理なようなので、あまり真面目に実装していません、何か問題があったら連絡ください。

prefixとsuffixについて

ランダムな値の前後に文字列を挿入できます。

例えば"prefix":"random number ","suffix":" !!!"と設定しておくと、random number <ここにランダムな値が入る> !!!と入力できます。

また、"prefix":"{\"random\":\"","suffix":"\"}"と設定すると {"random": <ここにランダムな値が入る>}とJSON文字列を入力できます。

prefixとsuffixありでuuidを出力
prefixとsuffixありでuuidを出力

値が連続して入力される場合

AtomS3Uの中央ボタンを押して入力する際に同じ値が88888888888888と入力されてしまう場合があります。

その際は、AtomS3Uのリセットボタンを押して再起動させてください。

AtomS3U
AtomS3U リセットボタン