オリジナルのマクロパッドを作ってみた

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

JLCPCBとは

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

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

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

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

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

オリジナルのマクロパッドとは?

マクロパッドというのはキーボードの補助として用いる、キーボードのような装置です。 一般的にはメインのキーボードよりキーの数が少なく、よく使う機能などを割り当ててパソコンの操作を簡単にするために用いるものです。

今回はこのマクロパッドを自作してみようと思います。

材料

  • マイコンボード
  • キーボードスイッチ
    • Gateron low-profile(hot-swap / direct) / Cherry MX
      • キーボードスイッチも2種類、固定の仕方も選べるようにしました
  • 128x64 OLED
    • なんとなく表示機がついている方が面白そうなのでつけました
  • オーディオジャック/表面実装スピーカー
    • なんとなく音が鳴ると面白そうだったのでつけました

キーボードスイッチ Gateron low-profile

Gateron low-profileはロープロファイルキーボードスイッチの中でも比較的安価なスイッチです。ロープロファイルキーボードスイッチにはKailh Choc V1/V2やCherry MX low-profileなど様々な種類があり、それぞれフットプリントが違うので基板を流用することが出来ない点に注意が必要です。(一方で普通のキーボードスイッチはCherry MX互換スイッチが多く、多くの場合は基板が流用できます)

ホットスワップソケット

ホットスワップソケットはGateron low-profileはフットプリントが独自なので専用のものが必要です。

キーキャップ

ロープロファイルのキーキャップもキーボードスイッチの種類によって形状が違うため、Gateron low-profileに適合したものが必要です。 しかし調べるとGateron low-profile専用のキーキャップはあまり見当たりません、そこで寸法を色々調べたところCherry MX low-profile用のキーキャップが、かなり近い形をしていたので、今回はこれを購入してみました。

結果、問題なくキーキャップとして利用できました。

表面実装スピーカー

表面実装のスピーカーを雑に検索して見つかったものを使用しています。型番的には8530というもののようです(単にサイズを表した数字列です) 特に増幅などもせずRaspberry Pi Picoのハイパスフィルタとしてのコンデンサ経由して接続しています。

スイッチ付きイヤホンジャック

このイヤホンジャック、デスクトップパソコンなどでよく見かけるものと同じものだと思います。 5極のピンがあり、イヤホンジャックが抜かれているときだけ導通するようになっており、この部品だけで、イヤホンを接続しているとイヤホンから、イヤホンを接続していないときはスピーカーから、という制御ができる優れものです。

型番はPJ-307と呼ばれているもののようです。

スイッチの仕組みは仕様書の図だとこんな感じです。

https://www.aitendo.com/product/4432 から転載

ボリューム

2連の薄型のボリュームです。今回は2連である必要はないのですが、手元にこれがあったのでこれの1つのボリュームだけを使っています。 スルーホールの部品ですが、かなり薄型なので、コンパクトなガジェットにも使いやすくてお気に入りです。

注意点としてこのボリューム、同じ見た目でピン配置が異なるものがあるようです。

型番的にはB103と呼ばれているもののようです。(103はおそらく抵抗値だろうから、104とかもあると思います)

基板の設計

今回はキーボードスイッチを固定するためのトッププレートも基板として発注することにします。 つまりメインボードと、トッププレートの2枚を設計しJLCPCBに発注します。

基板の設計にあたってはいくつか工夫した点があります。

2種類のマイコンボードをサポート

Raspberry Pi Picoと Pro Microという自作キーボード界ではメジャーなマイコンボード両方に対応するため、2つのフットプリントを少しずらして重ねて配置しています。もちろん配線は両方のマイコンに接続させています

3種類のキーボードスイッチをサポート

自作キーボードで用いるキーボードスイッチにはいくつか種類があり、その種類によりフットプリントの形状が異なります。 今回試したかったのはGateronのlow-profile(ロープロファイル)のキーボードスイッチです。

ロープロファイルというのは、通常のキーボードスイッチよりも高さの低いキーボードスイッチの種類です。

このスイッチのフットプリントは一般的なCherry MXのものとは違っていたので、フットプリントから自作することにしました。 (後にすでにあるフットプリントの存在を教えてもらいましたが、、まぁ勉強ということで・・)

せっかく作るので、通常のGateronのlow-profile、Gateron low-profileのホットスワップソケット(キーボードスイッチを取り外しできるようにソケットを介してつなげる方式)、そしてキーボード界のデファクトスタンダードであるCherry MXの3種類に対応したフットプリントを作りました。

トッププレートの設計

トッププレートはキーボードスイッチを固定するための四角い穴の開いた板です。 基板のキーボードスイッチの固定位置とぴったり合わせて、穴の大きさもキーボードスイッチぴったりに作る必要があるので、気を付けて設計します。

具体的には、まずフットプリントとして、キーボードスイッチを固定するための四角穴を作ります。この際、部品の原点がキーボードスイッチのフットプリントと同一になるように注意が必要です。

その後、完成したキーボード基板のデータをコピーし、不要な部品を削除したうえで、キーボードスイッチのフットプリントをキーボードスイッチの四角穴のフットプリントに置換します。

最後にディスプレイのための窓などもくりぬくように指定をして完成です。

この後、基板に修正を加える場合は、部品の位置をずらさないように注意しました。(よくわからなくなった場合は、トッププレートを再度作り直しました)

基板の発注

発注はもちろんJLCPCBです。

jlcpcb.com

通常の基板は1.6mmなのですが、トッププレートはGateronのlow-profileの仕様に合わせて1mmにしました。 (比較用で1.2mmも作ってみましたが、どちらでも問題なかったです、強いて言えば1.2mmのほうがしっかり固定できている感じがします)

基板は100mm*100mm以内に収めるようにしたため、5枚で$4(はじめの1つは$2)+送料で発注できました。 色はなんとなくかっこいい黒!

今回のミス

懲りずにまたミスをしてしまいました・・

雑に設計したため、Raspbery Pi Picoの3V3につなげるべき配線を3V3_ENに繋いでしまっていました。

今回も配線がシンプルだったので1か所パターンをカットして、正しい配線をジャンパ線でつなげて修正完了です。

動作確認

Raspberry Pi PicoとGateron low-profileのキーボードスイッチをhot-swapソケットでマウントする方式で組み立ててみました。

Raspberry Pi PicoとOLEDはピンソケット経由で取り付けましたが、基板に直接はんだ付けした方が薄く済ませることが出来ます。

実はこのマクロパッドの配線は、以前作ったRaspberry Pi Picoを使った携帯ゲーム機と同じような配線になっているため、同じプログラムが動作します。

inajob.hatenablog.jp

マクロパッドとしての動作確認

さて、ここからはキーボードとしての振る舞いを実装していきます。

調べると、MicroPythonではなくCircuitPythonを使うと簡単にキーボードやマウスが作れるとのこと・・

circuitpython.org

CircuitPythonのuf2ファイルを取得し、Raspberry Pi Picoに書き込みます(RUNを操作するための、スイッチを付けて置けばよかったと後悔・・BOOTスイッチを押しながら、USBケーブルを抜き差しします)

CircuitPythonはMicroPythonとは違い実行中もUSBマスストレージとして認識され、ライブラリなどをPCから直接コピーすることができます。

まずはOLEDの制御用に Adafruit_CircuitPython_SSD1306 をインストール(libディレクトリにコピーする)

github.com

文字を表示するには以下のフォントファイルが必要です(ルートディレクトリにコピーする)

github.com

さらにマウスやキーボード制御のために Adafruit_CircuitPython_HID をインストールします。

github.com

後は初期化コードを少し書いて、スイッチの状態に合わせてキーコードを送信すればマクロパッドの基礎は完成です。

ここでは、十字キーとA,Bというそのままの機能を割り付けましたが、もっと自由に、1キー打鍵すると複数の文字を入力できるようにしたり、OLEDに表示されたメニューから選択した文字を入力するなどといった複雑な機能を作ることもできます。

工夫した点としては、キーが押され始めるとカウントアップする変数を用意して、キーが押されてから2フレーム目にキー入力を発行するようにした点です。(もっとちゃんとするなら、キーの押し下げ、押し上げなども送信するのが良いと思います。)

"""
Raspberry Pi Pico Keyboard test

Copyright (c) 2023 inajob

This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
"""

import board
import busio
import digitalio
import time

# OLED
import adafruit_ssd1306

i2c = busio.I2C(board.GP5, board.GP4)  # (SCL, SDA)17,16
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
display.fill(0)
display.text("Hello",0,0,1)
display.show()

# USB HID
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode

right = digitalio.DigitalInOut(board.GP16)
right.switch_to_input(pull=digitalio.Pull.UP)
left = digitalio.DigitalInOut(board.GP18)
left.switch_to_input(pull=digitalio.Pull.UP)
up = digitalio.DigitalInOut(board.GP19)
up.switch_to_input(pull=digitalio.Pull.UP)
down = digitalio.DigitalInOut(board.GP17)
down.switch_to_input(pull=digitalio.Pull.UP)

btna = digitalio.DigitalInOut(board.GP15)
btna.switch_to_input(pull=digitalio.Pull.UP)
btnb = digitalio.DigitalInOut(board.GP14)
btnb.switch_to_input(pull=digitalio.Pull.UP)


kbd = Keyboard(usb_hid.devices)
trigger = [0,0,0,0,0,0]

while True:
    if not(left.value):
        trigger[0] = trigger[0] + 1
    else:
        trigger[0] = -1
    if not(right.value):
        trigger[1] = trigger[1] + 1
    else:
        trigger[1] = -1
    if not(up.value):
        trigger[2] = trigger[2] + 1
    else:
        trigger[2] = -1
    if not(down.value):
        trigger[3] = trigger[3] + 1
    else:
        trigger[3] = -1
    if not(btna.value):
        trigger[4] = trigger[4] + 1
    else:
        trigger[4] = -1
    if not(btnb.value):
        trigger[5] = trigger[5] + 1
    else:
        trigger[5] = -1

    if trigger[0] == 2:
        kbd.send(Keycode.LEFT_ARROW)
        display.fill(0)
        display.text("LEFT",0,0,1)
        display.show()
    if trigger[1] == 2:
        kbd.send(Keycode.RIGHT_ARROW)
        display.fill(0)
        display.text("RIGHT",0,0,1)
        display.show()
    if trigger[2] == 2:
        kbd.send(Keycode.UP_ARROW)
        display.fill(0)
        display.text("UP",0,0,1)
        display.show()
    if trigger[3] == 2:
        kbd.send(Keycode.DOWN_ARROW)
        display.fill(0)
        display.text("DOWN",0,0,1)
        display.show()
    if trigger[4] == 2:
        kbd.send(Keycode.A)
        display.fill(0)
        display.text("A",0,0,1)
        display.show()
    if trigger[5] == 2:
        kbd.send(Keycode.B)
        display.fill(0)
        display.text("B",0,0,1)
        display.show()

まとめ

Gateronのlow-profileのキーボードスイッチを使ったマクロキーパッドを作ってみました。 キーボードパネルも基板として発注することで、手軽にしっかりしたつくりのマクロパッドを作成できました。

Raspberry Pi Picoでこのようなマクロパッドを使う際はCircuitPythonが便利であることも知りました。

次はもっとキーの数の多いキーボードの作成にも挑戦してみたいと思いました。

参考

以下の記事を参考にしました。

https://hf-labo.net/ew-pico-mouse-keyboard/hf-labo.net

logikara.blog