11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【電子工作 / PCB】自作キーボード製作のテストなどで便利に使える『Key Matrix Tester(キーマトリクステスター)』を製作しました!

キーマトリクス配置に接続した複数のキー(スイッチ)のテストを簡単に行うことが出来る『Key Matrix Tester(キーマトリクステスター)』を製作してみました。

キーマトリクス配置(キーマトリクス配列)とは、キーボードなど多くのスイッチを扱う場合によく用いられる物理的な配線方法のことを指し、スイッチ状態の判定(ON/OFF)を効率的に行いマイコンに接続するのに必要な端子の数を少なくする事が出来る方法です。

例えば自作キーボードの製作では多くのスイッチの判定を行う必要があるわけですが、それら全てのスイッチ判定を行うためには通常の接続(スイッチ1つに対しマイコンの端子を1本割り当てる)ではかなり多くの接続端子がマイコンチップまたはマイコンボード側に必要となってきます。

マイコン側で使えるGPIOピン(入出力端子)の数には限りが有り、そしてあまり効率的ではないためそこで用いられるのがスイッチの物理的な接続(配線)をマトリクス配置にして必要なピン数を減らすという方法を取るのが一般的です。

キーマトリクスによるスイッチの配置は理屈が分かれば難しいものではありませんが、テストをしたい場合に必要な数のスイッチを用意しブレッドボード等でそれを組むのは結構面倒な作業となります。
そこでそのような作業を簡略化出来るボードを製作しました!

Key Matrix Tester(キーマトリクステスター)の製作!

電子工作で自作キーボードにも興味を持ち最近いくつか自作キーボードやキーパッドを製作したのですが、設計段階のテスト回路やファームウェア作成時の動作テストが出来る物理回路を用意するのは面倒な作業になるかと思います。
キーボードって結構多くのスイッチを使っているので、それをブレッドボードやユニバーサル基板などで再現するのはかなり大変です!

こちらは47キーの40%サイズの自作キーボードを製作した際に動作テスト&ファームウェア作成のためにブレッドボードで組んだスイッチ部分です。
キーマトリクスでスイッチを配置するためにダイオードの接続や行(row)/列(col)の端子を用意したりと・・・これを毎回やるとなるとかなり面倒な作業になります。

自作キーボードの製作に慣れている方ならこのような物理回路が無くてもファームウェアの作成等は出来ると思いますが、実回路で動作を確認しファームウェアも作っておけばメイン基板にパーツを実装しファームウェアを書き込んだ際不具合がある場合に問題切り分けも簡単に出来ることから、私はいつも基板設計前に物理的な実回路を使ってファームウェアを作るようにしています。

キーマトリクスの物理的な接続方法はそれほど難しいものではありませんが、これを毎回ブレッドボード等を使い作るのは非常に面倒になるので、16列6行(計96スイッチ)までの数に対応したキーマトリクステスターを製作しました。
さらに多くのスイッチが必要なテストをする場合も連結して増やすことも出来ます。

キーマトリクス配置(配列)とは?

製作したボードの説明の前に、そもそもキーマトリクスとはどんなものなのか簡単に説明しておきます。

QMKといったキーボード用のファームウェアは標準でキーマトリクスに対応しています。
スイッチをマトリクス配置で接続し、既存のマイコンボードに接続して対応したファームウェアを書き込めば簡単にキーボードとして動作してくれます。

Pro MicroやRaspberry Pi Picoといった既存のマイコンボードでは使えるGPIO端子(入出力端子)の数に限りがありますが、スイッチをキーマトリクス配列に接続することにより必要なピン数を減らしより多くのスイッチ判定に対応しているということです。

通常マイコンを使ったスイッチのON/OFF判定はGPIO端子にスイッチを接続しLOWレベルになるとスイッチが押されているといった判定を行うのが一般的です。(マイコン側でプルアップ)

しかしこの接続ではスイッチ1個に対してマイコン側のGPIO端子が1つ必要となってくるので、端子の数に限りがあるマイコンチップやボードではそれほど多くのスイッチ判定を行うことが出来ません。

そこで多くのスイッチ判定が必要となるキーボードなどではキーマトリクス配置(スイッチの物理的な配線方法)にすることにより、少ない数の端子で効率的にスキャンし多くのスイッチ動作を検出する方法が取られています。
これがキーマトリクスと呼ばれるものです。

例えば4×4で配置している場合16個のスイッチがあり、通常ならマイコン側のGPIO端子が16本必要になることになります。
これをキーマトリクス接続すると、列(COL)に4本(COL0/COL1/COL2/COL3)そして行(ROW)に4本(ROW0/ROW1/ROW2/ROW3)の合計8本のGPIO端子のみで全てのスイッチ判定を行うことが出来るようになります。
各スイッチ間にダイオードを入れ、実際の接続はこのようになります。(下図はcol2rowでの接続です)

キーマトリクスのスキャン方法

キーマトリクス配置にしたスイッチの判定を行う場合、接続したマイコンは列(Col)または行(Row)に電圧をかけてスキャンを行い交差している部分(スイッチ部分)の信号を受け取った場合にキーが押されていると判別します。
スキャン方法には次の2通りの方法があります。

col2row(コル・ツー・ロー)

列(Col)に電圧をかけて行(Row)で信号を確認する方法です。(上図がこれにあたります)
列に信号を送信し、どの行が接続されているか(スイッチが押されているか)をチェックします。
全ての列に対して順番にスキャンを行いどのスイッチが押されているかを特定します。

row2col(ロー・ツー・コル)

こちらは逆に行(Row)に電圧をかけて列(Col)で信号を確認する方法です。
行に信号を送信し、どの列が接続されているか(スイッチが押されているか)をチェックします。
全ての行に対してスキャンを行いどのスイッチが押されているかを特定します。

信号の方向が上図col2rowとは逆になるのでダイオードの向きも逆になります。

ゴースト対策

キーマトリクスでは上図のように各列(または行)を順にスキャンして押されているスイッチを判定するわけですが、複数のスイッチが同時に押されると「ゴースト」と呼ばれる誤検出が発生する場合があります。

これを防ぐためにダイオードを使用して信号が逆流しないようにするのが一般的です。
col2row接続とrow2col接続では信号の向きが逆となるので、物理的なダイオードの接続向きも逆になります。

QMKといったキーボード用ファームウェアではどちらにも対応しています。
物理的に接続したダイオードの向きによりソフトウェア側で指定するようになっています。
ちなみに今回製作したボードではcol2rowでの接続にしています。

ボードのイメージ

ザックリとですがキーマトリクス配置のイメージが掴めたかと思います。
マイコン側で使えるGPIO端子には数に限りがあるので、多くのスイッチを扱う場合キーマトリクス接続によりキー判定で使用するGPIO端子の数を少なくする事が出来るということです。

そしてキーマトリクスを用いたテスト回路をブレッドボード等を使い組む場合、先述のようにスイッチの数によっては結構大変になってきます。

そこで16×6でマトリクス接続し合計96個のスイッチが使えるボードを製作することにしました。
ある程度大きなキーボードにも対応することが出来る数だと思います。

マイコンと接続するROWおよびCOL端子はJST-PH2.0プラグ(赤枠部分)またはピンヘッダーorピンソケット(青枠部分)から取ることが出来ます。

JSTプラグが付いたケーブル(COLは8P×2本、ROWは6P×1本)を用意しておくと接続が簡単になりますが、通常のジャンパーワイヤーを青枠部分に接続しても問題ありません。

また、スペース的に余裕があったのでロータリーエンコーダーも1つ入れています。

ROW/COLピンは2列用意しているので、1列目はマイコンボードとの接続に利用し、もう1列は例えばエンコーダーの押し込みスイッチの動作を特定の部分に入れたい場合や外部スイッチ等を接続するのにも利用出来ます。
また本ボードを複数連結しより多くのスイッチに対応することも出来ます。

ボードサイズは175mm×90mm、いいサイズ感にまとまっていると思います。

全体の回路構成はこのようになっています。
ダイオードの向き(キーマトリクス部分)の接続はcol2row接続としています。
QMKファームウェア等で使用する場合はソフトウェア側でcol2rowの指定を行って下さい。

基板の発注

基板の発注はJLCPCBを使いました。
基板データ(ガーバーファイル)をダウンロード出来るようにしておきます。
興味ある方は作ってみて下さい!

今回製作した基板のサイズは、各PCB製造メーカーが定める標準サイズ(10cm)よりも大きなサイズの基板となっています。
標準サイズを超える基板でもJLCPCBでは他のPCB製造メーカーに依頼するよりかなりお安く製造する事が出来るのでオススメです!

発注時の選択項目は特に特記すべきところはありませんが、製造番号の削除オプション(PCB上のマーク)は無料で行えるので[マーク除去]を選択しておくといいかと思います。
あとはほぼデフォルトで選択されている項目を選んでおけば問題ありません!(PCBカラーはお好みで!)

MEMO
今回私が発注したものは[表面仕上げ]に金メッキ加工を行う[ENIG]を選択しています。
これは追加料金が発生するオプションとなります。
通常の[HASL]で発注しても本基板では特に問題はありません!

パーツの実装

配送方法はOCS Expressを選択し発注から8日ほどで手元に基板が届きました。
毎回早いですね、JLCPCB!

使用パーツは全てスルーホールパーツを使っているのではんだ付けは難しくはないと思いますが、タクトスイッチとダイオードは数が多いので結構時間がかかると思います。

スルーホールパーツはリードベンダーがあると綺麗にリード線を折り曲げることが出来るので一つあると便利です!

MEMO
ダイオードは取り付ける向き(極性)があるので注意して下さい!

パーツ実装後、フラックスクリーナーIPAを使い基板洗浄をすると綺麗に仕上がります!

【電子工作】はんだ作業にあると便利な必須アイテムたち!

使用方法

使用方法は至って簡単です。
マイコンボードに書き込んだQMKといったキーボード用のファームウェアで設定したRow/Col端子をそれぞれ対応した部分に接続するだけです。(QMKファームウェアの使用方法等はこちらでは割愛します)

自作キーボードの設計と並行してファームウェアの作成を行ったり、オープンソースで公開されているファームウェアの動作確認などでも便利に使えると思います。

またこれは本基板とは関係ありませんが、自作キーボードでよく使われるATmega32U4やRP2040のブレークアウトボードと組み合わせて便利に使うことも出来ます。

Pro MicroやRaspberry Pi Picoなど既存ボードではマイコンチップ(ATmega32U4やRP2040)の全GPIOピンを使うことが出来ませんが(ボードの内部機能で使われているピンなどがあるため)、自作キーボードのメインPCBを設計する際に既存ボードを使わずマイコンチップを直実装させる場合にはこのようなブレークアウトボード的なものと組み合わせて使うとより便利に使うことが出来ると思います。

【電子工作 / PCB】ATmega32U4の全GPIO端子が使えるブレークアウトボードの製作!自作キーボードのテスト環境にも便利に使えます。
【電子工作 / PCB】初めてのRP2040を使った基板設計。テスト回路を組む際に使える最小構成で組んだRP2040ブレークアウトボードの製作!

使用パーツ一覧

今回使用したパーツ一覧です。
一般的によく使われる形状やサイズのパーツばかりなので入手に関しては問題ないと思いますが、リンク先のページでサイズ等の確認を行って下さい!

パーツサイズ(数量)入手先
タクトスイッチ6×6mm(96個)
※高さはお好みで!
秋月電子 / AliExpress
ダイオード1N4148(97個)秋月電子 / AliExpress
ロータリーエンコーダーEC11 or EC12
スイッチ付き5pin(1個)
AliExpress
JST-PH2.0プラグ8pin(2個) / 6pin(1個)AliExpress
ピンヘッダー
ピンソケット
お好みでピンヘッダーまたはピンソケットを
取り付けて下さい!

最後に!

自作キーボードの世界にも足を踏み入れ自分で設計したキーボードやキーパッドを製作するようになったのですが、スイッチのキーマトリクス部分の物理配線が非常に面倒になることからこのようなキーマトリクステスターを作ってみました。

自作キーボードのメイン基板を発注している間にファームウェアを作り込んだり、またオープンソースで公開されているキーボードの動作確認をしたい場合などで実機がなくてもテストやキーマップの変更による動作確認に利用したりと・・・1台あると便利だと思います。
何かの参考になればと思います!

コメントを残す