初めてのESP8266(REESPUSB) Lチカまでの最短ルートとハマリポイント


[Running electronicsのサイト](http://www.runele.com/ca1/40/p-r-s/)から、ESP-WROOM-02 USB付きBreakout基板 REESPUSBを購入した。
この基盤は、Wifi機能を持った基盤にArduino実行環境が作れると最近何かと話題のESP8266にタクトスイッチとリセットボタンをに加え、３V電源とシリアル通信ができるUSBを搭載した優れモノ。

バラバラに部品を買って自分で組み立てることも,もちろん可能であるが、いろいろと手間がかかることと、サイズが大きくなってしまうことからこちらの商品を買うことを選択。
外観はこんな感じ。BootとDLの切り替えスイッチがついており、書き込みを行うときはDL側に切り替えてRESETボタンを押すと書き込みモードとなる。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/b482c169-12b4-c67a-bac7-38bec876c327.png)

このような基盤を扱うのは初めてで、いろんな思い込みから何点かハマってしまったことがあるので、手順と共に情報を残しておく。（同じように考えてハマる人もいるはず！）

#動作モード
これまでにArduinoも扱ったことがなく、ネットの情報をいろいろしらべていたところ、ESP8226には
　①ATモードと呼ばれる、コマンドベースで動くモード
　②ArduinoIDEで作ったプログラムを動かすモード
など、幾つかのモードがあることがわかった。
（他にもLunarというスクリプトを動かすモード等がある）
これらの切り替えは、ATモードであればこのプログラムの様なファームウェア更新ツールで、プログラムを書き込む必要があり、Arduinoの場合はArduino IDEを使って書き込む必要があり、**これらを同居させることは不可能**なのであるが、それに気づくのに数日かかってしまった。

下記に各モードへの切り替え方法を記載する

#ATモードへの切替方法
ATモードとは、ATコマンドと呼ばれるコマンドをシリアル通信で送ることによりWifiに接続したり、接続したWifi経由でインターネットからデータを取得したりすることができるモードのこと。

##1. 書き込みソフトインストール
Windowsの場合、NodeMCUというGUIベースのプログラムが公開されている。
ダウンロードパスは下記。（MACは利用不可）
**NodeMCU（Windowsのみ）**
https://github.com/nodemcu/nodemcu-flasher/tree/master/Win64/Release
上記リンクから、ESP8266Flasher.exeをダウンロードする。

##2. ATモードファームウェアダウンロード
次に、NodeMCUを使って書き込むプログラムをダウンロードする。
下記のリンクからFirmwareをダウンロード
**v0.9.5.2 AT firmware bin**
https://drive.google.com/file/d/0B7X-WA5Q9nVPMUhJcmUzcEw2akk/view?usp=sharing

##3. ファームウェア書き込み
GithubからダウンロードしたESP8266Flasher.exeを実行する。アイコンはこんな感じ。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/11e6014d-d254-eb2a-0e7c-e2df4fd4b076.png)

Configタブを開き、先ほどダウンロードしたbinファイルを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/d395db24-b93c-a833-31ff-4050eb232775.png)
ESP8266をUSBで接続し、COM Portをあわせる。Flashボタンを押すとファームウェアの書き込みが始まる。
書き込むときは、スイッチをDL側に切り替えるのを忘れずに。（GPIO 0をLowにセット）
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/ba442a87-b485-3144-c0ff-430d99501467.png)


最後に、左下に 緑のチェックマークが出れば成功。

##4. 確認
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/7c705c20-6112-86b6-243a-33dc6f99274b.png)
Arduino IDEやteratermを使ってシリアルコンソールを立ち上げ、ATと入力してOKと返ってこれば成功。
<img width="11" alt="file" src="https://qiita-image-store.s3.amazonaws.com/0/77722/7c705c20-6112-86b6-243a-33dc6f99274b.png">
ATコマンドの一覧は、下記URLを参照。
http://ja.docs.jumpwire.io/ESP8266Reference/ATCommands/


#Arduinoプログラム動作モードへの切り替え方法
次に、Arduino IDEを使って自分で開発したプログラムを書き込む方法を紹介する。
先述のとおり、
##Arduino IDE環境セットアップ
下記URLから、それぞれの環境（OS）にあったプログラムを選択し、Arduino IDEをインストールする。
https://www.arduino.cc/en/Main/Software

##ESPボードの情報を追加。
ArduinoIDEのインストールが完了したら、File>Preference（Macの場合は、Arcuino>Preference)を選択し、設定ウインドウを開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/4db05e2c-1c06-26fe-442b-b38b482c430f.png)


下記GitHubにアクセルし、記述されているStableバージョンのURLをAdditional Boards Manager URLsに貼り付ける。
（下記の貼り付けURLを参考にしてもよい）
https://github.com/esp8266/Arduino#installing-with-boards-manager

貼り付けURL（２０１６年２月時点）
``http://arduino.esp8266.com/stable/package_esp8266com_index.json``

![image](https://qiita-image-store.s3.amazonaws.com/0/77722/eae34a85-11f4-449b-7a8f-c9ed4dfc3780.png)

##Lチカ（LEDをチカチカさせる）プログラムを書き込み

###プログラム例
下記のプログラムをエディタに記述するか、File>Examples>01.Basics>Blinkを選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/68f2a650-8e21-efed-f1d1-39609a8d1bea.png)

```c:blinkLED.cpp
void setup() {
  //１３番ピンをOutputモードに切り替え
  pinMode(13, OUTPUT);
  //シリアルポートに文字列出力
　Serial.println("セットアップ完了！");
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // 一秒待つ
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // 一秒待つ
}
```

##書き込み
スイッチをDLに切り替えて、ArduinoIDEの左上にあるアップロードボタンを押すと、アップロードが始まる。done uploading と表示されると成功。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/be6e64c1-4e8f-274c-bc9b-6ef1b657e6df.png)

###アップロードできない時は？
Tools>Portをみて、``/dev/cu.usbserial-xxxx``という項目が出ているかを確認する。どれかわからない場合、一度USBを抜いたり指したりしてみて、その時に項目が増えるかどうかをチェック。何も反応がない場合、使っているケーブルに原因がある可能性がある。ケーブルを変えてみることで、解決する可能性がある。
（私の場合、PS4のコントローラについてきたケーブルをつかったところ、この様な状況が発生した。）
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/157ac5fc-4b22-0c35-ecc4-832d9f044caf.png)

##配線
写真の通り、１３番ピンから抵抗を挟んでLEDをつなぎ、GNDに接続する。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/7490f2ff-b180-574c-f51b-8f7da6436470.png)

##動作確認
アップロードが完了すると、自動的にプログラムが開始される。

[![ESP8266LED完成](http://img.youtube.com/vi/hddIoAUOhy0/0.jpg)](http://www.youtube.com/watch?v=hddIoAUOhy0![image](https://qiita-image-store.s3.amazonaws.com/0/77722/67bd0f83-d7c3-a41f-ef1f-58a6797077dd.png)
)


#ハマったこととその解決策
自分と同じことで、時間が無駄に消費されてしまわぬよう…
##コンソールに文字列が表示されない
コンソールへ何かを出力するには、Serial.printと記述する必要がある。
Printfとかprintlnではダメ。（気がついてみれば当たり前なのだが…）
##端末が認識されない
PCにUSBで接続する際、ケーブル非対応が原因で端末が認識されない場合がある。USB接続してもPC側に反応がない場合、ケーブルを別のに変えてみる。
##ATとコマンド打ってもOKと返ってこない
先述の通り、**ArduinoのプログラムとATプログラムの同居はできない。**
ATコマンドを使いたい場合は、AT firmを書き込む。（この場合は、Arduinoのプログラムは消える）