Inkscapeで曲線配列なキーボードをぐりぐりしながら設計する(後編)

この記事ではフリーのドローソフト「Inkscape」を使用して曲線的なレイアウトを設計し、KiCADへ連携する方法を紹介しています。

後編では、前編で作成した12列✕4行の曲線配列をKiCAD側で読み込んでフットプリントを整列する手順を説明します。前編の手順を踏んでいないSVGは取り込めませんのでご注意下さい。

KiCADに関する細かい手順の説明は省略していますので、KiCADを使用されたことがない方は サリチル酸さん の『自作キーボード設計ガイド Vol1』を購入してみてください。

salicylic-acid3.booth.pm

記事の更新履歴

  • 2024/5/28  注意書きを追記
  • 2024/5/24  ナンバリングの図を修正

スクリプトの準備

実施する前にまず連携用のスクリプトの最新版をこちらからダウンロードし、任意のフォルダに配置しておいてください。

drive.google.com

スクリプトの更新履歴
  • 2024/5/22 ver.1.0 を公開

具体的な手順(KiCAD編)

取り込み先となるKiCAD側の操作手順を説明します。

  1. 新規プロジェクトを作成
    新しくプロジェクトを作成します。
  2. ざっくりと回路図を作成
    SVGを読み込む前にKiCADの回路図エディタで回路図を作成しますが、ここではまだ完成させずに以下の作業のみを行います。*1
    • スイッチ、および各スイッチの周囲に配置するパーツのシンボル(ダイオード、LEDなど)の配置
    • アノテーション
    • フットプリントの割当て

    作例の場合は以下のような感じになります。12列×4行なので、スイッチ、ダイオード、LEDを各48個ずつ配置してアノテーションしてありますがまだ配線はしていない状態です。マイコンなどほかのパーツも未配置です。


    リファレンス指定子とフットプリントの割当ては以下のようになっています。
    部品 リファレンス指定子 フットプリント
    スイッチ SW1~SW48 CherryMX_Hotswap
    ダイオード D1~D48 D3_SMD_v2
    LED D49~D96 YS-SK6812MINI-E
  3. 基板にフットプリントを配置
    回路図をざっくり作成したら [ツール]->[回路図から基板を更新]でフットプリントを基板に配置しておきます。
  4. KiPythonを起動しスクリプトをインポート
    PCBエディタにて [ツール]->[スクリプト コンソール] よりKiPythonを開きます。



    このような画面が開きます。


    コマンドは常に一番下の>>>の行に以下のコードを1行ずつ貼り付けて実行します。(スクリプトのパスは各自の環境に置き換えてください)
    import os
    os.chdir(r'C:\kee\boo\importinkscape.py')
    import importinkscape
  5. 一度保存する
    大事な事なので直前に書きますが、スクリプトで行う一括処理はアンドゥが効きません。必ず事前に基板を保存するようにしてください。
  6. スイッチを整列する
    以下のコードを一度に実行します。(改行は分かりやすいように入れていますが、入れても入れなくても大丈夫です)
    importinkscape.importsvg(
    svg=r'C:\kee\boo\yourkeeb.svg',
    ids="path730,path730-4,path730-5,path730-7",
    prefix="SW"
    )
    svg=r'C:\~'SVGファイルのフルパス、ids="path…"は前編の最後にInkscapeで確認したIDをカンマ区切りで列挙したもの、prefix="SW"は並べ替えるフットプリントのリファレンス指定子の数字の前部分(SW○○の「SW」)です。

    スイッチのフットプリントがSVGの四角形の位置に整列します。

  7. ダイオードを整列する
    つづいてダイオードを整列しますが、同じ座標だと下図の点線の位置に来てしまいスイッチと被ってしまうのでスイッチに対して8mm右に90度回転して配置することにします。

    以下のコードを一度に実行します。
    importinkscape.importsvg(
    svg=r'C:\kee\boo\yourkeeb.svg',
    ids="path730,path730-4,path730-5,path730-7",
    prefix="D",
    offset_x=8,
    offset_dig=90
    )
    offset_x=8は「スイッチの8mm右に配置」、offset_dig=90は「90度回転」を意味しています。

    スイッチの右に90度回転して配置されます。(このフットプリントは両面にパッドがあるので配置面はこれでOKです)

  8. LEDを整列する
    同様にLEDもスイッチの位置を基準に、下に5mmずらして配置することにします。また、裏面に取り付けるため反転する必要があります。

    importinkscape.importsvg(
    svg=r'C:\kee\boo\yourkeeb.svg'',
    ids="path730,path730-4,path730-5,path730-7",
    prefix="D",
    index_begin=49,
    offset_y=5,
    flip=True
    )
    offset_y=5はスイッチの「5mm下*2」、flip=Trueは「配置面を反転*3」です。また、LEDのリファレンス指定子が「D49」から始まっているためindex_begin=49で開始番号を指定しています。

    これでスイッチ、ダイオード、LEDが配置できました。

  9. ナンバリングを調整してみる
    これで完成でもよいのですが、この状態だとLEDのリファレンス指定子(D49~D96)の番号は下図のような順番になっています。

    これはids="path730,path730-4,path730-5,path730-7"の指定順にパスが参照され、そのパスの始点である左(Inkscapeで左から右に線を引いたため)から順にナンバリングしているためです。
    しかしWS2812B系のようなシリアルRGBLEDの場合、配線の都合で以下のような順番で並べたい場合があるかと思います。

    この場合、LEDの配置コマンドの実行を4回に分け、path730-4とpath730-7の実行時にindex_reverse=Trueを指定することで希望した順番で並べることができます。

     

    さらに、指定個数を読み飛ばすrect_skipや指定個数でストップするrect_numを組み合わせることで以下のように複雑な並べ方も可能です。

    ただし縦(上から下)に振ることだけはできません。パスの方向に限ります。

  10. あとはよしなに…
    いきなりぶん投げて恐縮ですが、あとは以下の流れで仕上げてください。
    1. 回路図を仕上げる
    2. 再度[回路図から基板を更新]でパーツと配線を基板に展開する
    3. 基板の配線を仕上げる

パラメータ一覧

importsvg()のパラメータです。上記で登場していないオプションは正しく機能しない場合があります。

パラメータ 必須 デフォルト値 説明
svg string - SVGファイルのフルパス
ids string - パスのID属性値。カンマ区切りで複数指定可
prefix string - リファレンス指定子のプリフィクス
mode string - "move" move…既存のフットプリントを変更(無ければスキップ)
move_add…既存のフットプリント変更(無ければ追加) 未実装
replace…既存のフットプリントを置き換え(無ければ追加) 未実装
index_begin int - 1 リファレンス指定子の開始番号
index_reverse bool - True リファレンス指定子を降順にする
fp_lib string - - フットプリントライブラリのパス(modeがmove_add、replaceの場合必須) 未実装
fp_name string - - フットプリント名(.kicad_mod は不要)(modeがmove_add、replaceの場合必須) 未実装
flip bool - False フットプリント配置面を反転
rect_skip int - 0 先頭から指定した個数のサブパスを処理せずスキップする
rect_num int - 0 指定した個数のサブパスを処理対象とする
origin_offset_x float - 0.0 原点座標をオフセット(x)
origin_offset_y float - 0.0 原点座標をオフセット(y)
offset_x float - 0.0 フットプリント座標からオフセット(x) 
offset_y float - 0.0 フットプリント座標からオフセット(y)
offset_dig float - 0.0 回転角をオフセット
no_rotate bool - False サブパスに合わせて回転しない(常にoffset_dig回転)

 

以上です。

実装が思うようにいかず想像以上に苦労しましたが設計のお役に立てば幸いです。

*1:この段階で他のシンボル(マイコンなど)の配置や回路の配線まで仕上げても良いのですが、フットプリントのリファレンス指定子(SW○○など)が必ずしも意図通りにコントロールできず、シンボルとフットプリントの紐づけが崩れることで回路側に手戻りが生じる可能性があるためお薦めはしません。

*2:Y軸は下がプラス、上がマイナスです

*3:「true」ではなく「True」とする必要があります