e3w2q.github.io

Raspberry Pi Pico、Pro Micro RP2040を使ってPRK Firmwareに対応した自作キーボードを設計する際のポイント

2021/12/03

これは、PRK Firmware Advent Calendar 2021の3日目の記事です。ライセンスはMIT Licenseです。

キーマトリクスの配線

COL2ROWとなるようにダイオードを配線します。

col2row

キーマトリクスに使えるGPIO番号に特に制限はありません。

PRK Firmwareでは以下のように書きます。

# Initialize GPIO assign
kbd.init_pins(
  [ 4, 5, 6, 7 ],            # row0, row1,... respectively
  [ 29, 28, 27, 26, 22, 20 ] # col0, col1,... respectively
)

prk_crkbd/keymap.rb at main · picoruby/prk_crkbd

数字は、GPIOに割り振られたピン番号です。GNDピンなども含めた総ピンの連番ではないことに注意してください(以下同じ)。

Raspberry Pi Picoの場合、GP0~GP28なのでキーマトリクスに使えるのは0~28の最大29本です。

Pico-R3-SDK11-Pinout

出典:Raspberry Pi Documentation - Raspberry Pi Pico

Pro Micro RP2040の場合、GPIO0~9、GPIO20~23、GPIO26~29なので、キーマトリクスに使えるのは0~9、20~23、26~29の最大18本です。

ProMicroRP2040_Graphical_Datasheet

出典:Pro Micro RP2040 Hookup Guide - learn.sparkfun.com

シリアルLEDの配線

シリアルLEDに、電源、GND、1つのGPIOピンを配線します。

PRK FirmwareではGPIOピンを以下のように指定します。

# Initialize RGBLED with pin, underglow_size, backlight_size and is_rgbw.
rgb = RGB.new(
  0,    # pin number
  6,    # size of underglow pixel
  21,   # size of backlight pixel
  false # 32bit data will be sent to a pixel if true while 24bit if false
)

prk_crkbd/keymap.rb at main · picoruby/prk_crkbd

使えるGPIO番号に制限はありません。

分割キーボードの左右間シリアル通信に使えるGPIOピン

基本

PRK Firmwareでは以下のようにGPIO番号を指定します。

# `split=` should happen before `init_pins`
kbd.split = true
kbd.uart_pin = 1

kbd.uart_pinは、デフォルトで1なので、GPIO1を左右間シリアル通信に使用する場合は、

kbd.split = true

と書くだけでよいです。

kbd.uart_pinに設定できるのは、RP2040の「UART0 RX」の機能を持つピンです。

Pro Micro RP2040は公式のピンアウト図には29に「UART0 RX」が使えるとは書いてありませんが、RP2040データシート上は使えるはずです。

現在は対応していない、UART1のRXやUART0/1のTXを使えるようにPRKを改修することは、強い要望があれば可能とのことです。

バージョン0.9.6以降

kbd.mutual_uart_at_my_own_risk = true

と書き足すことにより、ハードウェアUARTの機能を使わず、ソフトウェア的に実装されたUARTを使うことができます。

これにより、kbd.uart_pinに任意のGPIO番号が利用可能となります。

また、左右のLEDの同期が可能となります。

参考:Mutual UART communication · picoruby/prk_firmware Wiki

現在は実験的な機能ですが、問題がなければ正式機能に格上げする予定とのことです。

ちなみに、KMK Firmwareを使った分割キーボードの場合は、右手側と左手側で左右間シリアル通信に使うピンを変えないと動かないようです(マスター側はGPIO1、スレーブ側はGPIO0のようにする)。

この点、PRK Firmwareは実験的な機能をオンにしてもしなくても同じGPIO番号が使えるのはいいところですね(リバーシブル基板が作りやすい、ファームウェアにおいて左右で設定を変えるようなコードを書かなくてよい)。

分割キーボードのTRRSコネクタの配線

以下の3つのピンを配線します。3つなので、TRRSケーブルのほかにTRSケーブルも使えます。

Raspberry Pi Picoの電源ピンとして3V3(OUT)も使えると考えられるとのことです。試した方は結果をPRK作者のhasumikinさん (@hasumikin)に連絡すると喜ばれると思います。

なお、Raspberry Pi Pico を使った分割キーボードで、38ピン目のGNDを左右間通信に使うと動作が不安定になった、という事例を拝見しました。設計の際には注意するとよいかもしれません。

ロータリーエンコーダ用の配線

ロータリーエンコーダに2つのGPIOピンとGNDを配線します。

キーマトリクスやシリアルLEDに使えるGPIOピンと同様に、使えるGPIO番号に制限はありません。

PRK Firmware側では以下のように指定します。

encoder = RotaryEncoder.new(21, 9)

ロータリーエンコーダは一体型キーボードなら最大4個まで、分割キーボードならそれぞれの側に2個ずつまで配置できます。この数は要望があれば増やすことは可能とのことです。

分割キーボードで、左右それぞれにロータリーエンコーダがある場合、以下のように書きます。

encoder_left = RotaryEncoder.new(21, 9)
encoder_left.configure :left
encoder_right = RotaryEncoder.new(21, 9)
encoder_right.configure :right

Herix rev3基板にPro Micro RP2040を載せた場合のファームウェアが参考になります。

その他の注意点

VCCとRAWが接続した基板だとPro Micro RP2040はクラッシュするとのことです。

出典:PRK Firmware: Keyboard is Essentially Ruby - HASUMI Hitoshi - Rabbit Slide Show14枚目のスライド

リンク集

謝辞など

PRK作者のhasumikinさん (@hasumikin)に疑問点をいろいろお尋ねしたところ、丁寧なご説明をいただきました。ありがとうございました!これでRaspberry Pi Picoを使ったキーボードが設計できそうです。あとは厚かましいですがPRKでDuplex Matrixが使えるようになると嬉しいです。

一覧へ