はじめに

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

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」を新しいものに差し替え、ビルドを実行。エラーもなく無事に完了しました。その後実際に書き換えましたが、無事に使えています。

インジケータ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日
このページを公開。「ソフト編」を大幅に変更。