
Nrsk left
0x0c/spltnrskb
KLE レイアウト(kle/left.json、kle/right.json)から生成した、左右分割・有線接続のキーボード基板です。 KiCad 10 のプロジェクト(回路図と配線済み基板)、製造用ガーバー、BOM、QMK ファームウェア設定を含みます。筐体のデータ(アクリルのレーザーカット用 DXF/SVG と 3D プリント用 STL)も入っています。

KLE レイアウト(kle/left.json、kle/right.json)から生成した、左右分割・有線接続のキーボード基板です。 KiCad 10 のプロジェクト(回路図と配線済み基板)、製造用ガーバー、BOM、QMK ファームウェア設定を含みます。筐体のデータ(アクリルのレーザーカット用 DXF/SVG と 3D プリント用 STL)も入っています。
Nrsk right is an open-source printed circuit board by 0x0c, from the 0x0c/spltnrskb repository on GitHub. It is a 2-layer board of 180.5 × 133.5 mm with 135 parts on 106 nets, routed with 1,054 tracks and 999 vias.
It is built around the RP2040, W25Q128JVSIQ and AP2112K-3.3, with the USBLC6-2SC6, 1N4148W and B5819W among its other parts. Its parts include 43 diodes, 42 switches, 18 capacitors, 10 resistors and 4 ICs. It belongs with the RP2040 boards of this library.
KLE レイアウト(kle/left.json、kle/right.json)から生成した、左右分割・有線接続のキーボード基板です。
KiCad 10 のプロジェクト(回路図と配線済み基板)、製造用ガーバー、BOM、QMK ファームウェア設定を含みます。筐体のデータ(アクリルのレーザーカット用 DXF/SVG と 3D プリント用 STL)も入っています。
v2 では Pro Micro などのマイコンボードをやめ、RP2040 と QSPI Flash、USB-C コネクタなどを基板に直接実装しました。 マイコンボード用に設けていた内側の帯(約 20 mm)がなくなり、基板はキー領域とほぼ同じ大きさになっています。
| 項目 | 内容 |
|---|---|
| キー数 | 左 38 + 右 42 = 80 |
| マイコン | RP2040(QFN-56、12 MHz 水晶、I/O 3.3 V)と 16 MB の QSPI Flash W25Q128JV を左右に 1 組ずつ、裏面に直接実装 |
| USB | USB-C(USB 2.0)を左右それぞれに搭載 |
| 左右接続 | USB-C(片側にもう 1 つ、PC 用と同じレセプタクル)と USB-C ケーブル(C-C、データ通信用)。QMK の PIO シリアル(半二重、D+ の 1 本)と 5 V 給電 |
| スイッチ | Cherry MX 互換、Kailh MX ホットスワップソケット(裏面) |
| 基板 | 2 層、左 161.1 × 126.3 mm、右 180.5 × 126.3 mm(キー配列の外周から 3 mm を基本に、上端を 6 mm、内側を左 17.0 mm・右 12.6 mm 広げて OLED、USB-C 2 つ、マイコンの場所を確保)、四隅は半径 4 mm の角丸、M2 取付穴 × 8(片側あたり)、表裏とも GND のベタ(約 5 mm 間隔のビアで表裏をつなぐ) |
| 筐体 | 左 178.1 × 143.3 mm、右 197.5 × 143.3 mm、高さ 15.6 mm(3D プリント版)/ 16.5 mm(アクリル版)、いずれもプレート上面まで |
| 外観 | プレートは透明アクリル 1.5 mm、アクリル版の枠と底板はマットクリア 3 mm。プレートは外周の切り欠きなし。USB-C の 2 つの穴はコネクタの外形ぴったりで、高さも形も同じ(基板の舌で差込口を外面の 0.8 mm 内側まで出している)。3D プリントのトレイは外周の角をフィレット加工(B のプレートも上面の外周に半径 1 mm の R) |
| 表示 | 0.91 インチ OLED(128×32)を左右に 1 枚ずつ、プレートと面一のハーフミラーアクリルのカバー付き。高さは増えない |
| ホイール | 左上と右上の角にサムホイール(ロータリーエンコーダー Alps EC05E1220401 で読み取り、1 回転 12 クリック)。高さは増えない |
| ドラム | 右半分の上段、F12 の右の空きに、手前と奥へ転がすドラム式ダイヤル(ロータリーエンコーダー Alps EC10E1220505 で読み取り、1 回転 24 クリック)。縦スクロールを送る。高さは増えない |
| 3D ビューア | http://www.0x0c.me/spltnrskb/ 、組み立てガイドは http://www.0x0c.me/spltnrskb/assembly.html 、写実的な 3D 表示は http://www.0x0c.me/spltnrskb/views.html 、エンコーダーの検証基板の 3D 表示は http://www.0x0c.me/spltnrskb/enctest-views.html (GitHub Pages、main への Push で自動更新) |
基板の表と裏です(KiCad の 3D 表示)。裏面は裏から見た向きなので、左右が反転して見えます。
| 左 | 右 | |
|---|---|---|
| 表 | ![]() | ![]() |
| 裏 | ![]() | ![]() |
完成イメージ(Blender でレンダリング)です。筐体は 2 つの 3D プリント版を採用しています。左が A(3D プリントのトレイ + 透明アクリルのプレート)、右が B(プレートも 3D プリント)です。A はプレートを上からスリムヘッドの小ねじで、B は底からネジで留めます(B の上面にはネジが見えません)。

A と B は http://www.0x0c.me/spltnrskb/views.html で、3D のまま好きな角度から見られます。ドラッグで回転、ホイールかピンチで拡大します。「自動回転」をオンにすると、ゆっくり回り続けます(触っている間は止まり、手を離して 3 秒ほどで再開します)。形状、材質、照明は Blender のレンダリングと同じです。基板は、KiCad から書き出した実装済みのものです(gen/export_3d.py で build/3d/ に作る)。「パストレース」をオンにすると、手を止めている間、ブラウザでパストレーシング(three-gpu-pathtracer)が進み、写真のような画が得られます。GPU を使い続けるので、最初はオフです。オンのときの自動回転は、選んだサンプル数まで描いてから 30° ずつ回ります。ボケとケーブル、台座(3°、6°、9°)も表示を切り替えられます。手元で開くときは python3 -m http.server -d docs で docs/views.html を配信してください。ページの下には寄りの画像(打鍵する位置から、背面、側面、角、キーキャップ、ホイール、ドラム式ダイヤル、差込口。ケーブルを抜いた全体・背面・差込口も)が並び、クリックすると拡大します。台座に載せた姿も、側面と背面の 2 枚があります。3D 表示のモデル・照明・床の影は gen/export_web3d.sh(4 分ほど)で、寄りの画像は gen/render_details.sh(1 枚 3 分ほど)で作り直せます。
各半分に同じ回路が載っています。Raspberry Pi の RP2040 設計ガイド(Hardware design with RP2040)の最小構成に、保護部品を加えた構成です。
| 機能 | 部品 |
|---|---|
| QSPI Flash | W25Q128JVS(16 MB、SOIC-8 208 mil)、0.1 µF |
| クロック | 12 MHz 水晶(3225)、15 pF × 2、XOUT に 1 kΩ 直列 |
| 電源 | VCC(5 V)→ LDO AP2112K-3.3(入出力 1 µF)→ 3V3。コアの 1.1 V は RP2040 内蔵レギュレータ(VREG_VIN/VREG_VOUT に 1 µF) |
| 電源のパスコン | IOVDD × 6、DVDD × 2、USB_VDD、ADC_AVDD にそれぞれ 0.1 µF、3V3 に 10 µF |
| USB | 27 Ω × 2(D+/D−)、CC 用 5.1 kΩ × 2(USB-C のデバイス認識用)、ESD 保護 USBLC6-2SC6 |
| 左右接続の USB-C | VBUS = VCC(5 V)、D+(A6、B6)= DATA、GND。D− と CC は未接続 |
| 電源経路 | VBUS → ポリスイッチ 500 mA → ショットキーダイオード B5819W → VCC(5 V、左右接続の USB-C で反対側にも給電) |
| リセットと書き込み | RUN を 10 kΩ でプルアップしたリセットスイッチ(裏面)。BOOTSEL は QSPI_SS から 1 kΩ を通したはんだジャンパー |
| 左右判定 | GP0 を 10 kΩ で左は 3V3、右は GND に接続 |
RPI-RP2 ドライブとして見え、UF2 ファイルをコピーすれば書き込めます。一度 QMK を書き込んだあとは、リセットスイッチを素早く 2 回押すと同じ書き込みモードに入ります。ISP 書き込み器は必要ありません。片側のマトリックスは 6 行 × 8 列で、使う GPIO は 14 本です。
RP2040 の GPIO は 30 本あるので、シリアル通信 1 本、左右判定 1 本、I2C 2 本、エンコーダー 2 本を足しても十分に足ります。
列 7 を使うのは右の \ キーだけで、左の列 7 は未接続です。QMK の分割キーボードは左右で同じ列数を前提とするため、左右とも 6 × 8 のマトリックスにそろえています。
| 用途 | GPIO |
|---|---|
| ROW0〜ROW5 | GP4〜GP9 |
| COL0〜COL7 | GP10〜GP14、GP16〜GP18(GP15 は QFN の角で配線しにくいため使わない) |
| I2C1(OLED) | SDA = GP2、SCL = GP3 |
| サムホイールのエンコーダー | A 相 = GP19、B 相 = GP20(共通端子は GND) |
| ドラム式ダイヤルのエンコーダー(右だけ) | A 相 = GP22、B 相 = GP23(共通端子は GND) |
| 左右間データ | GP1、左右接続の USB-C の D+ |
| 左右判定 | GP0 |
| 予備 | GP15、GP21、GP24〜GP29(左は GP22、GP23 も) |
左右接続の USB-C は、VBUS に VCC(5 V)、D+ に DATA、GND をつなぎ、D− と CC は未接続です。D+ は表裏の 2 つのピン(A6、B6)をどちらも DATA につないでいるので、ケーブルはどちら向きに挿しても動きます。
fab/<side>/nrsk-<side>-assembly-back.pdf(裏面の実装図、左右反転済み)を使ってください。配線の確認には fab/<side>/nrsk-<side>-copper.pdf を使えます(1 ページ目が表面 F.Cu、2 ページ目が裏面 B.Cu で、どちらも外形付き)。左半分の左上、右半分の右上の角に、親指でなぞって回すサムホイールを付けています。

| 左ホイール | 右ホイール | |
|---|---|---|
| 回す(レイヤー 0) | 音量 | ページ上下 |
| 回す(レイヤー 1) | 画面の明るさ | カーソル左右 |
割り当ては keymap.c の encoder_update_user() で変更できます。
検討段階の記録として、側面ダイヤルの 2 タイプ(サムホイール型と横向きノブ型)を比べたレンダリングは docs/img/dial-study/dial-grid.jpg にあります。サムホイール型を採用し、角に置きました。
読み取りの方式は、当初の磁気角度センサー AS5600 と磁石、ボールプランジャーの組み合わせから、市販のロータリーエンコーダーに変えました。理由と検討した代替案は docs/specs/thumbwheel-encoder.md に、両者の断面の比較は docs/img/encoder-study/sheet.jpg にあります。
右半分の上段で、F12 の右に空いている 2 u の場所に、手前と奥へ転がすドラム式のダイヤルを付けています。奥へ転がすと上へ、手前へ転がすと下へスクロールします(レイヤー 1 では左右へスクロール)。

case/print/right-drum.stl)。case/print/right-drum-bezel.stl)の枠を、プレートの穴に収めます。枠の上面はプレートと面一で、段差はありません。プレートを載せる前にベゼルを基板の上に置き、上からプレートをかぶせます。枠の下のつばがプレートの下面に当たってベゼルが抜けるのを止め、軸受けブロックの上面とエンコーダー側の脚が下から支えます。ベゼルのフードがエンコーダーを覆い、もう一方のフードの天井が軸受けブロックを押さえます。A、B、アクリル版で同じ部品を使います。resolution)を 2 にしています。マウスのホイールのキーコードを送るため、QMK のマウスキー機能を有効にしています。実機で向きが逆なら、gen/make_qmk.py の pin_a と pin_b を入れ替えます。設計の経緯と、検討した代替案は docs/specs/drum-dial.md にあります。
左右に 0.91 インチの OLED モジュール(128×32、SSD1306、I2C)を 1 枚ずつ付けています。
case/laser/<side>-oled-cover)を、プレートの切り欠きにはめ込みます。カバーの周りに残るプレートの帯は、筐体の外周(上辺と内側の辺)までも、横のキーキャップまでも 5.5 mm です。カバーの 4 つの角はすべて R7 です。筐体の角に面する角は筐体の角(R12.5)と同心なので、帯の幅は角でも変わりません。帯の近くの外周のネジは省いています。カバーの下端は OLED モジュールの端から 1.5 mm 下で、OLED の表示(ガラス)がカバーの中央に来るように置いています。そのため、右のカバーの下の Y キーとの帯だけは 2.7 mm です。ハーフミラーのアクリルは 2 mm 厚からしか市販されていません。そこで 3D プリント版は壁の上面をカバーの下だけ 0.5 mm 下げて、上面をプレートと面一にしています(アクリル版は 0.5 mm 高くなります)。カバーは OLED のガラス面と壁の上面に透明両面テープで貼り、ネジは使いません。消灯中は鏡のように見え、点灯すると表示が透けて見えます。カバーの周りに余白を取るため、基板の上端を 5 mm 延ばし(ホイールのためにさらに 1 mm 延ばして計 6 mm)、内側を広げています。oled_task_user で、USB をつないだ側にレイヤーと Caps Lock、もう一方に WPM を表示します。処理は firmware/qmk/keyboards/nrsk/keymaps/default/keymap.c にあります。検討段階の記録です(採用したのは、上に書いたプレートと面一のハーフミラーのカバーです)。画像は今の基板・筐体の形で描き直しています。台座の位置は外形から計算し、壁の上に収まるように置いています。
キーキャップに隠れにくい OLED の付け方を、高さ 0〜13 mm の 4 案(A〜D)と傾斜 2 案(E・F)で比べました。
座った目線と寄りのレンダリングを、取り付け方式ごとに docs/img/render-grid.jpg にまとめています。
台座の形状は gen/oled_variants.py、レンダリングは gen/render_all.sh で作り直せます。デフォルトは確認用のプレビュー(長辺 1200 px、数分)で、FINAL=1 ./gen/render_all.sh とすると高画質(長辺 2400 px)で出力します。
B〜F は OLED を基板の外側(壁の上)へ移すため、基板のコネクタから配線でつなぐ前提です。
3D プリントとアクリルのレーザーカットのどちらでも作れるよう、同じ寸法のサンドイッチ構造にしています。3D プリントのトレイを使う版は 2 種類あり、どちらも正式な仕様です。
case/laser/<side>-plate)。プレート越しに基板が見えます。case/print/<side>-plate.stl)。スイッチの爪が掛かる周りだけ 1.5 mm で、ほかは裏に 2 mm の補強があり、上下を逆にして印刷します。中は見えません。トレイは A と B で共通です。壁の中を縦にネジ穴が通り、上面には丸いくぼみ、その下に六角のナット受けがあります。A は透明アクリルのプレートを、ナット受けに入れた M2 ナットへスリムヘッド小ねじ M2 × 6 mm(頭 φ4 × 0.5 mm)で上から留めます。B は、プレート裏のボスに入れたヒートセットインサートへ、トレイの底の座ぐりから M2 × 12 mm のなべネジで留めるので、上面にネジは見えません。アクリル版は上から M2 × 20 mm で底板の下のナットまで共締めします。 基板は 8 か所の取り付け穴で筐体の底に固定し、スイッチプレートは外周のネジで留めます。 寸法の基準は MX の規格(プレート上面から基板上面まで 5.0 mm)です。

| 部分 | A / B(3D プリントのトレイ、case/print/) | アクリル版(case/laser/) |
|---|---|---|
| 底 | トレイの床 2 mm、外周の下端 R2・上端 R0.6 のフィレット | 底板 3 mm(<side>-bottom) |
| 壁 | トレイと一体、幅 8 mm、高さ 14.1 mm。ホイールの上は外せる角キャップ(<side>-wheel-cap.stl) | 枠 3 mm × 4 枚(差込口のある枠には切り欠き、frame4 は切り欠きなし) |
| 基板の支持 | 床から高さ 7 mm のボス(φ4.6、下穴 φ1.6)に M2 × 6 mm タッピングネジ | M2 × 7 mm スペーサーに、上から M2 × 4 mm、下から M2 × 5 mm のネジ |
| プレート | A:透明アクリル 1.5 mm、上からスリムヘッド M2 × 6 mm でナット受けのナットへ/B:3D プリント(補強付き、裏のボスに M2 インサート)、底の座ぐりから M2 × 12 mm | 透明アクリル 1.5 mm、上から M2 × 20 mm とナットで底板まで共締め |
| ネジ本数 | 外周 左 10・右 11、基板 左右 8 ずつ | 同じ |
設計上の注意点です。


case/preview/viewer.html は組み立て状態を回して見られる 3D ビューアです。http://www.0x0c.me/spltnrskb/ で公開しています(.github/workflows/pages.yml)。
基板は KiCad の 3D プレビューと同じ部品実装済みの姿で表示します(gen/export_3d.py で KiCad から書き出し、gen/glb_mesh.py でブラウザ向けに軽量化)。
「分解表示」をオンにすると、スライダーでレイヤーどうしの間隔を 0〜40 mm で変えられます。
「台座」で角度(なし、3°、6°、9°)を選ぶと、台座に載せて傾けた姿になります。ケース、プレート、基板、スイッチ、ダイヤル、ゴム足、台座は、チェックボックスでそれぞれ表示と非表示を切り替えられます。
組み立て手順は、同じデータを使ったインタラクティブな組み立てガイド(case/preview/assembly.html、公開版は http://www.0x0c.me/spltnrskb/assembly.html)で確認できます。手順ごとに部品が所定の位置に入るアニメーションと説明が出て、A・B・アクリル版と左右を切り替えられます。
case/print/ の STL は、部品ごとに三面図(第三角法:平面図・正面図・右側面図)を case/drawings/<部品名>.pdf に用意しています。A3 横の用紙に、収まる最大の標準尺度(10:1〜1:2)で描き、全体の寸法(幅・奥行き・高さ)と表題欄を入れています。見える稜線と輪郭は実線、隠れる部分は破線(かくれ線)です。部品は STL の向きのまま描くので、台座は印刷するときの姿勢、B のプレートは上面が上です。
線は拡大しても粗くならないベクトルです。日本語の文字には PDF 標準の日本語フォント(平成角ゴシック)を指定し、埋め込んでいません。表示するときは閲覧ソフトの日本語ゴシック体で置き換わります(macOS のプレビュー、Acrobat、Chrome、Firefox で表示できます)。
STL を書き出すスクリプト(make_case.py、foot_coupon.py、pin_coupon.py、make_enctest.py)は、print/ に STL を書くたびに、同じ階層の drawings/ の三面図を作り直します(検証基板の筐体は enctest/case/drawings/)。各 PDF には、元の STL、gen/case_drawings.py、オプションのハッシュを記録しています。どれも変わっていなければ描き直しを省くので、STL の中身が同じなら時間はかかりません。描くのは gen/case_drawings.py です(numpy だけで動きます)。メッシュの稜線(面どうしが 35° より大きく折れる辺)と輪郭を拾い、深度バッファで見える部分と隠れる部分に分けます。フィレットは薄い段を積み重ねた形なので、段の辺は描かず、フィレットの両端の線だけを残します。STL を指定すると、その部品だけを描きます(python3 gen/case_drawings.py case/print/left-tray.stl、かくれ線なしは --no-hidden、変更がなくても描き直すときは --force)。
3D プリント版のトレイの底には、ゴム足(3M CS-02、直径 9.5 mm)を貼る位置を決めるくぼみ(直径 10 mm、深さ 1 mm)が 5 か所あります。くぼみはプレートのネジの座ぐりを避けているので、プレートを外すときにゴム足を剥がす必要はありません。サムホイールのある角だけは、ホイールを挟んで 2 個です。この配置で、すべてのキーがゴム足で囲まれた範囲の内側に入ります。
奥を持ち上げたいときは、3D プリントの台座(case/print/<side>-stand-3.stl、-6、-9)に載せます。台座は奥の辺と両側の辺に沿った U 字で、上面のくぼみに奥の 3 つのゴム足が収まり、手前の 2 つのゴム足は机に載ります。ネジは使わず、角度を変えるときは台座を取り替えます。9° の台座の高さは 22.9 mm です。

傾け方は、トレイに付ける脚 3 案(磁石式、折りたたみ式、ねじ込み式)と台座 2 案(全周、奥の U 字)をモデルにして比べ、U 字の台座に決めました。比較の画像は docs/img/tilt-study/sheet.jpg、表は docs/img/tilt-study/table.md、経緯は docs/specs/case-feet-tilt.md にあります。くぼみのはめあいは印刷機によって変わるので、トレイの前に case/print/foot-coupon.stl を印刷して確かめてください(手順は docs/ordering.md の 7 章)。
左右合計の部品表を bom/nrsk-bom.csv(Excel で開ける UTF-8)と bom/nrsk-bom.md にまとめました。
基板の電子部品、キースイッチとキーキャップ、筐体のネジ類と材料、ケーブルまで含みます。
数量は回路図と筐体のデータから自動で数えているので、レイアウトを変えても ./build.sh で更新されます。
片側ごとの KiCad の部品表は fab/<side>/nrsk-<side>-bom.csv にあります。
各行には、実際に買える部品のメーカー型番・購入先・参考単価・商品ページの URL を付けています。商品ページはすべて開いて型番と仕様を確認しました(LCSC の品は 2026-10-10、ほかは 2026-10-04 時点)。 LCSC で買えるものは、すべて LCSC を最初の購入先にしています。
購入先は gen/bom_sources.json にまとめてあり、価格や在庫は変わるので発注前に確認してください。
注文先ごとの手順と数量(筐体の版ごとのネジやアクリルを含む)は docs/ordering.md にまとめています。注文の前に確かめることは docs/pre-order-checklist.md にあります。
次の部品は、発注前に特に確認してください。
case/print/pin-coupon.stl を印刷して確かめてください(手順は docs/thumbwheel-check.md)。ピンの対辺は gen/make_case.py の PIN_AF で変えられます。主な部品(左右合計)は次のとおりです。
| 部品 | 数量 |
|---|---|
| マイコン RP2040(QFN-56) | 2 |
| QSPI Flash W25Q128JVSIQ(16 MB) | 2 |
| 水晶振動子 12 MHz Abracon ABM8-272-T3 | 2 |
| LDO AP2112K-3.3 | 2 |
| USB-C レセプタクル HRO TYPE-C-31-M-12 | 4 |
| USB ESD 保護 USBLC6-2SC6 | 2 |
| OLED モジュール 0.91 インチ(128×32) | 2 |
| ロータリーエンコーダー Alps EC05E1220401(サムホイール用) | 2 |
| ロータリーエンコーダー Alps EC10E1220505(ドラム式ダイヤル用、右だけ) | 1 |
| ダイオード 1N4148W | 80 |
| MX 互換スイッチ/Kailh ホットスワップソケット | 各 80 |
| 2 u スタビライザー | 3 |
| 0805 の抵抗とコンデンサ | 抵抗 20、コンデンサ 36 |
| M2 ネジ類 | 外周 21 本、基板固定 16 か所 |
基板の電子部品は、すべて裏面に載っています。JLCPCB の部品実装サービスに、左右を別々の注文として出します。実装用のファイルは gen/make_jlc.py が作ります。
fab/<side>/nrsk-<side>-jlc-bom.csv:JLCPCB の形式の部品表(Comment、Designator、Footprint、LCSC Part #)fab/<side>/nrsk-<side>-jlc-cpl.csv:部品の位置と回転(Designator、Mid X、Mid Y、Layer、Rotation)実装を頼むのは 20 種類(左 77 個、右 81 個)です。OLED、ドラム式ダイヤルのエンコーダー、ホットスワップソケット、キースイッチは手で付けます。OLED はガラスの高さを合わせて半田付けする必要があり、ドラム式ダイヤルのエンコーダーは表面の挿入部品で、ソケットは表面のフットプリントに属しているので、実装ファイルから外しています。
注文の手順は次のとおりです。
fab/<side>/nrsk-<side>-gerber.zip をアップロードします(2 層、厚さ 1.6 mm)。nrsk-<side>-jlc-bom.csv、配置に nrsk-<side>-jlc-cpl.csv を渡します。JLCPCB は、部品ごとに自社の部品ライブラリ(EasyEDA)のフットプリントで配置します。KiCad のフットプリントと回転や原点が違う部品は、make_jlc.py で補正しています。補正の値は、EasyEDA のフットプリントを基板のパッドに重ね合わせて求めました。CPL どおりに置いた EasyEDA のフットプリントでは、どの部品もすべてのパッドが同じ名前の基板のパッドに載ります(中心のずれは最大 0.46 mm で、水晶の手半田用のパッドが長いため)。USB-C だけは、実績を集めた補正表(JLCKicadTools)が 180° の補正を指定しています。しかし今の EasyEDA のフットプリントは KiCad と同じ向きなので、補正を入れていません。プレビューで差込口が基板の内側を向いていたら、make_jlc.py の JLC_FIX で USB-C の回転を 180 にしてください。
JLCPCB の部品の在庫は 2026-10-10 に確かめました(JLCPCB の部品一覧を写した非公式の検索サービス jlcsearch による)。拡張部品(Extended)は 9 種類で、種類ごとに追加料金がかかります。エンコーダー EC05E1220401 は在庫が 41 個と少ないので、注文前に確認してください。USB の 27 Ω 抵抗は、在庫が 5 個しかなかった YAGEO の品から、推奨部品の UNI-ROYAL 0805W8F270JT5E(C17594)に替えています。
入力は kle/ のキー配列だけで、ほかのデータはすべて gen/ のスクリプトで生成します。
<side> は left または right です。
spltnrskb/
├── kle/ 入力:キー配列(Keyboard Layout Editor の JSON、左右 1 つずつ)
│ ├── left.json
│ └── right.json
├── left/, right/ KiCad プロジェクト(左右で同じ構成)
│ ├── nrsk-<side>.kicad_pro プロジェクト設定(基板ルールとネットクラス)
│ ├── nrsk-<side>.kicad_sch 回路図
│ ├── nrsk-<side>.kicad_pcb 配線済みの基板
│ ├── erc.rpt, drc.rpt ERC(回路図の検査)と DRC(基板の検査)の結果
│ ├── case_data.json 筐体の生成に渡す基板の寸法(外形、取付穴、コネクタの位置)
│ └── fp-lib-table, sym-lib-table ライブラリの参照設定
├── lib/ 左右共通の自作ライブラリ
│ ├── nrsk.kicad_sym 回路図シンボル
│ ├── nrsk.pretty/ フットプリント(MX ホットスワップ 1u〜2.25u、OLED、エンコーダー、ドラムの軸受け)
│ └── nrsk.3dshapes/ OLED モジュールとドラム式ダイヤルのエンコーダーの 3D モデル
├── fab/<side>/ 基板の発注用データ
│ ├── nrsk-<side>-gerber.zip ガーバーとドリル
│ ├── nrsk-<side>-bom.csv 片側の部品表
│ ├── nrsk-<side>-jlc-bom.csv JLCPCB の部品実装用の部品表
│ ├── nrsk-<side>-jlc-cpl.csv JLCPCB の部品実装用の配置(位置と回転)
│ ├── nrsk-<side>-schematic.pdf 回路図
│ ├── nrsk-<side>-copper.pdf 配線図(1 ページ目が表、2 ページ目が裏)
│ └── nrsk-<side>-assembly-back.pdf 裏面の実装図
├── case/ 筐体gen/ のスクリプトは、build.sh が次の順に呼び出します。
| 段階 | スクリプト | 生成するもの |
|---|---|---|
| 部品ライブラリ | fetch_3d.sh、models3d.py、footprints.py | 3D モデルの取得、OLED の 3D モデル、lib/nrsk.pretty |
| 回路図 | layout.py、make_sch.py、make_pro.py | KLE の解析とピン割り当て、回路図、プロジェクト設定 |
| 基板 | make_pcb.py、route.py、sexpr.py | 部品の配置、Freerouting による自動配線、KiCad ファイルの読み書き |
| 3D 出力 | export_3d.py、glb_mesh.py | ビューア用の基板メッシュ(build/3d/、Git の管理対象外) |
| ファームウェア | make_qmk.py | firmware/qmk/keyboards/nrsk/ |
| 筐体 | make_case.py、case_preview.py、case_section.py、case_viewer.py、assembly_guide.py、case_drawings.py(make_case.py から呼ばれる) | case/ 以下のすべて |
| 部品表 | make_bom.py、bom_sources.json | bom/(購入先の情報は bom_sources.json に手で記入) |
| JLCPCB の実装データ | make_jlc.py | fab/<side>/nrsk-<side>-jlc-bom.csv、fab/<side>/nrsk-<side>-jlc-cpl.csv |
| README の画像 | doc_images.sh | docs/img/left-*.png、docs/img/right-*.png、断面図 |
次のスクリプトは build.sh に含まれず、必要なときに手で実行します。
render_blender.py、render_all.sh、render_grid.pyexport_web3d.sh、render_details.sh、views_page.pyrender_compare.sh、compare_ab.py、port_slide.pyoled_variants.py、oled_study.sh、oled_sheet.py、port_variants.pypin_coupon.py(case/print/pin-coupon.stl。使い方は docs/thumbwheel-check.md)foot_coupon.py(case/print/foot-coupon.stl。使い方は docs/ordering.md の 7 章)tilt_variants.py、tilt_stands.py、render_tilt.py、tilt_sheet.py、tilt_study.sh。台座そのものは make_case.py が作りますbuild_enctest.sh、make_enctest.py、render_enctest.py(使い方は docs/encoder-test-board.md)KLE を編集した場合は ./build.sh を実行すると、回路図、基板、配線、ERC/DRC、製造データ、筐体、BOM、QMK 定義をすべて作り直します。
行の配線とダイオード周りはスクリプトで規則的に引き、残りを Freerouting(tools/freerouting-2.4.1.jar)に任せています。
Freerouting の結果には乱数によるばらつきがあるため、未配線と DRC の違反がどちらも 0 になるまで最大 25 回やり直します。
配線のあと、表裏に GND のベタを敷き、約 5 mm 間隔のビアで表裏をつなぎます(route.py の pour())。配線で囲まれた細い部分にもビアを足し、それでもつながらない銅は取り除きます。SMD のパッドはベタにそのままつなぎ、手で半田付けするスルーホールのパッドだけ、熱が逃げにくいよう細い線でつなぎます。
./build.sh で全データを作り直すには、次のツールが必要です(macOS で確認)。
~/Applications/KiCad または /Applications/KiCad)brew install openjdkmkdir -p tools && curl -L -o tools/freerouting-2.4.1.jar https://github.com/freerouting/freerouting/releases/download/v2.4.1/freerouting-2.4.1.jarpython3 -m venv .venv && .venv/bin/pip install manifold3d numpy matplotlibKiCad の標準ライブラリにない 3D モデルは、./build.sh の冒頭で gen/fetch_3d.sh が tools/ へ取ってきます(Git の管理対象外です)。
gen/models3d.py で作る簡易モデル(lib/nrsk.3dshapes/)tools/alps/)これがあれば KiCad の 3D ビューアでも、すべての部品が実装された状態で表示されます。
blender -b -P gen/render_blender.py -- --samples 192 --res 1800ファームウェアは QMK で作ります。キーボード定義は firmware/qmk/keyboards/nrsk にあります。
左右とも同じファームウェアを書き込みます。左右の判定は基板の配線(GP0)で決まるので、左用・右用を分ける必要はありません。
brew install qmk/qmk/qmkqmk setupqmk setup は ~/qmk_firmware に QMK を取得し、ビルドに使う ARM のコンパイラなどもまとめて入れます。
Windows では QMK MSYS を使ってください。
Homebrew の arm-none-eabi-gcc は標準 C ライブラリ(newlib)を含まないためビルドできません。その場合は Arm 公式の Arm GNU Toolchain(arm-none-eabi)を ~/.local/opt に展開します(sudo は不要です)。
mkdir -p ~/.local/opt && curl -L https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-darwin-arm64-arm-none-eabi.tar.xz | tar -xJ -C ~/.local/opt次の手順のスクリプトは、コンパイラを自動で探して使います。探す場所は ~/.local/opt/arm-gnu-toolchain-*-arm-none-eabi と /Applications/ArmGNUToolchain です。別の場所に置いた場合は、環境変数 ARM_TOOLCHAIN にそのディレクトリを指定してください。
firmware/qmk/compile.shキーボード定義を ~/qmk_firmware/keyboards/nrsk に同期してから qmk compile -kb nrsk -km default を実行します。ビルドが通ると firmware/qmk/build/nrsk_default.uf2 ができます(~/qmk_firmware/nrsk_default.uf2 にも残ります)。別のキーマップは firmware/qmk/compile.sh mine のように名前を渡します。
RP2040 は ROM に USB ブートローダーを持っています。専用の書き込み器やドライバは要りません。
左右接続のケーブルを外し、書き込む側の半分だけを、PC 用の口(外側の USB-C)で PC につなぎます。
その半分を書き込みモードにします。PCに RPI-RP2 という USB ドライブが現れれば成功です。
nrsk_default.uf2 を RPI-RP2 ドライブにコピーします。コピーが終わると自動で再起動し、キーボードとして認識されます。コマンドで書き込む場合は次のとおりです(書き込みモードになるのを待ってから書き込みます)。
qmk flash -kb nrsk -km defaultもう片方も同じ手順で書き込みます。
最後に左右の内側の USB-C どうしを C-C ケーブルでつなぎ、どちらか片方の外側の USB-C を PC につなぎます。USB をつないだ側がマスタになり、その側の OLED にレイヤーと Caps Lock、もう一方に WPM が表示されます。
RPI-RP2 ドライブが出ない場合は、USB ケーブルが充電専用でないか確認し、BOOTSEL パッドを短絡したまま挿し直してください。それでも出ない場合は、水晶、Flash、3.3 V LDO の半田付けを確認してください。デフォルトのキーマップは KLE の刻印どおりで、fn を押している間はレイヤー 1 になります(矢印キーが Home/End/PgUp/PgDn、Backspace が Delete)。
キーマップを変えるには、firmware/qmk/keyboards/nrsk/keymaps/default/keymap.c を編集します。自分用のフォルダ(例: keymaps/mine/)を作り、firmware/qmk/compile.sh mine でビルドしてもかまいません。
lib/nrsk.pretty の USB-C のフットプリント)。firmware/qmk/compile.sh(qmk compile -kb nrsk -km default)が警告なしで通ることを確認しています。使ったのは、現行の qmk_firmware(2026-10 時点)と Arm GNU Toolchain 15.2.rel1 です。確認は 2026-10-12 に、ドラム式ダイヤルを足した後の設定で行いました。出力は nrsk_default.uf2(約 87 KB)です。実機での動作(キー入力、左右通信、OLED、ホイール)はまだ確認していません。| Qty | Value | Footprint | References |
|---|---|---|---|
| 42 | 1N4148W | Diode_SMD:D_SOD-123 | D1, D2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23 +26 |
| 11 | 0.1uF | Capacitor_SMD:C_0805_2012Metric | C5, C6, C7, C8, C11, C12, C13, C14, C15, C18, C20 |
| 8 | M2 | MountingHole:MountingHole_2.2mm_M2 | H1, H2, H3, H4, H5, H6, H7, H8 |
| 4 | 1uF | Capacitor_SMD:C_0805_2012Metric | C3, C4, C16, C17 |
| 2 | 10k | Resistor_SMD:R_0805_2012Metric | R1, R6 |
| 2 | 15pF | Capacitor_SMD:C_0805_2012Metric | C1, C2 |
| 2 | 1k | Resistor_SMD:R_0805_2012Metric | R7, R10 |
| 2 | 27 | Resistor_SMD:R_0805_2012Metric | R2, R3 |
| 2 | 4.7k | Resistor_SMD:R_0805_2012Metric | R8, R9 |
| 2 | 5.1k | Resistor_SMD:R_0805_2012Metric | R4, R5 |
| 2 | Space | nrsk:SW_MX_Hotswap_1.00u | SW36, SW37 |
| 2 | USB-C | nrsk:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J1, J2 |
| 1 | ' | nrsk:SW_MX_Hotswap_1.00u | SW27 |
| 1 | , | nrsk:SW_MX_Hotswap_1.00u | SW31 |
| 1 | - | nrsk:SW_MX_Hotswap_1.00u | SW11 |
| 1 | . | nrsk:SW_MX_Hotswap_1.00u | SW32 |
| 1 | / | nrsk:SW_MX_Hotswap_1.00u | SW33 |
| 1 | 0 | nrsk:SW_MX_Hotswap_1.00u | SW10 |
| 1 | 10uF | Capacitor_SMD:C_0805_2012Metric | C19 |
| 1 | 12MHz | Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm_HandSoldering | Y1 |
| 1 | 500mA | Fuse:Fuse_1206_3216Metric | F1 |
| 1 | 7 | nrsk:SW_MX_Hotswap_1.00u | SW7 |
| 1 | 8 | nrsk:SW_MX_Hotswap_1.00u | SW8 |
| 1 | 9 | nrsk:SW_MX_Hotswap_1.00u | SW9 |
| 1 | ; | nrsk:SW_MX_Hotswap_1.00u | SW26 |
| 1 | = | nrsk:SW_MX_Hotswap_1.00u | SW12 |
| 1 | AP2112K-3.3 | Package_TO_SOT_SMD:SOT-23-5 | U4 |
| 1 | B5819W | Diode_SMD:D_SOD-123 | D99 |
| 1 | BOOTSEL | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP1 |
| 1 | Backspace | nrsk:SW_MX_Hotswap_2.00u | SW13 |
| 1 | Cmd | nrsk:SW_MX_Hotswap_1.25u | SW38 |
| 1 | Drum_Dial_Bearing | nrsk:Drum_Dial_Bearing | DRUM1 |
| 1 | EC05E1220401 | nrsk:Alps_EC05E1220401 | ENC1 |
| 1 | EC10E1220505 | nrsk:Alps_EC10E | ENC2 |
| 1 | Enter | nrsk:SW_MX_Hotswap_2.25u | SW28 |
| 1 | F10 | nrsk:SW_MX_Hotswap_1.00u | SW4 |
| 1 | F11 | nrsk:SW_MX_Hotswap_1.00u | SW5 |
| 1 | F12 | nrsk:SW_MX_Hotswap_1.00u | SW6 |
| 1 | F7 | nrsk:SW_MX_Hotswap_1.00u | SW1 |
| 1 | F8 | nrsk:SW_MX_Hotswap_1.00u | SW2 |
| 1 | F9 | nrsk:SW_MX_Hotswap_1.00u | SW3 |
| 1 | H | nrsk:SW_MX_Hotswap_1.00u | SW22 |
| 1 | I | nrsk:SW_MX_Hotswap_1.00u | SW16 |
| 1 | J | nrsk:SW_MX_Hotswap_1.00u | SW23 |
| 1 | K | nrsk:SW_MX_Hotswap_1.00u | SW24 |
| 1 | L | nrsk:SW_MX_Hotswap_1.00u | SW25 |
| 1 | M | nrsk:SW_MX_Hotswap_1.00u | SW30 |
| 1 | N | nrsk:SW_MX_Hotswap_1.00u | SW29 |
| 1 | O | nrsk:SW_MX_Hotswap_1.00u | SW17 |
| 1 | OLED 128x32 | nrsk:OLED_0.91in_128x32_I2C | J3 |
| 1 | Opt | nrsk:SW_MX_Hotswap_1.25u | SW39 |
| 1 | P | nrsk:SW_MX_Hotswap_1.00u | SW18 |
| 1 | RP2040 | Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm | U1 |
| 1 | Reset | Button_Switch_SMD:SW_SPST_PTS810 | RSW1 |
| 1 | U | nrsk:SW_MX_Hotswap_1.00u | SW15 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U2 |
| 1 | W25Q128JVS | Package_SO:SOIC-8_5.3x5.3mm_P1.27mm | U5 |
| 1 | Y | nrsk:SW_MX_Hotswap_1.00u | SW14 |
| 1 | [ | nrsk:SW_MX_Hotswap_1.00u | SW19 |
| 1 | \ | nrsk:SW_MX_Hotswap_1.50u | SW21 |
| 1 | ] | nrsk:SW_MX_Hotswap_1.00u | SW20 |
| 1 | fn | nrsk:SW_MX_Hotswap_1.00u | SW35 |
| 1 | ← | nrsk:SW_MX_Hotswap_1.00u | SW40 |
| 1 | ↑ | nrsk:SW_MX_Hotswap_1.00u | SW34 |
| 1 | → | nrsk:SW_MX_Hotswap_1.00u | SW42 |
| 1 | ↓ | nrsk:SW_MX_Hotswap_1.00u | SW41 |

0x0c/spltnrskb
KLE レイアウト(kle/left.json、kle/right.json)から生成した、左右分割・有線接続のキーボード基板です。 KiCad 10 のプロジェクト(回路図と配線済み基板)、製造用ガーバー、BOM、QMK ファームウェア設定を含みます。筐体のデータ(アクリルのレーザーカット用 DXF/SVG と 3D プリント用 STL)も入っています。

0x0c/spltnrskb
KLE レイアウト(kle/left.json、kle/right.json)から生成した、左右分割・有線接続のキーボード基板です。 KiCad 10 のプロジェクト(回路図と配線済み基板)、製造用ガーバー、BOM、QMK ファームウェア設定を含みます。筐体のデータ(アクリルのレーザーカット用 DXF/SVG と 3D プリント用 STL)も入っています。

HaydenGillen/SportsWatch
This GPS watch project began from my interest in building a custom fitness device that records accurate run and cycle data and allows users to create and implement their own features.


mburger89/SMK_macro_pad
4x4 wireless macro pad — RP2040 + Raspberry Pi RM2. KiCad project generated from Python; includes a 42%-smaller 'mini' variant with back-mounted electronics.

liorknafo/power-feed-manual-mill
DIY stepper power feed for a SIEG X3.5D mill: electromagnetic clutch, RP2040 controller PCB, Rust firmware, build123d CAD

Vishalbabu-09/Auralab_Workstation
Advanced 4-layer PCB design featuring split-plane noise isolation (AGND/DGND) and asynchronous dual-core processing. Implements a handheld multi-tool oscilloscope, current tracker, and symmetrical DC power supply.

jadenrhee/wigglecam-controller
RP2040 co-processor board for a 4-lens wigglegram camera: constant-current flash, controls, battery telemetry, Pi 5 I2C interface. 4-layer, DRC-clean, fab-ready.


alphaseneca/cryptick-token-pcb
Hardware schematics, 2-layer PCB layout, and manufacturing files for Cryptick Token — the 100% open-source biometric hardware security key and cryptographic hardware enclave.
It measures 180.5 × 133.5 mm and has 2 copper layers, 1.6 mm thick.
135 parts, built around the RP2040, W25Q128JVSIQ, AP2112K-3.3 and USBLC6-2SC6. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the 0x0c/spltnrskb repository on GitHub, at the commit this page was made from: the board is right/nrsk-right.kicad_pcb and its schematic enctest/nrsk-enctest.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask 0x0c before reusing the design.