見出し画像

Python で 電気回路の授業

電気回路の授業では、回路図を書いたり、計算をしたり、いろんなことをします。

今回は、電気回路の授業準備で使えそうな Python と Google コラボラトリー を使った方法をお伝えします!

まず、Google コラボラトリー

ブラウザで Python を実行できる開発環境です。
iPad でも使えたりするし、自分のデバイスの環境を汚さないあたりがいいですよね!

電気回路の作成手順です。

参考は、こちらのサイトです。

Google コラボラトリー でコードを入力するまでがわからない方はこちらから

まずは、このコードを実行します

!pip install schemdraw==0.14

次にこちらを実行します

%matplotlib inline
%config InlineBackend.figure_format = 'png'

ここで、

 'png'

にしているのは、後で回路図をダウンロードするときに、png形式でダウロードしたいからです。

では、回路図を作ってみましょう!

import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files

with schemdraw.Drawing() as d:
    d += elm.SourceSin().up().label('10V') # 交流電源
    d += elm.Line().up() # 縦の線
    d += elm.Line().right() # 右に行く線
    d += elm.ResistorIEC().down().label('10Ω') # 抵抗
    d += elm.Inductor().down().label('10mH') # コイル
    d += elm.Capacitor().down().label('10μF') # コンデンサ
    d += elm.Line().left() # 左に行く線
    d += elm.Line().up() # 縦の線

d.save('circuit.png')

# png 形式でダウンロード
#files.download('circuit.png')

こちらで作成できた回路はこんな感じ。

綺麗に作図できていますね!😆

作った回路図をダウンロードしたい場合は、

# png 形式でダウンロード
files.download('circuit.png')

上記のように、files の前についている # を消して実行してください。
# はコメントアウトする時に使い、今は無効化してありました。

では、二つの回路の直列はどんな感じになるでしょうか!?

import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files

with schemdraw.Drawing() as d:
    d += elm.SourceSin().up().label('10V') # 交流電源
    d += elm.Line().right() # 右に行く線
    d += elm.ResistorIEC().down().label('10Ω') # 抵抗
    d += elm.Inductor().down().label('10mH') # コイル
    d += elm.Line().left() # 左に行く線
    d += elm.Line().up() # 縦の線

d.save('circuit.png')


こんな具合で回路を作ることができます!

    d += elm.ResistorIEC().down().label('10Ω') # 抵抗

の ' ' で囲まれているところがラベルになります。
中身は文字列として認識してくれます。

並列はこんなコードになりました。

import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files

with schemdraw.Drawing() as d:
    d += elm.SourceSin().up().label('10V') # 交流電源
    d += elm.Line().right() # 右に行く線
    d += elm.Dot() # ドット
    d.push() # この位置を記憶
    d += elm.ResistorIEC().down().label('10Ω') # 抵抗
    d.pop() # さっき記憶した位置に戻る
    d += elm.Line().right() # 右に行く線
    d += elm.Inductor().down().label('10mH') # コイル
    d += elm.Line().left() # 左に行く線
    d += elm.Dot() # ドット
    d += elm.Line().left() # 左に行く線

d.save('circuit.png')

ここで、直列回路の時と違うのが、

    d.push() # この位置を記憶
    d.pop() # さっき記憶した位置に戻る

この二つを使っているところかなと思います。

回路を描いて行くときに、このライブラリでは左側から、右回りで回路をつなげて行くようになっています。

そして、回路の要素の右側や下から次の要素をつなげてくれるんです。

そのため、並列で先ほどの記憶させる動作をしないと….。

こんな感じになってしまうのです。

そのため、その位置を記憶させるコードと、記憶した位置に戻るコードを追加しながら回路を描いていきます。

さっきから、いきなり交流電源でやっていますけど、これを使う人は少ないですよね🤣笑

ということで、直流で素子が一つの場合。

import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files

with schemdraw.Drawing() as d:
    d.push()
    d += elm.BatteryCell().label('5V') # 直流電源
    d.pop()
    d += elm.Line().up() # 縦の線
    d += elm.ResistorIEC().right().label('5Ω') # 抵抗
    d += elm.Line().down() # 縦の線

d.save('circuit.png')

ちょっと複雑にすると、

import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files

with schemdraw.Drawing() as d:
    d.push()
    d += elm.BatteryCell().label('5V') # 直流電源
    d.pop()
    d += elm.Line().up() # 縦の線
    d += elm.ResistorIEC().right().label('5Ω') # 抵抗
    d.push()
    d += elm.ResistorIEC().right().label('5Ω') # 抵抗
    d.pop()
    d += elm.Dot()
    d += elm.Line().up() # 縦の線
    d += elm.ResistorIEC().right().label('5Ω') # 抵抗
    d += elm.Line().down() # 縦の線
    d += elm.Dot()
    d += elm.Line().down() # 縦の線
    d += elm.Line().left() # 左に行くの線

d.save('circuit.png')

こんな感じです。

    d += elm.Line().up() # 縦の線
    d += elm.Line().down() # 縦の線
    d += elm.Line().left() # 左に行くの線
       d += elm.Line().light() # 右に行くの線

この辺り、解説して無いですけどいいですよね?😎笑
Line は線
up , down で縦の線
left , light で横の線

普通の英語だし。

他にもいろんな要素(LED や 論理回路)が用意されているので、ぜひ作図してみてください!

こちらで解説しています。

さて、次はベクトル図です。

交流回路を扱うということは、ベクトル図を描く必要もあるのです。
これが伝わる人は少ないですよね笑
すみません😆笑

こちらのサイトを参考にさせていただきました。

そもそも。
複素平面を描きたくて、いいツールないかなって探してたんです。

でも、

これ、自分で作ったほうが早いし、汎用性あるんじゃね!?

って思って、Python なら簡単に作れるのでは….と探していて見つけたのです!!😉

プログラム

こちらは、上記のサイトに使い方が載っているので、参考にしていただければ良いのですが、少しだけ改変しました。

import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
import cmath
import math

# 5×5サイズのFigureを作成してAxesを追加
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(111)

# 格子点を表示
ax.grid()

# 軸範囲の設定
lim=[-40,40]
ax.set_xlim(lim)
ax.set_ylim(lim)

# x軸とy軸
# 実軸
plt.quiver(lim[0],0,lim[1]*2,0,angles='xy',scale_units='xy',scale=1)
plt.text(1.05*lim[1],0.02*lim[0], 'Re')
# 虚軸
plt.quiver(0,lim[0],0,lim[1]*2,angles='xy',scale_units='xy',scale=1)
plt.text(0.03*lim[0],1.05*lim[1], 'Im')
# 原点
plt.text(0.1*lim[0],0.1*lim[0], '$O$')

# 余分な目盛りを削除
xt=list(ax.get_xticks())
for i in [0,np.floor(lim[0]),np.ceil(lim[1])]:xt.remove(i)
ax.set_xticks(xt)
ax.set_yticks(xt)

# 虚軸の目盛りを変更
imlabel=[]
for yticks in ax.get_yticks():
 if yticks < 0 :imlabel.append("- j "+str(yticks*(-1)))
 else : imlabel.append("j "+str(yticks))
ax.set_yticklabels(imlabel) 

# 軸を中央に移動
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)


a = math.sqrt(48)
b = complex(-30,-a)
test = 10 + 20j

# 極座標に変換
r, rad = cmath.polar(b)

# 単位を度数(degree)に変換
deg = math.degrees(rad)

# 位相(rad)
phase = math.radians(deg)

# 直交座標に変換
ort = cmath.rect(r, phase)

# ベクトルを表示 quiver(始点x,始点y,成分x,成分y)
ax.quiver(0, 0, b.real, b.imag, color = 'red',angles = 'xy', scale_units = 'xy', scale = 1)

# ベクトルにテキストを添える
#ax.text( 0 , 0 , '   ' , color = 'red', size = 15)

print(b)
print(r)
print(deg)
print(rad)
print(ort)

plt.show()

#グラフをダウンロードするときは、plt.show() をコメントアウトして、下記の2つのコードを有効化する
#plt.savefig('grah.png')
#files.download('grah.png')

変わっているところは、

# 虚軸の目盛りを変更
imlabel=[]
for yticks in ax.get_yticks():
 if yticks < 0 :imlabel.append("- j "+str(yticks*(-1)))
 else : imlabel.append("j "+str(yticks))
ax.set_yticklabels(imlabel) 

ここの部分です。
どうしても、y軸の j を数値の前に持ってきたくて。

これで作ったベクトル図はこんな感じ。

画像をダウンロードするときは、

#plt.show()

#グラフをダウンロードするときは、plt.show() をコメントアウトして、下記の2つのコードを有効化する
plt.savefig('grah.png')
files.download('grah.png')

このような状態にしてください。

#plt.show()

注意点は、上記のようにしないと、空白のベクトル図をダウンロードすることになります。

それぞれの要素ですが、

a = math.sqrt(48)

は、48の平方根(√48)を作るコードです。

b = complex(-30,-a)

では、-30 - j √45 という状態を作っています。
複素数を作っています。

test = 10 + 20j

この test という変数のような感じで複素数を設定することも可能です。
ただ、今回は√を使いたかったので、わざわざ、変数a に代入して、comlpex で複素数を作っています。

こちらは、コメントに書いてある通りです!

# 極座標に変換
r, rad = cmath.polar(b)

# 単位を度数(degree)に変換
deg = math.degrees(rad)

# 位相(rad)
phase = math.radians(deg)

# 直交座標に変換
ort = cmath.rect(r, phase)

続いて、ベクトルの設定

# ベクトルを表示 quiver(始点x,始点y,成分x,成分y)
ax.quiver(0, 0, b.real, b.imag, color = "red",angles = 'xy', scale_units = 'xy', scale = 1)

ここでベクトルを設定しているところなので、注意です。

b.real

では、変数 b の実部を取り出しています。

b.imag

では、変数 b の虚部を取り出しています。

よって、変数名が違うなら変える必要があります。
例えば、先ほどの test という変数に入っている複素数を表現したいのであれば、

# ベクトルを表示 quiver(始点x,始点y,成分x,成分y)
ax.quiver(0, 0, test.real, test.imag, color = "red",angles = 'xy', scale_units = 'xy', scale = 1)

のように、 .real , .img の前につける変数名を変えてください。

 次に、ベクトル図に添えるテキスト(ラベル)の設定です。

# ベクトルにテキストを添える
#ax.text( 0 , 0 , '   ' , color = 'red', size = 15)

今、上記のようになっていますが、

0 , 0 のところでは、テキストを表示させる座標を設定します。
'     ' の中にあるテキストを表示させてくれます。

お試しください。

他にも、color = 'red', size = 15 みたいなところがいろんなところにあります。
色と大きさの設定ですね。

この辺りは、色々変えてみてください。
なんとなくでもいける気がします笑

こちらを解説している動画です

ぜひご覧ください!


何かと0から1を作るのは大変だと思います。学校はどこも似たような問題課題に対応していると思います。それなのに、先生って自分だけで頑張ろうとするんですよね。ボクの資料やnoteが1になって、学校ごとの現状に合わせてカスタムしていただければと思います‼️