KiCadのフットプリント自動配置プラグイン

自作キーボードの基板設計をKiCadでやっている人は多いと思います。私は基板上の配線作業はパズルを解くみたいで好きなのですが、一方でスイッチやダイオードのフットプリントを決まった位置に並べる作業は退屈で好きではありません。そこでKiCadのプラグインを自作して自動的に配置するようにしました。

ダウンロード

ダウンロードはここから。

github.com

動作環境

以下は私のPC環境です。

  • Windows11
  • KiCad 9.0.4

まえがき

久々にキーボードを自作しようと思ってKiCadを開いて基板の設計を始めた。キーボード基板の設計はもう何回もやっているので、同じことを繰り返せばできる。でもやる気が起こらない。

その一つの原因がスイッチとダイオードのフットプリントを所定の位置に並べる作業だ。脳みそを使わない単純作業は楽しくない。学びや新しい発見がないからだ。モチベーションのためにも自分にとって何か新しい要素がほしい。

そこで、スイッチやダイオードのフットプリントを自動配置するKiCadのプラグインを作ることにした。世の中にはAuto KDK(Auto-Keyboard-Design-Kit)などもっと優れたものもあるし、これくらいのプラグインは探せばどっかの誰かが作ったものがあるはず。でもまあ自作することで成長するということもあるし、自分で作ったほうが後で改造しやすい。

いつもキーボードを設計するときにKeyboard Layout Editor (KLE)でキー配列を考える。ここでjsonファイルがダウンロードできるので、これをプラグインのインプットにする。

まずは雛形をAIで作成

ChatGPTで雑に質問すると、雛形を作ってくれる。KiCadのプラグインには以下のファイルを用意するらしい。

  • __init__.py
  • klelayoutimporter.py
  • metadata.json

klelayoutimporter.pyが本体。__init__.pyはプラグインをKiCadに認識させるための2行のコード。metadata.jsonにはこのプラグインの説明などの情報を書く。自分の環境ではこれらのファイルを /c/Users/XXXX/My Documents/KiCad/9.0/scripting/plugins/KLELayoutImporter に置く。 (最初/c/Users/XXXX/My Documents/KiCad/9.0/plugins/KLELayoutImporterに置いたらダメだった。上のディレクトリの役割の違いはよくわからない。)

動かし方は、PCBエディターでジグソーパズルのアイコンから実行できる(なんでジグソーパズル?)。

ジグソーパズルのアイコン(赤丸)をクリックするとプラグインを実行できる
はじめエラーが出てくるが、対処すれば動くようになった。よくわからんところはChatGPTにエラーメッセージを入れると解説してくれる。

少し改造

雑にChatGPTに指示したので、KLEのキーと回路図のスイッチとの一致とか何も気にせずに配置してしまうコードになってしまった。

そこで、KiCad回路図上の各スイッチの値(Value)とKLEのキーの印字の一致をチェックすることにした。KLEでのキーの印字とKiCadでの各スイッチのValueを一致させておく必要がある。大文字小文字の区別は面倒なので、pythonスクリプト中ですべて小文字に変換してからチェックするようにした。

KLEのキーの印字(legend)とKiCadのValue(値)を一致させる

また各スイッチにダイオードが必要になるので、スイッチと同じReference番号となるダイオードを対応させ、スイッチのフットプリント位置に特定のオフセットをつけて配置する。そのために回路図のアノテーションでスイッチとダイオードの番号を一致させるように回路図を作っておく必要がある。キーマトリクスの回路図を左上に描いて、アノテーションの方向を指定すれば番号を一致させることができる。

コードを改造していると、いくつか気をつけるところがある。

スクリプト変更の反映

KiCadを立ち上げたままpythonスクリプトを編集していると修正が反映されない。メニュー>ツール>プラグインプラグインの更新を行ってからプラグインを実行する必要がある。

フットプリントの位置

キーボードのキーピッチは19.05 mm (19 mmで作っている人もいるかも)が一般的である。KLEの位置やキー幅はこれを単位としているので、19.05をかけてmmに直す必要がある。 pythonコード内でフットプリントの位置を設定するときには、

        unit = pcbnew.FromMM(self.key_pitch)
        x_sw = (x_sw_u + 0.5*w_u)* unit
        y_sw = (y_sw_u + 0.5)* unit
        matched_fp.SetPosition(pcbnew.VECTOR2I(int(x_sw), int(y_sw)))

とする。ここでのunitは1000000になっている。つまりnm(ナノメートル)がKiCadの位置の最小単位になっているらしい。 これを整数で与える仕様みたい。

KLEとKiCadのフットプリントのキーの位置

ChatGPTが生成したコードのParserで得られる位置は、キーの左上の位置となっていた。コード内でx_currentというような変数で現在のx位置を保持しておき、キーの幅分だけx位置を増やして次のキーの位置を計算するためだ。

一方でKiCadのキースイッチのフットプリントの位置は、キーの中心(ステムの中心)になっていることが多いと思う。自分のフットプリントライブラリでもそうなっている。そのためにParserで得られた位置をそのまま使うと、幅が1uよりも広いキーの位置がずれる。これに気づくのに少し時間がかかった。

フットプリントの反転

ダイオードは基板の裏面に配置したい。そういう場合は

matched_d.Flip(board.GetDesignSettings().GetAuxOrigin(), True)

のようにすればよい。ただし、これは現在の状態からの反転操作になるので、繰り返しプラグインを実行すると意図しない面に実装するようになってしまう。下記のように書くと、どちらの面に実装されているかを判定したうえで反転できる。

if not matched_d.IsFlipped():
    matched_d.Flip(board.GetDesignSettings().GetAuxOrigin(), True)

完成

プラグインを実行するとスイッチが順番に整列していく。気持ちがいい。 ダイオードの位置も配線を考えながら微調。

プラグインを実行後

あとがき

プラグインを自作するのは結構時間がかかってしまうかと思っていましたが、あっさりとできてしまいました。現在のようなAIが登場するより以前は、webの参考になる記事を検索して探したり、あるいは公式ドキュメントを確認する必要がありました。これが億劫で作っていなかったのですが、今はAIを利用すればテンプレートとコードの原案を一瞬で作成してくれるのでかなり捗ります。

このおかげで楽しくない作業をスキップできるようになりました。もう一つ強調すべき点は、このように自動化することによってキースイッチのフットプリント位置がずれるというミスを無くすことができます (私はスイッチのフットプリントの位置がズレた基板を作るというミスを2回したことがあります...)。こうした単純作業を自動化しない理由はありませんね。

この記事は、自作したオリジナルキーボードpbkb48で書きました。