ぽぽろん研究所のサムシング

twitter:@poporon_labもよろしく

自作キーボード開発計画 番外編#1:ガーバーデータのシルクレイヤにデザインを追加してみた【gerbolyze】

はじめに

こんにちは、ぽぽろん研究所です。年末年始はいかがお過ごしですか。自分はごちうさに毎秒浄化されています。そのため、体は寒いですが心はポカポカです。

というわけで、今回は自作キーボード開発計画番外編ということで、ガーバーデータのシルクレイヤ部分に追加でデザインを入れることができないかについて検討しました。テンプレートのガーバーデータに自分の好みのデザインを簡単に入れられることができたら、テンプレートの回路に自分のデザインを入れて、名刺基板のようなものを誰でも作れるのではと思いついたので検討しました。

KiCadの場合、基板にデザインを入れるにはいくつかの方法があると思います。その一つにデザインのフットプリントを作成して、PCBデータに貼り付けることです。しかし、PCBデータがKiCadのライブラリに依存しているので、開けない可能性などがあり、基板にデザインを入れるのが難しい場合があります。そこで、ライブラリに依存しないガーバーデータを編集することはできないかと調べてみました。今回はgerbolyzeを使った方法を残そうと思います。デザインの追加にはinkscapeを使いました。

f:id:poporon_lab:20220102012023p:plain
デザイン追加中の画面

まだまだ使いこなせていないので、今回はシルクレイヤの部分だけのやり方となります。また、簡単にできるやり方を調べたのですが、そこそこ難易度は高いと思います。

gerbolyzeとは

gerbolyzeはPCBの製造に使用するガーバーファイルにSVGベクターデータやPNGJPEGラスターイメージをレンダリングするツールになります。言葉ではよくわかりませんね。簡単に言い換えると「PCBを発注するとき送るガーバーファイルに絵を入れることができます」ということです。そのため、KiCadなどで起こり得るフットプリントライブラリの依存問題をなくすことができます。詳しくはこちらを参考ください。

github.com

gerbolyzeの下準備とインストール

今回はインストールとgerbolyzeを使って生成したSVGファイルを編集して、ガーバーファイルに反映するまでを記そうと思います。続編として、PNGを使ったやり方も投稿しようと思っています。

今回の環境

今回はwindows10のWSLを使用してgerbolyzeのインストールを行っていきます。そのため、Ubuntuでも同様のやり方でインストールすることが可能だと思います。SVGファイルの編集にはinkscapeを使用します。

python3.8以上の使用をオススメします。研究所の人はpython3.6.9を使用してエラーを吐かれ、強行突破しました。下の方に一応対応を書いておきますが、できるならpythonのバージョンは上げておくと良いと思います。

以降の作業で実行するコマンドはWSL上で実行しています。WSLからWindowsのCドライブなどにアクセスする場合は/mnt/からアクセスを行います

WSLのインストール(Windowsのみ)

WSLとはWindows Subsystem for Linuxの略で、簡単に言うとWindows上でUbuntuが動かせるようになるツールです。

昔はインストールが面倒であったのですが、最近はインストールが簡単になったそうなので、簡単に書いておきます。詳しくは公式などを参照ください。

インストール方法

  1. powershellを開く
  2. コマンド「wsl --install」を実行。

Ubuntuのバージョンを指定したい場合は「wsl --list --online」でインストール可能なバージョンを調べ、「wsl --install -d 」を実行してください。にはインストールしたい対象のディストリビューションを入れます。

今回はUbuntu18.04にインストールを行いました。

gerbolyzeのインストール

最初にインストールに必要最低限コマンドを載せておきます。これらのコマンドのほとんどはgerbolyzeのクイックスタートに乗っていたコマンドに一つ追加したものになります。追加した部分は2行目のgerbvのインストールです。これはガーバーファイルへの反映時に要求され、エラーとなって出たので、追加しました。

:~$ sudo apt install libopencv-dev libpugixml-dev libpangocairo-1.0-0 libpango1.0-dev libcairo2-dev clang make python3 git python3-wheel curl python3-pip python3-venv cargo
:~$ sudo apt install gerbv
:~$ cargo install usvg

:~$ pip3 install --user git+https://git.jaseg.de/pcb-tools-extension.git
:~$ pip3 install --user gerbolyze --no-binary gerbolyze
gerbolyzeのインストール時のエラー対応

gerbolyzeのインストール時にはいくつかエラーが出たので、それらについて記しておきます。gerbolyze実行時にもエラーが出ていたので、下に記します。

pip3 install --user git+https://git.jaseg.de/pcb-tools-extension.git実行時にcloneに失敗する

こちらでは「server certificate verification failed. CAfile: none CRLfile: none」とエラーが表示され、cloneができないと表示されました。対応としては、以下のコマンドを実行することで対応することができました。

:~$ sudo apt-get install --reinstall ca-certificates

pip3 install --user gerbolyze --no-binary gerbolyzeで失敗する

こちらではclangによるビルド時にいくつかのヘッダをインクルードできないエラーについて確認しました。これらはgccとg++のバージョンによる問題だったので、これらのバージョンを確認して必要に応じてアップデートと切り替えを行う必要がありました。gccとg++のバージョンを8以上であれば問題は出ないと思います。

バージョンの確認方法

:~$ gcc --version
:~$ g++ --version

gccとg++のバージョン8をインストール

:~$ sudo apt install gcc-8
:~$ sudo apt install g++-8

gccとg++のバージョンを切り替える

:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 10
:~$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 10

gerbolyzeの使い方

ここではKiCadで生成したガーバーデータからテンプレートのSVGファイルを生成して、編集したテンプレートを反映するまでのやり方を記します。

今回使用するガーバーデータは過去に自分が作ったものを少し編集したものです。参考までにガーバーデータをGitHubにあげておきます。テスト用にでも使用してください。

github.com

KiCadでガーバーファイルを出力する

作成したPCBデータからガーバーファイルを出力する方法です。基本的には外注先の設定に合わせる形で良いと思います。今回使用した設定を残す意味を込めて出力方法を記します。

  1. PCB設計画面上部のプロットを選択します。
    f:id:poporon_lab:20220101185705p:plain
    プロットのボタン位置
  2. 出てきたサブウィンドウでガーバーデータを出力する。このとき設定を確認する。
    f:id:poporon_lab:20220101185700p:plain
    ガーバーデータの出力
  3. サブウィンドウ上で「ドリルファイルを生成」のボタンを押して、ドリルファイルを出力する。このときも設定を確認する。
    f:id:poporon_lab:20220101185703p:plain
    ドリルファイルの生成
gerbolyzeでテンプレートを作成する

gerbolyzeを使ってガーバーファイルからSVGファイルに変換します。このSVGファイルを編集することで、ガーバーファイルにデザインを入れることができます。

今回使用したガーバーファイルを参考までにこちらにあげておきます。

template作成方法は以下のコマンドを実行することです。

:~$ gerbolyze template -t <output SVG file> <input gerber dir>

-t <output SVG file>はトップレイヤの出力先となるSVGファイル、<input gerber dir>はベースとなるガーバーファイルが入ったディレクトリパスとなります。具体的な例は以下のようになります。

:~$ gerbolyze template -t template_top_test.svg test_gbr/

上のコマンドではカレントディレクトリ内にあるtest_gbrディレクトリのガーバーファイルを参照してトップレイヤのSVGファイルをtemplate_top_test.svgとして出力します。

オプションに-b <output SVG file>を追加することで、ボトムレイヤのSVGファイルを出力することも可能です。詳しくはgerbolyze template --helpを参照ください。

テンプレートを編集する

gerbolyzeで生成したSVGファイルをinkscapeで開き、編集を行います。参考までに生成したSVGファイルも同様にこちらにあげておきます。

SVGファイルをinkscapeで開き、レイヤ選択からsilkレイヤを選択します。レイヤ選択の表示には上部のレイヤタブからレイヤをクリックすることでレイヤを表示できます。このsilkレイヤでデザインをレイアウトします。

f:id:poporon_lab:20220101205920p:plain
レイヤの選択

ここでは文字と簡単なイラストの挿入について説明していきます。高解像度のイラストの検討は次回行う予定です。

文字の挿入

左側のタブからテキストツールを選択して、適当な位置で文字を入力します。右タブのテキストとフォントから適当にテキストを調整してください。ここまでは普通にinkscapeでテキストを挿入するやり方と変わりません。

このときテキストを貼り付ける位置には注意しましょう。既存のシルク部分やソルダレジストのマスク部分、ドリルの穴の部分には重ならないようにしましょう。シルク部分とレジストマスク部分はそれぞれ白と銀色をしています。重なると、既存のシルクの消失や追加したデザインの欠損に繋がります。問題なければ重なっていても大丈夫だと思います。

f:id:poporon_lab:20220101215053p:plain
シルクとレジストマスク部分の例

テキストを入れたら、そのテキストオブジェクトをパスに変換します。やり方は以下の通りです。

  1. 右タブの選択ツールを選択します
  2. 選択ツールで挿入したテキストオブジェクトを選択します
  3. 上部タブのパス→オブジェクトをパスへを選択します
    f:id:poporon_lab:20220101213953p:plain
    テキストオブジェクトをパスへ変換

これで文字の挿入の準備は完了です。あとはガーバーファイルへ書き込むだけです。ガーバーファイルの書き込みは下の項で記します。

イラストの挿入

基本的に文字の挿入と基本は変わりません。イラストを挿入して、パスに変換するだけです。しかし、基板上にはシルクとレジストの2色しかありません。そのため、多少工夫する必要があります。今回は簡単なイラストを使用し、色の複雑なイラストは次回の記事にまとめます。複雑なイラストを使用するとパスの数が増えて処理が終わらなくなる可能性があります。

基本的なイラストの挿入は以下の通りです。

  1. silkレイヤを選択した状態で、画像をドラッグアンドドロップして画像を埋め込み、適度な大きさに調整します。
  2. 挿入した画像を選択した状態で、上部タブからパス→ビットマップのトレースを選択します。
    f:id:poporon_lab:20220101222917p:plain
    ビットマップのトレースの位置
  3. サブウィンドウ上で左側のパラメータを調整して、更新ボタンを押します。プレビューが表示されるので、問題なければOKをクリックします。このときOKを押さないとパスに変換されません。OKを押してもサブウィンドウは閉じられませんが出力はされています。出力されたオブジェクトは挿入した画像と重なっているので、わかりにくくなっています。
    f:id:poporon_lab:20220101223434p:plain
    サブウィンドウの表示
  4. 挿入した画像はいらないので、削除します。
    f:id:poporon_lab:20220101224209p:plain
    挿入画像の削除

おまけとしてカラーのイラストを挿入した場合について以下に記します。基本的には同じで、ビットマップトレースを行う部分でしきい値を調整するやり方となります。今回はニパ子のイラスト素材をお借りしました。

285ch.godhandtool.com

  1. 同様のやり方で画像を挿入します。
  2. ビットマップトレースのウィンドウを出し、しきい値を調整します。このときプレビューを参考に調整します。今回は明るさの境界を調整しました。
  3. しきい値を調整したら、OKをクリックして、パスに変換したオブジェクトを生成します。
    f:id:poporon_lab:20220101225814p:plain
    カラー画像のパスへの変換
  4. 最後に挿入した画像を削除します。

このようにすることで、カラー画像を線画として扱うことができます。新聞印刷の変換をすることで、擬似的にグレースケールを再現することができるのだが、これは長くなりそうなので、次回以降の話とします。

gerbolyzeでガーバーファイルにデザインを反映する

これまでで作成したSVGファイルを使用して、オリジナルのガーバーデータにデザインを反映します。最終的に使用するSVGファイルのsilkレイヤは画像のようになっています。

f:id:poporon_lab:20220102012023p:plain
ガーバーファイルに反映させるデザイン
それぞれのファイルの準備を終えたら、以下のコマンドを実行して新しくガーバーファイルを生成します。

:~$ gerbolyze paste -t <input SVG file> --subtract out.silk-=in.mask <input gerber dir> <output gerber dir>
今回使用したオプションの説明
  • -t <input SVG file>ではトップレイヤのSVGファイルを指定しています。-b <input SVG file>でボトムレイヤも同様に指定することが可能です。

  • --subtract out.silk-=in.maskでは減算パラメータの設定を指定しています。ここでのパラメータはオリジナルのガーバーファイルと追加したデザインが重なっている部分を削除して、重なりをなくすためのパラメータとなります。デフォルトではシルクレイヤのパラメータにout.silk-=in.silk+0.5もあるのですが、これがあるとデザインが反映されなかったので変更しています。また、デフォルトではcopperレイヤやmaskレイヤの指定もあるので、この辺のレイヤを変更する場合には注意してください。

  • <input gerber dir>ではデザインを追加したいガーバーファイルの入ったディレクトリを指定します。テンプレート作成と基本的に同じものを指定すると思います。

  • <output gerber dir>では出力先のディレクトリを指定します。デザインを反映したガーバーファイルを指定先のディレクトリに保存します。

その他の詳細はGitもしくはgerbolyze paste --helpを参照ください。

具体的なコマンド例を以下に記します。

:~$ gerbolyze paste -t template_top_test.svg --subtract out.silk-=in.mask test_gbr/ output_test_1/
コマンド実行時のエラーについて

今回gerbolyze pasteコマンドを使用してデザインを反映させる際に以下のエラーが出力されました。

TypeError: unlink() got an unexpected keyword argument 'missing_ok'

これはpythonのバージョンが3.8未満であると出力されると思われます。ここでエラーになっているmissing_okの引数はpython3.8で追加されているためです。参考資料

今回使用したpythonのは3.6.9だったためエラーが出力されました。回避方法としては、out_cand.unlink(missing_ok=True)コメントアウトします。ここでは出力先のディレクトリにあるファイルの削除を行っています。しかし、出力されるファイルは上書き保存で出力されます。そのためエラー箇所をコメントアウトしても特に動作上問題はなさそうです。変更箇所を以下に記します。

変更ファイル~/.local/lib/python3.6/site-packages/gerbolyze.pyの102行目を変更します。102行目の先頭に#をつければ完了です。

変更前

            # In case output dir already existed, remove files we will overwrite
            for in_file in source.iterdir():
                out_cand = output_gerbers / in_file.name
                out_cand.unlink(missing_ok=True)

変更後

            # In case output dir already existed, remove files we will overwrite
            for in_file in source.iterdir():
                out_cand = output_gerbers / in_file.name
                #out_cand.unlink(missing_ok=True)       ←ここを変更
生成されたガーバーファイルの確認

今回はシルクレイヤのみの変更なので、gtoファイルのみを確認します。確認方法としてはKiCadのガーバービューワーやウェブ上のガーバービュワーで確認することができます。今回は手軽に確認できるウェブアプリのP板さんのwebチェッカーを利用してみました。出力されたgtoファイルをチェッカーにドラッグアンドドロップして表示させたところ以下のようになれば完成です。自分の入れたデザインが反映されていれば問題なくできていると思います。

f:id:poporon_lab:20220102025420p:plain
P板webチェッカーでの確認
これで一連の作業は終了です。

最後に

今回は自作キーボード開発計画番外編を投稿しました。今は名刺基板編を進めていますが、寝起きに何を思ってか今回のことを思いついたので、調べてみました。思いの外、インストールから手こずってしまい、一日溶かしてしまいました。情けないです。

年の変わり目に何を考えてこんなことをやっていたのかわからないです。人は暇になると何をやるのかわかったものじゃないですね。。。それにしても今回は長かった。

他に何かエラーがあればコメント下さい。自分も覚えている範囲でしか書いていないので、別のエラーがあったような気もします。今回使えていない機能もあるので、もう少し調査は必要そうです。

今回はこれまで。それでは、また次回。研究所はいつでもお友達募集中です。(次回は今回の残課題かな?YouTube計画も進めたいんだがなぁ)