これは,格子の各辺に抵抗が,頂点とGNDの間にコンデンサが配置された大規模なRC回路網(格子回路)をシミュレーションするスクリプト群です. 回路シミュレーションにはLTspiceを利用しており,シミュレーションのためのネットリストを生成・変更・LTspiceサブプロセスによるシミュレーション実行・ログファイルのパースなどの機能を提供します. 目的は材料の触覚センサ利用のためのシミュレーションですので,7x7のグリッド状の電極が想定され,電極間のグリッド数(あるいは端の電極から回路の端までのグリッド数)を与えることで全体の格子回路を生成します. 7x7の電極の内,中央は電圧源に接続され,その他48個の電極が観測点です. 詳しくは以降を参照してください.
注)デモはconfig.ymlが実行環境に合わせて適切に設定されていることを前提とします.config.yml自体の説明はconfig.yml内のコメントを参照してください.
レポジトリをクローンして移動
$ git clone https://github.com/BSL-Kyutech/LatticeCircuit.git
$ cd LatticeCircuit
電極間グリッド数M(観測電極の概念は無いが,サイズの表現として利用)を3,抵抗を2.4kOhmとしたときの対角線上の抵抗を確認
$ python check_resistance.py 3 2.4
中央に電流源,四隅にGNDを置いて各ノードの電圧を動作点解析で求める.接触は,横・縦を0~1で表現したXとYの位置を中心として,MxMの矩形領域がF倍の抵抗値になることでシミュレートとする.前の抵抗チェックに問題が無いことを確認し,同設定で(x,y) = (0.5,0.25)および(x,y) = (0.25,0.5)に接触して抵抗が半減したとするならば,以下のように実行できる.
$ python measure_voltages.py -m 3 -r 2.4 -x 0.5 0.25 -y 0.25 0.5 -f 0.5 0.5
電極間グリッド数を3とした時の電極ノード番号を確認
$ python suggest_setup.py 3
電極間グリッド数を3とした時のシミュレーション用ネットリストを生成
$ python generate_base_netlist.py 3 > base.net
LTspiceのサブプロセスを立ち上げ,シミュレーションを実行(接触するx位置,y位置,力を0~1で表現した時,それぞれ0.1, 0.2, 0.3と設定)
$ python simulate.py -s --X=0.1 --Y=0.2 --F=0.3
- 回路シミュレーションにはLTspiceを利用します
- LTspiceで作図できない回路規模をシミュレーションするため,ネットリスト(.netファイル)をスクリプトで生成します
- ベースとなるネットリストのパラメータ値を書き換えることで,接触に伴う電気的特性の変化を表現します
- 接触による圧抵抗効果・圧電効果は,接触位置を中心とした等分散二次元ガウス分布を接触力で重み付けして表現します
- シミュレーション結果は,各電極における電圧値と,与えた接触位置・力となります.
- Numpy
- PyYAML
対角線上で抵抗を計測するためのスクリプトです.
中央に電流源,四隅にGNDを置いて各ノードの電圧を動作点解析するためのスクリプトです.
measure_voltages.pyの実行によって得られた結果をpickleに保存した場合において,このpickleを渡してグラフを描画するスクリプト.
動作点解析用モジュールです.上記スクリプトを利用せず,自身でシミュレーションコードを書く場合に利用してください.
usage: suggest_setup.py [-h] M
- 引数
M
:電極間のグリッドの数.
- オプション引数
-h
: ヘルプ表示
- 戻り値(標準出力)
- 電極位置に相当するノード番号
- 全体の格子サイズ.総ノード数
- 入出力のノード番号(電極位置のノード番号を入出力に分けたもの)
usage: generate_base_netlist.py [-h] [--R R] [--C C] [--V V] [--F F] [--D D]
[-s] [-p]
M
- 引数
M
:電極間のグリッドの数.
- オプション引数
-h
: ヘルプ表示--R
: 抵抗値の指定 [kOhm].指定しない場合のデフォルトは10kOhm--pulldown
: 電極のプルダウン抵抗.指定しない場合のデフォルトは10,000kOhmで,10,000kOhm未満の時に挿入される--sink
: 回路の角にある4つのノードのプルダウン抵抗.指定しない場合のデフォルトは1Ohmで,10,000kOhm以上の時は挿入されない--C
: ノードとGNDの間の静電容量の指定 [nF].指定しない場合のデフォルトは0nF(コンデンサの追加なし)--V
: 入力電圧(振幅)の指定 [V].指定しない場合のデフォルトは1V--A
: 入力電流(振幅)の指定 [mA].指定しない場合のデフォルトはFalse.指定された場合,他に優先され,スタート時にA[mA]になる2D周期のPULSE電流が印加される.--F
: 入力電圧(周波数)の指定 [Hz].指定しない場合のデフォルトはFalse.その場合,スタート時にV[V]になる2D周期のPULSE電圧が印加される--D
: シミュレーション時間の指定 [msec].指定しない場合のデフォルトは10msec.コンデンサを加える場合は収束にかかる時間を考慮のこと-s
: 入力電圧にSINE電圧を選択.--Fに値が渡されたときに有効化される-p
: 入力電圧にPULSE電圧を選択.--Fに値が渡されたときに有効化される-g
: 回路の端にあたる全てのノードをGNDに繋げる.それに伴い意味を成さなくなる抵抗・コンデンサは削除される.
- 戻り値(標準出力)
- ネットリスト(ファイル保存はDemoに示したようにリダイレクトを使用すること)
- エラーは標準エラー出力に出力される.
- コンデンサでGNDに接続されるため,現状,入力電圧に変化がないと電流が流れない.他の設定も考えられるようにするべきか.
usage: simulate.py [-h] [-g] [--Dp DP] [--Df DF] [-s] [--X X] [--Y Y] [--F F]
-
引数なし
-
オプション引数
-h
: ヘルプ表示-g
: x位置,y位置,力をそれぞれ0.1~0.9の範囲でグリッド状にシミュレーションするためのフラグ--Dp
: 位置に関して何分割するかの指定.-g
指定時のみ有効.指定しない場合のデフォルトは3--Df
: 力のに関して何分割するかの指定.-g
指定時のみ有効.指定しない場合のデフォルトは3-s
: x位置,y位置,力をそれぞれ指定して1つの接触条件についてシミュレーションするためのフラグ--X
: x位置の指定.-s
指定時のみ有効.指定しない場合のデフォルトは0.5--Y
: y位置の指定.-s
指定時のみ有効.指定しない場合のデフォルトは0.5--F
: 力の指定.-s
指定時のみ有効.指定しない場合のデフォルトは0.5--Alpha
: 抵抗の変化量の係数.-g
あるいは-s
指定時のみ有効.デフォルトは1.0--Beta
: 静電容量の変化量の係数.-g
あるいは-s
指定時のみ有効.デフォルトは1.0--Sigma
: 接触の影響範囲(空間的な標準偏差).-g
あるいは-s
指定時のみ有効.デフォルトは0.5
注意)
-g
も-s
も指定されない場合の挙動は,接触なし(抵抗・静電容量の変化なし)としてシミュレーション実行 -
戻り値(標準出力)
- シミュレーションを行った接触条件のリスト
- 各電極の電圧情報
- 結果の表示方法を切り替えるオプション引数を作り,データセットとしてファイル保存できるようにする必要あり.
上記simulate.py
を実装するためのモジュールです.上記スクリプトを利用せず,自身でシミュレーションコードを書く場合に利用してください.
このモジュールは,実行環境に依存する変数をconfig.ymlで与えることとしています.config.ymlで定義する変数は以下の通りです.
- ltspice: 'LTspiceの実行ファイルの絶対パス'
- working_dir: 'ベースとなるネットリストファイルが保存されたディレクトリの絶対パス'
- delimiter: '実行環境におけるパスの区切り文字.Winなら\,その他は/'
- base_netlist: 'ペーストなるネットリストファイルの名前' 補足)working_dirには,シミュレーション時にtmp.netという抵抗・静電容量の変化を与えたネットリストの一時ファイル,および,シミュレーションによる中間ファイルが生成されます.
(2021/4/21時点) 7x7の電極中央に電圧を印加した際の,残りの48個の電極での(定常状態における最大)電圧を計測することとしています.使用しているのは,LTspiceのTRANコマンドです.このコマンドは設定された時間の過渡応答をシミュレーションするコマンドで,この時間幅の最後から20%の時間幅を定常状態と見なしています.netlistファイルは,LTspiceを立ち上げてopenすることで個別にシミュレーションをすることや,電圧プロファイルをプロットすることができるので,最後から20%の時間幅において定常状態となることを確認することをお勧めします.あまりにも長い時間の過渡応答シミュレーションは,多くの時間・メモリを消費することに繋がるので注意してください.