はじめに

今回使ったArduino Micro互換機What's Next Pinkに関する件と、ファームウェア関係についていろいろやってみた件を書いていきます。

ここの記述は基本的に2020年前半のものです。

失敗を修正

マイコンボード再選定

前年の失敗を踏まえ、以下のように考えました。

という事でもう一度Arduino Microを買おうかと思いましたが、互換機の「What's Next Pink」を購入しました。800円ほど安かったんで。

Arduinoの互換機も怪しいのがいろいろあるようなのですが、これは調べた限りでは大丈夫そうな感じです。オリジナルとの違いは、本体にピンの番号が印刷されてないくらいとか……。公式サイトがなくなってるっぽいというか、ドメイン名は別の業者に買われたのかなって感じで、その辺が少し気になるのですが。

買ったら練習とかせず、配線してファームウェアを書き込んでしまいます。

ファームウェアひな形製作の件

前回、キーの配置を描いてできる配線図がぐちゃぐちゃになる事、ピンの番号が判らない事で、作業が止まりました。

配線図について

Keyboard Layout Editorでレイアウトを作ったとき、テンキー部を45度傾けたり、十字キーを再現したりしました。配線図がぐちゃぐちゃになったのはこの辺が原因かなと思いまして。いっそのこと、キーマトリックス表のように格子配列で単純に描いた方がいいかなと。

ピンの番号について

Arduino Micro本体やWhat's Next Pinkについてくるピンアウトシート(図にピン番号が描かれている)にも見当たらない、BやCやDから始まる番号ですが、探し回ってたらピンの名前が数種類書かれた画像を見つけました。当時見つけたのとは違いますが、こんな感じ

図を見ると、「Port Pin」のところに「PB2」「PC7」とか書かれてます。これって、共通している最初の「P」をとれば「B2」「C7」とか、Keyboard Firmware Builderの「PINS」タブにあったピンの番号になるのでは……。この辺はいくつかのサイトでも書かれており、間違いないようです。

あとで気がつきましたが、公式販売サイト?にも、PNG形式とPDFで「PD6」などのピン番号が併記されている図がありました。両方とも「PD1」が2つありますが……。

Keyboard Firmware BuilderとQMK Firmware

Kbfirmwareを使いこなすという記事を知りました。あと、オリジナルキーボードのファームウェア作成で以下のサイトの記事を知りました。

これで、次のように作業を進めてみます。

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

という事で、製作に戻ります。

ファームウェアのひな形製作

Keyboard Layout Editor

レイアウトを作る

Keyboard Layout Editorでレイアウトを作りました。キーマトリックスそのまま。

無変換やカナといった日本語のキーはどう書けばいいのか判らないというかこれでは無理っぽいので、適当にローマ字で。

できたらRawデータと一応JSONファイルも保存。

Keyboard Firmware Builder

配線図

Keyboard Firmware Builderで、Raw dataを白いところにペーストして、下の「Import」をクリック。

配線図はわかりやすいです。必要なピンの数も21本なので大丈夫です。

ピンの指定

調べたピンの番号を割り当てていきます。LEDにも割り当てます。

キーマップ

キーマップのタブ。いくつかのキーが「NO」になっています。後で修正するつもりなので、このままでいきました。

SETTINGタブ

Layout Nameは、物理配置の製作番号B02を書きました。Bootloader Size以下の値はデフォルトで。

Save ConfigurationをクリックでJSONファイルがダウンロードできるので、保存しておきます。

次のCompileタブでは、hexファイルとzipファイルがダウンロードできます。とりあえず両方とっておきました。

KBFirmware JSON to QMK Parser

すぐに変換された

KBFirmware JSON to QMK Parserで、KBFirmwareのJSONファイルをQMKのデータに変換します。

「Select a KBFirmware-formatted JSON file.」の隣に先ほど保存したJSONファイルをドラッグ&ドロップ。すぐ変換されました。

タブごとに内容を全てコピーし、タブ名のテキストファイルとして保存。以下の名前のファイルを保存します。

<keyboard>はキーボードの名称という事で、私の場合は先にLayout Nameで書いた「B02」を使い、「B02.c」「B02.h」というファイル名にしました。

上記画像のkeymap.cですが、「KC_ENT」「KC_Y」等と書かれています。キーコードというやつですね。Keyboard Firmware Builderのキーマップのタブで、「NO」と表記されていた箇所が「xxxxxxx」となっています。これまた後で修正するつもりなので、ここはこのままで。

この後ビルド環境を作り、テンプレートを作成したら、そこに内容をコピーします。

変換前後の比較

変換前後のkeymap.cを見比べました。Keyboard Firmware BuilderのCompileタブでダウンロードしたzipファイルを解凍したところ、「qmk_firmware」という名前のフォルダになりました。qmk_firmware\keyboards\kb\keymaps\default\にkeymap.cがありました。みてみると、インジケータLED関係の(ような気がする)コードがあります。変換後のにはありませんでした。

void led_set_user(uint8_t usb_led) {

	if (usb_led & (1 << USB_LED_NUM_LOCK)) {
		DDRD |= (1 << 6); PORTD &= ~(1 << 6);
	} else {
		DDRD &= ~(1 << 6); PORTD &= ~(1 << 6);
	}

	if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
		DDRB |= (1 << 7); PORTB &= ~(1 << 7);
	} else {
		DDRB &= ~(1 << 7); PORTB &= ~(1 << 7);
	}

	if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
		DDRB |= (1 << 6); PORTB &= ~(1 << 6);
	} else {
		DDRB &= ~(1 << 6); PORTB &= ~(1 << 6);
	}

	if (usb_led & (1 << USB_LED_COMPOSE)) {
		
	} else {
		
	}

	if (usb_led & (1 << USB_LED_KANA)) {
		
	} else {
		
	}

}

変換で省かれたインジケータLED関係の(ような気がする)コード

KBFirmwareでは意味があるけどQMK Firmwareだとダメってやつなのでしょうか。NumLockのピンがD6、Caps LockがB7、ScrollLockがB6というのを考えると、あの行はピンを表しているのかなという感じはあるのですが、所詮プログラマではないので判りません。

判らないならそのままにしておけって話なのですが、変換後の方に上記のコードを付け足しておきました。ダメならエラーが出るだろうからそのとき外せばいいやという単純な思い込みの元に。

ビルド環境作り

2021年06月08日追記。ここでの記述はどれも2020年前半のものですが、特にビルド環境作りは変わりました。2021年5月にOSをクリーンインストールした際は、最新のバージョンを使って下記の手順を試したところ、途中で反応がなくなったため、QMK MSYSをインストールしています。

MSYS2をインストールします。以下のサイトを参考にしています。

MSYS2をインストール

MSYS2のサイトからインストーラをダウンロード、実行します。ファイル名は「msys2-x86_64-(年月日).exe」。

インストールフォルダを指定し、ショートカットはデフォルトで、インストール開始。

途中、ファイアウォールが反応しました。「pacman.exe」はこの後打ち込むコマンドのやつだなと思い、許可。

インストール終了

「今すぐ MSYS2 64bit を実行します」にチェックが入っているのを確認して完了をクリック。インストーラが終了し、MSYS2が起動します。

MSYS2を最新の状態に

起動したら次のコマンドを打ち込んで実行しました。打ち込まず、適当なテキストファイルに書いてコピー&ペーストしただけだったかも。大文字小文字も意味があるんでしょう。

pacman -Syu

途中、「警告」で始まる2行のメッセージが出て止まりました。

止まる

右上の終了ボタンをクリックして終了。インストールしたフォルダからmsys2.exeを実行し、再び起動。再度同じコマンドを実行。

pacman -Syu

選択する場面では、「Y/n」なら「Y」を選択。

そのうち完了し、プロンプトが出て止まります。

止まった辺りでOptionでいろいろ変更。フォントをWZ Editorで使っている等幅フォントに指定。大きさは12、ウィンドウは98×42を指定。

これで一旦終了。

QMK Firmware導入

QMK FirmwareをGithubからダウンロード。この辺はプログラマーではない人向けのQMK Firmware入門を実行しています。

サイトで紹介されていたzipファイルの場所は、GitHub - qmk/qmk_firmwareClone or download→[Download ZIP]のURLでした。

zipファイルの場所

展開したフォルダは、「qmk」と短い名前に変更し、適当なところに置いてます。短くしたのは、「qmk_firmware」だと長いなあというそれだけの話です。

続いてMSYS2(msys2.exe)を起動。作業を行うフォルダをqmk(名前を短くしています)に移動し、コマンドを実行します。

cd /c/software/program/qmk
./util/msys2_install.sh

qmkフォルダがc:\software\program\にある場合

選択する場面では、「Y/n」なら「Y」を選択。(a/c/f/N)ならAllを示すa。

この辺でファイアウォールが反応したら許可しておきました。「wget.exe」は許可。

完了
Installation completed!
Please close this Winodw and restart MSYS2 MinGW

上記の2行がでたら終了。一旦閉じます。以降は「mingw64.exe」を使用……、と、ascii.jpの記事に書いているように見えるし、私はそうしているのですが、人様の記事(のスクリーンショットに写っているコマンドプロンプト)をみると「msys2.exe」を立ち上げているように見えます。どっちでもいいのでしょうか……。

ファームウェア製作

ファームウェアを製作します。以下のサイトを参考にしています。

テンプレート作成

この辺はQMK Firmware でオリジナルキーボードのファームウェアを作成するに書かれている事を実行しています。

MSYS2(msys2.exe)を起動。作業を行うフォルダをqmkに移動し、コマンドを実行します。

cd /c/software/program/qmk
./util/new_keyboard.sh

実行すると、キーボードの名前、タイプ、(制作者の?)名前を聞かれました。この手のはたぶん、いわゆる半角英数字が無難なのでしょう。タイプはデフォルトでいいようなので、そのままエンターキーを押しました。

キーボードの名前は、KBFirmware JSON to QMK Parserで使った「B02」を使いました。

Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %YEAR% with 2020... done
Replacing %KEYBOARD% with B02... done
Replacing %YOUR_NAME% with Mule,KOUNO Motoo... done

Created a new keyboard called B02.

To start working on things, cd into keyboards/B02,
or open the directory in your favourite text editor.

qmkフォルダの\keyboards\B02\以下にテンプレートが作成されました。念のためコピーをとって別名で保存しています。

移植

この辺は主にKbfirmwareを使いこなすに書かれている事を実行しています。

KBFirmware JSON to QMK Parserで変換してできた6つのファイルを、テンプレート作成でできたファイルにコピー&ペースト。

Kbfirmwareを使いこなすにも明記されていますが、config.hが2箇所にあります。コピー&ペーストで書き直すのは\keyboards\B02\にある方で、\keyboards\B02\keymaps\default\にある(keymap.cと同じ階層)ファイルサイズの小さい方はそのまま。

「rules.mk」は一箇所書き換えます。この辺は8.QMK Firmwareの設定と書き込み【手配線で自作キーボードを作る講座】を参考にしました。

ブートローダーの設定を、BOOTLOADER = atmel-dfuからBOOTLOADER = caterinaに変更しました。What's Next PinkはArduino Micro互換機でマイコンはATmega32u4搭載なので、Pro Microと同じ扱いだろうと思いまして。

# Bootloader selection
#   Teensy       halfkay
#   Pro Micro    caterina
#   Atmel DFU    atmel-dfu
#   LUFA DFU     lufa-dfu
#   QMK DFU      qmk-dfu
#   ATmega32A    bootloadHID
#   ATmega328P   USBasp
BOOTLOADER = caterina

この後、放置していたkeymap.cをきちんと書き直します。「xxxxxxx」になっていた箇所を、キーマトリックスとQMKのキーコードをみながら修正します。

ファームウェア書き込み

いよいよビルドして書き込みを行います。MSYS2(msys2.exe)を起動して作業を行うフォルダをqmkに移動し、コマンドを実行します。「make B02:default」と打ち込んでエンターを押した後、少し間が開きました。

エラー発生

cd /c/software/program/qmk
make B02:default
Making B02 with keymap default

make[1]: ディレクトリ '/c/software/program/qmk' に入ります
tmk_core/protocol/lufa.mk:14: lib/lufa/LUFA/makefile: No such file or directory
make[1]: *** ターゲット 'lib/lufa/LUFA/makefile' を make するルールがありません.  中止.
make[1]: ディレクトリ '/c/software/program/qmk' から出ます
Make finished with errors
make: *** [Makefile:579: B02:default] エラー 1

のっけからエラー発生です。落ち着いて「'lib/lufa/LUFA/makefile' を make するルールがありません」をコピーし、ググってみます。最初にヒットしたサイト【DZ60】ファームウェアをmakeできない - 蟹好きのメモを読みました。なるほど、あるはずのものがないのね。確認しましたが、本当にありませんでした。

という事で、GitHub - qmk/lufaに行き、Clone or download→[Download ZIP]でアーカイブファイルをダウンロード。解凍した中身をQMK Firmwareの\lib\lufa\に移します。

またエラー発生

作業を再開したところ、2回エラーが出ました。最初のはエラーメッセージが大量に出ます。調べたところ、keymap.cの冒頭コメントの前に「Keypad ,Keypad ,」という文字が。

削除して作業を再開すると、今度は別のエラー。

Compiling: keyboards/B02/keymaps/default/keymap.c                                                  keyboards/B02/keymaps/default/keymap.c: In function 'led_set_user':
keyboards/B02/keymaps/default/keymap.c:52:2: error: expected declaration or statement at end of input
  }
  ^
 [ERRORS]

再度keymap.cをテキストエディタで開き、52行目をみます。さらに前後をみると……、閉じ括弧が1個足りませんでした。2個のエラーはどちらもコピー&ペーストのミスみたい。

ビルド完了

作業を再開しました。今度は最後までいったようです。

完了

qmkフォルダの下に.buildフォルダができており、以下のファイルができていました。

付け足したインジケータLEDのコードは、エラーが出なかったみたいです。本当によかったんだろうかと妙な感じ。実際キーの挙動で点灯消灯するかは判りませんが。

書き込み

キーボード(What's Next Pink)のUSBケーブルをPCに接続します。Windowsが何か反応するかなと思いましたが、特に何も無かったはず。

MSYS2(msys2.exe)を起動して作業を行うフォルダをqmkに移動し、コマンドを実行します。

cd /c/software/program/qmk
make B02:default:avrdude

しばらくすると Detecting USB port, reset your controller now. と表示され、ピリオドが増えていきます。そこでコントローラ(What's Next Pink)のリセットスイッチをダブルクリックすると、作業が進んでいきます。

リセットスイッチを押す回数ですが、1回とか、最初は2回で次からは1回とか、いろいろあるようです。うちの場合は1回ではダメでした。いつも2回押してます。

うちの場合、コントローラはプレートの裏に固定しており、リセットスイッチを押すときはネジ6本を外してキーボードを開き、プレートを立てて押しています。リセットとGNDのピンから線を引っ張ってタクトスイッチにつなぎ、表側に付けるべきでした。3号機はそうしよう。

エラーが出ずに終わったら完了みたい。めでたしめでたし。

確認・修正

これまでの作業は、普通のキーボードを使い、KeySwap for XPでキーバインドを一部変更した状態で使ってきました。

keyswapで全ての設定を削除してキーバインドを標準に戻し、ログオフ→ログイン。見えるキーボードで、設定したキーが設定通り打たれているかを確認しました。おかしなのが3箇所。

@がshift+2ってあたりは英語キーボードって感じです。

という事で、keymap_jp.hというのを使ってみます。はじめてのQMKキーマップ編集 JISキーボード系の記号ってどれ?等を参考にしました。

keymap.cに#include "keymap_jp.h"を付け足し、おかしかったキーを修正(KC_から始まる名前をJP_のものに変更)します。終わったら再ビルドして書き込み。

確認しましたが、うまくいっているようです。JP_UNDS で、シフトキーを併用しないでもアンダースコアがでるのは面白いです。「見えるキーボード」で見ると、キーを押しただけでshift+\が表示されます。

インジケータLEDは、やはりというか点灯しませんでした。念のため、GNDの線を外しておきます。

2020年5月30日、オリジナルキーボードが一応完成となりました。キーキャップは全部作り直しだし、キーマップは変わるだろうしで、本当の完成はまだ先の話ですが、最初の完成という事で。

インジケータLED

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に変更)のはダメでした。その後ScrollLockのLEDが反応するようになりましたが、#include "led.h"の一行を加えたからかもしれませんし、違うかもしれません。ということで2020年6月28日現在、CAPSLockのLED以外は言うことを聞いてくれるようになりました。

2020年07月03日追記。CAPSLockのLEDにつながる線が外れていたのを発見。半田付けをやり直したところ、SHIFTCAPSLockで点灯と消灯を確認しました。情けなさ過ぎ。

ATOKだとCAPSLock単体で英語入力モードのトグルスイッチになるので、シフトキー無しでも点灯してくれるとうれしいのですが、そういかないのは仕方ないところでしょうか。

とりあえず、うちの環境では3個のインジケータLEDが動くようになりました。

文書更新履歴

2022年01月23日
「修正編」から「インジケータLED」記事を移動。
2021年06月08日
冒頭と「ビルド環境作り」に注意書きを追加。
2020年06月20日
このページを公開。