はじめに

ファームウェア関係についていろいろやってみた件を書いていきます。

2020年に書いたソフト編の内容が古く、もう使わない方法を書いてたりするので、別に記事を起こしました。

2020年の話

ソフト編のまとめみたいなものです。

コントローラ

2019年、コントローラにArduino Microを選びました。よく使われるPro Microではピンが足りなかったので。

ブレッドボードで回路の勉強。Arduino Microが使えそうというのがわかりました。しかし延々とAを打ち出すプログラムを作ってしまったらしく、PCは絶不調になり、私の腕では修正もできなかったので、Arduino Microは使えなくなりました。

買い直そうとしましたが、800円ほど安かった互換機「What's Next Pink」を購入しました。

ファームウェア製作の件

以下のように作業を進めました。

  1. Keyboard Layout Editorでレイアウトを作る
  2. Keyboard Firmware BuilderにRawデータを渡してファームウェアを作る
  3. KBFirmware JSON to QMK Parserで、QMK Firmware用に変換する
  4. MSYS2、QMK Firmwareをインストール
  5. オリジナルキーボードのテンプレートを作成
  6. QMK用に変換したファイルをテンプレートにコピー&ペーストし、適時書き換え

2019年、Keyboard Layout Editorでキーの配置を描き、そのデータをKeyboard Firmware Builderにかけて配線図を出すと、ぐちゃぐちゃになりました。キーの配置を格子状に単純に書いたら解決しました。

ピン番号を指定するところがありましたが、Arduino Micro本体やWhat's Next Pinkについてくる図にない名称でした。調べるとピンの名前が数種類書かれた画像を見つけました。これを使ってピン番号を指定できました。

その後MSYS2、QMK Firmwareをインストール。QMK Firmwareでテンプレートを作成し、QMK用に変換したファイルをコピー&ペースト。多少修正を加えます。

ビルドしてエラーが出たら修正を繰り返し、良ければキーボードのコントローラに書き込み。

以上が2020年の話です。

2021年の話

新・ビルド環境作り

最初にビルド環境を作ったのは2020年前半ですが、その頃はMSYS2(Windows上で動くUNIXシェル環境)インストール後QMK Firmwareをインストールしていました。

2021年5月にOSをクリーンインストールした際は、最新のバージョンを使ったところ、途中で反応がなくなったため、QMK MSYSをインストールしています。

以下のサイトを参考にしています。

以下の手順は私の場合です。ソフトウェアの起動はランチャ(ぷちらんちゃ)を使ったりしています。

  1. 公式サイト・リリースページから最新版をダウンロード(QMK_MSYS.exe)
  2. QMK_MSYS.exeを実行
  3. インストールフォルダを指定 デスクトップにショートカットアイコン追加、ドライバなどにチェック
  4. インストール開始 ファイアウォールで確認が出たら許可しておく
  5. Finishで終了

[y/n]の選択が出たら y ですが、ここまでは特になかったかも。

続いて起動すると、DOS窓(言い方が古いか)の高機能版みたいなのが開きます。ConEmuというやつみたい。「こねむ」と読んでしまいましたが Console Emulator の略でしょうか。作業がやりやすくなるよう、これの設定を先に行いました。

  1. ショートカットアイコンをランチャに登録し、そこから起動 ConEmuが立ち上がる
  2. タイトルバーを右クリック→settingで設定変更
    • [General]、Interface language を日本語に すぐ日本語になる
    • [フォント]、メインコンソールフォントをテキストエディタ用のに変更 サイズは16
    • [サイズと位置]、幅108、高さ45
    • [マウス]、マウスボタンの操作で右:Edit menu
  3. 最下段、設定を保存。以後、設定の引き継ぎはインポートで

この後、QMK Firmwareのインストールを行います。

ファイアウォールで止まったら再度コマンドを実行。

  1. コマンドを実行 qmk setup --home C:(QMKのインストールフォルダのパス)
    • インストールフォルダをあらかじめ作っておくと止まってしまうので作らない
  2. 選択する場面では、「Y/n」ならy 保存場所と環境変数の確認で2回あった
  3. そのうち完了し、プロンプトが出て止まる。exitで終了

この後、自分のキーボードの設定ファイル類を元に戻します。

  1. (QMKフォルダ)\keyboards\ 以下のフォルダをetcフォルダに移す
  2. (QMKフォルダ)\keyboards\ に、バックアップをとっておいた自分のキーボード用フォルダを置く
  3. コンパイルして確認 make (キーボード名):default

これでビルド環境が復活。2021年いっぱいはこれで問題は出てきませんでした。

2022年の話

2022年は、QMK Firmwareをコマンドでアップデートしたところビルド不可になったり、QMK Firmwareをアンインストール→最新版インストールしたらinfo.jsonで引っかかったりと、いろいろありました。これ書いてる時点で1月なので、これからまだ何かあるかもしれませんが。

QMK Firmwareアップデート→ビルド不可

2022年初頭、QMK Firmwareが古くなってるかもしれないと思うようになりました。インストールしたのは2021年5月なので8ヶ月ほどそのままです。

データのバックアップをとった後、アップデート方法を検索。コマンド一発でアップデートをやってみましたが、一応完了。ただ、ビルドができません。なんだこれは。

よくわからないのでQMK MSYSをアンインストール。QMK MSYSとそのすべてのコンポーネントを完全に削除した後、最新のをダウンロードしてインストールしておきました。私にはこのほうが良かったみたいで。

info.jsonの形式が違う

QMK Firmwareを最新にして自分のキーボードの設定ファイル類を元に戻し、ビルドしたところ、エラーが出ました。

 Not including data from file: keyboards/B02/info.json
       layouts.LAYOUT: Additional properties are not allowed ('key_count' was unexpected)
 Not including data from file: keyboards/B02/info.json
       layouts.LAYOUT: Additional properties are not allowed ('key_count' was unexpected)
 Not including data from file: keyboards/B02/info.json
       layouts.LAYOUT: Additional properties are not allowed ('key_count' was unexpected)

info.jsonで「追加のプロパティは許可されていません(「key_count」は予期していませんでした)」……。私もこんなエラーが出るなんて予期してなかったよ。

おかしいと思い、QMK Firmware関連で一緒にインストールされた他の方のinfo.jsonを見比べてみました。

他の人の(左)と私の(右)info.json

他の人のはちょっと書き換えてます。とはいえ、右の私のと比べていろいろ簡単になってるように見えます。「key_count」もなければコントローラのピン番号の組み合わせ(キーマトリックス)みたいなのも無し。

公式の解説を読むと、info.jsonは必ずしも必要なものではなさそう。私はキーマップの書き換えにDOS窓みたいなのにコマンド打ってますが、その程度なら関係ないのかな。とはいえエラーが出るのは気持ち悪いのでなんとかしてみました。

2年前は以下の順でQMKの各ファイルを作っています。

  1. Keyboard Layout Editorでレイアウトを作る
  2. Keyboard Firmware BuilderにRawデータを渡してファームウェアを作る
  3. KBFirmware JSON to QMK ParserでQMK Firmware用に変換する

今回は、QMK Firmware用への変換を別のツールで行います。info.jsonだけなので、次の手順で作ります。

  1. Keyboard Layout Editorでレイアウトを作る
  2. Convert KLE raw to QMK info.jsonにRawデータを渡してinfo.jsonを作る

Keyboard Layout Editorですが、以前作ったテキストデータがあるので「Raw data」にコピー&ペースト。キーの名称のみ作り直しました。

キーの名称が抜けているところがあったりと、手を抜いております。私の場合は真っ白でも良かったかもしれません。

できたら下の「Raw data」をコピーして保存。

次にKLE を QMK info.json に変換(Convert KLE raw to QMK info.json)でRaw dataをコンバートします。

入力の欄に「Raw data」をコピー&ペーストして変換をクリックすると、QMK用に変換されたテキストが出力されます。これをコピーして「info.json」のファイル名で保存。

この記事作ってる時気づいたのですが、この変換サイト、日本語にもなったのね。実際に作業した二十日前には気づきませんでした。

改行などで見た目を整理 他の人のと同じ形式に

「info.json」を新しいものに差し替え、ビルドを実行。エラーもなく無事に完了しました。その後実際に書き換えましたが、無事に使えています。

2023年の話

2023年初頭、QMK Firmwareが古いのには気づいていたので更新することにしました。インストールしたのは2022年1月で更新もしていないので丸1年そのままです。

いろいろあった上、なんともならなかったこともありましたが、妥協して割り切りました。

QMK Firmware入れ直し

2023年1月7日の時点でQMK Firmwareのバージョンは0.19.6。私が使っているのは0.15.12。自作キーボード関係の方は0.18系が多いような気がします。

QMK Firmwareはアップデートの際に破壊的変更があるようで、ちょっと検索すると阿鼻叫喚の話がいくつかヒットしました。面倒なのでアップデートせず使い続けるという選択もありますが、ドキュメントの内容が整合付かなくなってきそうな気もします。

ということでQMK Firmwareをアップデートすることにしました。順序は以下の感じで。

  1. ファイルなどのバックアップをとる
  2. QMK MSYSをアンインストール
  3. 最新のQMK MSYSをインストール
  4. 最新の状態にする
  5. 前の環境ではうまくいったファイル類で試してエラーメッセージを確認
  6. 新しいキーボードを作って各ファイルの中身をみてみる
  7. keymap.cやinfo.jsonなどを手直し
  8. うまくいくまで手直し/ダメならまぁその時はその時ということで
少し詳しく

バックアップ

  • \QMK\keyboards\内の、私が使っているキーボードのフォルダを保存。
  • \QMK\keyboards\etc\内の他のキーボードのフォルダを一部保存(多いので)。
  • \QMK_MSYS\conemu\ConEmu.xmlを保存(ConEmuの設定ファイル)。

\QMK\keyboards\etc\は私が作ったフォルダで、他のキーボードのフォルダをまとめて移動しています。このフォルダを(一部)残すのは、QMK Firmwareのバージョンが上がったことで各ファイルの中身がどう変わったかを観たかったからです。破壊的変更にどう対応したのか参考になるかもと思いまして。

アンインストール

バックアップを済ませたらQMK MSYSをアンインストール。

[コントロールパネル]→[プログラムと機能]から「QMK MSYS」で右クリック、アンインストール実行。

キーボードの設定ファイルがあったQMKフォルダは削除。QMK MSYSフォルダは中身を削除。フォルダごと削除でも可。

QMK MSYSインストール

現時点で最新のをインストール。手順は今までと一緒。

最新の状態にする

QMK MSYS公式Frequently Asked Questions(よくある質問)、How do I keep my environment up to date?(環境を最新の状態に保つにはどうすればよいですか?)に書かれていることを実行。

# Update the package database and core system packages with:
pacman -Syu  

# If needed, close QMK MSYS, run it again from Start menu. Update the rest with:
pacman -Su

# Optional - update QMK CLI if a "native" package was not released to MSYS
python3 -m pip install qmk --upgrade

最新の状態になったら、私が使っているキーボードのフォルダをコピー&ペースト。

前の環境ではうまくいったファイル類で試してエラーメッセージを確認

とりあえず、各ファイルを修正せずそのままビルドしてみます。

黄色や赤い文字が出ているし「エラー」って日本語もあるので、このままではダメというのが分かります。
大量のエラー

英語は分からないのでDeepL翻訳にかけました。

  • config.hの *** は、もう有効なオプションではないので削除しよう
  • config.hの *** は、info.jsonの *** を優先して非推奨になったよ
  • フォルダ名 'B02' は '^[0-9a-z][0-9a-z_/]*$' にマッチしません

最初の2つは事前に調べたとおりなので分かりました。たぶんこの辺

3つ目は知りませんでした。フォルダ名というかキーボード名ですが、最初の文字は数字かアルファベット小文字なのね。2文字目以降はアンダースコアもありみたい。今まで「B02」で問題なくやってきたので意外でした。この辺の変更はもっと前だったんだろうか。

「B02.c」「B02.h」というファイルも小文字に替えます。フォルダ内をそれらのファイル名で検索をかけると(WZ Grepを使用)B02.cの中に「#include "B02.h"」とあったので、これも書き換え。

キーコードが変わった?

再度ビルドをかけると、前述のエラーは出なくなったものの、今度は違うエラーが。Num Lock と Scroll Lock のキーコードで引っかかったみたい。

ネット検索してみると、 qmk_firmware/docs/keycodes.md(2022年11月28日)に次の記述が。変わってたのか。

  • KC_SCROLL_LOCK  KC_SCRL
  • KC_NUM_LOCK     KC_NUM

とりあえず修正。この後、ビルドは無事終わりました。

このエラーはどうすれば

この後、とあるマクロを作って複数置いたものをビルドしてみると最後の最後で上記のエラーがでました。

私が書いたコードがおかしいと思ったのですが、どこがおかしいのかさっぱり分かりません。なので、他のところから手を付けてみました。

検索してみると、QMK Firmwareで、キーマップをmakeするときに出たエラーの対処方【備忘録】がヒット。avr-gccのバージョンをダウングレードしたのね……って、どうやるんだろうそれ。

とりあえず環境を変えてみようとQMK MSYSをアンインストールし、2022年12月20日のベータ版を入れてみました。ダウングレードしてみるなら昔のを入れればと思いましたがいろいろ変えたのがもったいないし、どのみちいつか新しくするならいっそのこと最新版を入れて、もしうまくいけば儲けものですし。

でもやっぱりダメだったので、今回作ったマクロは使わないことに決定。

その後は今のところなんとかやれています。

インジケータLED

2020年の様子

NumLockCAPSLock、おまけでScrollLockのインジケータLEDが点灯すればいいなあと思っていました。

とりあえず、コントローラのWhat's Next Pinkのピン出力の設定や配線など、ハードウェアの方は作っておきました。問題はソフトウェアの方です。

最初、Keyboard Firmware Builderでファームウェアを作ったときは、LED関係っぽいコードがありました。QMKのデータに変換した際、消されていたのですが、付け足しておきました。ビルドも、このコードによるエラーはなく、書き込みもできましたが、LEDは反応しませんでした。

自作キーボード系のネタは、ブログやTwitterなどチェックしていましたが、装飾用のLEDの話は多いものの、インジケータLEDの話はなかなか見つかりません。QMK Firmwareのkeyboards以下にある膨大な人様の設定を参考にしようかと思いましたが、さっぱり判りません。

どうしたものかと思っていたところ、2020年6月2日だったか3日だったかに、次のツイートを発見。

Pro MicroのLEDをCAPSロック等のステータス表示に使うのはこんな感じかと思います

#自作キーボード

github.com/MakotoKurauchi…

東京ばなないんさんの2020年6月2日のツイートより

ということで、うちの環境に合うよう、keymap.cを書き換えてみました。プログラムのことは判りませんが、とりあえずやってみようと。

#include QMK_KEYBOARD_H
#include "keymap_jp.h"

#define MICRO_LED_NUM D6
#define MICRO_LED_CAP B7
#define MICRO_LED_KNA B6

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//(キーマップ略)
    ),

};
void matrix_init_user(void) {
  setPinOutput(MICRO_LED_NUM);
  setPinOutput(MICRO_LED_CAP);
  setPinOutput(MICRO_LED_KNA);
}

void led_set_user(uint8_t usb_led) {
  if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
    writePinLow(MICRO_LED_NUM);
  } else {
    writePinHigh(MICRO_LED_NUM);
  }
  if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
    writePinLow(MICRO_LED_CAP);
  } else {
    writePinHigh(MICRO_LED_CAP);
  }
  if (IS_LED_ON(usb_led, USB_LED_KANA)) {
    writePinLow(MICRO_LED_KNA);
  } else {
    writePinHigh(MICRO_LED_KNA);
  }
}

当のkeymap.cはもうないので、今のを一部書き換えて再現

念のため切っていた配線をつなぎ直し、ビルドして書き込むと……、LEDが点灯しました。感激です。ついに点灯しました。しかし何かおかしい。点灯と消灯が逆になってるわこれ。

本当なら、NumLockのLEDが点灯し、CAPSLockとカナキーのは消灯しているはずです。逆になってます。ためしにテンキーを打ってみますが、やはり逆です。

これは弱ったと頭を抱えながらコードをみていると、「Low」「High」という単語が目に入りました。

これ……、逆にしたら点灯パターンも逆になるんと違うやろか。

ということで書き換え。

void led_set_user(uint8_t usb_led) {
  if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
    writePinHigh(MICRO_LED_NUM);
  } else {
    writePinLow(MICRO_LED_NUM);
  }
  if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
    writePinHigh(MICRO_LED_CAP);
  } else {
    writePinLow(MICRO_LED_CAP);
  }
  if (IS_LED_ON(usb_led, USB_LED_KANA)) {
    writePinHigh(MICRO_LED_KNA);
  } else {
    writePinLow(MICRO_LED_KNA);
  }
}

現在の様子(該当部のみ)

LEDが点灯しました。感激です。ついに点灯しました。しかも思っていたとおりのパターンで。これでテンキーが生きているか死んでるか一目でわかるようになりました。情報を公開&紹介してくださった方々に感謝です。

この後、リンク先のコードがシンプルになっていました。ためしに新しい方で書き換えたところ、最初のように点灯が逆パターンになります。シンプル版では「Low」「High」という単語はなく、どう変えればいいか判らないです。前のを知ることができたのは運がよかったのか。

といいますか、そもそも何で点灯が逆になるのかなってのがあるんですが、私には判らないので考えないことにします。私の方で、何か大切なことをやってないから、というのが一番ありそうなのですが。

ただこの時点では、キーに反応するのはNumLockのLEDだけで、CAPSLockとカナキー(その後ScrollLockに変更)のはダメでした。

その後CAPSLockのLEDにつながる線が外れていたのを発見。半田付けをやり直したところ、SHIFTCAPSLockで点灯と消灯を確認しました。これでうちの環境では3個のインジケータLEDが動くようになりました。

2022年に気づいたこと

公式サイトのLED インジケータで実装例を読んでいたところ、ふと目にとまりました。

led_update_kb() の実装例
// この例では、ピンは反転していて、
// low/0 は LED がオンになり、high/1 は LED がオフになります。
// この挙動は、LED がピンと VCC の間にあるか、ピンと GND の間にあるかどうかに依存します。

点灯が逆パターンになった件、これと関係あるんでしょうか。私はLEDをピンと GND の間でつなぎましたが、VCC の間につなぐものだったのでしょうか……。

とりあえずちゃんと動いてるので、この件は見なかったことにします。

文書更新履歴

2022年01月23日
このページを公開。「ソフト編」を大幅に変更。