Adafruit_nRF52_Bootloader

Activity, over time

Daily GitHub activity and social mentions.

Mentions

Daily posts linking to this repository

Loading mentions chart

Attention

Daily stars & forks

Loading attention chart

Star accumulation

Cumulative stars

Loading star accumulation chart

Pull requests

Daily opens & merges

Loading pull requests chart

Conversations

Daily issues & comments

Loading conversations chart

Community

Daily accounts & reviews

Loading community chart

Mentions

1post · 30d
Nov 50 posts
  1. Zenn · · @tommys079

    MDBT50Q-1MV2を基板に直載せしてZMKを動かす:自作の基板定義で押さえた7つのポイント(ZMK v0.3) この記事について 自作キーボード「Ashiyu mini(足湯ミニ)」を設計しています。Pro Micro 型のコントローラー(nice!nano など)は使わず、無線モジュール MDBT50Q-1MV2(中身は nRF52840)を基板に直接載せました。 そのため、ZMK に用意されている「シールド」ではなく、基板そのものの定義(ボード定義)を自分で書く必要がありました。この記事は、その基板定義で押さえたポイントと、GitHub Actions でファームウェアのビルドが通るまでの記録です。 ! この記事を書いた時点では、基板はまだ届いていません(2026年10月に発注)。ビルドは通っていますが、実機での動作は未確認です。「未確認」と書いた所は、届いてから続編で報告します。 Ashiyu mini の概要 項目 内容 キー 67 個(F の段なし、日本語配列の記号キーあり) 接続 Bluetooth(接続先 3 つ)、USB ポインティング 中央にトラックパッド(Azoteq TPS65)。NUM ボタンでテンキーに切り替え その他 ダイヤル 2 個、キーのバックライト、状態表示 LED 電池 LiPo 3400 mAh(トラックパッドの下) 厚さ 平らな底板で机から上面まで 11.4 mm ファームウェア ZMK v0.3(専用の基板定義 ashiyu_mini) なぜ直載せにしたのか 理由は 2 つです。 薄くしたかった:Pro Micro 型のボードを使うと、ボードとピンヘッダの分だけ高くなります。 ピンが足りなかった:キー行列(6 行 × 12 列)に加えて、トラックパッドの I²C、状態表示 LED 用の 6 本、バックライト、ダイヤル 2 個(回転と押し込み)、RESET と BOOT のスイッチを使います。Pro Micro 型のボードでは、出ているピンが足りません。 代わりに、ボード定義を一から書くことになります。ここからがその中身です。 ファイル構成(ZMK v0.3 の形式) firmware/ boards/arm/ashiyu_mini/ ashiyu_mini.dts … ピン、キー行列、LED、電池、フラッシュの区割り ashiyu_mini-pinctrl.dtsi … I²C と PWM のピン ashiyu_mini-layout.dtsi … キーの物理配置(ZMK Studio が使う) ashiyu_mini_defconfig … 基板の既定の設定 Kconfig.board / Kconfig.defconfig board.c … 初回起動時の電圧設定など board.cmake / pre_dt_board.cmake zephyr/module.yml … このリポジトリを Zephyr のモジュールとして読ませる config/ west.yml / build.yaml / ashiyu_mini.conf / ashiyu_mini.keymap zephyr/module.yml で、基板定義とドライバーの置き場所を Zephyr に教えます。 zephyr/module.yml name: ashiyu_mini build: cmake: firmware kconfig: firmware/Kconfig settings: board_root: firmware dts_root: firmware ! ZMK の開発版は、新しい基板定義の形式(Zephyr の HWMv2)に移っています。この記事のファイル配置は ZMK v0.3(Zephyr 3.5)向けの古い形式なので、west.yml で ZMK を v0.3 に固定しています。新しい ZMK に上げるときは、基板定義の作り直しが必要です。 config/west.yml manifest: remotes: - name: zmkfirmware url-base: github.com/zmkfirmware projects: - name: zmk remote: zmkfirmware revision: v0.3 import: app/west.yml self: path: config ポイント1:VDD が 1.8 V のままになる(REGOUT0) いちばんハマりやすい所だと思います。 MDBT50Q に電池や USB の電源を VDDH から入れる「高電圧モード」では、チップ内部のレギュレーターが VDD を作ります。ところが工場出荷のままだと、VDD は 1.8 V しか出ません。3.3 V 前提の LED、トラックパッド、I²C のプルアップは、このままでは正しく動きません。 そこで、最初の起動で UICR の REGOUT0 に 3.3 V を書き込み、1 回だけ再起動するコードを board.c に入れました(Zephyr の nrf52840dongle の基板定義と同じ考え方です。あちらは 3.0 V)。 firmware/boards/arm/ashiyu_mini/board.c(抜粋) static int ashiyu_board_init(void) { /* 高電圧モードで動いていて、かつ REGOUT0 が初期値(1.8 V)のときだけ */ if ((nrf_power_mainregstatus_get(NRF_POWER) == NRF_POWER_MAINREGSTATUS_HIGH) && ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) == (UICR_REGOUT0_VOUT_DEFAULT << UICR_REGOUT0_VOUT_Pos))) { NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos; while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {} NRF_UICR->REGOUT0 = (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) | (UICR_REGOUT0_VOUT_3V3 << UICR_REGOUT0_VOUT_Pos); NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos; while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {} NVIC_SystemReset(); /* 新しい VDD はリセット後に反映される */ } return 0; } SYS_INIT(ashiyu_board_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); 2 回目以降の起動では条件に当たらないので、何もしません。 ポイント2:32 kHz の水晶を載せない ピンを 1 本でも多く使いたかったので、32 kHz 水晶用のピン(P0.00 / P0.01)をキー行列の行に使いました。水晶が無いので、内部の RC 発振器を使う設定にします。 firmware/boards/arm/ashiyu_mini/ashiyu_mini_defconfig(抜粋) CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y ポイント3:NFC のピンと RESET のピン(UICR) P0.09 / P0.10 は、初期状態では NFC 用です。P0.09 をキー行列の列に使うため、普通の GPIO に切り替えます。 P0.18 は、背面の RESET スイッチにつなぎました。RESET ピンとして使う設定にします。 firmware/boards/arm/ashiyu_mini/ashiyu_mini.dts(抜粋) &uicr { nfct-pins-as-gpios; gpio-as-nreset; }; ポイント4:フラッシュの区割りはブートローダーに合わせる 秋月電子の MDBT50Q-1MV2(通販コード 117928)は、ブートローダー書き込み済みとして販売されています。中身は Adafruit nRF52 Bootloader と SoftDevice S140 6.1.1 という想定で、nice!nano と同じ区割りにしました。 区画 開始アドレス 大きさ 中身 sd_partition 0x00000 0x26000 SoftDevice(Bluetooth の土台) code_partition 0x26000 0xC6000 ZMK 本体(uf2 で書き込む部分) storage_partition 0xEC000 0x08000 設定の保存(接続先など) boot_partition 0xF4000 0x0C000 ブートローダー ! モジュールに実際に入っているブートローダーの版は、届いてから USB ドライブの INFO_UF2.TXT で確認します(未確認)。版が違った場合に備えて、SWD 端子(基板の TP1〜4)からブートローダーを書き直せるようにしてあります。 ポイント5:ブートローダーが読むボタンのピン Adafruit のブートローダー(pca10056 用のビルド)は、P0.11 を DFU ボタンとして読みます。そこで、背面の BOOT スイッチを P0.11 につなぎました。また、同じブートローダーが P0.12 も OTA 用の DFU ボタンとして読むので、P0.12 には何もつないでいません。 ポイント6:キー行列とダイヤルの押し込みを 1 つにまとめる ダイヤルの押し込みスイッチは、キー行列には入れず、GND に落ちる個別の GPIO にしました。zmk,kscan-composite で、キー行列(6 行 × 12 列)と個別 GPIO を 1 つのキースキャンにまとめ、ダイヤルを「7 行目」として扱っています。 firmware/boards/arm/ashiyu_mini/ashiyu_mini.dts(抜粋) kscan0: kscan0 { compatible = "zmk,kscan-composite"; rows = <7>; columns = <12>; wakeup-source; matrix { kscan = <&kscan_matrix>; }; dials { kscan = <&kscan_dials>; row-offset = <6>; }; }; ポイント7:ZMK Studio に対応させる ZMK Studio は、ブラウザー(zmk.studio )からキーの割り当てを変えられる ZMK 公式の仕組みです。対応させるために、次の 4 つを入れました。 物理配置(physical layout):各キーの位置と大きさ。chosen に zmk,physical-layout を指定します。Ashiyu mini では、キーの中心座標を書いた JSON から、Python スクリプトで ashiyu_mini-layout.dtsi を生成しています。 CONFIG_ZMK_STUDIO=y(config/ashiyu_mini.conf) snippet studio-rpc-usb-uart(USB でつなぐため。config/build.yaml) キーマップに &studio_unlock(Ashiyu mini では Fn+S。鍵を開けないと変更できません) config/build.yaml include: - board: ashiyu_mini snippet: studio-rpc-usb-uart 注意点もまとめておきます。 Studio で変えられるのは、キーの割り当てとレイヤー名です。コンボ、マクロの中身、長押しの時間、ダイヤルの割り当ては、今のところ .keymap を直してビルドし直します。 Bluetooth でつなぐ場合、ブラウザー版が使えるのは Linux だけです(Windows と Mac は専用アプリ)。ふだんは USB でつなぐのが確実です。 一度 Studio で保存すると、あとで .keymap を直して書き込んでも、Studio の内容が優先されます。.keymap の内容に戻すには、Studio の「Restore Stock Settings」を使います。 ! ZMK v0.3 のファームウェアと、今の zmk.studio がつながるかは未確認です。届いたら続編で報告します。 おまけ:深いスリープ中のダイヤルの電流 ダイヤルの A / B ピンは、内部のプルアップを使っています。ダイヤルが止まった位置で接点が閉じていると、深いスリープ中でも電流が流れ続けます(2 個で最大約 1 mA の見積もり)。 ZMK v0.3 のダイヤル用ドライバーには省電力の仕組みが無いので、board.c に小さなデバイスを作りました。ZMK が深いスリープに入る直前(SUSPEND)に、4 本のピンを切断してプルアップを外します。止まった位置で接点が開く品なら不要ですが、データシートに書かれていなかったので、念のため入れています(実際に閉じるかは、届いてからテスターで確認します)。 ビルド:GitHub Actions で 3 種類を作っておく 到着後に問題を切り分けやすいように、CI で 3 種類のファームウェアを作っています。 種類 中身 使いどころ 通常版 ZMK Studio(USB)入り ふだん使う USB ログ版 動作の記録を USB シリアルに出す 動かないときの調査 キーだけ版 トラックパッドのドライバーを外す(overlay で無効化) 最初の動作確認。トラックパッドをつなぐ前に、キー・ダイヤル・LED を確かめる ひとつハマった点があります。このリポジトリ自体を Zephyr のモジュールにしているため、リポジトリの中で west init すると、取得した Zephyr と zephyr/module.yml がぶつかりました。そこで、config/ だけを別のディレクトリにコピーして west init し、ビルドのときに -DZMK_EXTRA_MODULES でリポジトリを読ませています。 .github/workflows/zmk.yml(抜粋) - name: West build (ashiyu_mini, with ZMK Studio over USB and BLE) run: | cd /tmp/zmk-config west build -s zmk/app -d /tmp/build -b ashiyu_mini -S studio-rpc-usb-uart -- \ -DZMK_CONFIG=/tmp/zmk-config/config -DZMK_EXTRA_MODULES="${GITHUB_WORKSPACE}" できた .uf2 は、専用のブランチ(zmk-results)に置くようにしました。ビルドの記録も一緒に置くので、失敗したときに原因を git から読めます。 まだ確かめていないこと 秋月のモジュールに入っているブートローダーの版 ZMK Studio が今の Web アプリとつながるか ダイヤルが 1 クリックで 1 回動くか、止まった位置で接点が閉じるか 状態表示 LED の点き方、トラックパッドの向きと速さ 電池がどのくらい持つか 次回 基板が届いたら、次の順で進めて報告します。 無線モジュール(U1)をホットプレートで取り付ける(低温はんだ) 「キーだけ版」を書き込んで、キーとダイヤルを確認 ZMK Studio につながるか試す クレジット キー配列とケースの形状は、Salicylic_acid3 さんの ClickBoard と ACC Keycaps を元にしています(CC BY-NC 4.0)。 MDBT50Q のフットプリントは、Adafruit ItsyBitsy nRF52840 Express の基板データ(CC BY-SA)を元にしています。 基板定義のファイルは MIT ライセンスです。 参考 ZMK Studio(ZMK 公式ドキュメント) Adafruit nRF52 Bootloader

Latest stargazers

The last 10 distinct accounts we observed this year.

Most active participants

PR, issue, comment & review events in the past year.

Packages

Scan pending.

Live mentions badge

Show how many posts mention your project in the last 30 days.

Live mentions · last 30 days
adafruit/Adafruit_nRF52_Bootloader mentions in the last 30 days