KiCad に収録されているフットプリントのランド (PcbNew では統一してパッドと呼んでいる) は、たいてい直径 1.7mm、穴サイズ 1mm 程度である。 たとえば、KiCad のフットプリントビューワーで PinHeader_1x02_P2.54mm_Horizontal のランドを見るとこの値である。 ここで、残る銅箔の幅 (太さ、水平方向の厚み) は 0.35mm である。 この銅箔の幅は、専門業者に発注する場合は問題ないであろうが、 感光基板、あるいは熱や薬剤などでトナー転写するなどして自作する場合はその転写精度の悪さからパターンに問題が現れる場合がある。 また、紙フェノール基材の生基板を使うとちょっといじっただけでパターンが剥がれることも考えられる。

自作プリント基板の悪い加工精度でも堪えるよう、ランドやその穴の直径を調整したいが、ランドを一括で編集するには フットプリントを全部自分で作り直すすべてのパッドをクリックして手動で選択し「選択されたパッドにデフォルトのパッドプロパティを適用」するソースファイルで sed する かしかないらしい。 どれもなんだかあんまりきもちのよい方法ではないので、Python で記述できる Script Console を使って一括編集してみた。 ついでに、プラグインにもしてみた。

Script Console を使う

結論から言うと、以下のスクリプトを Script Console にペーストするとパッドサイズを変更できる。

import pcbnew

board = pcbnew.GetBoard()

for fp in board.GetFootprints():
    for pad in fp.Pads():
        if pad.GetShape() in [pcbnew.PAD_SHAPE_CIRCLE, pcbnew.PAD_SHAPE_OVAL]:
            pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE)
            pad.SetSizeX(2100000)
            pad.SetDrillSize(pcbnew.wxSize(800000, 800000))
        elif pad.GetShape() in [pcbnew.PAD_SHAPE_RECT]:
            pad.SetSizeX(2100000)
            pad.SetSizeY(2100000)
            pad.SetDrillSize(pcbnew.wxSize(800000, 800000))

Pcbnew Python Scripting の API マニュアル を頑張って読んだらだいたい分かることだが、簡単に解説をする。

PcbNew 用の API が Python module の pcbnew にまとまっているので、これを import し使う。 pcbnew.GetBoard() で 現在のボードの状況が class Board のインスタンスとして得られる。 Board.GetFootprints()class FOOTPRINTS のインスタンスが得られる。これは iterable で、 リスト内包表記などで iterate すると class FOOTPRINT (note: singular) のインスタンスが得られる。 class FOOTPRINT には、メンバ関数の FOOTPRINT.Pad() が存在し、そのフットプリントに紐づくパッド (ランド) を iterate することができる。 FOOTPRINT.Pad()class PADS を得、例によってこれは class PAD の iterable なので、iterate する。 PcbNew では円だけでなく楕円や長方形等のパッド形がサポートされており、class PAD では PAD.GetShape(), PAD.SetShape() でそれを操作できる。 今回は、長方形の場合は適当な正方形にし、楕円または円のときは適当な円にすることにしてある。 円にすることで、指定するべき必要なパラメータが一つ減る (楕円の場合は大きさ (形) を表すためにパラメータが 2 つ必要だが、 円の場合は半径の一つだけでよい)。 Pad.SetSizeX() で x 方向の長さ (辺の長さまたは直径)、 Pad.SetSizeY() で y 方向の長さを指定できる。 Pad.SetDrillSize() で穴の大きさ (ペア型で指定し、長(短)軸直径と短(長)軸直径) を指定できる。

Pad.SetSizeX()Pad.SetSizeY()Pad.SetDrillSize() は整数型しか受け付けず、単位は [nm]。 したがって例えば上記の 2100000 は 2.1mm を表す。 直径を変えたいときは、それらの引数を変更すればよい。レーザープリンタで印刷してみた感じ、この設定でなんとかなりそうであった。 2.54mm ピッチの部品に余裕がないような気がするが、今作っているものに 2.54mm ピッチの部品はそんなに多くないので、カッター等で後処理すればよさそう。

プラグインにする

せっかく書いたので、プラグインにして再利用したい。基本的には PcbNew Plugins | Developer Documentation | KiCad に従えばよい。 簡単に説明を書いておくと、pcbnew.ActionPlugin を継承した新たなクラスを定義して、メンバ関数 Run() に上記処理を書く。 その後、定義したクラスのインスタンスのメンバ関数 register() (親クラスの pcbnew.ActionPlugin で定義) を呼ぶ Python Script (後述) を %APPDATA%/Roaming/kicad/scripting/plugins 等に配置すれば、 PcbNew のツール→外部プラグインの下に現れる。

import pcbnew

class EnhancePadSizes(pcbnew.ActionPlugin):
    def defaults(self):
        self.name = "Enhance Pad Sizes"
        self.category = "Footprints"
        self.description = ""
        self.show_toolbar_button = False

    def Run(self):
        board = pcbnew.GetBoard()

        for fp in board.GetFootprints():
            for pad in fp.Pads():
                if pad.GetShape() in [pcbnew.PAD_SHAPE_CIRCLE, pcbnew.PAD_SHAPE_OVAL]:
                    pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE)
                    pad.SetSizeX(2100000)
                    pad.SetDrillSize(pcbnew.wxSize(800000, 800000))
                elif pad.GetShape() in [pcbnew.PAD_SHAPE_RECT]:
                    pad.SetSizeX(2100000)
                    pad.SetSizeY(2100000)
                    pad.SetDrillSize(pcbnew.wxSize(800000, 800000))

EnhancePadSizes().register()

ランドの設定が決め打ちなのが気に入らないが、設定できるようにするには wxWigets でウィンドウを作らないといけなく、面倒くさい。 とりあえず変えたいときは毎回スクリプトを書き換えることにする。

wx でウィザードを出してるサンプルがあったので、書きたくなったらこれを参考にしよう。

もしかすると PcbNew の scripting 以下は Python のモジュール検索 path になっていて、import して使えたりするかもしれない。そうすると、 引数付きの関数を作って呼ぶだけになるのでかなり楽 & 便利になりそうだが、未調査。知っている方教えてください。