HandiPiの手のひらサイズのキーボードを作ってみた

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。

この記事の作例もJLCPCBに基板を発注して実現しました。

HandiPiとは?

今回作るのは手のひらサイズのキーボードです。

自分で設計してもよいのですが、今回はHandiPiという手のひらサイズのRaspberry Piコンソールのプロジェクトのキーボード部分のデータがオープンソースになっていたのでそれを使うことにしました。 (というかこのHandiPiのキーボードに一目ぼれして、作ってみよう、と思い立ったというのが正確なところです)

https://github.com/brickbots/HandiPi より

このキーボードは、大半がスルーホール部品で構成されており、基板と少しの追加部品を購入すれば我が家の部品箱にある部品で作れそうでした。

Miryokuとは

このキーボードはMiryokuというキーボード配列を採用しています。

github.com

これは36キーのキーボード配列で、様々なキーボードファームウェアでこの配列を利用できます。 今回はQMK版のmiryoku_qmk/users/manna-harbour_miryoku at miryoku · manna-harbour/miryoku_qmk · GitHubを使用します。

横10列のキーと、下の6つのキーが存在し、下の6つのキーでレイヤーを切り替えながら、横10列のキーを打鍵するというスタイルです。

https://github.com/manna-harbour/miryoku/tree/master/docs/reference より

下の6つのキーのどれか一つを親指で押さえながらほかのキーを打鍵することで、数字や記号を入力することが出来ます。 この配列の賢い点は、抑える親指と反対の手のキーのみに配列が割り当てられていことです。

具体的には、右下真ん中を押下したNumというレイヤーの配列の場合、数字キーは左手側にテンキーの配列で割り当てられています。

https://github.com/manna-harbour/miryoku/tree/master/docs/reference より

一方、左真ん中を押下したNavというレイヤーの場合は、カーソル移動のキーは右手側に割り当てられています。

https://github.com/manna-harbour/miryoku/tree/master/docs/reference より

細かいカスタマイズの設定も用意されています。

上のキーの割り当て表を見て謎のキー配列だと思う方もいるかもしれませんが、これはColemak Mod-DHという配列のようです。HandiPiではこの配列ではなくなじみのあるQWERTY配列のオプションを選択しています。また、それに合わせてカーソルキーをVIライクなH,J,K,Lに変更するオプションも有効にしています。

発注までの流れ

下記のプロジェクトのリポジトリに、KiCADの設計ファイルやガーバーデータが置いてあります。

github.com

KiCADの設計ファイルを使うと、オリジナルを少し改変したものを作ることもできますが、今回はそのままガーバーデータを使い、全く同じものを発注することにしました。

トッププレートと、ボトムプレートの2種類の基板が必要となります。

それぞれを5枚発注して$7×2 + 送料となりました。 (ほかの基板と一緒に発注したので$7になりましたが、JLCPCBでは1枚目の基板が安くなるはずです)

トッププレートは1mm厚、 本体基板は通常通りの1.6mm厚で注文しました。

必要な部品の購入

このキーボードをつくるにあたって必要な部品はそれほど多くありません。

メインマイコンのATMega328PはArduino UNOのメインマイコンとして有名なもので、我が家にも在庫がいくつかありました。 またその周辺部品として必要な16MHzの水晶発振子、や22pFのコンデンサ、バイパスコンデンサである0.1uFのコンデンサなども家にありました。

キーボードのスイッチとなるのも、一般的な6mm角のスイッチで、これは秋月電子で売っているものがありました。これは比較的軽い押し心地で、コスパもよいのでお勧めです。

ファントムキー防止のためのダイオードは表面実装のものが必要です。これもちょうど家にあったので、買う必要はありませんでした。

このキーボードはATMega328Pにソフトウェア的にUSB HIDを実装するV-USBというライブラリを使用します。そのため、USB周りのちょっと普段は使わない部品が必要です。

具体的には 75Ωの抵抗と、3.6Vのツェナーダイオードです。これは家になかったのでAliExpressで注文しました。 また、4方向スイッチもそれっぽいものをAliExpressで注文しました。(が、このスイッチは現状のファームウェアではうまく動きませんでした)

ATMega328Pへのファームウェアの書き込み

さて、基板と部品がそろったら、いよいよ組み立てたいところなのですが、、まずはメインマイコンであるATMega328Pにファームウェアを書き込む必要があります。

しかし、リポジトリを眺めても、どうもファームウェアの作り方についての詳細が記載されておらず、Issueで聞いてみることにしました。

github.com

この件は私のほかにも気になっていた方がいたようでした。 親切にも作者の方がビルドに必要なリポジトリの場所と、コマンドラインを教えてくれました。

私はDocker環境でこれを実行し、必要なhexファイルを作りました

# リポジトリをcloneする
$ git clone https://github.com/brickbots/qmk_firmware
$ cd qmk_firmware
$ git checkout handipi

# submoduleをpullする
$ git submodule init
$ git submodule update


# docker上のQMK環境に入る
$ docker run -it -v //`pwd`:/qmk_firmware -w //qmk_firmware qmkfm/qmk_cli

# 教えてもらったコマンドラインでビルドする
$ make clean handipi:manna-harbour_miryoku:flash MIRYOKU_ALPHAS=QWERTY MIRYOKU_NAV=VI

ここまでを実行すると handipi_manna-harbour_miryoku.hex が生成されます

qmkをDockerではなく直接マシンにインストールしていればこの流れで書き込みができるようなのですが、自分は手元の環境にいろいろ入れたくなかったのでDockerを使ったため、マイコンへの書き込みは別途avrdudeコマンドを使うことで行いました

$ avrdude -c diecimila -p m328p -b19200  -U flash:w:handipi_manna-harbour_miryoku.hex -v

さて、順番が前後しますが、ATMega328Pにファームウェアは焼いたものの、fuse bitの設定が出来ていません。 デフォルトのfuseの設定ではうまく動作しないので、こちらも設定します(qmkで焼くときはfuseの設定もうまくされるのだろうか?)

miryoku_qmk/docs/fuse.txt at miryoku · manna-harbour/miryoku_qmk · GitHub ここを見るとATMega168でのfuseの設定例が載っているので、これと同じような設定をATMega328Pでも設定すれば良さそうです。

大事そうな設定は、外部水晶発振を使用することと、クロックを1/8しない(CKDIV8 = 1)くらいだと思います。

AVR® Fuse Calculator – The Engbedded Blogを使って、fuseを計算すると、lfuse 0xEF, hfuse 0xD9, efuse 0xFEとなりました。

ということでこのfuseを書き込みます

$ avrdude -c diecimila -p m328p -b19200  -U lfuse:w:0xef:m -U hfuse:w:0xd9:m -U efuse:w:0xfe:m

組み立て

ひとまずキーボードとダイオード以外の部品をはんだ付けします。

22pFのコンデンサは表面実装のものしかなかったので、スルーホールのフットプリントの上に無理やり乗せました 1.5kΩの抵抗も手元になかったので1kΩの表面実装抵抗3つをうまく使って1.5kΩの抵抗を作りました。

USB部分はコネクタではなく、4本の配線が出ているだけだったので、動作テストのためには古くなったマウスのUSBケーブルを切り取ったものをつなげてPCに接続してみました。

うまくいくとPCでUSB機器として認識されます。

この状態でキー1つと対応するダイオードを取り付けると、キーボードとしての動作も確認できます。

ここまでくれば後はすべてのキーとダイオードを実装します。

ダイオードは表面実装で、数も多いので実装が大変ですが、黙々とはんだ付けします。

動作確認

キーを順番に押して行って、すべてのキーが想定通りに動作するか確認します。

自分の場合ははんだ付けがうまくいってなかったり、製作の過程で基板に傷をつけて、断線してしまっている箇所があり、ここで少し苦労しました。

Miryokuの組み合わせキーも試してみると、マウスの操作もこのキーボードでできることが確認できました。

まとめ

HandiPiプロジェクトのキーボード部分のデータを利用して、自分でも手のひらサイズのキーボードを自作できました。 HandiPiのようにRaspberryPiと組み合わせて手のひら端末を作るのも良し、ほかのマイコンボードと組み合わせるにも良しの、便利なモジュールだと感じました。

組み立ての過程でATMega328PをUSB HIDとして利用するためのV-USBや、QMKを使ったキーボードファームウェアのビルド、Miryokuという面白いキー配列の知識も学ぶことが出来ました。

自分で基板を設計するのも勉強になりますが、こういうほかの人の作例を真似して作ることでも、多くの学びを得ることが出来ることも実感しました。

最後に、この基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板はこちらにまとめています。)