TinyGoで作る自作キーボード体験 - zero-kb02の紹介とTinyGo Keeb

TinyGoを使った自作keyboardを作るイベント TinyGo Keeb Tour 2024 in Sendai with Sendai.go が2024-10-12に仙台で開催され参加した。このイベントで配布されたキーボード[zero-kb02](https://github.com/sago35/keyboards)  について公式サイトなどから情報をピックアップし整理する。これからTinyGo Keebへの参加を検討される方の参考になればと思う。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_1256483_3e994335-2448-1100-5cdb-9ebb8fdccb44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/c02aa689-f020-d491-35c8-4d63e6ddfe69.jpeg)
*写真）イベント当日の仙台は晴天に恵まれた。*

# 概要

このキーボードはRP2040-Zeroを使ったマイコンボードの性格が強い。USBをパソコンに繋いでキーボードとして利用できるが、パソコンに接続しなくても電源を与えればマイコンとして単独で動作する。周辺機器と公式サイトのサンプルを次の表にまとめた。

| 項目 | 詳細 |公式サイトサンプル|
|------|------|---|
| マイコンボード | RP2040-Zero |[03_usbcdc-serial](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/03_usbcdc-serial),[04_usbcdc-echo](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/04_usbcdc-echo)|
| マイコンボード | フルカラーLED |[01_blinky1](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/01_blinky1)|
| キーマトリクス用スイッチ| 4x3　MXメカニカルキー　ソケット式|[12_matrix_basic](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/12_matrix_basic)|
| キーマトリクス用フルカラーLED| 4x3　SK6812MINI-E　|[02_blinky2](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/02_blinky2)|
| ディスプレイ | 0.96インチOLEDディスプレイ SSD1306 I2C接続 128x64 |[07_oled](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/07_oled),[08_oled_tinydraw](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/08_oled_tinydraw),[09_oled_tinyfont](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/09_oled_tinyfont),[10_oled_rotated](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/10_oled_rotated),[11_oled_animation](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/11_oled_animation),[16_oled_inverted_hw](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/16_oled_inverted_hw),[17_oled_japanese_font](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/17_oled_japanese_font)|
| 入力デバイス | アナログジョイステック（SW付き) |[06_joystick](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/06_joystick)|
| 入力デバイス | ロータリエンコーダ(SW付き） |[05_rotary](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/05_rotary),[13_rotary_button](https://github.com/sago35/tinygo_keeb_workshop_2024/tree/main/13_rotary_button)|
| 拡張端子 | 12ピン端子(2.54mmピッチ2x6) |
| 拡張端子 |I2C Grove端子 |

# ハードウェア

zero-kb02の公式サイトに回路図とガーバーがある。

[回路図およびガーバー](https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards%2Ftree%2Fmain%2Fzero-kb02%2Fzero-kb02)　

## マイコンボード RP2040-Zero
zero-kb02にはWaveshare社が開発したRP2040-Zeroを搭載している。RP2040-ZeroはSoC(System On Chip)にRP2040を採用したコンパクトなマイコンボードである。SoCとはCPUを中核としてメモリや通信機能などを1チップに統合したICである。Raspberry Pi Picoと同じSoCを使用しているので、Raspberry Pi Picoと互換性が高い。その一方でピン数を減らし小型化、USB Type-Cを採用した実用的な設計である。
[Waveshareのサイト](https://www.waveshare.com/rp2040-zero.htm)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/5345bd70-10af-c75c-c3f2-d60dada06f18.png)

## I/O割り当て
| pin | I/O | モード       | 位置   | 内容                     |     
| --- | --- | ------------ | ------ | ------------------------ |
| 0 | GP0   | 入力プルアップ | 左上   | Joystick押込SW          | 
| 1 | GP1   | 出力 | キー真下 | SK6812MINI-E　カラーLED   |  
| 2 | GP2   | 入力プルアップ | 右上   | ロータリエンコーダ押込SW |  
| 3| GP3   | 入力プルアップ |   右上     |ロータリエンコーダA   |   
| 4| GP4  | 入力プルアップ|   中央     |ロータリエンコーダB   |     
| 5| GP5  | 出力 |   中央     | キーマトリクスCol1 |    
| 6| GP6  | 出力 |   中央     | キーマトリクスCol2 |    
| 7| GP7  | 出力 |   中央     | キーマトリクスCol3 |    
| 8| GP8  | 出力 |   中央     | キーマトリクスCol4 |    
| 9| GP9  | 入力プルダウン |   中央     | キーマトリクスRow1 |    
| 10| GP10  | 入力プルダウン |   中央     | キーマトリクスRow2 |  
| 11| GP11 | 入力プルダウン |   中央    | キーマトリクスRow3 | 
| 12| GP12 | I2C |   上/背面(I2C Grove端子)| OLED SDA / I2C Grove|
| 13| GP13 | I2C |   上/背面(I2C Grove端子)| OLED SCL / I2C Grove|
| 14| GP14 | 汎用 |   背面(拡張端子)  |EX01 |  
| 15| GP15 | 汎用 |   背面(拡張端子)  |EX02  | 
| - | GP16 | 出力 |  マイコンボード上 |WS2812B　カラーLED  |
| 26| GP26| 汎用 |   背面(拡張端子)   |EX03 | 
| 27| GP27| 汎用 |  背面(拡張端子)    |EX04 | 
| 28|ADC2| アナログ入力|左上|Joystick Y軸| 
|29|ADC3| アナログ入力|左上|Joystick X軸| 


## キーマトリクスとカラーLED

キーマトリクスとはキーボードで一般的に使われている回路である。全てのキースイッチに個別のピンを割り当てるのではなく、キースイッチをRow（行）とCol（列）の格子状に配置して接続する。これによってピン数を大幅に節約している。zero-kb02では12個のキースイッチが使われているが、通常の個別にキースイッチを割り当てると12ピン必要である。しかし、キーマトリクス配置では7ピン（Row 3ピン + Col 4ピン）しか使用しない。よくあるパソコンで使われているテンキー付きキーボードでは100個以上のキースイッチからの入力を20～25ピン程度で実現している。
カラーLEDはSK6812MINI-Eをデイジーチェーン(数珠繋ぎ)したものがキースイッチの下に配置されていて、GP1に接続されている。

キーマトリクスとカラーLEDおよびキースイッチの関係図を作成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/ee431788-15f3-5e86-0c8c-a4681aa86221.png)

その他、zero-kb02ではキーマトリクスをプルダウンで使用していることに注意する。

## その他のデバイス

この記事では詳述しないが、zero-kb02には他にも次のデバイスが実装されている。

- ロータリエンコーダ：回転操作と押し込みスイッチ
- アナログジョイステック：X/Y軸の検出と押し込みスイッチ
- OLED：グラフィカルディスプレイ（128x64)
- （マイコンボード）USB Type-C端子：電源とパソコン接続
- （マイコンボード）フルカラーLED

## 背面端子
拡張機能として外部端子とGrove端子が用意されている。拡張性が高い設計になっている。

それぞれのピンアサインを紹介する。https://github.com/sago35/keyboards より
![pinout01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/7353c93c-2f43-dad7-86ca-3d71d2fe517a.jpeg)



# ソフトウェア

## 開発環境とビルドおよび書き込み方法（Windows)

次の流れで開発環境を整える:

- COMポートの確認
COMポートとはシリアルポートのことである。WindowsではCOM番号で示される。番号は固定されておらず次の方法で確認する。まず、zero-kb02を外しておく。次にWindows11で確認する方法を示す。
1.コントロールパネルからデバイスマネージャーを起動する。
2.zero-kb02を接続する。
3.ポート（COMとLPT）にUSBシリアルデバイス（COM番号）が表示されるので、このCOM番号をメモする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/49a09d06-9167-96eb-c6d3-d553569aab0a.png)
*淡赤部分のCOMをメモする*
- scoopのインストール
scoopはMicrosoft Windows用のコマンドラインで動作するパッケージマネージャーである。
[インストール方法](https://scoop.sh/)

```:コマンドラインからscoopを実行した例
C:\Users\user>scoop
Usage: scoop <command> [<args>]

Available commands are listed below.

Type 'scoop help <command>' to get more help for a specific command.
```
- goのインストール
[インストール方法](https://go.dev/doc/install)
- tinygoのインストール　
[インストール方法](https://tinygo.org/getting-started/install/windows/)
- goplsのインストール 
goplsは"Go please"(ゴープリーズ)と読み公式のGo言語language serverである。VSCodeやVimなどのテキストエデッタはLSP（language server protcol)を使いコード補完などの開発支援を行う。
[インストール方法](https://pkg.go.dev/golang.org/x/tools/gopls#readme-installation)

## ビルドおよび書き込み方法（Windows)
ビルドおよび書き込みをするには、PCとzero-kb02を繋げた状態で次のコマンドを実行する。

シリアルポートはCOMポートの確認でメモしたものを使用する。
* シリアルポート COM3 プログラム main.go の場合
```
tinygo flash -port COM3 -target waveshare-rp2040-zero --size short main.go
```

うまく行けば、自動的にリセットされzero-kb02でコードが実行される。

## サンプルプログラム

zero-kb02の公式サイトには概要にあげたように多数のサンプルが公開されているのですぐに試せる。また、TinyGoを使ったプロジェクトは活発で、GitHubにはさまざまなプロジェクトやライブラリが公開されている。zero-kb02はRP2040-Zeroを採用しているのでRaspberry Pi Picoのプロジェクトも流用できることが多い。zero-kb02以外のプロジェクトも本記事のI/O割り当てを参考にすれば動作するものも多いはずだ。

# イベントを終えて
自作キーボードの組み立てはハンダごてやニッパーなどの工具も必要でハードルが高いが、このイベントでは工具が人数分用意されていた。電子工作に不慣れな参加者もスタッフと一緒に製作できていた。ハードウェア関連の製作イベントはあまりないが、zero-kb02の開発者の@sago35様をはじめとしたスタッフの方々や他の参加者のおかげで有意義なイベント体験ができた。個人的にはGoやTinyGoの組み込み機器への応用の可能性と理念を少し理解できたと思う。ありがとうございました。

2025年も全国各地でTinyGo Keeb Tourの開催が発表された。自作キーボードやTinyGoに興味がある方はもちろんだが、新しい技術トレンドに触れたい方、実践的なものづくりを体験したい方にも参加をおすすめする。技術的なスキルアップはもちろん、ものづくりの楽しさや開発者コミュニティとの出会いなど、きっと素晴らしい経験が得られるはずだ。

イベントの詳細や申し込みについては、[TinyGo Keeb](https://tinygo-keeb.connpass.com/)のページをご覧いただきたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/106b4ed2-409a-c7fe-0acd-abaa72a47b1e.png)
*余興のじゃんけん大会で頂いたgopherを模した基板*

**TinyGo Keebの他の記事**

https://qiita.com/ysaito8015@github/items/148a28ee20f5a48d3cb8
https://zenn.dev/uji/articles/wio-terminal-tinygo