まんま!の備忘録

ソフトウェア・ファームウェア・ハードウェア関連の備忘録

KiCADで作成した基板を電磁界シミュレーション(その2:USB2.0)

作成した基板の電磁界シミュレーションするまでをまとめます。Macでの作業です。
openEMSとgerber2EMSを使用します。
前回はこちら。
taogya.hatenablog.com


今回のゴールは以下です。

参考資料

インピーダンス計算は事前にこちらで計算
taogya.hatenablog.com

USB2.0テクニカルマニュアル
https://product.tdk.com/system/files/dam/doc/content/emc-guidebook/ja/jemc_practice_04.pdf

さて、設計した基板が本当に大丈夫かシミュレーションしていきましょう。
対象基板は以下のような形です。赤枠内がUSBラインです。
今回小型基板ですがそのまま実施すると時間かかるので、必要な部分だけ切り出します。
また、部品があるところは配線でショートします。

準備

シミュレーション環境が使えるディレクトリに移動し、ガーバーデータをfabフォルダにコピーします。

$ cd Simulation
$ mkdir fab
$ cp /your_gerber_dir/* fab

シミュレーション実施するために、以下ファイルを作成する必要があります。

  • スタックアップ ファイル
  • ドリルファイル
  • 位置ファイル
  • 構成ファイル
スタックアップ ファイル

PCB スタックアップを説明するファイルです。
各層の定義をjsonファイルに落とし込みます。(2024/03/30時点です)

Key Value
name typeがcopper の場合、「<optional-text>-<name>.gbr 」の nameに当たる部分を指定します。「*_Cu」である必要がある(例えばF_Cu/B_Cu)。それ以外は任意文字列。
type copper, core, prepreg から指定します。
color ソースコード見ると参照していない?とりあえず null で。
thickness この層の厚みを mm で指定します。
material この層の材質を指定するみたいだが、ソースコードでは参照していない?とりあえず FR4 で。
epsilon 誘電率
lossTangent 損失正接

JLCPCBプラグインで出力したガーバーデータのcopper 層のファイル名が 「*-_CuTop.gbr」、「*-_CuBottom.gbr」 となっているので、 「*-F_Cu.gbr」、「*-B_Cu.gbr」に置き換えます。
KiCAD の基板の設定 物理的スタックアップとガーバーデータとgerber2emsのexampleをみながら、 stackup.jsonを作成します。
ついでに、「-EdgeCuts.gbr」のファイル名も「Edge_Cuts.gbr」にする必要あるので直します。

$ for name in fab/*-CuTop.gbr; do mv $name ${name/CuTop/F_Cu}; done && \
for name in fab/*-CuBottom.gbr; do mv $name ${name/CuBottom/B_Cu}; done && \
for name in fab/*-EdgeCuts.gbr; do mv $name ${name/EdgeCuts/Edge_Cuts}; done
$ vi fab/stackup.json
{
    "layers": [
        {
            "name": "F_Cu",
            "type": "copper",
            "color": null,
            "thickness": 0.035,
            "material": null,
            "epsilon": null,
            "lossTangent": null
        },
        {
            "name": "Core",
            "type": "core",
            "color": null,
            "thickness": 1.46,
            "material": "FR4",
            "epsilon": 4.5,
            "lossTangent": 0.02
        },
        {
            "name": "B_Cu",
            "type": "copper",
            "color": null,
            "thickness": 0.035,
            "material": null,
            "epsilon": null,
            "lossTangent": null
        }
    ],
    "format_version": "1.0"
}
ドリルファイル

ガーバーデータに「-PTH.drl」で終わるファイルがあればOKです。

位置ファイル

ポートの位置を記述したCSVファイルです。
ファイル名は「-pos.csv」で終わる必要があります。
copper層を両面で定義しているなら「-top-pos.csv」、「-bottom-pos.csv」で終わるファイルを作成します。

ガーバーデータ見ながら座標を入力していきます。
このcsvで指定する座標は左下が0点で上(y)、右(x)方向がプラスになります。
ガーバーデータは上(y)がマイナスになっているので、逆にします。
また、Rotはポートの入出力端の向きで、
↑:0、→:-90、↓:180、←:90
のようです。

上面

$ vi fab/differential-top-pos.csv
Ref,Val,Package,PosX,PosY,Rot,Side
"SP1","Simulation_Port","Simulation_Port",4.8,9.0,-90,top
"SP2","Simulation_Port","Simulation_Port",21.5,8.05,90,top
"SP3","Simulation_Port","Simulation_Port",4.8,6.9,-90,top
"SP4","Simulation_Port","Simulation_Port",21.5,7.55,90,top

下面

$ vi fab/differential-bottom-pos.csv
Ref,Val,Package,PosX,PosY,Rot,Side

構成ファイル

シミュレーション全体を構成するファイルです。
これは、長いので説明省きます。。すみません。
こちら とexamplesの方を参考に構成してください。
※注意
frequency は in MHz と書いてあるが、Hzの誤記のように思う。
differential_pairs のnameに「.」が含まれているとエラーとなるので「_」などに置き換えておくこと。(USB2_0 のように)
inter_layers は2層だとエラーになる。。2層基板ですがとりあえず4にしてます。
width/lengthは位置ファイルのポートが(PosX,PosY,Rot)=(1, 1, -90)の時、以下のようなイメージで設定します。

meshのサイズはシミュレーション実施始めに 「ems/geometry/F_Cu.png_mesh.png」が生成されるので、その図を見ながら、隣の配線とぶつかっていないか見ながら調整します。だめそうなら、シミュレーション中止して調整します。わからなければ、実施後の結果をみて判断しましょう。
(線太いのでわかりづらいですが。。)


以下、今回の例です。メッシュサイズが小さいと馬鹿みたいに時間かかります。(xy=10にしたら4時間かかった)

$ vi simulation.json
{
    "format_version": "1.1",
    "frequency": {
        "start": 1e8,
        "stop": 3e9
    },
    "max_steps": 8e4,
    "via": {
        "filling_epsilon": 1,
        "plating_thickness": 50
    },
    "mesh": {
        "xy": 50,
        "inter_layers": 4,
        "margin": {
            "xy": 100,
            "z": 100
        }
    },
    "margin": {
        "xy": 500,
        "z": 500
    },
    "ports": [
        {
            "width": 100,
            "length": 400,
            "impedance": 45,
            "layer": 0,
            "plane": 1,
            "excite": true
        },
        {
            "width": 100,
            "length": 400,
            "impedance": 45,
            "layer": 0,
            "plane": 1,
            "excite": false
        },
        {
            "width": 100,
            "length": 400,
            "impedance": 45,
            "layer": 0,
            "plane": 1,
            "excite": true
        },
        {
            "width": 100,
            "length": 400,
            "impedance": 45,
            "layer": 0,
            "plane": 1,
            "excite": false
        }
    ],
    "differential_pairs": [
        {
            "start_p": 0,
            "stop_p": 1,
            "start_n": 2,
            "stop_n": 3,
            "name": "USB2_0"
        }
    ]
}
インピーダンスの確認

では実施します。

$ gerber2ems -a --export-field -d

10分ぐらいかかりました。
だいぶかかりますね。

結果です。ems/results/Z_diff_USB2_0.png に生成されます。

全体的に高いですね。110Ω超えちゃってます。


ついでにParaview(本当はもっとぬるぬる動く)


実測と比較してみないとわかりませんが、以上です。

急激なアクセス増化(Google AdSense?)

Google AdSenseに審査申し込みをして1週間が経ちます。
今まで、本ブログのアクセス数は数件ほどでしたが、急に100件超えました。

なんだ?
海外から何かのアタックされたのか?
と不安に思いつつ、そういえばGoogle AdSenseに審査申し込み中だったことを思い出し。

結局なぜなのかわからないが、Google AdSense申し込み時にそういうことあった方いたらコメントいただけると助かります。。

スクリーン録画とffmpeg を使用してgif化

Macでスクリーン録画したものをこのブログに上げる時の手順忘れちゃうのでメモ。

⌘+⇧+5 実行
選択部分を収録を選択。
収録実行
録画停止

ターミナルを開く。

$ ffmpeg -i "画面収録 2024-03-30 19.57.55.mov" -vf scale=320:-1 output.gif

ディレクトリ内に一つしかmovがないなら

$ ffmpeg -i "$(ls *.mov)" -vf scale=320:-1 output.gif

KiCADで作成した基板を電磁界シミュレーション(その1:インストール)

作成した基板の電磁界シミュレーションするまでをまとめます。Macでの作業です。

今回のゴールは以下です。

  • openEMS のインストール
  • gerber2ems のインストール

なお、このシミュレーターはパターンのみの確認しかできません。
部品実装状態でのシミュレーションは調査して、後にまとめるかもしれません。

さて、まずはインストールを始めましょう。

環境構築

まずは作業環境作ります。Python3.11を使用します。
(3.10 以上である必要であります。3.10、3.11 でOKなの確認済み)

$ brew install python@3.11
$ mkdir Simulation
$ cd Simulation
$ python3.11 -m venv venv
$ . venv/bin/activate

openEMS のインストール

こちらの手順で進めます。(macOS)
docs.openems.de

[2024/03/28時点でエラー出ます。手動ビルドを行う必要があります。]
$ brew tap thliebig/openems https://github.com/thliebig/openEMS-Project.git
$ brew install --HEAD openems

エラー出ます。

 -- Unable to determine HDF5 C flags from HDF5 wrapper.
CMake Error at /opt/homebrew/Cellar/cmake/3.29.0/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_HL_LIBRARIES) (found
  suitable version "1.14.3", minimum required is "1.8")

cmakeのバグのようです。
github.com

しょうがないので手動でビルドします。

$ pip install cython numpy h5py matplotlib
$ git clone --recursive https://github.com/thliebig/openEMS-Project.git
$ cd openEMS-Project

以下3コマンドで CMakeLists.txt を書き換えます。

$ sed -i '.bk' 's/^find_package(HDF5 1.8 COMPONENTS C HL REQUIRED)/find_package(HDF5 COMPONENTS C HL REQUIRED)/g' AppCSXCAD/CMakeLists.txt && \
sed -i '.bk' 's/^find_package(HDF5 1.8 COMPONENTS C HL REQUIRED)/find_package(HDF5 COMPONENTS C HL REQUIRED)/g' CSXCAD/CMakeLists.txt && \
sed -i '.bk' 's/^find_package(HDF5 1.8 COMPONENTS C HL REQUIRED)/find_package(HDF5 COMPONENTS C HL REQUIRED)/g' openEMS/CMakeLists.txt

インストール実行

$ ./update_openEMS.sh ~/opt/openEMS
$ echo 'export PATH="$HOME/opt/openEMS/bin:$PATH"' >> ~/.zprofile
$ cat ~/.zprofile | tail -1
export PATH="$HOME/opt/openEMS/bin:$PATH"

./update_openEMS.sh ~/opt/openEMS --python とするとうまく仮想環境にインストールされないようで、gerber2ems のインストールチェックで以下エラーが出る場合があります。

ModuleNotFoundError: No module named 'CSXCAD'

なのでここで Pythonライブラリをインストールします。

$ cd ./openEMS/python
$ python setup.py build_ext -I ~/opt/openEMS/include -L ~/opt/openEMS/lib -R ~/opt/openEMS/lib
$ python setup.py install
$ cd ../../CSXCAD/python
$ python setup.py build_ext -I ~/opt/openEMS/include -L ~/opt/openEMS/lib -R ~/opt/openEMS/lib
$ python setup.py install

ターミナルを開き直してインストールチェックです。

$ openEMS
 ---------------------------------------------------------------------- 
 | openEMS 64bit -- version v0.0.36-15-g1ccf094
 | (C) 2010-2023 Thorsten Liebig   GPL license
  ---------------------------------------------------------------------- 
:

OK!!

gerber2ems のインストール

github.com


仮想環境を立ち上げます。

$ cd Simulation
$ . venv/bin/activate

[2024/03/28 時点で後のインストールでエラー出るので以下モジュールを個別でインストールします。(Mac M1のみ)]

$ pip install git+https://github.com/drufat/triangle.git

インストール。

$ brew install python3-dev
$ brew install gerbv
$ git clone https://github.com/antmicro/gerber2ems.git
$ cd gerber2ems
$ pip install .

インストールチェックです。

$ gerber2ems --help
usage: EM-Simulator [-h] [-c CONFIG_FILE] [-g] [-s] [-p] [-a] [--export-field] [--threads THREADS]
                    [-d | -l {DEBUG,INFO,WARNING,ERROR}]
:

OK!!


最後に、動作確認をしてみましょう。gerber2ems/examples/differential を実行してみます。

$ cd examples/differential
$ gerber2ems -a

1分30秒ほどかかりました。
ems/results ディレクトリ内に結果が格納されます。
以下は差動インピーダンスの結果。

おまけ

Paraviewを使用して綺麗に見せることもできるようです。

$ brew install paraview
$ gerber2ems -a --export-field

Paraviewを開いて確認します。

(実際はもっとぬるぬる動きます。)


結構時間かかるので、実際の基板では必要なところだけ切り取ってシミュレーションした方がようさそうですね。

FreeCadのインストール

以下からダウンロードします。
www.freecad.org

ダウンロードしたファイルをダブルクリックします。
アプリを移動します。

アプリを実行します。
初回は警告画面出るので、同意できるなら開くを押します。

インストール完了です。


使い方や作成フローはこちらわかりやすいです。
Macと操作方法違うところあるかもですが。)
cosmosdesign2021.com

CPU負荷に応じて猫がはしるやつ

面白いのを見つけたので紹介。
CPU負荷に応じて猫がはしるやつです。
kyome.io

いれてみました。(本当はもっとぬるぬる動きます。)


ランナー変えれるようなので変えてみます。


スライムいいね^^

インストールはこちらからどうぞ。

Mac

RunCat

RunCat

  • Takuto Nakamura
  • ユーティリティ
  • 無料
apps.apple.com

Windows

ランナーは少ないみたい。
github.com

【KiCAD】ノウハウまとめ

勉強になったサイトや、便利なプラグインなどのリンクをまとめます。
たまに更新します。

基板発注先

PCBGoGo

まだ使ってない。
クーポンが便利。何回か発注していくと割引なくなるみたい。
それでも安いし、対応が良いので良いところみたい。
www.pcbgogo.jp

JLCPCB

発注しようとして、Paypalでトラブルのため、待ち。
格安です。
jlcpcb.com

プラグイン

PCBGOGO Kicad用プラグイン

基板発注依頼用のガーバーデータを生成+基板発注画面まで遷移してくれる。
めちゃ便利。
www.pcbgogo.jp

JLCPCB Kicad用プラグイン

基板発注依頼用のガーバーデータを生成してくれる。
github.com

【KiCAD】基板の設定(その5:デザインルール 制約)

基板の設定のデザインルールの制約とはどんな設定項目かをまとめます。(Macでも同様です)

こんな画面です。


結構重要な設定です。これによって、基板のコスト変わったりします。
PCBGoGoの自動見積もりと標準FR-4基板製造基準を参考に進めます。
www.pcbgogo.jp
www.pcbgogo.jp

※ 1 mil = 0.0254 mm とします。

【銅】最小クリアランス

自動見積もりの「最小パターン幅/間隔」、製造基準の「外層パターン幅/間隔」/「内層パターン幅/間隔」です。
5mil、6mil、8mil は安くなる傾向になります。それ以外は高くなる傾向になります。(2024/03/22時点)

【銅】最小配線幅

基本的に、【銅】最小クリアランスと同じがいいでしょう。

【銅】最小接続幅

探しましたが、PCBGoGoでは基準がないように見えます。
【銅】最小配線幅でいいでしょう。
基板Aと基板Bを繋ぐ場合は、製造基準の「接続部幅」を考慮しましょう。

【銅】最小アニュラー幅

製造基準の「ランド座残りの幅」です。

【銅】最小ビア直径

自動見積もりの「最小穴径」と製造基準の「TH穴の穴径」に【銅】最小アニュラー幅×2 を加算した値です。
または、【穴】最小スルーホールに【銅】最小アニュラー幅×2 を加算した値です。

【銅】導体から穴のクリアランス

製造基準の「NTH穴からパターンまでのスペース」です。

【銅】導体から基板端クリアランス

製造基準の「パターンから外形までのスペース」です。

【穴】最小スルーホール

自動見積もりの「最小穴径」と製造基準の「TH穴の穴径」です。
0.25mm、0.3mm は安くなる傾向になります。それ以外は高くなる傾向になります。(2024/03/22時点)
NTHの設定はないようなので、スルーホール以外の穴を開ける時は、製造基準の「NTH穴の穴径」を考慮しておきましょう。

【穴】穴から穴へのクリアランス

製造基準の「TH穴間隔」です。

【マイクロビア】最小マイクロビア直径

【銅】最小ビア直径より小さいビアです。
特になければ、【銅】最小ビア直径と同じでいいでしょう。

【マイクロビア】最小マイクロビア穴径

【穴】最小スルーホールより小さいビアです。
特になければ、【穴】最小スルーホールと同じでいいでしょう。

シルクスクリーン】アイテムの最小クリアランス

製造基準の「シルクからレジストまでのスペース」のはずです。
調べましたがあまり情報がなく。ちょっと自信ないです。

製造基準の「レジスト幅」、「レジストからパットまでのスペース」を考慮してあげた方がいいかな。
(例えば、0.1 + 0.15 + 0.05 = 0.3mm)

シルクスクリーン】最小テキスト高

製造基準の「文字高」です。

シルクスクリーン】最小のテキストの太さ

製造基準の「文字幅」です。

【円弧/円を線分で近似する】最大許容偏差

円弧/円を描画する時の最小値です。
円弧近似で調べてもらうと、イメージつきやすいかと。

【ゾーン塗りつぶし方法】ゾーン外形の外側のフィレットを許可する

以下参考。
forum.kicad.info

【ゾーン塗りつぶし方法】最小サーマルリリーフ スポーク数

スルーホールと塗りつぶし部を結ぶ時の線の数です。

【長さの調整】スタックアップの高さを配線長の計算に含める

多層基板にした時に、N層からN+1層の配線長を計算に含めるかということ。


んで、最終こんな感じ。

【KiCAD】基板の設定(その4:ハンダマスク/ハンダペースト)

基板の設定のハンダマスク/ハンダペーストとはどんな設定項目かをまとめます。(Macでも同様です)

こんな画面です。

ハンダマスクの拡張

パッドより、広いまたは狭い幅でハンダマスクを設定したい場合。
あんまりないかと思うので、0のままでいいかと。

以下参考。
electronics.stackexchange.com

ハンダマスクの最小ウェブ幅

マスク開口部間の最小間隔のようです。
以下の「4.2.6 Solder mask layer」を参考にしてください。
https://www.nxp.jp/docs/en/application-note/AN2388.pdf

PCBGoGoなんかだと、以下の30項レジストからパットまでのスペース の0.05mm x 2 = 0.1mmに該当するところでしょうか。
www.pcbgogo.jp

この値より小さい間隔でマスク開口部が設定されていると結合してしまうようです。
フットプリント作成時点で考慮しておいて、ここは0に設定しておくのが無難かな。

ハンダマスクと導体間のクリアランス

パッドとマスク開口部の間隔のようです。
ハンダマスクの拡張との違いは、拡張は「その大きさに拡張したい」という意味で、こちらは制約ということなんだろう。
forum.kicad.info

ハンダマスクアパーチャ(開口部)がフットプリント内のパッド間を接続することを許容する

ハンダマスクの最小ウェブ幅 で書いた、結合するかどうかの設定なんだろうか。
情報がない。。とりあえず、初期状態のままが無難か。

ビアのテンティング

ビアをレジストで覆うかどうか。

以下参考。
www.pcbgogo.com
www.qualiecocircuits.com.au

ハンダペーストの絶対クリアランス

マスク開口部をどのくらい狭めるかをmmで指定したい場合。
部品実装依頼する場合には、設定した方がいいだろうが、手実装なら0でいいだろう。

ハンダペーストの相対クリアランス

マスク開口部をどのくらい狭めるかを割合(%)で指定したい場合。
部品実装依頼する場合には、設定した方がいいだろうが、手実装なら0でいいだろう。



ハンダマスクの拡張〜ハンダマスクと導体間のクリアランス の情報が少ない。
とりあえず初期状態のままで何枚も製造依頼してきたという方もいるので、いじらないでおいて大丈夫だろう。
forum.kicad.info


んで、最終こんな感じ。

【KiCAD】基板の設定(その3:基板仕上げ)

基板の設定の基板仕上げとはどんな設定項目かをまとめます。(Macでも同様です)

こんな画面です。

端面スルーホール パッドあり

こんなかんじのやつです。
www.pcbgogo.jp

基板端メッキ

こんなかんじのやつです。
www.pcbgogo.jp

銅箔仕上げ

パッドの表面処理の指定です。
こんなかんじのやつです。
www.pcbgogo.jp
www.pcbgogo.jp

エッジカード コネクタ

こんなかんじのやつです。
www.pcbgogo.jp


んで、最終こんな感じ。