雪豹でESP8266

JOBSが生きていた頃のMac以外使わないって分けでもないんですが、キーボードが壊れてしまいUSBキーボードを接続して、まだどうにか使えるのでMBA Originalがメインマシンなんですが、これで今さらEPS-WROOM-02というESP8266というチップが入ったWIFIモジュールをいじってみました。

このモジュールは昨年夏くらいに、かなり話題になったのですが、流行ものには手を出さない主義なので、興味が無いわけでもなかったのですが、手に入れていませんでした。たまたま先日Aitendoで目について、もうかっても良い頃かなと思い購入しました。技適マック付きのモジュールが税別500円で変換基板が120円でした。

開発するまえに懐かしいATコマンドを試してみようとおもったのですがうまくいきません。ENをプルアップしないと動作しない事に気がつくまで、1時間くらいかかりました。ESPr Developerなどを買えばこんな事はないのですが、貧乏性なのでどうしてもお金で解決したくありません。

EPS-WROOM-02の開発はArduinoのIDEにこのプラットフォームのファイルを組み込んで開発するのが最もポピュラのようですが、雪豹では最新のArduinoの1.6系は使用できません。雪豹でも使えたといわれる1.6.1も試しましたが、dylibが無いというエラーでAVRのバイナリがダウンロードできない状態でした。

AVRのビルドもたまにするので、これでは困るのでほかの方法が無いか調べてみました。いろいろ検索したところ[PlatformIOという開発環境](http://qiita.com/hotchpotch/items/81162efb86d12b74c41a)がある事を知りました。この開発環境はコマンドラインベース(CLI)のツールとIDEなツールが用意されているようです。最新のIDEのアプリケーションはMac OS X 10.8以降のバイナリでもちろん使えません。

CLIのツールはPythonをつかった環境でPythonの2.7を推奨していて、雪豹は2.6がデフォルトだったので2.7のパッケージが公式に用意されていたのでインストールしました。

追記：OS X El Capitanでは/usr/binにpython 2.7.10がありますが、TLSv1しかサポートしていないため、やはりパッケージをインストールするのが良いようです。

pythonのパッケージをインストールしたところ/usr/local/binにpythonファイルが見つかりません。findで探したところ/Library/Frameworks/Python.framework/Versions/2.7/bin/にあり、とりあえずここにpathを通して使えるようにしました。

これでPlatformIOをページの手順のpipでインストールしたところ、インストールは成功してplatformioコマンドが使えるようになりました。platformioコマンドもpythonと同じフォルダーにインストールされるようです。

上記のリンクのベージを参考にplatformio initでファイルを作り、runしてバイナリの生成まではスムーズにいきました。

ところがターゲットへの書き込み方法がわかりませんrunだけで書き込みができるような感じでしたが、私が試したところそうは動きませんでした。またまた検索で調べてみたところオプションをつけると実行されるのですが、ダウンロードでエラーになります。

```
bash-3.2$ platformio run --target upload --upload-port /dev/cu.usbserial-000013F
DA
[Fri Dec  2 08:33:45 2016] Processing esp_wroom_02 (platform: espressif8266, boa
rd: esp_wroom_02, framework: arduino)
--------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
Converting http.ino
Collected 24 compatible libraries
Looking for dependencies...
Library Dependency Graph
|-- <HttpClient> v2.2.0
|-- <ESP8266WiFi> v1.0
Compiling .pioenvs/esp_wroom_02/src/http.ino.o
Linking .pioenvs/esp_wroom_02/firmware.elf
Checking program size .pioenvs/esp_wroom_02/firmware.elf
text       data     bss     dec     hex filename
227864     3024   29672  260560   3f9d0 .pioenvs/esp_wroom_02/firmware.elf
Building .pioenvs/esp_wroom_02/firmware.bin
Looking for upload port...
Use manually specified: /dev/cu.usbserial-000013FDA
Uploading .pioenvs/esp_wroom_02/firmware.bin
Uploading 235040 bytes from .pioenvs/esp_wroom_02/firmware.bin to flash at 0x000
00000
warning: espcomm_send_command: didn't receive command response
warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed
warning: espcomm_send_command: wrong direction/command: 0x01 0x03, expected 0x01
 0x04
error: espcomm_upload_mem failed
*** [upload] Error 255
========================== [ERROR] Took 8.72 seconds ==========================
```

GPIO0をLOWにしてRESETするという方法で焼き込みができるという事で何度も試したのですがダメでした
しかたがないので、esptool.pyというpythonの別のツールをダウンロードしてインストールして試してみたところこちらはうまくいく事がありました。成功するときにはボタンの放すタイミングとかに影響されているような気がしましたがよくわかりませんでした。

```
bash-3.2$ esptool.py --port /dev/cu.usbserial-000013FDA --baud 115200 write_flas
h 0x0000 .pioenvs/esp_wroom_02/firmware.bin
esptool.py v1.3-dev
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Flash params set to 0x0040
Writing 237568 @ 0x0... 237568 (100 %)
Wrote 237568 bytes at 0x0 in 20.6 seconds (92.1 kbit/s)...
Leaving...
```
書き込みまでどうにか進んだのですが、今度はwdtのリスタートが頻繁にかかり不安定な状態でした。

```
 ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
```

これまたいろいろ検索したところEN端子をプルアップではなく、[CR遅延回路にする](http://akimasa.hatenablog.com/entry/2016/01/08/230823)と安定するというページを見つけためしてみたところ、どんぴしゃでした。

後日追記：これはこのモジュールは3.3Vの電源が起動時に300mA以上とかなり大きくなって、電源が耐えられないと不安定になる事があるようです。白状しておくと150mAのLDOで駆動していて、全然足りてませんでした。

![IMGP0052.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/d12be0fb-ba9c-d314-59ba-9db9cd06474b.jpeg)

platformioはESP8266以外にもMSP430やAVRやARMなどいろいろな開発環境が用意されていて、同じ手順で開発できて、とてもすばらしです。ArduinoやPinguinoやYAGARTOのgccを別々に使っていたのをplatformioに移していきたいです。（後日追記：AVRとPIC32はファイルが用意されていないようで使えませんでした。platformioをupgradeしたら、他もビルドできなくなりTimeMachineでフルリストアしました。古い環境でたまたま動いているようなあまり深追いはしない方が良いようです。）

実は、これでちょっと作りたいものがあるので、こつこつ作ってみたいと思います。

追記：RESETとGPIO0を手持ちの2SC945を入れてDTRとRTSに接続したらplatformioで焼けました。platformioのesptoolはスイッチで手動ではタイミングがあわせられないようです。

![写真（2016-12-03 09.38）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/973e59a5-c23e-a071-367e-9bad9fcee22b.jpeg)


```
bash-3.2$ platformio run --target upload 
[Fri Dec  2 13:39:26 2016] Processing esp_wroom_02 (platform: espressif8266, boa
rd: esp_wroom_02, framework: arduino)
--------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
Converting http.ino
Collected 24 compatible libraries
Looking for dependencies...
Library Dependency Graph
|-- <ESP8266WiFi> v1.0
|-- <HttpClient> v2.2.0
Compiling .pioenvs/esp_wroom_02/src/http.ino.o
Linking .pioenvs/esp_wroom_02/firmware.elf
Checking program size .pioenvs/esp_wroom_02/firmware.elf
text       data     bss     dec     hex filename
227368     2748   29504  259620   3f624 .pioenvs/esp_wroom_02/firmware.elf
Looking for upload port...
Auto-detected: /dev/cu.usbserial-DA0059MQ
Uploading .pioenvs/esp_wroom_02/firmware.bin
Uploading 234272 bytes from .pioenvs/esp_wroom_02/firmware.bin to flash at 0x000
00000
................................................................................
 [ 34% ]
................................................................................
 [ 69% ]
.....................................................................           
 [ 100% ]
========================= [SUCCESS] Took 32.51 seconds =========================
```

ESP-WROOM-02はplatformioのuploadツールで書き込めましたが、同じ回路でESP-01はだめで、esptool.pyを試したところ問題なく焼けました。
nodemcu(ESP-12+CH340)はFLASHボタンを押しながらUSBを接続した後にesptool.pyを使うと書き込めました。ESP8266は書き込みに結構はまります。

ESP8266は通常時は75mAくらいですが、WIFIをOFFにすると20mA以下にできるようです。

![DCF77-ESP.png](https://qiita-image-store.s3.amazonaws.com/0/104066/db0d9224-e974-9f04-0e8b-38abc2c6571b.png)

```
  WiFi.disconnect();
  delay(1);
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
  delay(1);
```

どうもタイミング依存があるようで、ネットで見つけた情報ではdisconnectの後のdelayは無かったのですが、私のところではそれでは動かなくて入れました。