デンシナブログ!!!

名前: デンシナ

趣味: キーボード論理配列の変更

好きな食べ物: 寿司, ラーメン, とんかつ, 焼肉

いつもいるところ: https://misskey.systems/@den_shina

【アドカレ2025】軍手のキーボードを作った話

アドカレ2025!うお〜。 軍手キーボード作った話をします! ((o(´∀`)o))ワクワク 作ったのはこれ!の17分30秒?くらいからでてるやつ!見てない人は見てみて〜。

作ったモチベ

もともと2年くらい前から作りたい〜って思ってたんだよね。 普段使ってるのはglove80っていうキーボードなんだけど、これはこれで使いやすいものの、やっぱり普通の分割キーボードだから机にいないとキーボード打てないんだよね。 机にいるときにしかタイピングできないって辛いよ〜。 僕は歩いたり走ったり寝たりしながらキーボード打ちたいわけ。 ってことでどうしたらいいかな〜ってのを不定期的にやる気になったときに試行錯誤しているんだ。 でもなかなか形にならなかったり、失敗したりしてたんだけど、今回またコンテストやるって聞いたから急いで動く形にしたよ。

キーボード紹介

作ったキーボードの名前は「軍手 & Raspberry Pi Pico W with MPU6050」です! 動画だとニュアンスが伝わらず全部+になってるケド... そんで配列の名前は「突貫作成仮配列ver3」! これはまあ、そのまんまですね〜。

ハードウェア解説

名前に全て表現されているけど、使ってるのは Raspberry Pi Pico W と MPU6050だね。(あと軍手) まずRaspberry Pi Pico Wの紹介からするよ! 動画だと手の甲にのっかってる緑のやつだね。 これはRaspberry Pi なんだけど、Linuxとか入るめちゃリッチな感じのやつではなく、ほとんどArduinoみたいなお手軽電子工作に使われるやつだよ。 Raspberry Pi Pico Wの特徴といったら、なんといってもその安さ!たしか1000円くらいで買えちゃったきがする。 普通のRaspberry Piって5000円とかするから、それと比べたらめっちゃ安いね。素晴らしい。 あとBluetooth対応ってのもこれの特徴だね!すごいぞ! 次はMPU6050! 動画だと手の指にくっついて光ってるやつです。 これは加速度センサーで、加速度と角速度が取得できるよ。 これを使って指の動きを検知してます! あと軍手は普通の軍手で、3セット100円くらいで売ってたやつ。 軍手って軍用手袋の略らしい。へ〜。 工夫点としては、iPadをタップできるように、人差し指の腹を切り取ってあるところくらいかな?あんまり加工はしてないね。 こいつらと、あと乾電池ボックスとかを接着剤とかマジックテープで合体させて、空中配線したものが、今回作った「軍手 & Raspberry Pi Pico W with MPU6050」だね。 自由研究感がある温かい見た目となってるよ。 お気に入りポイントは、電源いれるとMPU6050についてるLEDが光ってかっこいいところと、あと動画だと音声を消しているからわからないけど、「キュイーン」っていう小さいモスキート音みたいなのが聞こえるところです。

入力方法解説

動画の冒頭にもちらっとうつってるけど、このキーボードの動かし方を書いた表がこちらです。

([(_, T), (_, T)], "a")
([(_, T), (_, I)], "enter")
([(_, T), (_, M)], "b")
([(_, T), (T, _)], "c")
([(_, T), (I, _)], "d")
([(_, T), (M, _)], "e")
([(T, _), (_, T)], "space")
([(T, _), (_, I)], "f")
([(T, _), (_, M)], "g")
([(T, _), (T, _)], "h")
([(T, _), (I, _)], "i")
([(T, _), (M, _)], "j")
([(_, I), (_, T)], "k")
([(_, I), (_, I)], "l")
([(_, I), (_, M)], "m")
([(_, I), (T, _)], "n")
([(_, I), (I, _)], "o")
([(_, I), (M, _)], "p")
([(I, _), (_, T)], "q")
([(I, _), (_, I)], "r")
([(I, _), (_, M)], "s")
([(I, _), (T, _)], "t")
([(I, _), (I, _)], "u")
([(I, _), (M, _)], "v")
([(_, M), (_, T)], "w")
([(_, M), (_, I)], "x")
([(_, M), (_, M)], "y")
([(_, M), (T, _)], "z")
([(_, M), (I, _)], "Backspace")
([(_, M), (M, _)], "shiftone")
([(M, _), (_, T), (_, T)], "1, !")
([(M, _), (_, T), (_, I)], "2, @")
([(M, _), (_, T), (_, M)], "3, #")
([(M, _), (_, T), (T, _)], "4, $")
([(M, _), (_, T), (I, _)], "5, %")
([(M, _), (_, T), (M, _)], "6, ^")
([(M, _), (T, _), (_, T)], "7, &")
([(M, _), (T, _), (_, I)], "8, *")
([(M, _), (T, _), (_, M)], "9, (")
([(M, _), (T, _), (T, _)], "0, )")
([(M, _), (T, _), (I, _)], "-, _")
([(M, _), (T, _), (M, _)], "=, +")
([(M, _), (_, I), (_, T)], "[, {")
([(M, _), (_, I), (_, I)], "], }")
([(M, _), (_, I), (_, M)], "backslash, |")
([(M, _), (_, I), (T, _)], ";, :")
([(M, _), (_, I), (I, _)], "sqt, dqt")
([(M, _), (_, I), (M, _)], "grave, tilde")
([(M, _), (I, _), (_, T)], "comma, <")
([(M, _), (I, _), (_, I)], "dot, >")
([(M, _), (I, _), (_, M)], "slash, ?")
([(M, _), (I, _), (T, _)], "right arrow")
([(M, _), (I, _), (I, _)], "left arrow")
([(M, _), (I, _), (M, _)], "down arrow")
([(M, _), (_, M), (_, T)], "up arrow")
([(M, _), (_, M), (_, I)], "言語切り替え")
([(M, _), (_, M), (_, M)], "ESC")
([(M, _), (_, M), (T, _)], "kana")
([(M, _), (_, M), (I, _)], "eisu")

みるのむずいと思うけど、まず、1行抜き出してくるとこうなってるよね。 (なんか1, なんか2) このなんか1が指の動きを表していて、なんか2が入力されるキーを表しているよ。 例えば、先頭の ([(_, T), (_, T)], "a") これは、 なんか1 = [(_, T), (_, T)] なんか2 = "a" ってことで、なんか1の動きをすると、Aキーが入力されるって感じ。 なんか1の中身の話だけど、これは [(左0, 右0), (左1, 右1)]みたいなpairのlistになってて、listの0番目から順番に全部入力するってことを表してるんだ。 そんで、「T:親指, I:人差し指, M:中指, _:動きなし」 って解釈するよ。 だからさっきのなんか1を持ってくると [(_, T), (_, T)] これの(_, T)は、左手が「_:動きなし」で、右手が「T:親指」だね。 それが2つ並んでるから、「右手親指を動かす、その後、右手親指を動かす」って感じに解釈されるんだ。 だから最初の行のこれ ([(_, T), (_, T)], "a") は、「右手親指を動かす、その後、右手親指を動かすと、"a"が入力される」って解釈になるよ。 このキーボードは、使えるキーが両手で6キーしかないから、基本的にアルファベットは2打で1キー入力に対応するね。 それでも足りないから、最後の方は3打で1キーになってるよ。 効率わるいね... さらに、日本語入力するときは普通のローマ字入力を採用しているから、4打で1かな入力ってことになる... ひえ〜

実装解説

実装の中身の紹介をするよ! まず、指の動きの検知方法だね。これは、非常に温かみのあるルールベースの検出となっております... MPU6050から得られる生の値をこねくり回すことで、単一の「指の動きの激しさ」を表すスカラー値にして、それを感覚と試行錯誤で決めた閾値と比較することで、「動いてる」と「動いていない」を判定しているよ。 だから、指をゆっくり動かすと、全然反応しないで、クイッと動かすとtapと判定されるようになっているわけだね。 その指のtap判定をstate machineに投入して、state machineはさっきの表と見比べて、(新しいstate, Maybe 入力)を返すってのをloopしているよ。 解説するとそれだけで、非常に簡単なんだけど、これを作るのもめっちゃ時間かかったな〜。 僕にこういう知見がまったくないから、AIくんにいろんなこときいて、頑張りました...

配列解説

配列の話! 上の方で配列自体は紹介しちゃったわけだけど、これの工夫点を書きます! 工夫点は 1. EnterとSpaceは入力しやすいところに持ってきた点 2. だいたいアルファベット順にならべて、覚えやすくした点 3. 極力2打で入力できるようにした点 くらいかな。 まず1だけど、EnterとSpaceは英語でも日本語入力でもめっちゃ使うからとりあえず押しやすいところに配置しました。 そんで、2だけど、アルファベット順にあとは並べるように配置したよ。 これは、実装にコンテストの最終日ぎりぎりまでかかってしまって、学習時間が全くなかったからなんだよね。 本当はもっといろいろ配列を考えたかったんだけど、あまりにも時間がなくてなにもできなかったよ。 具体的には、まず英語と日本語入力で配列を分離したいし、それぞれの配列で入力することになる文章の母集団に対して最適な入力方法ってのも考えたかったな。 時間も知識も不足していてできず...orz それでもなるべく2打でできるようにしたのは頑張ったかな〜。配列は2回ほどフルリメイクしてるから突貫作成仮配列ver3って名前にしました😎

作った感想

結局圧倒的な低スコアで動画出演することになったわけだけど、もっと改善して早く簡単に打てるようにできる可能性は感じてる! 来年はそれを目指す!...かもしれないし、ほかの入力デバイスを作ってるかもしれない... というのも最近、でもないけど、最近Metaが販売しているEMG Bandっていうのがあって、これは手首にバンドを装備すると指の動きが検出できるってものなんだ。 今んところは英語しか入力できないようだし、入力方法もそんなに素早くなさそうだけど、見た目がスタイリッシュでかっこいいね。 軍手よりいいカモ... って思ってるから、もしかしたらそっち方面を試すかもしれない。あと僕がちんたらやるより先にMetaがちゃんとした商品を出すかもしれないね。 配列も工夫の余地というか、動画でも参加してる人いたけど、steno的な形で入力するようにしたいんだよね本当は。 指の動きがすくなくて済むのがすごい魅力的。 動きの判定については、ルールベースのtap判定じゃなくて、機械学習ベースのやつにしたい。 最初はそれを目指していたんだけど、機械学習が全然うまくいかないのと、学習用データを用意するのがめんどくさくて断念しちゃったんだよね。 機械学習ベースになったらもっと難しい判定ができるだろうって思ってて、たとえばプリセット登録しておいた文章を手話みたいにして入力できるかもしれない。 まあ完全な手話入力は遅そうだからやらないけど、一部のよく使う文章はそれでいいかもね。 キーボードのあとは、マウス操作も軍手でできるようにしたい! それもできたら、次はマイクもつけて、音声入力に対応したり、指パッチンでホムンクルスを燃やせるようにしたり... やることが山積みだぜ... そんな感じで、2025年は終わり! また来年がんばるぞい!!!