Python プログラミングで回路図作成(Schem Draw)
本記事では、Python で回路図を描けるライブラリの Schem Draw を使って、電圧源と抵抗を直並列にしたシンプルな回路図の描き方を解説していきます。
Schem Draw を触ってみた感触としては、RLC素子やダイオード、トランジスタ、オペアンプなどがあるので、簡単な回路図であれば Schem Draw で描けてしまいます。ソースコードも大した量を書かなくても良いので、サクッと回路図を描けてしまうのが良いなと思いました。
ただし、単純に回路図を描くだけなら回路CADを使った方が直感的で扱いやすいかもしれません。では、Schem Draw で回路図を描く最大のメリットは何かというと、「Python」で描けることだと思います。Schem Draw を単体で扱うのではなく、numpyなどの数値演算ライブラリと組み合わせて、電気的仕様の入力データから、回路定数をプログラムで演算して、回路図に定数を記載して Schem Draw で出力するような使い方ができる点が最大のメリットだと思います。
早速、Schem Draw について解説していきます。
ライブラリ Import
Schem Draw のライブラリは以下のようにインポートします。「as elm」の部分に何かこだわりがあれば、他の書き方をしても良いと思います。
import SchemDraw
import SchemDraw.elements as elm
「SchemDraw.elements」の中には下記ページに記載されている回路素子が含まれています。これだけの素子があれば、簡単な回路の回路図は Schem Draw で描けそうです。
回路図の作成方法(部品単体)
回路図を作成する際、はじめに下記のコードを書きます。左辺の「d」は「a」でも「b」でも、なんでも構いません。
d = schemdraw.Drawing()
上記のコードでは、括弧の中身は空っぽですが、次のようにパラメータを入れて回路図をカスタマイズすることもできます(下記のコードは参照ドキュメントコピー)。
schemdraw.Drawing(*elements, unit=3.0, inches_per_unit=0.5, lblofst=0.1, fontsize=14, font='sans-serif', color='black', lw=2, ls='-', fill=None)
パラメータ説明
unit(float):
2端子要素の全長を調整できます。
値を大きくすれば、抵抗やコンデンサのリード長さが長くなるとイメージしてもらえれば良いと思います。ちなみに、抵抗器の内側のジグザグ部分は1.0単位です。
inches_per_unit(float):
描画スケールを設定するための描画単位あたりのインチです。
lblofst(float):
回路素子とラベル(回路記号や定数など)の間の距離を調整できます。
fontsize(float):
テキストラベルのデフォルトのフォントサイズを調整できます。
font(string):
テキストラベルのデフォルトのフォント書体
色(文字列またはタプル):
回路図の色を変更できます。
色名または RGB で指定します。
lw(float):
素子のデフォルトの線幅を変更できます。
ls(文字列):
デフォルトの線のスタイル を変更できます。
「-」や「:」などで指定します。
塗りつぶし(文字列またはタプル):
閉じた素子のデフォルトの塗りつぶし色を変更できます。
たとえば、「schemdraw.Drawing( )」の括弧の中身を空っぽにしたまま、抵抗を描くと次のように出力されます。ただし、「schemdraw.Drawing( )」のコードだけで抵抗は出力されません。後ほど解説します。
そして、下記のように括弧の中にパラメータを入れると、抵抗は次のように出力されます。
d = SchemDraw.Drawing(unit=3.0, inches_per_unit=4.0, lblofst=0.2, fontsize=36, font='Times New Roman', color='blue', lw=5, ls=':')
次に、抵抗を1つ出力する例を用いて、回路図の作成方法を解説していきます。まず、下記のコードを実行すれば抵抗が1つだけの図を出力することができます。
# =================================================
# ライブラリインポート
# =================================================
# 回路図作成ライブラリ
import SchemDraw
import SchemDraw.elements as elm
# =================================================
# メイン
# =================================================
d = SchemDraw.Drawing()
d.add(elm.Resistor(label='100K$\Omega$'))
d.draw()
では、上記のコードをひとつずつ解説していきます。まず、下記のコードでは、「d = SchemDraw.Drawing( )」で作成した回路図に抵抗を追加しています。「elm.Resistor」で、回路素子のライブラリから 抵抗を追加しています。「elm.Resistor」を「elm.Capacitor」に変えればコンデンサを追加することができます。「label='100K$\Omega$'」では、抵抗と共に記載するテキストラベルを設定します。「$\Omega$」が「Ω」になります。
d.add(elm.Resistor(label='100K$\Omega$'))
そして、下記のコードで、作成した回路図を出力することができます。
d.draw()
以上で、部品単体の回路図を作成することができます。
回路図の作成方法(部品複合)
回路図に部品を追加したい場合、「add」で回路素子を追加していくだけです。比較的簡単に部品を追加することができます。しかし、ひとつ重要なポイントがあります。それは「部品をどこに配置するか」です。それを決めるのが下記のコードで「d='right'」と記載した部分になります。
# =================================================
# ライブラリインポート
# =================================================
# 回路図作成ライブラリ
import SchemDraw
import SchemDraw.elements as elm
# =================================================
# メイン
# =================================================
d = SchemDraw.Drawing(unit=2.0, inches_per_unit=3.0)
d.add(elm.Resistor(d='right', label='R1'))
d.add(elm.Resistor(d='right', label='R2'))
d.draw()
まず、上記のコードを実行すると次のように回路図が出力されます。
dキーワードは、「right」「left」「up」「down」または「r」「l」「u」「d」をソースコードに記載することで描画方向を指定することができます。 dが指定されていない場合、要素は前の要素と同じ方向に描画されます。
もし、抵抗 R2 を下方向に描きたければ、次のように、抵抗 R2 の d の部分を「down」にします。
d.add(elm.Resistor(d='right', label='R1'))
d.add(elm.Resistor(d='down', label='R2'))
上記のコードで実行すると次のように出力されます。
また、次のように「theta」を使って角度 [deg] を入力すれば、素子の接続に角度をつけることができます。
d.add(elm.Resistor(d='right', label='R1'))
d.add(elm.Resistor(theta=45, label='R2'))
隣に回路素子をつけ足していくだけであれば、上記のように add でどんどん追加していけばOKです。しかし、現実的には並列回路も作りたいと思います。並列接続をする場合には「push」と「pop」を使用します。
まず、プログラムは書いたソースコードの上から下へ順番に処理されていきます。そして「push( )」を記載すると、その直前に加えた素子の描画位置と方向を保存します。次に「pop( )」を記載すると、「push( )」を記載した描画位置と方向から素子を加えていくことができます。
たとえば、下記のコードを実行すると次の回路図が出力されます。ちなみに「elm.Dot( )」で黒点を描くことができます。
d = SchemDraw.Drawing(unit=2.0, inches_per_unit=3.0)
d.add(elm.Resistor(d='right', label='R1'))
d.add(elm.Dot())
d.push() # この描画位置/方向を後で使用するために一時保存
d.add(elm.Resistor(d='down', label='R2'))
d.pop() # 一時保存した描画位置/方向に戻る
d.add(elm.Resistor(d='right', label='R3'))
d.draw()
閉回路にするためには、「elm.Line」を追加します。以下に抵抗直並列回路の閉回路図のソースコードを記載します。もし、実際に試してみるのであれば、一行ずつ add を加えていくと、どのように回路図が描き足されていくのかが分かり、理解が深まると思います。
# =================================================
# ライブラリインポート
# =================================================
# 回路図作成ライブラリ
import SchemDraw
import SchemDraw.elements as elm
# =================================================
# メイン
# =================================================
d = SchemDraw.Drawing(unit=2.0, inches_per_unit=3.0)
d.add(elm.Resistor(d='right', label='R1'))
d.add(elm.Dot())
d.push() # この描画位置/方向を後で使用するために一時保存
d.add(elm.Resistor(d='down', label='R2'))
d.add(elm.Dot())
d.add(elm.Line(d='left'))
d.add(elm.BatteryCell(d='up', reverse=True, label='E'))
d.pop() # 一時保存した描画位置/方向に戻る
d.add(elm.Line(d='right'))
d.add(elm.Resistor(d='down', label='R3'))
d.add(elm.Line(d='left'))
d.draw()
上記のコードを実行すると次の回路図が出力されます。
参考ページ
本記事は下記のページを参考にしながら作成しました。英語ですが、 Schem Draw の使い方について色々と書かれています。
以上
何かお役に立てたら、サポートしていただけると嬉しいです!モチベーションを高めて、アウトプットしていきます!