【KiCAD応用講座】PCB切削で平面コイルが動くか試してみる① CADファイルの準備


※ 当ページには【広告/PR】を含む場合があります。
2020/12/18
2022/10/02
Debian LinuxにKiCad v6以降をソースコードビルド・インストールしてみる
KiCadとInkscapeでSVG画像からGBR(ガーバー)ファイルに変換して卓上CNCで基板を削る①

今回はKiCADで手で配線しながら設計することの難しい平面コイルの作成法を、kicad_pcbファイルのフォーマット構造などを考慮しながら解説していきます。


KiCadではじめる「プリント基板」製作 (I・O BOOKS)

IoTセンサーを自作しよう!KiCadで回路基板からDIY!ESP32プログラミング

マイクロ平面コイルを作って遊びたい

海外の技術ハック系サイトでFlexARという柔軟性のあるマイクロ平面コイルを見かけて、何だかとても気になってはきました。

合同会社タコスキングダム|蛸壺の中の工作室

結構構造が単純でとても安価ではあるのですが、これをヨーロッパから取り寄せになると送料がかなり高くなってしまいそうです。

...ならば同じような構造のものが自分で作れるか検討してみよう、ということでオリジナルマイクロ平面コイルを作成してみます。

なお、個人的に柔軟な素材である必要がないので、両面銅板PCBに切削加工でコイルを削り出す方法でトライすることを画策中です。


KiCadではじめる「プリント基板」製作 (I・O BOOKS)

IoTセンサーを自作しよう!KiCadで回路基板からDIY!ESP32プログラミング

kicadファイルの構造をじっくり見てみよう

.kicad_pcbファイルの中身をじっくり観察してみます。

適当な回路図面を描いて、その
kicad-pcbファイルを何かテキストエディタで開いてみましょう。

            (kicad_pcb (version 20171130) (host pcbnew "(5.1.8-0-10_14)")

  (general
    (thickness 1.6)
    #...中略
  )

  (page A4)
  (layers
    (0 F.Cu signal)
    #...中略
    (49 F.Fab user)
  )

  (setup
    (last_trace_width 0.25)
    #...中略
      (outputdirectory ""))
  )

  (net 0 "")
  (net 1 "Net-(J1-Pad1)")

  (net_class Default "This is the default net class."
    (clearance 0.2)
    #...中略
    (add_net "Net-(J1-Pad1)")
  )

  (module Connector_Pin:Pin_D1.0mm_L10.0mm (layer F.Cu) (tedit 5A1DC084) (tstamp 5FDBC3DF)
    (at 37.560001 34.545001)
    #...中略
  )

  (module Connector_Pin:Pin_D1.0mm_L10.0mm (layer F.Cu) (tedit 5A1DC084) (tstamp 5FDBC3E9)
    (at 68.915001 34.545001)
    #...中略
  )

  (segment (start 37.560001 34.545001) (end 43.435001 34.545001) (width 0.25) (layer F.Cu) (net 1) (status 400000))
  (segment (start 64.85 30.48) (end 68.915001 34.545001) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC41C) (status 800000))
  (segment (start 57.785 30.48) (end 64.85 30.48) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC41A))
  (segment (start 50.8 37.465) (end 57.785 30.48) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC418))
  (segment (start 47.625 37.465) (end 50.8 37.465) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC417))
  (segment (start 46.99 36.83) (end 47.625 37.465) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC415))
  (segment (start 45.72 36.83) (end 46.99 36.83) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC413))
  (segment (start 43.435001 34.545001) (end 45.72 36.83) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC412))

)
        
などなど丸括弧()で囲われたテキスト形式で図面の設定らしきものが羅列されていることが見て取れます。

これは、S式Pcbnewファイル・フォーマットと呼ばれて定義されているkicad_pcbファイルの図面の表記表現です。

参考資料:
Files Formats KiCad (4.x) ファイル・フォーマット日本語版

構成される主要な要素は以下のようになります。

            (kicad_pcb ... ):
    ヘッダー行とpcbファイルの内容本体
(general ... ):
    ジェネラルセクション
    Pcbnewの共通設定
(layers ... ):
    レイヤーセクション
    導体レイヤーなどの情報を定義する
(setup ... ):
    セットアップセクション
    基板図面のページ設定などのオプションを保管している
(net ... ):
    ネットリスト
    回路図のネットリストの構成(ネット番号とネット名)を反映している
(net_class ... ):
    ネットクラスリスト
    ネットクラス(配線、穴、サイズ、クリアランス設定、ネット名、ネット割当てなど)の情報を保持
(module ... ):
    モジュールリスト
    基板上の全フットプリント(モジュール)のリスト
(segment ... ):
    配線リスト
    基板上の配線と穴のリスト(導体レイヤーのみ有効)
        
察しの良い方はここら辺でピンときているかもしれませんが、今回はシェルスクリプトで配線の加工座標を計算して、pbcnewフォーマットのファイルでそのまま加工してみるチャレンジングな試みになります。

なお、海外の方で
pythonによる平面コイルを出力してくれる便利なスクリプトを公開している方がいますので、シェルスクリプトは使えなくて嫌だという方はぜひ参考にしてみてください。

個人的な趣向が主な理由ですが、平面コイルだけでなく今後さまざまな図形に拡張しやすくしたいがために、今回はシェルスクリプトでkicad_pcbを吐き出してみます。


KiCadではじめる「プリント基板」製作 (I・O BOOKS)

IoTセンサーを自作しよう!KiCadで回路基板からDIY!ESP32プログラミング

実践〜スクリプトからKiCAD図面まで

それではここから実際にどうやって平面コイルを設計していくのかを具体例な手順を見ていきましょう。

平面コイル図形の出力スクリプト

まずは平面コイルを狙ったレイヤー(デフォルトでは
F.Cu(表銅面))にコイル図形を描画できるbashスクリプトを以下に作成してまみした。

            #!/bin/bash

usage_exit() {
    msg1='[-x float] [-y float] [-r float] [-s int] [-a float]'
    msg2='[-w float] [-d float] [-t int] [-c int] [-l string] [-n int]'
    echo -e "Usage: $0 \n $msg1 \n $msg2 [-h help] ..." 1>&2
    exit 1
}

nonlinuxos_exit() {
    echo "Try the script only in LINUX OS." 1>&2
    exit 1
}

if [ -z $PWD ]; then
    nonlinuxos_exit
fi

while getopts x:y:r:s:a:w:d:t:c:l:n:h OPT; do
    case $OPT in
        x ) CENTER_X=$OPTARG ;;
        y ) CENTER_Y=$OPTARG ;;
        r ) RADIUS=$OPTARG ;;
        s ) SIDES=$OPTARG ;;
        a ) START_ANGLE=$OPTARG ;;
        w ) TRACK_WIDTH=$OPTARG ;;
        d ) TRACK_DISTANCE=$OPTARG ;;
        t ) TURNS=$OPTARG ;;
        c ) SPIN=$OPTARG ;;
        l ) LAYER=$OPTARG ;;
        n ) NET_NUM=$OPTARG ;;
        h ) usage_exit ;;
    esac
done

WORK_DIR=$PWD

if [ -z "$CENTER_X" ]; then
    CENTER_X=150.0
fi

if [ -z "$CENTER_Y" ]; then
    CENTER_Y=150.0
fi

if [ -z "$RADIUS" ]; then
    RADIUS=0.15
fi

if [ -z "$SIDES" ]; then
    SIDES=40.0
fi

if [ -z "$START_ANGLE" ]; then
    START_ANGLE=0.0
fi

if [ -z "$TRACK_WIDTH" ]; then
    TRACK_WIDTH=0.13
fi

if [ -z "$TRACK_DISTANCE" ]; then
    TRACK_DISTANCE=0.2
fi

if [ -z "$TURNS" ]; then
    TURNS=40
fi

if [ -z "$SPIN" ]; then
    SPIN=-1
fi

if [ -z "$LAYER" ]; then
    LAYER='F.Cu'
elif [[ "$LAYER" =~ fcu ]]; then
    LAYER='F.Cu'
elif [[ "$LAYER" =~ bcu ]]; then
    LAYER='B.Cu'
elif [[ "$LAYER" =~ cut ]]; then
    LAYER='Edge.Cuts'
elif [[ "$LAYER" =~ cmt ]]; then
    LAYER='Cmts.User'
elif [[ "$LAYER" =~ dwg ]]; then
    LAYER='Dwgs.User'
fi

if [ -z "$NET_NUM" ]; then
    NET_NUM='0'
fi

awk -v cntrx=$CENTER_X -v cntry=$CENTER_Y -v radius=$RADIUS -v sides=$SIDES \
    -v startangle=$START_ANGLE -v tw=$TRACK_WIDTH -v td=$TRACK_DISTANCE \
    -v turns=$TURNS -v spin=$SPIN -v layer=$LAYER -v net=$NET_NUM '
    function radians(theta_) {
        PI = 3.14159265359;
        return PI / 180.0 * theta_;
    }
    function fnc_string(s_x, s_y, e_x, e_y, nt_, lyr_, tw_) {
        printf "  (segment (start %f %f) (end %f %f) (width %.2f) (layer %s) (net %d))\n", s_x, s_y, e_x, e_y, tw_, lyr_, nt_;
    }
    BEGIN {
        OFS=",";
        segs_ = sides;
        base_x_ = cntrx;
        base_y_ = cntry;
        for (j = 0; j < turns; j++) {
            segs_ += 4.0;
            segangle_ = 360.0 / segs_;
            segradius_ = td / segs_
            for (i = 0 ; i < int(segs_) ; i++) {
                start_x_ = base_x_ + (radius + segradius_ * i + td * (j + 1)) * sin(radians(segangle_ * spin * i + startangle))
                start_y_ = base_y_ + (radius + segradius_ * i + td * (j + 1)) * cos(radians(segangle_ * spin * i + startangle))
                end_x_ = base_x_ + (radius + segradius_ * (i + 1.0) + td * (j + 1)) * sin(radians(segangle_ * spin * (i + 1.0) + startangle))
                end_y_ = base_y_ + (radius + segradius_ * (i + 1.0) + td * (j + 1)) * cos(radians(segangle_ * spin * (i + 1.0) + startangle))
                fnc_string(start_x_, start_y_, end_x_, end_y_, net, layer, tw)
            }
        }
    }
' > $WORK_DIR/custom_coil_r"${RADIUS}"_t"${TURNS}".txt
        
とりあえずこれをmake_coil.shとでも名付け、適当な作業フォルダに保存しておきます。

なお、動作環境としてはbashとawkの使えるLinuxやMacOSでも動作するように思います。

もしwindowsで利用したい場合には、以前特集した
busyboxが便利です。

詳細は以下のリンク先の記事を方を参考にしてください。

参考|WindowsでもLinuxシェルコマンドをいつでも簡単に使いたい!と思い立ったときの魔法のツール・busybox

このスクリプトは各コイルの設計諸元をコマンド引数で渡すことでkicad_pcbのセグメントセクション(配線リスト)だけを計算して出力してくれるものです。

使用例として、

            #👇スクリプトに実行権限を付与
$ chmod +x make_coil.sh

#図面上でコイルの中心座標(50.0, 50.0)に半径30.0で
#巻数20のコイルを巻き出し角度45度の位置から作成.
#切削条件として切削幅0.2, 配線間隔0.28, 半時計周り(-1)にて
#ネット番号1のF.Cuレイヤーに加工する.
$./make_coil.sh -x 50.0 -y 50.0 -r 5.0 -t 20 -s 40.0 -a 45.0 \
    -w 0.2 -d 0.28 -c 1 -l fcu -n 1
#...正常に実行後、custom_coil_r30.0_t20.txtに結果が書き込まれる

$ cat custom_coil_r5.0_t20.txt
  (segment (start 71.411193 71.411193) (end 65.145833 76.233353) (width 0.20) (layer F.Cu) (net 1))
  (segment (start 65.145833 76.233353) (end 57.843080 79.270772) (width 0.20) (layer F.Cu) (net 1))
#..以下略
        
というふうに使えます。

コマンドオプションで分かりくいだけ解説すると、

            -x, -y:
    コイルの中心点座標で、通常は図面の端左上を原点(0, 0)とする絶対座標をとる
-s:
    コイルの形状点を作成する際に、内周から外周方向へ巻きながら進むときに
    点の座標を計算するためのスライド量。
    値を大きくするほど細かく形状点を描画する。
    大きすぎると外周ほど点が過剰に密になり、
    小さすぎると内周の点が疎くなりカクカクな形状になるので注意
-c:
    コイルを巻く方向。
    -1で半時計回り、1で時計回りにする
-l:
    加工のターゲットレイヤーを選択するパラメーター。
    fcu > F.cu (デフォルト)
    bcu > B.cu
    cut > Edge.Cuts
    cmt > Cmts.User
    dwg > Dwgs.User
        
といった具合になります。

bash/awkの参考書

KiCADは強力な回路基板の設計ツールですが、色々な図面を描いていくうちに、今回のようにちょっと手で配線しながら描いていくのが難しい構造に出くわすこともあるかもしれません。何かしらのスクリプト言語と併せて、補助的な設計手法にも慣れておくとよいかと思います。

個人的にはほとんどコマンドも文法構文も変えないで済むシェルスクリプトで作成しておくと、何年先も安定して使えるというメリットがあると考えます。

AwkやSedなどは是非この機会に扱えるようになっておくと良いと思います。

KiCADでコイルの設計作業

では、先程の例で吐き出した
custom_coil_r5.0_t20.txtの中身を適当な***.kicad_pcbをテキストエディタで開いて、以下のように(kicad_pcb ..)の中のセグメントセクションの方にコピペしてみましょう。

            (kicad_pcb (version 20171130) (host pcbnew "(5.1.8-0-10_14)")

 #...中略

 #...元々あったセグメントセクション(中略)
  (segment (start 43.435001 34.545001) (end 45.72 36.83) (width 0.25) (layer F.Cu) (net 1) (tstamp 5FDBC412))

  #👇元のセグメントセクションの下にコイル形状の定義をコピペ
  (segment (start 71.411193 71.411193) (end 65.145833 76.233353) (width 0.20) (layer F.Cu) (net 1))
  (segment (start 65.145833 76.233353) (end 57.843080 79.270772) (width 0.20) (layer F.Cu) (net 1))
  #..以下略

)
        
コイルのセグメントセクションを追記して保存した後で、このkicad_pcbファイルをkicadで開くと、コイル形状表示されていたらインポート完了です。

合同会社タコスキングダム|蛸壺の中の工作室

ということで、平面コイルは割とアッサリ設計できることが分かっていただけたら幸いです。


KiCadではじめる「プリント基板」製作 (I・O BOOKS)

IoTセンサーを自作しよう!KiCadで回路基板からDIY!ESP32プログラミング

まとめ

今回は切削加工で平面コイルを試すための前段階として、KiCADから基板図面をどのように作成するかを解説していきました。

コイルやパターンプリントなどの規則性がある図形は、手で描いていくよりも、何かしらの言語でスクリプトで組んでみたほうが作業時間の節約にもなって賢いやり方かと思います。

さて次回以降では、この平面コイルが切削できるのか、コイルとして動作するのか、などなど検証していく内容の方をお届けする予定です。著者的には別のことで作業が飛び飛びになることが最近多いのですが、業務時間の合間合間をみてコツコツ前へ進めていきます。

参考サイト

Let KiCad And Python Make Your Coils(海外)

平面コイル用pythonスクリプト - KiCAD_CopperSpiral_v2.py

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。