RP2040 で QMK Firmware を使うメモ

前置き

天下一キーボードわいわい会 Vol.4 - connpass にキーボードを出展するためにケースを新規作成しましたが、それに合わせて、以前から実現したかった USB Type-C 化を実現するため、以前購入して上手く使えなかった sekigon-gonnoc/pico-micro: A Pro Micro compatible board with RP2040 and mid-mount USB-C receptacle を使いました。RP2040 で QMK Firmware を動かすのは初めてで、使えるようになるまで多少の試行錯誤がありましたので、備忘録として必要な作業をまとめました。

なお、RP2040 を使う前は Pro Micro を使っており、その時の設定ファイルは qmk_firmware/keyboards/yamanami at yamanami_keyboard · s-show/qmk_firmware · GitHub のとおりで、RP2040 を使う場合の設定ファイルは qmk_firmware/keyboards/yamanami_rp2040 at yamanami_keyboard · s-show/qmk_firmware · GitHub のとおりです。

ボードと MCU の変更

まず、マイコンボードを Pro Micro から PICO Micro に切り替えるため、MCU とブートローダーの設定を次のとおり変更しました。

1- MCU = atmega32u4
2+ MCU = RP2040
3- BOOTLOADER = caterina
4+ BOOTLOADER = rp2040

ピン指定の変更

PICO Micro は Pro Micro との間でフットプリントとピン配置に互換性がありますが、RP2040 を使う時はピンの指定を GPIO の番号で指定する必要があるため、以下の対応表を作成してピンの指定を修正しました。

Pro Micro と PICO Micro のピンの対応表
Pro MicroPICO MicroPro MicroPICO Micro
D3GP0B5GP9
D2GP1F4GP29
D1GP2F5GP28
D0GP3F6GP27
D4GP4F7GP26
C6GP5B1GP22
D7GP6B3GP20
E6GP7B2GP23
B4GP8B6GP21
1- #define MATRIX_ROW_PINS { F4, C6, D7, E6 }
2+ #define MATRIX_ROW_PINS { GP29, GP5, GP6, GP7 }
3- #define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B6 }
4+ #define MATRIX_COL_PINS { GP28, GP27, GP26, GP22, GP20, GP21 }
5- #define MATRIX_ROW_PINS_RIGHT { F7, B1, B3, B2 }
6+ #define MATRIX_ROW_PINS_RIGHT { GP26, GP22, GP20, GP23 }
7- #define MATRIX_COL_PINS_RIGHT { D4, C6, D7, E6, B4, B5 }
8+ #define MATRIX_COL_PINS_RIGHT { GP4, GP5, GP6, GP7, GP8, GP9 }
PICO Micro のピン配置

左右間のシリアル通信の設定

Pro Micro を使うときは rules.mkSPLIT_KEYBOARD = yes を指定して config.h#define USE_SERIAL#define SOFT_SERIAL_PIN D2 を追加すれば左右間のシリアル通信を設定できましたが、RP2040 では SOFT_SERRIAL_PIN が定義されていないため、次の順番で設定を修正しました。

まず、公式リファレンスで「RP2040 を使う時は SOFT_SERIAL_PIN の代わりに SERIAL_USART_TX_PIN を使うこと」と指定されており、私の設計では Pro Micro の D2 ピンでシリアル通信していましたので、config.hSOFT_SERIAL_PIN D2#define SERIAL_USART_TX_PIN GP1 に修正しました。

1- #define SOFT_SERIAL_PIN D2
2+ #define SERIAL_USART_TX_PIN GP1
私のキーボードの回路図

それから、私のキーボードではシリアル通信に使える線が一本だけで全二重通信によるシリアル通信はできないため、半二重通信でシリアル通信するために #define USE_SERIAL#define SERIAL_USART_HALF_DUPLEX に変更しました。

1- #define USE_SERIAL
2+ #define SERIAL_USART_HALF_DUPLEX

そして、rules.mkSERIAL_DRIVER = vendor を追加すれば左右間のシリアル通信の設定は完了です。

1SPLIT_KEYBOARD = yes
2+ SERIAL_DRIVER = vendor

その他の設定

Pro Micro を使っているときはキーボードのリセットボタンを押せば Pro Micro がブートローダーモードになってファームウェアを更新できましたので、同じ機能を追加するため config.h に次の設定を追加しました。

1+ #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
2+ #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U

これでキーボードのリセットボタンを2連打すれば PICO Micro がブートローダーモードになって uf2 ファイルを書き込めるようになりますので、ファームウェア更新の手間を減らすため設定を追加した。

参考にしたウェブページ

‘serial’ Driver

Raspberry Pi RP2040

sekigon-gonnoc/pico-micro: A Pro Micro compatible board with RP2040 and mid-mount USB-C receptacle

Lunakey PicoでQMK Firmwareを動かしてみました