RubyKaigi 2023 ノベルティキーボードをつくってみた

この記事は [【RubyKaigi 2023連動イベント】みんなでRubyの知見を共有しよう - Qiita](https://qiita.com/official-events/4d2a9eed42dbe0a4af21) の参加記事です。

https://qiita.com/official-events/4d2a9eed42dbe0a4af21

## はじめに

先日の[RubyKaigi 2023](https://rubykaigi.org/2023/)でノベルティグッズとして、マイクロパッドキットが配布されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/6d610257-1943-06f7-d4b3-45564d76ac9b.png)
（キースイッチは別で用意したものです）

最近 [ここからはじめる自作キーボード](https://shop.yushakobo.jp/products/a0900kj-00-1?_pos=1&_sid=3e87e2ad7&_ss=r) をやり、またキーボードつくりたいなと思っており、ちょうどRubyKaigiでいただいたのでつくってみました。

## ビルドガイド通りに進める

いただいたPCBにビルドガイドへのリンクが記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/7b5f9f39-203a-84df-475c-daea9e37dda8.png)

https://swanmatch.github.io/keeb_rubykaigi2023/

詳細な組み立て手順はビルドガイドにあるので省略します。

なお、[KeebKaigi 2023](https://keebkaigi.org/2023/)でノベルティキーボード製作者の[魔王さん](https://twitter.com/swan_match)がノベルティキーボードについてお話されていましたので、先に見ておくと組み立てが楽しくなる！かもしれません。
（「ミスしないようにビルドガイドをしっかり読みましょう」って話はここだったのかなと考察できて楽しかった）

https://www.youtube.com/watch?v=Hg66nYmoFhQ&t=2516s

で、組み立ててできたものがこちらです！

https://twitter.com/ohakutsu/status/1658074883019124736?s=20

カラフルに光ってかっこいい！
また、各キーは`bundle exec`や`rails s`などRubyist向けのマクロになっていました！（詳細は[`keymap.rb`](https://github.com/swanmatch/keeb_rubykaigi2023/blob/master/keymap.rb)を参照）

（Twitterで[魔王さん](https://twitter.com/swan_match)からコメントいただきました！嬉しい！）

## キーマップをカスタマイズしてみる

せっかくなので、キーマップをカスタムして、`ruby`と入力できるようにしてみます。

ビルドガイド通りに進めると、このノベルティキーボードのファームウェアは、Rubyでキーマップを書ける「[PRK Firmware](https://github.com/picoruby/prk_firmware)」が使われています！
（RubyKaigi 2023の[`@hasumikin`](https://twitter.com/hasumikin)さんの[セッション](https://rubykaigi.org/2023/presentations/hasumikin.html#day3)でも紹介されていました）

https://github.com/picoruby/prk_firmware

なので、すでにある`keymap.rb`（ビルドガイドでダウンロードしたもの）をもとにカスタムしてみます。

まず、`keymap.rb`を読んでみます。
なお、以下のリポジトリで`keymap.rb`は公開されていました。

https://github.com/swanmatch/keeb_rubykaigi2023/blob/master/keymap.rb

```keymap.rb
require "consumer_key"

kbd = Keyboard.new

kbd.init_direct_pins([
  3,  4,  6, 29,
  2,  1,  7,  0
])

kbd.add_layer :default, %i[
  COPY           RAILS    CONSOLE    PASTE
  BKSP_LEFT      BUNDLE   RAKE       DEL_RIGHT
]

# (snip)
```

`init_direct_pins`と`add_layer`の部分に注目します。

`init_direct_pins`はPRK FirmwareのWikiによると、

https://github.com/picoruby/prk_firmware/wiki/Keyscan-matrix#direct-scan

> **Direct-scan**
> Direct-scan circuit has no diode and one-to-one correspondence between pins and switches.

とのことです。
以下のリポジトリでPCBのデータが公開されていたので、回路図を見てみましょう。

https://github.com/swanmatch/keeb_rubykaigi2023

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/80041a44-ff1e-4412-4075-41117f0561a7.png)

![スクリーンショット 2023-05-15 22.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/fec2b1cb-3fa0-9e51-9e01-4098440c8be5.png)

また、Seeed Studio XIAO RP2040の各ピンは以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/1cfecac7-91c1-63f7-dcf1-dabcf4e7d740.png)

（[Overview | Seeed Studio Wiki](https://wiki.seeedstudio.com/XIAO-RP2040/) より引用）

これらから、各ピンとキースイッチは1対1でつながっており、実際のキーとピンの対応は以下の図のようになることがわかります。

![key.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/008caf29-cc56-6f36-df52-b0e2aca0e4b7.jpeg)

次に、`add_layer`はその名の通り、レイヤーを設定できる様です。

https://github.com/picoruby/prk_firmware/wiki/Basics-of-keymap.rb

https://github.com/picoruby/prk_firmware/wiki/Layers-and-mode-key

修飾キーが押されていない状態でのレイヤーには`default`が使われるため、ここにキーコードを設定すると良さそうだということがわかります。

ということで、「`ruby`と`picoruby`が入力できるキーマップ」を考えてみました！
（複数のレイヤーをやりたいと思ったんですが、人生初のLEDのはんだ付けで力尽きそうなのでお許しください）

![key.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/2e7974ba-2dc9-857d-8001-4b3535ade3e7.jpeg)

そして、書いた`keymap.rb`はこちらです！
（RGBの設定も少し触ってみました）

https://gist.github.com/ohakutsu/72ce0746276dd19650c4f192b2957b00

いざ、入力...！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/a0e80a14-f68e-7855-b31b-a7f5d7eb29a5.png)

できました！ばんざーい :raised_hands:

## さいごに

人生初のLEDのはんだ付けで力尽きそうになりましたが、無事LEDを壊すことなく完成できてよかったです。
また、PRK FirmwareをRubyKaigiで知って使ってみたのですが、すっとRubyで書けるのがとてもよかったです。

RubyKaigi 2023 ノベルティキーボード最高に楽しめました！ありがとうございました！

## 追記

自分用のキーマップをRubyist仕様を残しつつ、つくってみたので載せておきます。

https://gist.github.com/ohakutsu/180c7c6710399f20fe246dc09a183b87