QMK/ZMK/KMK薙刀式の状況

昨年6月に下のような記事を書きました。

QMK薙刀式の進化 - weblog.sy

この変換ロジックを思いついたときには、これはうまくいきそうだという実感があったのですが、 実際に実装して使ってみると、入力してもなかなか文字が表示されないというのは、 思っていたよりストレスがあって、 開発の途中からどうやって入力途中で先行確定していくかを考え始めたのですが、 それはもはや最初におもいついたロジックとはずれていっていると感じて、 このv15x実装は放り出しました。

正確に変換するより、なるべく早く表示して入力フィードバックを与えた方が、 体験としてよいなと、今更考えなおして、次の実装v15yを作り始めました。 dvorakjよりもいいものにはしたいです(変換の確定が遅い、なにより不安定)。 とるさんのHachikuが一番、入力体験がいいなと思っていたので、 それと似たような挙動をキーボードファームウェアで実現できたらいいなと。 (Hachikuのコードは全く読んでいません汗)

最近のスタイルとしてはKMKでまずちゃんと動くものをつくって、 それをQMKとZMKに移植する、というフローにしています。 Pythonで書けるので、コレクション(List、Setなど)があるのは大変楽だし、 型がないので同じ変数に文字列やLambda式をつっこんだりと 割と好き放題できます。 とにかく動くものをつくるには手っ取り早いし、デバッグも早い。 (本当はPRK Firmwareをいれてrubyで書きたいんですが、まだうまくいきません。)

とりあえず動作するものを置いておきます。 まだUNICODE入力が必要な編集モードを実装していないし、入力中におかしくなったりするので未完成ですが、おおむね思った通りに動作しています。

データ構造として、スペースや編集モードのDFキーなど、必ず前置で押すキーと、濁点、半濁点のように後置が許されるキーを分けて定義しました。 QMKにもv15yとして移植はしたのですが、あまり工夫をしていない実装でv15、v15xに比べてファームウェアサイズが大きいので、 OLEDとかをオフにしないといけないのが課題です。

kmk_naginata/Raspberry_Pi_Pico_15y at main · eswai/kmk_naginata · GitHub

qmk_firmware/users/naginata_v15y at master · eswai/qmk_firmware · GitHub

今年はv15yの実装を完成させて、ZMKにも移植するのが、新年の抱負ですね。

2023年の自キ活ふりかえりと自作ケースの話

キーボード #1 Advent Calendar 2023 - Adventarの12/15の記事です。

昨日は大岡俊彦さんの

【薙刀式】カナ配列薙刀式はいいぞという話【キーボードAdvent Calender 2023】: 大岡俊彦の作品置き場

でした。 私も薙刀式ユーザーで日常的に薙刀式でかな入力しています。

2023年のふりかえり

参加したイベント
  • 天キー vol. 4
  • 天キー vol. 5
作ったキーボード
ファームウェア

あらゆるファームウェア薙刀式対応にする活動

  • QMK薙刀式の改良
  • KMK薙刀式をつくった (pythonなんでちょっと書いて試すのが簡単、ただし想像以上に実行速度が遅かった)
  • ZMK薙刀式をつくった (ZMKチョットワカル。薙刀式behaviorつくった)

MABLEをつくった話

MABLEはMiniAxe-like BLE keyboardを短縮して名づけました。 MiniAxeの無線版を作ろうという動機です。 Seeed Studio XIAO nRF52840を使えば、LiPoバッテリーの充電回路がついてるし、GPIOは11pinしかないけどMiniAxeレイアウトなら不足はないし、ファームウェアはKMKやZMKが使えるので、私以外にも同じ構成で左右分割無線キーボードをつくっている例が見つかります。 ZMKのBT実装は技適問題があるらしいので、無線でつなく場合は大人しくKMKを使います。

完全にイベント駆動で天キーvol. 5に向けてつくったのですが、 見栄えのするケースを作ろうと思って試行錯誤した結果、自分でも満足のいくデザインができました。 天キーでもいくつか高評価をいただいただけでなく、 なんと驚くべきことに自作キーボードカレンダー2024(3月の写真)に採用いただきました。 写真は愛車のロードスターの上で撮りました。

ここでは、そのケース設計の試行錯誤の過程をすこし書いてみたいと思います。

コンセプト

私は3Dプリンタ(Original Prusa i3 MK3S+とVORON V0)を持っているので、 PCB以外のプレートやケースは3Dプリンタで作ることが多いです。 PCBを設計してオーダー、PCBを待っている間にケースを設計し、3Dプリンタを動かしている間にファームウェアを書くというフローです。 今回、3Dプリンタらしい、金属削りとは違うデザインにしてみよう、というのが最初の動機でありコンセプトといえます。

最近は恐ろしいことに個人が少量で金属の機械加工をオーダーできる時代になりました。 天キーでも既製品と見分けのつかない自作アルミケースがたくさんありました。 しかし細かくて深い穴がいっぱい空いていて、ほとんど材料をすててしまうような形は、 引き算である削り加工では時間とお金がかかるのでやりたくありません。 そういう形は足し算である3Dプリンタ(additive manufacturing)の得意とするところです。 アルミケースに見劣りしないように、穴だらけのケースをつくろう、という出発点でした。

1st design

ラーメン構造の鉄塔のような形がまずは思い浮かんだので形にしてみました。 プリントしてみると、これはこれで満足感のある形ではあったのですが、 キーボードのケースとしては、あまりかっこよくありません。 寸法調整したり綺麗にプリントできるよう何度か試行錯誤はしたのですが、 やはりカッコよくなかったのは致命的でボツです。

2nd design

次のデザインをどう思いついたのかもはや覚えていませんが、 RAMA WORKSのTHERMALのスリットを意識しつつ、もっと極端にしたらどうなるだろうという感じだったとおもいます。 スリットは貫通していて、向こう側が見えるようにしました。 また、ケースの4方向全部に連続的にスリットを入れたかったので、45度方向にスリットしてみました。

しかしながらプリントしてみると最初の印象はちょっと気持ち悪かったです。 デザインとしては単調だし、やりすぎ感があります。 でも見る向きによって印象が変わるので、 スリット自体は効果的なデザインだなと思いました。

3rd design

次はスリットを部分的にしてみました。 4面全てにスリットをいれつつ、 あまりかっこよくスリットが入らない二つの角の付近はスリットをやめてみました。 スリットのあるところ、ないところの対比がよくて、 このデザインの方向性でいけそう、という感触を得ました。

左右対称の分割キーボードなので、ミラーすれば反対側も自動的にできるのですが、 スリットの方向を左右で同じ方向にしたかったので、 反対側もちゃんとCADモデリングした非対称デザインなのが、 こだわりと言えばこだわりです。

3例挙げましたが、試作としては3回では終わっていなくて、 他の試作品は捨ててしまっただけです。 CADデータをみるとX字にスリットをきったものもありました。 寸法調整やUSB穴の処理、マイコンの蓋など、他にも試行錯誤があります。 3Dプリンタの出力最適化もあります。

また同じデザインでGateron Low Profile版もつくりました。 2, 3週間、週末はこればかりやっていたとおもいます。

最後に

天キーvol.5の後の飲み会で、 ハードをやる人とソフトをやる人が比較的わかれていて、どちらがとっつきやすいという話があったのが興味深かったです。 その人のバックグラウンドによって手を出すところが違うんですね。

私はハード(PCB含めたキーボード設計)もソフト(ファームウェア薙刀式拡張とか)もやるのですが、 もともと親指シフトキーボードを作りたかった、それは物理レイアウトとしての親指シフトキーボードと、 ファームウェア親指シフト入力をエミュレーションする、 という2つを両方ともやりたかったのが、 自作キーボードの始まりだったからでしょうね。

また、普段CAD設計をする仕事をしているのでCAD慣れしていますし、 趣味でプログラムを書くのでファームウェアも敷居が低かったです。 PCB設計は勉強しましたが、foostanさんの本のおかげで失敗なく設計できました。(2018頃の話) 自作キーボードは機械設計、電子設計、ソフトウェアを組み合わせる総合的なホビーであるところが面白いと思っています。

この記事はもちろん自分で設計したキーボードで書きました。 来年もハードソフト両面で楽しんでいきたいと思います。

明日は、あたるの⌨キーボード&技術アカ さんです。 お楽しみに。

天キー Vol.5感想 +alpha

天キーVol. 5

Vol. 4に続いて2回目の参加でした。

今回、ZMK薙刀式を大岡さんに少し触ってもらいましたが、 全てのキーを離して初めて文字が出力されるというのに戸惑ったようです。 これは予想通りの反応でしたが、この時感じたのは、薙刀式はDvorakJの挙動を前提にしており、 ZMK薙刀式のように私が使いやすいようにチューンしてしまうと、 それは本家薙刀式と違うものになってしまうのではないかということです。 それは本当に薙刀式なのかと思ってしまって。

現在の全てのキーを離して初めて出力する、というロジックは15xというバージョンですが、 これは誤変換をなくすことを主眼においており、 スピードは犠牲にしているところがあります。 私には十分なスピードですが、大岡さんのスピードにはついていけないのでしょうね。

よって、DvorakJ互換の15dというバージョンを作ろうかと思い始めています。 同様に、後置シフトも一旦、disableするかと。

ジャパンモビリティショー

天キーは当日移動を考えていましたが、せっかくなのでモビリティショーを見に行きました。 日産のハイパーフォースは写真では、なんだこれと思っていましたが、 実物をみると印象は違いました。 しばらく見ていたくなる車でした。

マツダのアイコニックSPは圧巻のデザインでした。 美しいデザインで、バタフライドアもマッチしており、 ターンテーブルで回る姿は、いつまでも見飽きなかったです。

コペンは本当にこのパッケージで出たらいいのですが、 ロードスターと近すぎるようにも思います。

東京インターナショナルオーディオショー

気軽に高級スピーカーを試聴できる機会と思って参加しました。 無料だし。 正直、感想としては微妙です。 B&WやDALIはいいなと思いましたが、それはあまりに視聴環境が家庭環境からかけ離れているし、 音源もボーカルものは少なかったし、 大手有名メーカーほどいい音だなと思ったのですが、 スピーカーの実力以上の差があるように思えて、それは試聴環境への投資というか構築ノウハウの差にも思えました。 よって全然わからん。 ショップに自分の音源持って行って聞いた方がいいと思いました。

ZMK試行錯誤2

かな変換はできるので、次は編集モードなんだが、カッコを入力してからカッコの間にカーソルを移動する場合、以下のようにマクロを書いたが、なぜか順番通りには入力されない。

ZMK_UNICODE_SINGLE(kakko5l,  F, F, N0, N8) // (
ZMK_UNICODE_SINGLE(kakko5r,  F, F, N0, N9) // )
        // (){改行}{↑}
        kakko5: kakko5 {
            label = "ZM_kakko5";
            compatible = "zmk,behavior-macro";
            #binding-cells = <0>;
            wait-ms = <50>;
            tap-ms = <50>;
            bindings
                = <&macro_tap &kakko5l &kakko5r &kp UP>
                ;
        };

ZMK薙刀式ができた

これまでQMK薙刀式、KMK薙刀式を作ってきました。 QMK薙刀式はキーボードを挿せば即、薙刀式が打てることがメリットです。 配列エミュレータをインストールしなくていいですし、有線でつなげはスマホでも使えます。

QMK以外に薙刀式をのせる目的としては、無線対応があります。 XIAO BLEなどnrf52840と充電回路まで搭載して、 完全無線キーボードを作るためのハードが揃ったので、なんとか薙刀式を無線キーボードに乗せたいわけです。

KMK薙刀式はPythonで簡潔にコードを書ける点、nrf54840など無線対応ができる点に期待して作成しましたが、 CircuitPythonの実行が遅すぎる、nrf52840ではメモリが足りないなど、これ以上開発してもゴールにたどり着けないことが分かりました。

過去には、sekigonさんのQMK nrf52ブランチに薙刀式を実装したことがあるのですが、QMKが古いので先がないなぁと思って放置しています。 またsekigonさんのBLE Micro Pro用QMKを使う方法もあります。 これは当然BLE Micro ProやQuantizerを使う前提になるので、汎用的ではありません。

もうZMKしかない、という動機でZMK薙刀式を考えていたのですが、 どこから手をつけていいのかよくわからず、しばらくソースコードを眺める日々でした。 機能を拡張するにはbehaviorというものを作ればいいのが分かりました。 次にキーをどうやって出力するのかよくわからなかったのですが、それは昨日できました。 そうすると、あとは同じCで書いたQMK薙刀式のコードがほとんど使えるので、 数時間で一気にかな入力はできるようになりましたので、これを書いています。

フラッシュもRAMもまだまだ空いているので、今後編集モードを入れても余裕でしょう。

Memory region         Used Size  Region Size  %age Used
           FLASH:      201955 B       788 KB     25.03%
            SRAM:       48544 B       256 KB     18.52%
        IDT_LIST:          0 GB         2 KB      0.00%

ZMKはこちら。 app/src/behaviors/behavior_naginata.cが本体です。

GitHub - eswai/zmk: ZMK薙刀式を作っていきます

薙刀式behaviorを使ったキーマップの例はこちら。 キーボードはXIAO BLEを使った自作です。

GitHub - eswai/zmk-config: XIAO BLE使用の分割キーボードmable用のconfig

現時点では、ZMKをある程度理解していないと、かなり難しいと思います。 おいおい書いていきたいと思います。

※ XIAO BLEとZMKの組み合わせが技適に適合するのかはっきりしません。自己責任で。。。

ZMK試行錯誤1

ビルド

cd app/
rm -rf build/
west build -b seeeduino_xiao_ble -- -DSHIELD=mable_left -DZMK_CONFIG="/Users/foo/zmk-config/config"
cp build/zephyr/zmk.uf2 /Volumes/XIAO-SENSE/

あるキー(A)をプレス、リリースするには以下のコードになります。 A(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_A))とdefineされています。 定義はこちら zmk/app/include/dt-bindings/zmk/keys.h

ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(A, true, event.timestamp));
ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(A, false, event.timestamp));

秋月メモリ液晶

BeepyというRaspberry Pi Zeroにモノクロ液晶とBlackberryのキーボードをつけた端末があって、すごく欲しいんだけど、ファーストバッチは売り切れて、次の入荷を待っている。

とりあえず、同じ液晶は秋月で手に入るので、以下の部品を購入して、Raspberry Pi Zero 2 Wに接続してみたのでメモ。

購入部品

  • P-04944 シャープ モノクロHR-TFTメモリ液晶モジュール 2.7インチ WQVGA
  • K-07253 フレキコネクタDIP化キット(0.5mm10P)

接続するGPIOはBeepyに合わせた。

ドライバーはBeepyのもの。

GitHub - sqfmi/Sharp-Memory-LCD-Kernel-Driver: Linux Kernel Driver for Sharp Memory LCDs

フォントを変えたいときは

sudo dpkg-reconfigure console-setup

日本語表示もできるらしい。

CJK support on Beepy · GitHub