【KiCAD応用講座】PCB切削で平面コイルが動くか試してみる① CADファイルの準備
※ 当ページには【広告/PR】を含む場合があります。
2020/12/18
2022/10/02
マイクロ平面コイルを作って遊びたい
kicadファイルの構造をじっくり見てみよう
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))
)
()
(kicad_pcb ... ):
ヘッダー行とpcbファイルの内容本体
(general ... ):
ジェネラルセクション
Pcbnewの共通設定
(layers ... ):
レイヤーセクション
導体レイヤーなどの情報を定義する
(setup ... ):
セットアップセクション
基板図面のページ設定などのオプションを保管している
(net ... ):
ネットリスト
回路図のネットリストの構成(ネット番号とネット名)を反映している
(net_class ... ):
ネットクラスリスト
ネットクラス(配線、穴、サイズ、クリアランス設定、ネット名、ネット割当てなど)の情報を保持
(module ... ):
モジュールリスト
基板上の全フットプリント(モジュール)のリスト
(segment ... ):
配線リスト
基板上の配線と穴のリスト(導体レイヤーのみ有効)
実践〜スクリプトからKiCAD図面まで
平面コイル図形の出力スクリプト
F.Cu(表銅面)
#!/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
busybox
#👇スクリプトに実行権限を付与
$ 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でコイルの設計作業
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))
#..以下略
)
まとめ
参考サイト
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー