Skip to content

Instantly share code, notes, and snippets.

@yswallow
Last active July 23, 2024 03:57
Show Gist options
  • Save yswallow/8a99d8606a215e547646ca44e1c14fab to your computer and use it in GitHub Desktop.
Save yswallow/8a99d8606a215e547646ca44e1c14fab to your computer and use it in GitHub Desktop.
KMK Firmwareで完全無線分割キーボードを作る
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.A3,
board.A2,
board.A1,
board.A0,
board.SCK,
board.MISO,
)
row_pins = (board.D4, board.D5, board.D6, board.D7)
diode_orientation = DiodeOrientation.COLUMNS
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
21, 22, 23, 47, 46, 45,
]

KMK Firmwareで完全無線分割キーボードを作る

完全無線を実装できたので「左右間無線」から改題しました

USBから給電する必要がありますが, モバイルバッテリーを使えば無線ですね

できること

  • 左右間の接続を無線にする
  • 端末との接続をBLEにする

現状ではできないこと

  • PCとの接続を無線にする

このドキュメントでの制限

  • レイヤー機能は使えませんでした →使えました!
  • NeoPixelは使えません
  • プルリクが通らなかった場合にupstreamを追う気はないので将来的な修正や機能追加は反映されません

注意点

BLE Micro ProやYBKのキーボードと共通の通信方式を利用しているため, 誤って接続することがあります。KMKの左手側では対策されており, 誤って接続した場合にも誤ったキーが押されることはありませんが, KMKの右手側が他のキーボードに接続されてしまった場合の動作は保証されません。

必要なもの

  • ISP1807搭載Microボード

方法

ISP1807 MicroにCircuitPythonを入れる

Switch Scienceのブログをご覧ください

必要なライブラリをダウンロードする

CircuitPythonのライブラリダウンロードページからadafruit-circuitpython-bundle-7.x-mpy-YYYYDDMM.zipをダウンロードし, 中から adafruit_bleを取り出してください。(CircuitPythonのバージョンが上がった場合は8.xなどになるかもしれない)

どうしてmpyかというと記憶領域が足りないからです。

KMK Firmwareをダウンロードする

本家→ https://github.com/KMKfw/kmk_firmware

完全無線を実装したフォーク→ https://github.com/yswallow/kmk_firmware

git cloneなりDownload ZIPなりお好みで

設定Pythonファイルを作る

参考→ Corne用設定ファイル

  • 他のマイコンボード向けの設定のため, ピン名がboard.Pm_nの形式になっています
  • kb_rp2040.pyのほうがピン名称が同じなので参考にしやすいかもしれないです

kb.py

  • col_pins, row_pins を書き換える
    • board.D(0〜21), board.A(0〜6)で事足りると思います。
  • diode_orientation, coord_mappingを書く

main.py

キーマップを書きます。大体のキーボードはリバーシブル基板なのでsplit_flip=True(書かなくて良い)でいいと思います。rgb関連は削除してください。rgbを使う場合はbundleのmpyからneopixel.mpyが必要になります。

split_sideLEFTRIGHTの当てはまるほうを選んでください。

キーマトリックスに使われない組み合わせがある場合はsplit.split_offsetに片手あたりのキー数を代入してください。

レイヤー関連のキーはなんか動かないので通常キーに書き換えてください。

レイヤー関連のキーを定義する前に

layers_ext = Layers()
keyboard.modules.append(layers_ext)

する必要があるようです。

keyboard.go()の上に

    import board
    import digitalio

    led = digitalio.DigitalInOut(board.LED)
    led.direction = digitalio.Direction.OUTPUT
    led.value = False

と書いておくとKMKの起動がLEDの点灯でわかって便利です。

keyboard.goに引数として hid_type=HIDModes.BLE, secondary_hid_type=HIDModes.USBを渡すとKC.HID_SWITCHを押すことでHIDの送信先をBLEとUSBの間で切り替えることができるようになります。

ファイルのコピー

  1. CIRCUITPYドライブのファイルを全て削除します。
  2. CIRCUITPYドライブ直下に以下のファイルを置きます。
    • KMK Firmwareリポジトリからダウンロードしたファイルのうちkmkフォルダ
      • kmk/extensions/rgb.py は容量確保のため削除します。
    • circuitpython bundle から展開した adafruit_ble フォルダ
    • 作成したkb.py, main.py

動きましたか?

動きましたか?

動かないときはUSBシリアルの出力を見てデバッグしてください。

キーマップを書き換える

キーマップを書き換えるだけならUSBで接続されている左手のmain.pyを書き換えるだけです。簡単ですね。

付録

持ってないので想像で書き換えただけですがCorne向けのmain.py, kb.pyを添付します。

from kb import KMKKeyboard
#from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
# Adding extensions
#rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=27, val_limit=100, hue_default=190, sat_default=100, val_default=5)
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
layers_ext = Layers()
keyboard.modules = [layers_ext, split]
#keyboard.extensions = [rgb]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.LT(3, KC.SPC)
keyboard.keymap = [
[ #QWERTY
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #LOWER
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, XXXXXXX, XXXXXXX,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #RAISE
KC.ESC, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.EQL, KC.LCBR, KC.RCBR, KC.PIPE, KC.GRV,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
]
if __name__ == '__main__':
import board
import digitalio
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
led.value = False
keyboard.go(hid_type=HIDModes.BLE, secondary_hid_type=HIDModes.USB)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment