ESP8266 (ESP-WROOM-02) 回路シミュレーション・ツール LTspice (無料) の使い方 まとめ 


# 概要
Mac版 LTspice で 回路をシミュレートして、動作を理解する。

# はじめに
hotchpotch さんの Qiita記事
http://qiita.com/hotchpotch/items/8a6fe6b8b0026ac6218e
で、スイッチサイエンスの「自動書き込みモード」の回路について言及されていましたが、それが気になって気になって。
動きが理解できなかったので、「そうだ！シミュレーションしてみよう！」というのが発端です。
今回、なかなかうまくシミュレートできた(と思う)ので、ツールの使い方をQiita化しておきます。
(しかし、謎は解けていない)

なお、シミュレーションの対象となる回路は、以下の部分です。
http://doc.switch-science.com/schematic/ESP-WROOM-02_devboad/ESP_WROOM_02_FTDI.pdf
![スクリーンショット 2016-03-13 10.47.47.png](https://qiita-image-store.s3.amazonaws.com/0/69410/42800bc1-deb2-7d93-b053-983364ff3247.png)



# インストール
今回使うシミュレーション・ツールは定番の LTspice (無料)。
ダウンロードはこちらから
http://www.linear-tech.co.jp/designtools/software/#LTspice
![スクリーンショット 2016-03-13 5.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/69410/6a3cbd20-779e-f8f1-8899-fa64ea1a0068.png)
![スクリーンショット_2016-03-13_5_26_40.png](https://qiita-image-store.s3.amazonaws.com/0/69410/3e3740b2-02a1-d2f9-2112-83c3e70677e7.png)


# LTspice の使い方
最初が、非常にとっつきにくいです。
Windows版の移植だそうですが、UI ヒドいなコレ。

とにかく、ファンクションキー と ショートカット を覚えるのだ！！

 - ファンクションキーでコマンド開始

|キー|名前|意味|
|---|---|---|
|ESC|Cancel|コマンドのキャンセル|
|F2|Component|部品を配置|
|F3|Wires|ワイヤで結ぶ|
|F4|NetName|ワイヤの名称をつける|
|F5|Delete|削除|
|F6|Duplicate|コピー|
|F7|Move|移動|


 - ワイヤの斜め線を書きたい場合は「Shift」を押しながら。
 - 配置時に、部品を回転させるには Ctrl + r。 鏡映は Ctrl + e。
 - Windows版では "Control Panel" の "Netlist Options" で、"Convert 'μ' to 'u'" に「必ず」チェックをいれる。<br>Mac版では設定を変更する必要はない。
 - 保存時の名前に日本語はNGでした。

# 実際に回路を書いていく
## 部品を配置する
Draft - Component を選択する。(ショートカットは「F2)

 - 計量単位 "Ω"、"V"、"A" は省略可能。
 - 大きさの単位(補助計量単位)は、以下を使う。

|単位|乗数|名前|
|---|---|---|
|PET|10^15|ペタ|
|T|10^12|テラ|
|G|10^9|ギガ|
|meg|10^6|メガ|
|k|10^3|キロ |
|m|10^-3|ミリ|
|u|10^-6|マイクロ|
|n|10^-9|ナノ|
|p|10^-12|ピコ|
|f|10^-15|フェムト|

 

### 1. 抵抗
馴染みのある記号。「r」で検索。
![スクリーンショット 2016-03-13 0.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/69410/65b086a1-cc07-4b0d-bad5-faf447761778.png)
あるいは、現在のJIS規格 ではこちら。(個人的にはこっちがいいな)
misc にある。「ヨーロッパ抵抗」というらしい。
![スクリーンショット 2016-03-13 1.13.35.png](https://qiita-image-store.s3.amazonaws.com/0/69410/bd131e88-24a2-e33f-882c-215c4ca07911.png)

### 2. トランジスタ
そのものズバリ、「npn」で検索すると出てくる。
![スクリーンショット 2016-03-13 0.47.04.png](https://qiita-image-store.s3.amazonaws.com/0/69410/e7ebdeac-144e-6bd5-a003-dc6a4730b197.png)

### 3. 電源
voltage で検索。「入力信号」にも、これを使う。
![スクリーンショット 2016-03-13 1.09.50.png](https://qiita-image-store.s3.amazonaws.com/0/69410/59b6efa8-2d77-1fce-56e0-03f6bec9d615.png)

### 4. グランド
これがわかりずらい。
グランド(アース) は、F4(NetName) で GND を選択。 → ショートカットは「g」キー。
![スクリーンショット 2016-03-13 5.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/69410/8d1747fd-bded-5cce-0f2a-fa2df3a39245.png)


## ワイヤで接続する
Draft - Wires (ショートカットは「F3」)　ワイヤで結んでいく。
(ワイヤの斜め線を書きたい場合は「Shift」を押しながら。)

## ワイヤに名前をつける
Draft - Net Name (ショートカットは「F4」)
出力端子 (IO0/RESET) と 入力端子 (RTS/DTR) に、ラベル(名前)を付ける。
Port Type は、Output(出力) / Input(入力) / Bi-Direct.(両方向) を適切に選択！！
![スクリーンショット 2016-03-13 5.11.35.png](https://qiita-image-store.s3.amazonaws.com/0/69410/ef772e5b-636e-44bb-8da3-04c7df252ac5.png)


# 最後に忘れない
Draft - SPICE Directive (ショートカットは「s」キー) で、以下を追加する。
(これがないと、エラー「No analysis command found.」となる。)

```
.tran 0 0.2 0 1m
```
意味は「0〜0.2秒まで0秒目から0.001秒ずつ計算する」です。
![スクリーンショット 2016-03-13 4.16.55.png](https://qiita-image-store.s3.amazonaws.com/0/69410/0af60c2b-84d6-38b0-e93a-5b471de11f93.png)

# 回路
これが、最終的に出来上がった回路。
![スクリーンショット 2016-03-13 4.16.22.png](https://qiita-image-store.s3.amazonaws.com/0/69410/2491b417-7d1d-20ef-b111-7870d524c387.png)
こっちはオリジナル。うん、間違いなさそう。
![スクリーンショット 2016-03-13 10.47.47.png](https://qiita-image-store.s3.amazonaws.com/0/69410/d8f3bb9c-5f30-f542-e71b-56ce47618613.png)


## 入力信号を定義する
RTS/DTR は入力信号です。LTSpice では、電源を使って入力信号を表現するようです。
RTS/DTR の voltage 記号で右クリック。以下を入力。
![スクリーンショット 2016-03-13 3.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/69410/e8cc6ff9-b8bd-ef02-bdc7-66e6d3e7bb58.png)
![スクリーンショット 2016-03-13 3.54.51.png](https://qiita-image-store.s3.amazonaws.com/0/69410/ffd2c07f-2275-3666-c834-9420ecdab0b2.png)

設定値の意味は

|属性|意味|RTS|DTR|
|---|---|---|---|
|Vinitial|Lレベルの電圧 [V]|0|0|
|Von|Hレベルの電圧(V)|3.3|3.3|
|Tdelay|時間0から電圧が上がり始めるまでの時間 [s]|0|0.06|
|Trise|LレベルからHレベルに変化するまでの時間 [s]|0.01|0.01|
|Tfall|HレベルからLレベルに変化するまでの時間 [s]|0.01|0.01|
|Ton|Hレベルになっている時間 [s]|0.05|0.05|
|Tperiod|パルス列の周期（LレベルとHレベルの中間電圧の幅） [s]|1|1|
|Ncycle|パルスの数|1|1|

 - レベルが変化するのに必要な時間を、0.01s と仮定しました。
 - DTR の Tdelay 0.06 は、RTS と同期するための値 (0.05 + 0.01) です。


何故なら、ファームウェア書き込みツール esptool.py のコードが以下だから。
https://github.com/themadinventor/esptool/blob/master/esptool.py#L156

```
# RTS = either CH_PD or nRESET (both active low = chip in reset)
# DTR = GPIO0 (active low = boot to flasher)
self._port.setDTR(False)
self._port.setRTS(True)
time.sleep(0.05)
self._port.setDTR(True)
self._port.setRTS(False)
time.sleep(0.05)
self._port.setDTR(False)
```

## Netlist
最終的に出来上がった回路のNetlist
(View - SPICE Netlist で表示できます)

```
* /Users/dreamarts/Desktop/ESP8266.asc
Q§TR2 IO0 N002 DTR 0 NPN
Q§TR1 RESET N003 RTS 0 NPN
V1 N001 0 +3V3
R4 N001 IO0 10K
R6 RTS N002 10K
R5 N001 RESET 10K
R7 DTR N003 10K
V§RTS RTS 0 PULSE(0 3.3 0 0.01 0.01 0.05 1 1)
V§DTR DTR 0 PULSE(0 3.3 0.06 0.01 0.01 0.05 1 1)
.model NPN NPN
.model PNP PNP
.lib /Users/dreamarts/Library/Application Support/LTspice/lib/cmp/standard.bjt
.tran 0 0.2 0 1m
.backanno
.end
```

# シミュレーション実行
やっと、ここから、シミュレーション！！
「走る」アイコンでシミュレーション開始！！
![スクリーンショット_2016-03-13_4_16_22.png](https://qiita-image-store.s3.amazonaws.com/0/69410/a8d71d2e-57dc-ec80-afa4-1f530598ed26.png)


最初は「真っ黒」な画面が出て、なんじゃこりゃ？と思わせるが、ここであわてない。
![スクリーンショット 2016-03-13 3.19.35.png](https://qiita-image-store.s3.amazonaws.com/0/69410/a485436d-d7d4-020f-425f-b0400ca3fafe.png)

黒い画面上で「右クリック」。「Add Plot Pane」を選択。
![AddPlotPane.png](https://qiita-image-store.s3.amazonaws.com/0/69410/13b260d1-582f-e223-f84a-66a8a60e05d6.png)

おぉ！画面が分割して、グラフが二つ書けそうな雰囲気になる。
左クリックで、どちらのグラフを使うか選択できる。微妙なハイライトで分かりづらい。
ここではとりあえず、上側を選んでおく。
![スクリーンショット 2016-03-13 3.22.41.png](https://qiita-image-store.s3.amazonaws.com/0/69410/0c0c8563-3e91-b19a-7f4d-d926429ff738.png)

ここで、ウィンドウを、もとの回路図に切り替える。
マウスカーソルを、RTS の上に持って行くと、カーソルが「鉛筆マーク」(電圧計測)に切り替わる。(これ多分「プローブ」かな。アイコンが下手すぎるwww)
ぽちっと左クリックすると、先ほどのグラフ上に、RTS のグラフが描画される！
(カーソルが「蜂マーク」になった場合は「電流計測」になります。もしや「クランプメーター」を表している？)
![スクリーンショット 2016-03-13 3.29.16.png](https://qiita-image-store.s3.amazonaws.com/0/69410/3f348350-00c4-d072-7d48-6b81cff14158.png)

ここまでくれば、しめしめ。あとは、同じく DTR をグラフに追加する。
グラフの下側を選択して、IO0 と RESET をグラフに追加する。

そして、完成したのがこれ。なんとも RESET のタイミングが超絶に微妙。
![スクリーンショット 2016-03-13 4.12.50.png](https://qiita-image-store.s3.amazonaws.com/0/69410/a3241932-9524-176e-d8c8-fa5880265489.png)


# 考察
 - シミュレーションの結果は、hotchpotch さんの言うように、RESET の LOWトリガ よりも IO0 の HIGH 復帰の方が早いことになっている。というか、微妙。同時だなこれ。
 - これで「書き込みモード」になる？ならない？
 - しかし、実際の回路だと、必ずうまく「書き込みモード」になるそうだ。何故かはわからない。
 - 自分も、7of9 さんのいうように、バイブレータ回路 になっていて、相手方のトランジスタの出力を入力することで安定化している、と思ったのだがそうでもないらしい。解る人居たら教えて下さい…＞＜！ 
 - (→ なんならスイッチサイエンスさん教えて!!)
 - 初めて使ったけど、操作になれると、実は LTspice よく出来ている。
 - upvertor でもシミュレーション機能をそのうち出す、とか言っていたけど、なかなか出ない。このままだと、LTspice いいじゃん、ということになっちゃうよ。
 - LTspice タグ、1番ゲット!!

# 参考
http://ahonoyashiro.blog.fc2.com/blog-entry-79.html
http://www.cn.kagawa-nct.ac.jp/~kusama/experiment/cn4/T4_LTspice_2.pdf
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13109790308
https://exabugs.com/archives/50577590.html