はじめに

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

失敗を修正

マイコンボード再選定

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

という事でもう一度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というのを考えると、あの行はピンを表しているのかなという感じはあるのですが、所詮プログラマではないので判りません。

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

ビルド環境作り

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日、オリジナルキーボードが一応完成となりました。キーキャップは全部作り直しだし、キーマップは変わるだろうしで、本当の完成はまだ先の話ですが、最初の完成という事で。

文書更新履歴

2020年06月20日
このページを公開。