RP2040+KMKで実現する「マウスも動かせる」最強レイアウト-その3 KMK-【RP2040】

rp2040で作る自作キーボードの記事の第三回サムネイル。試作機のプログラムについてKMKフレームワークの使い方、試作機(MODEL01)でZZZ(ゼンレスゾーンゼロ)を遊んでみる。

制御ライブラリを「KMK」へアップグレード

前々回の記事「自作hitbox 小型マイコンで格ゲーコントローラを自作する。-その1 環境構築編-」では、標準的なadafruit_hidライブラリを使ったセットアップをご紹介しました。しかし、実際にゲームを快適に遊ぼうとすると、「もっと柔軟にキーを切り替えたい」「マウスも動かしたい」という欲求が出てきます。

そこで、Pythonで書ける高機能キーボードフレームワーク「KMK Framework」を採用しました。今回は、このkmkでのセットアップからレイヤー切り替えについて紹介していこうと思います。

第1回 セットアップ編

rp2040で作る自作キーボードの記事の第一回サムネイル。環境構築から「a」を入力できるようになるまで・

自作hitbox 小型マイコンで格ゲーコントローラを自作する。-その1 環境構築編-【RP2040】

pico互換マイコンで環境構築から『a』が出るまでの手順を丁寧に紹介します。

KMKのセットアップ

導入は非常にシンプルです。

  1. ダウンロード: KMK公式からファイルを一式入手します。(githubにあるので kmkフォルダを見つける)
  2. コピー: RP2040をPCに繋ぎ、libフォルダの中にkmkフォルダをそのままドラッグ&ドロップします。

1.配布場所からダウンロード

KMK: Clackety Keyboards Powered by Python

KMKのgithubページ

github.com

2. RP2040にインストール

他のライブラリと同様 “kmk”というフォルダを libフォルダにコピーすることでインストールできます。

kmkをライブラリフォルダにコピペ

詳しい使い方は公式のドキュメントを参照。

公式サイト(ドキュメント): getting start KMK docments
  • キーコードの一覧や各モジュールの設定方法が網羅されています。

1. ボタンの定義とスキャン

「MODEL 01」は、16個の操作ボタンに加え、背面に2つの切り替え用スイッチ(GP26, GP27)を搭載した計18入力の構成です。 KMKのKeysScannerを使えば、マトリックス配線でなくても、これらのピンを一括で管理できます。

参考コード例:

# GP0-15:ボタン, GP26-27:モード/ロックSW
PINS = [
    board.GP0, board.GP1, board.GP2, board.GP3,
    board.GP4, board.GP5, board.GP6, board.GP7,
    board.GP8, board.GP9, board.GP10, board.GP11,
    board.GP12, board.GP13, board.GP14, board.GP15,
    board.GP26, board.GP27 
]

keyboard.matrix = KeysScanner(
    pins=PINS,
    value_when_pressed=False, # 押した時に回路が閉じる
    pull=True,
)

2. アケコンでマウスを動かす:MouseKeysの実装

『ゼンレスゾーンゼロ(ZZZ)』などのARPGを遊んでいて一番困るのが、「報酬受け取りやメニュー選択でマウスが必要になる」こと。 わざわざマウスに持ち替えるのは面倒なので、アケコンのボタンでマウスをエミュレートします。

from kmk.modules.mouse_keys import MouseKeys
keyboard.modules.append(MouseKeys())

# 速度設定:自分の操作感に合わせて調整
mouse_keys = MouseKeys()
mouse_keys.max_speed = 20
keyboard.modules.append(mouse_keys)

これだけで、特定のボタン(後述のレイヤー)を押している間、十字キーを「マウスカーソル」として使えるようになります。

#通常キーボタンと同様に以下の様に割り当てるとカーソル移動をさることができます。
KC.MS_UP, # 例 5番: マウスカーソル上
KC.MS_LT, # 例 8番: マウス左
KC.MS_DN, # 例 9番: マウス下
KC.MS_RT, # 例 10番: マウス右

3. レイヤー切り替え

「ボタンが足りない!」を解決するのがレイヤー機能です。 今回は「長押し」や「スイッチのON/OFF」で、ボタンの役割を瞬時に切り替える構成にしました。

レイヤー番号レイヤー名主な機能トリガー(切り替え条件)備考
Layer 0標準モードZZZ等の通常戦闘操作デフォルト(ベース)基本のWASDや攻撃ボタン
Layer 1モードB数字キー・矢印キーGP27スイッチ をONの間設定やサブ操作用
Layer 2マウスモードマウス移動・クリックLayer0から11番ボタン をONの間マウスカーソルを操作可能
Layer 3拡張モード数字・AltキーLayer 2で12番ボタン を押している間マウス操作中の特殊入力
Layer 4ソフトOFF全ボタン無効化(ロック)(最上位レイヤーとして定義)持ち運び時の誤爆防止用
  • 長押しで移動 (KC.MO(n)): 特定のボタンを押している間だけ、裏のレイヤー(マウス操作など)を呼び出します。
  • 同時押しでさらに深く: レイヤー2を開きながら別のボタンを押すとレイヤー3へ……といった多段構成も可能です。
  • GP27スイッチGP26スイッチはモード切替用のトグルスイッチを使います。

究極の安全装置「ソフトウェアOFF」

面白い試みとして、背面のスイッチをONにすると全ボタンを無効化(KC.NO)するレイヤーを最優先で読み込むようにしました。ほかのキーボードやマウスで操作中の誤作動を防ぐ「物理的なソフトロック」です。


完成したレイヤー構成でZZZを遊ぶ

これらの機能を組み合わせて、「戦闘時はアケコン、メニュー操作はマウスモード」と切り替えることで、コントローラーから一切手を離さずにプレイできるようになりました。

※前回の記事の動画再掲

実際に動かしてみると、ニコの特殊モーションのような正確な入力が求められる操作も、自作ならではの配置のおかげでミスなく決まります。

最後に

当初は「キー入力ができればいい」と思っていましたが、KMKに乗り換えたことで、アケコンが「マウスにもなり、安全ロックもかかる」デバイスへと進化しました。

現状でも十分遊べるクオリティですが、今回の知見から改善したい点もいくつか見えてきました。

  • LEDインジケータの実装: 現在のレイヤーが視覚的にわかるようにしたい。
  • 基板の固定: 今はまだ宙ぶらりんなので、しっかり固定できる構造へ。
  • 入力ロジックの微調整: 右端キーのコンボ時の挙動をより滑らかに。

良い設計アイデアが浮かんだらMODEL02を作成して今回の内容を改善していこうと思います。

併せて読みたい:前回記事 “キーレイアウト設計”

rp2040で作る自作キーボードの記事の第二回サムネイル。試作機のモデリングと試作機テスト、試作機(MODEL01)でZZZ(ゼンレスゾーンゼロ)を遊んでみる。

自作hitbox 小型マイコンで格ゲーコントローラを自作する。-その2 キー配列と試作機01-【RP2040】

自作キーボード(アケコン風)の試作機1号完成。動作検証のためZZZを自作キーボードでプレイ。

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero

Reference: 本プロジェクトの制御には、オープンソースのキーボードファームウェア KMK Framework を使用しています。

  • develop chat Site: kmkfw.io
  • License: GPLv3