見出し画像

1キーのキーボードを作ってみる

前回までの2回で、やりたいことが本当に実現できそうか、インターネットの情報を集めながら確認してきました。
ぼちぼち実際のハードウェアに目を向けていこうと思います。

当面の最終的な大きなゴールとしては、

  • 40%+αサイズのキーボード(キーピッチは19mmぐらいを想定)

  • Bluetooth対応

  • バックライト付き

目的というか動機としては、机の上を広く使うため、キーボードの専有面積を小さくしたいということ。
また、キー数が少ないので、自分の使いやすいキー配置を見つけるまで、何度かキーマップを書き換えながら試したいという思いから、QMK Firmwareを使ってみたいと思っています。


Pro Micro

さて、まずはPro Microです。今回の工作のまさにキーデバイスですね。

Pro Micro - 青基板 2個セット 2,000円
https://www.amazon.co.jp/dp/B0C2K6LYB4

なんか、SparkFun社製オリジナルの赤いやつではないのに少し割高な気もしますけど、とりあえずAmazonでポチりました。

Pro Micro

手元に届いたら、まずは付属のピンヘッダを半田付け。
半田付けはもう十数年ぶり。めちゃくちゃ腕が落ちていることに愕然としながらどうにか取り付けました。

USBケーブルでパソコンにつないでみます。
デバイスマネージャーで確認すると、「Arduino Leonardo」と表示されますね。

デバイスマネージャーでは「Arduino Leonardo」と表示される

MURAOKA TaroさんのZennの記事( https://zenn.dev/koron/articles/a2e220d73800ba )によると、3種類あるブートローダーのうち「中華製Pro Micro互換機に書かれていることの多いブートローダー」とのこと。

ファームウェア書き込みモードにするには、リセットボタンを1回押すだけでいいようですね。オリジナルPro Microでは2回押しなので、先々ちょっと気にしておく必要があるかもしれません。

DFUモードでUSBデバイスとして認識させるには、DFUブートローダーでなくてはならず、今回購入したものに載っているものとは違うようです。
前出のMURAOKA Taroさんの記事によると、どうやらDFUブートローダーはマイコン本体ATmega32U4の出荷時に書き込まれているもので、Pro Microなり、Pro Microの互換機なりの製品になった時点で他のブートローダーに書き換えられているようです。
DFUモードで遊ぶのは後回しにしましょう。

ブレッドボード上にキーボードを作ってみる

不確定要素は早めに消して、少しずつゴールイメージを明確にしていきたいですよね。
USBキーボードとして動作させるまでの手順を確かめるため、特に QMK Firmware とはいかなるものかを確認するために、まずはブレッドボードを使って、Pro MicroをUSBキーボードに仕上げてみたいと思います。

まず回路図はこんな感じ。

回路図

回路図の右上のスイッチは、ファームウェアを書き込むときにPro Microをリセットするスイッチ。左下がキーボードのキーにあたるスイッチです。とりあえずは1個だけ。

これをブレッドボード上で配線します。スイッチはとりあえずタクトスイッチを使います。

ブレッドボード上に構成

ハードウェアの工作はこの程度にして、ファームウェアの作成に入ります。

QMK Firmware

QMK Firmwareについては全く初めてなので、公式ドキュメントに沿って進めていきます。

セットアップ

公式ドキュメントに従ってQMK MSYSをインストールします。
最新版は、https://github.com/qmk/qmk_distro_msys/releases/latest からダウンロードできます。

QMK MSYSを立ち上げて、qmk setup を実行します。
ただし、そのまま実行するとホームフォルダにGitHubからQMK Firmwareのソースをクローンしてしまうので、qmk setup -H <path>を使います。

$ qmk setup -H "ソースをクローンしたいフォルダのパス"

また、パスを指定する際、Windowsではパスの区切り文字として "\"(バックスラッシュ)を使いますが、QMK MSYSでは、"\" はそのままでは区切り文字と認識されないようです。
パス全体をシングルクオーテーションやダブルクォーテーションで囲む必要があります。あるいは、パスの途中にスペースなどが入っていなければ、"/"(スラッシュ)に置き換えてもいいと思います。

GitHubからソースファイルをダウンロードし終えるまでしばらく時間がかかります。

インストールが終わったら、公式ドキュメントの例に従ってコンパイルのテスト。
先ほど指定したパスがホームフォルダに設定されているのでカレントフォルダは特に気にしなくても良いようです。

$ qmk compile -kb clueboard/66/rev3 -km default

特にエラーが出なければOKですかね。
ホームフォルダに "clueboard_66_rev3_default.hex" ができていることを確認して先に進みます。

自分キーボード用ファームウェア

新しいキーボードのファームウェアを作成するときは、qmk new-keyboardコマンドを使います。
これについては、なぜか公式ドキュメントの日本語版には記載されていませんでした。

英語版には載っているのですが……とはいえ非常にあっさりとした情報のみ。

qmk new-keyboard
This command creates a new keyboard based on available templates.
Any arguments that are not provided will prompt for input. If -u is not passed and user.name is set in .gitconfig, it will be used as the default username in the prompt.

Usage:
qmk new-keyboard [-kb KEYBOARD] [-t {atmega32u4,STM32F303,etc}] [-l {60_ansi,75_iso,etc}] -u USERNAME

QMK Firmware公式ドキュメント(英語版)

このコマンドは、利用可能なテンプレートを基にして新しいキーボード(のファームウェア(のソースファイル?))を作成します。引数が指定されていない場合は、入力を求めるプロンプトが表示されます。-u が渡されず .gitconfig に user.name が設定されている場合は、それがプロンプトのデフォルトのユーザー名として使用されます。

だいたいこんな意味でしょうか。

qmk new-keyboardについては、公式ドキュメントではこれぐらいしか見つけられませんでした。しかも、なぜ日本語版のドキュメントではオミットされているのでしょうね。
まぁ、あんまり気にせずやってみればいいのでしょうけど、もう少し検索すると、Quiitaの@mizuhofさんが、まったくそのまま使えるお手本を載せておられたので、こちらも参照させていただきます。

上記の記事の通り、qmk new-keyboardを使います。
<github_username>には、とりあえず "KudoShusak" と入力してみました。

$ qmk new-keyboard -u KudoShusak
Ψ Generating a new QMK keyboard directory                                                                             

Name Your Keyboard Project
For more infomation, see:
https://docs.qmk.fm/#/hardware_keyboard_guidelines?id=naming-your-keyboardproject

Keyboard Name? 1key   

キーボードの名前を聞かれたので "1Key" と回答

Pick Base Layout
As a starting point, one of the common layouts can be used to bootstrap the process

Default Layout?
1. 60_abnt2
2. 60_ansi
3. 60_ansi_arrow
4. 60_ansi_wkl
5. 60_hhkb
6. 60_iso
7. 60_iso_wkl
8. 60_jis
9. 64_ansi
10. 64_iso
11. 65_ansi
12. 65_iso
13. 66_ansi
14. 66_iso
15. 68_ansi
16. 68_iso
17. 75_ansi
18. 75_iso
19. 96_ansi
20. 96_iso
21. alice
22. ergodox
23. fullsize_ansi
24. fullsize_extended_ansi
25. fullsize_extended_iso
26. fullsize_extended_jis
27. fullsize_iso
28. fullsize_jis
29. numpad_4x4
30. numpad_5x4
31. numpad_5x6
32. numpad_6x4
33. numpad_6x5
34. ortho_1x1
35. ortho_2x3
36. ortho_2x6
37. ortho_3x10
38. ortho_3x3
39. ortho_4x10
40. ortho_4x12
41. ortho_4x16
42. ortho_4x4
43. ortho_4x6
44. ortho_5x10
45. ortho_5x12
46. ortho_5x13
47. ortho_5x14
48. ortho_5x15
49. ortho_5x4
50. ortho_5x5
51. ortho_6x13
52. ortho_6x4
53. planck_mit
54. split_3x5_2
55. split_3x5_3
56. split_3x6_3
57. tkl_ansi
58. tkl_iso
59. tkl_jis
60. tkl_nofrow_ansi
61. tkl_nofrow_iso
62. none of the above
Please enter your choice: [62]                                                                                        

長大なリストの中からベースになるキーボードのレイアウトを選ぶよう促されますが、全くオリジナルなので最後の62番 "none of the above" を選びます。

What Powers Your Project
For more infomation, see:
https://docs.qmk.fm/#/compatible_microcontrollers 

MCU?
1. bit_c_pro
2. blackpill_f401
3. blackpill_f411
4. blok
5. bluepill
6. bonsai_c4
7. elite_c
8. elite_pi
9. helios
10. imera
11. kb2040
12. liatris
13. michi
14. promicro
15. promicro_rp2040
16. proton_c
17. stemcell
18. at90usb1286
19. at90usb1287
20. at90usb162
21. at90usb646
22. at90usb647
23. atmega16u2
24. atmega16u4
25. atmega328
26. atmega328p
27. atmega32a
28. atmega32u2
29. atmega32u4
30. attiny85
31. GD32VF103
32. MK20DX128
33. MK20DX256
34. MK64FX512
35. MK66FX1M0
36. MKL26Z64
37. RP2040
38. STM32F042
39. STM32F072
40. STM32F103
41. STM32F303
42. STM32F401
43. STM32F405
44. STM32F407
45. STM32F411
46. STM32F446
47. STM32G431
48. STM32G474
49. STM32H723
50. STM32H733
51. STM32L412
52. STM32L422
53. STM32L432
54. STM32L433
55. STM32L442
56. STM32L443
57. WB32F3G71
58. WB32FQ95
Please enter your choice: [29]
Ψ Created a new keyboard called 1key.
Ψ Build Command: qmk compile -kb 1key -km default.
Ψ Project Location: *:/****/*******/qmk_firmware/keyboards/1key,
Ψ {}Now update the config files to match the hardware!{}  

次にMCUを選ぶように促されます。Pro Microはatmega32u4を搭載しているので、29番を選びます。

メッセージの最後に、コンパイルのコマンドまで表示してくれます。親切ですね。

コマンドプロンプトでtreeコマンドを実行するとこんな感じ。

*:\****\*******\qmk_firmware>tree /f keyboards\1key
フォルダー パスの一覧:  ボリューム ****
ボリューム シリアル番号は ********* です
*:\****\*******\QMK_FIRMWARE\KEYBOARDS\1KEY
│  config.h
│  info.json
│  readme.md
│  rules.mk
│
└─keymaps
    └─default
            keymap.c

新しいファームウェアのひな型が出来ました!

キーマップ作製

まず、info.json を編集します。

     1  {
     2      "manufacturer": "KudoShusak",
     3      "keyboard_name": "1key",
     4      "maintainer": "KudoShusak",
     5      "bootloader": "atmel-dfu",
     6      "diode_direction": "COL2ROW",
     7      "features": {
     8          "bootmagic": true,
     9          "command": false,
    10          "console": false,
    11          "extrakey": true,
    12          "mousekey": true,
    13          "nkro": true
    14      },
    15      "matrix_pins": {
    16          "cols": ["D0"],
    17          "rows": ["D1"]
    18      },
    19      "processor": "atmega32u4",
    20      "url": "",
    21      "usb": {
    22          "device_version": "1.0.0",
    23          "pid": "0x0000",
    24          "vid": "0xFEED"
    25      },
    26      "layouts": {
    27          "LAYOUT_ortho_1x1": {
    28              "layout": [
    29                  {"matrix": [0, 0], "x": 0, "y": 0}
    30              ]
    31          }
    32      }
    33  }

変更したのは、15行目から18行目までの matrix_pins と、27行目から31行目までの layouts です。

matrix_pinsでは、キーマトリックスを構成するピンを指定します。
上の回路図で示した通り、Pro Microの5番ピンと6番ピンをタクトスイッチにつないでいるわけですが、ここには、atmega32u4 のピン(ポート)を書かなくてはいけません。Pro Micro のピンと、atmega32u4 のピンの対応表が必要です。
@mizuhofさんの記事にあった図を参考にさせていただきます。

@mizuhofさんの記事にあった図

ちなみに、元ネタは、https://qiita.com/mizuhof/items/c2f9eb173b21593d969e にある、"DOCUMENTS" タブから、"Graphical Datasheet" をクリックすると開くPDFファイルだと思います。

"Pro Micro" Graphical Datasheet

 また、layouts については、キーが1個しかないので、起点になる[0,0]の1行だけになります。

さて、次に keymaps/default/keymap.c を編集します。

     1  // Copyright 2023 QMK
     2  // SPDX-License-Identifier: GPL-2.0-or-later
     3
     4  #include QMK_KEYBOARD_H
     5
     6  const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     7      /*
     8       * ┌───┐
     9       * │ A │
    10       * └───┘
    11       */
    12      [0] = LAYOUT_ortho_1x1(
    13          KC_A
    14      )
    15  };

12行目から14行目がキーマップです。キーが1個しかないので、とりあえず "a" にあたる "KC_A" を設定します。

キーマップに定義するキーコードは、https://docs.qmk.fm/#/ja/keycodes を参考にします。

コンパイル

ソースコードのひな型を作ったときに出力されたコマンドでコンパイルします。

$ qmk compile -kb 1key -km default
コンパイル完了!

全て OK でコンパイルが完了しました。
ホームに指定したフォルダに "1key_default.hex" ができていることを確認します。

書き込み

公式ドキュメントによると、ファームウェアをキーボードに書き込む最も簡単な方法は QMK Toolbox を使うことだそうですので、QMK Toolbox を https://github.com/qmk/qmk_toolbox/releases からインストールします。

最新の qmk_toolbox_install.exe をダウンロードしてインストールしました。

Pro Micro をパソコンのUSBポートに接続し、QMK Toolbox に、1key_default.hex を読み込ませます。

ブレッドボード上に構成したリセットボタンを1回押すと、数秒間だけ QMK Toolbox の [Flash]ボタンが押せるようになるので、ここをクリックします。

書き込み完了!

しばらく待つと上の図のようなメッセージが出て書き込み完了です。

試し打ち

試しにタクトスイッチをポチポチ押してみます。

aaaaaa

入力できた!

めでたく"a"が入力できました。やったー!

とりあえず、ブレッドボード上ではあるもののQMK Firmwareを使ってUSBキーボードを作る手順が確認できました。

一通りのドキュメントの場所も確認できましたので、これらを参考に機能追加&工作を進めていきます。

(続く)


頂いたサポートは今後の記事作成のために活用させて頂きます。