tl;dr
- SparrowG21はGP2040-CEを使うレバーレスアケコン(スティック付き)だよ
- GP2040-CE v0.7.7で、なぜかPico用のビルドだと、GPIO24でRGB LEDを光らせることができなかったよ。Raspberry Pi PicoではGPIO24は、USB電源の検知なので、変更できないかもしれないと思ったよ。
- でもRP2040 Advanced Breakoutのビルドでは動作したので、ファームウェアをカスタムビルドすればなんとかなりそうだよ
- GP2040-CEは、configsにheaderファイルを記述すればビルドできたよ
SparrowG21をキーケットで頒布したよ
キーケットでは、レバーレスアケコンSparrowG21を頒布しました。以下のような特徴を持つゲームコントローラです。
- GP2040-CE専用
- アクションゲームで、左手親指をジャンプとして、上下キーを1つの指で操作できるようなキー配置
- ジョイスティック2本搭載(3Dプリントで製造したスティックキャップ付属)
- GH60互換ケース対応
- MX互換スイッチ対応
- 薄型スイッチKailh Choc v1、LOFREE x KAILH Full POM Low Profile対応(ただし、Chocの場合にはトッププレート、ホットスワップソケット非対応)。
- ホットスワップソケット対応(MX互換のみ)
- OLED、ターボインジケータLED、パワー&モードLED搭載
現在、Boothにて販売中です。
v0.7.7 でPico用ビルドでRGBLEDが光らない
キーケットで販売したバージョンには、Raspberry Pi Picoビルドのファームウェアを書き込み、SparrowG21用のピンマップを書き込んでいました。しかし、これではRGB LEDが光らないことがわかりました。v0.7.5では光ることを確認しており、その後サンプルで組んだもので光らなくなったので、RGB LEDが壊れてしまったと思い込んでいました。今回、組み直したものでも光らないことがわかり、改めて調べ直すことにしました。
購入された方(4名)には、不完全な状態のものを販売してしまっており、大変申し訳ありませんでした。
SparrowG21でRGB LEDに使っているGPIO24は、USB電源があることの確認に使われています。このことから、Raspberry Pi Picoビルドではこの前提で動いているからうまくいかないのかと思い、試しにRP2040 Advanced Breakoutのビルドで動かしてみたところ、期待通りRGB LEDが点灯しました。よって、GP2040-CEをSparrowG21向けにビルドすることができれば、動かすことができそうだと確信しました。
GP2040-CEのPico用ファームウェアをビルドする
GP2040-CEのソースコードを見てみると、次のような構成になっています。
- src/ : ソースコード
- headers/ : ヘッダーコード
- configs/ : 各ボード用の設定ヘッダーファイル
configs/ に各ボードの設定があり、そこでマクロ定数(#define BOARD_LEDS_PIN 24
等と定義するやつ)で、機能の有効無効や、ピンアサインを指定します。ここで使うマクロ定数はヘッダーファイル内で見つけることができます。
まず始めに、Pico用のファームウェアをビルドし、その後カスタムファームウェアの制作に取り組むことにしました。環境はUbuntu 22.04、OrangePi5+(ARM64)上で行っています。
まず、通常のPico用ファームウェアをビルドしました。
git clone --recursive https://github.com/OpenStickCommunity/GP2040-CE cd GP2040-CE # PICO_SDK_FETCH_FROM_GIT=1 とすると、pico_sdkをダウンロードする PICO_SDK_FETCH_FROM_GIT=1 cmake . # configsのMakefileを作る cd configs cmake . # ルートディレクトリでビルドする cd .. make
これで GP2040-CE_0.7.7_Pico.uf2
がビルドされました。
次に、カスタムファームウェアのビルドに進みます。
GP2040-CEのカスタムファームウェアをビルドする
まず、RP2040 Advanced Breakoutの設定ファイルconfigs/RP2040AdvancedBreakoutBoard
をコピーして configs/SparrowG21
を作りました。ボード名のヘッダファイル configs/RP2040AdvancedBreakoutBoard/RP2040AdvancedBreakoutBoard.h
があるため configs/SparrowG21/SparrowG21.h
にリネームしています。
ボードの設定(configs/SparrowG21/BoardConfig.h
)にボード名を記述するところがあるので、変更しておきます。
#define BOARD_CONFIG_LABEL "SparrowG21"
configs/CMakeLists.txt
に以下のようにビルドするボード名が書かれていました。ここにSparrowG21を追加しました。
add_subdirectory(Pico) add_subdirectory(SparrowG21)
さらに、ビルドする対象のボードは CMakeLists.txt
において ${GP2040_BOARDCONFIG}
と書かれているのを見つけました。指定がない場合、Pico
が使われるようになっており、先のビルドではこれが使われているようでした。そうであれば、環境変数で指定すれば良さそうです。これでビルドを行いました。
# configsのMakefileを更新 cd configs/ cmake . # ボードの指定でSparrowG21を指定する cd .. GP2040_BOARDCONFIG=SparrowG21 cmake . # ビルド make
すると、GP2040-CE_0.7.7_SparrowG21.uf2
ができました。
カスタムファームウェアの設定を作り込む
SparrowG21で行うべき設定は以下の通りでした。
- 各キーのピンアサイン
- I2CとOLED Displayを有効にして、ピンを設定する
- RGB LED機能を有効にして、ピンを設定する
- Board LED(Picoに付いているLED)を有効にする
- Turbo機能を有効にして、ピンを設定する
- Analog機能を有効にして、ピンを設定する
これらを、configs/SparrowG21/BoardConfig.h
に作り込んできました。
ほとんどの設定は、WebConfigの設定とheades にあるものが一致するようにできており(特にaddons)、あまり迷うことなく設定を見つけることができました。
各キーのピンアサイン
各ピンにキーを設定していきます。他のボードの設定が参考になります。同様に、Function、Turboキーも設定できます。
#define GPIO_PIN_07 GpioAction::BUTTON_PRESS_UP #define GPIO_PIN_05 GpioAction::BUTTON_PRESS_DOWN #define GPIO_PIN_06 GpioAction::BUTTON_PRESS_RIGHT #define GPIO_PIN_02 GpioAction::BUTTON_PRESS_LEFT #define GPIO_PIN_14 GpioAction::BUTTON_PRESS_B1 #define GPIO_PIN_16 GpioAction::BUTTON_PRESS_B2 #define GPIO_PIN_20 GpioAction::BUTTON_PRESS_R2 #define GPIO_PIN_22 GpioAction::BUTTON_PRESS_L2 #define GPIO_PIN_13 GpioAction::BUTTON_PRESS_B3 #define GPIO_PIN_15 GpioAction::BUTTON_PRESS_B4 #define GPIO_PIN_19 GpioAction::BUTTON_PRESS_R1 #define GPIO_PIN_21 GpioAction::BUTTON_PRESS_L1 #define GPIO_PIN_23 GpioAction::BUTTON_PRESS_S1 #define GPIO_PIN_03 GpioAction::BUTTON_PRESS_S2 #define GPIO_PIN_18 GpioAction::BUTTON_PRESS_L3 #define GPIO_PIN_17 GpioAction::BUTTON_PRESS_R3 #define GPIO_PIN_08 GpioAction::BUTTON_PRESS_A1 #define GPIO_PIN_11 GpioAction::BUTTON_PRESS_A2 #define GPIO_PIN_12 GpioAction::BUTTON_PRESS_FN #define GPIO_PIN_09 GpioAction::BUTTON_PRESS_TURBO
I2CとOLED Displayを有効にして、ピンを設定する
この設定は他のボードでも行われているので、それらを参考にしながら以下のように記述しました。
#define HAS_I2C_DISPLAY 1 #define I2C_SDA_PIN 0 #define I2C_SCL_PIN 1 #define I2C_BLOCK i2c0
RGB LED機能を有効にして、ピンを設定する
こちらも他のボードでも行われているので、それらを参考にしました。BOARD_LEDS_PIN
が利用するGPIOの番号です。LEDS_XXXX
はデイジーチェーン接続の順番です。
#define BOARD_LEDS_PIN 24 #define LED_BRIGHTNESS_MAXIMUM 128 #define LEDS_DPAD_LEFT 0 #define LEDS_DPAD_DOWN 1 #define LEDS_DPAD_RIGHT 2 #define LEDS_DPAD_UP 3 #define LEDS_BUTTON_B3 4 #define LEDS_BUTTON_B4 5 #define LEDS_BUTTON_R1 6 #define LEDS_BUTTON_L1 7 #define LEDS_BUTTON_B1 8 #define LEDS_BUTTON_B2 9 #define LEDS_BUTTON_R2 10 #define LEDS_BUTTON_L2 11
Board LED(Picoに付いているLED)を有効にする
Board LEDで、現在のモードなどを表現することができます(OLEDがあれば不要とも言えますが)。
ヘッダーファイルは headers/addons/board_led.h
にあり、これを見ながら必要な設定を追加しました。有効にした後、モードを表示する設定を行っています。
#define BOARD_LED_ENABLED 1 #define BOARD_LED_TYPE ON_BOARD_LED_MODE_MODE_INDICATOR
Turbo機能を有効にして、ピンを設定する
ヘッダーファイルは headers/addons/turbo.h
にあり、これを見ながら必要な設定を追加しました。
#define TURBO_ENABLED 1 #define TURBO_LED_PIN 10
Analog機能を有効にして、ピンを設定する
こちらもヘッダーファイルは headers/addons/analog.h
にあり、これを見ながら必要な設定を追加しました。
#define ANALOG_INPUT_ENABLED 1 #define ANALOG_ADC_1_VRX 26 #define ANALOG_ADC_1_VRY 27 #define ANALOG_ADC_2_VRX 28 #define ANALOG_ADC_2_VRY 29
作ったもの
変更したBoardConfig.hはこちらになります。
できたファームウェアを書き込む
設定変更後に再ビルドし、ファームウェアを書き込みます。
ファームウェアを変更するとき、設定があると残る作りになっているため、一度Flashの中身を削除する以下のファームウェアを書き込んだ後に、新しいファームウェアを書き込みます。
flash_nuke.uf2
すると、書き込むだけでセッティングが完了するカスタムファームウェアが動作しました!
GP2040-CEを自前でビルドしたら、v0.7.7かつGPIO24でLED光らせることができた pic.twitter.com/ySJ3NSixxg
— 74th (@74th) March 10, 2024
以上
わりと簡単にGP2040-CEのカスタムファームウェアを作ることができました。
もしキーケットでSparrowG21を買われていましたら、ドキュメントを確認の上、こちらのファームウェアをお試しいただければ幸いです。