M5 AtomS3Uでランダムな文字列をキー入力としてPCに送る
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で使用するならあった方がいい
コンパイル方法
- ソースコードは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
-
PlatformIOでcloneしたレポジトリのディレクトリ(m5-atoms3u-examples)内にあるusb_key_sender_randomディレクトリを開きます。
-
依存ライブラリのインストールなどで数分待つ必要があるかもしれません
-
M5AtomS3UをPCに接続して、リセットボタンを長押ししてからPlatformIOでbuild後、uploadしてください
※PlatformIOの使い方や操作方法は公式のドキュメントなどを参照してください。
使い方
-
M5AtomS3Uの中央のボタンを押したままPCに接続
-
しばらく待つとUSBストレージ(ATOMS3U_MSC)として認識され、SETTINGS.TXTファイルが表示されます
-
SETTINGS.TXTをメモ帳で開くとJSONファイルとなっています
-
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}
-
保存する。メモリ領域を確保するため、
}
以降にスペースが入っていますが、スペースは消さないようにしてください -
USBメモリを取り外すのと同様にちゃんと
取り出し
でPCから外してください。これをやらずにPCから取り外すと変更がうまく保存されません。取り出し
て数秒経つとLEDが光ります、それから取り外してください。 -
再度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を生成します。
keyboardLayoutについて
一部の記号が意図通りにPCに入力できないのでASCIIのキーマップを少しだけ変える処理を入れました。
"keyboardLayout"
の値を"ja"
とするとその処理が入ります。
現状版で想定される値は"ja"
かそれ以外となります。
"ja"
にしてダメな場合は値そのものを削除するか、空""
としてください。
ASCIIコードの部分はかなり面倒な処理なようなので、あまり真面目に実装していません、何か問題があったら連絡ください。
prefixとsuffixについて
ランダムな値の前後に文字列を挿入できます。
例えば"prefix":"random number ","suffix":" !!!"
と設定しておくと、random number <ここにランダムな値が入る> !!!
と入力できます。
また、"prefix":"{\"random\":\"","suffix":"\"}"
と設定すると {"random": <ここにランダムな値が入る>}
とJSON文字列を入力できます。
値が連続して入力される場合
AtomS3Uの中央ボタンを押して入力する際に同じ値が88888888888888
と入力されてしまう場合があります。
その際は、AtomS3Uのリセットボタンを押して再起動させてください。