初心者向けESP-WROOM-02解説その1: ラズパイを母艦にする

電子工作をはじめて一週間経過したかしてないか位のerukitiです。ごきげんよう。そんな電子工作ビギナーですが、ラズパイを母艦にしてESP-WROOM-02を使うのはそれなりに簡単でした。今回はそんな知見を雑多にまとめていこうと思いますが、今回はラズパイを母艦にする方法です。

間違ったこと書いてる可能性高いかもしれないので、是非ハードウェア上級者の人は突っ込みを入れて頂けると助かります！

## まずはESP-WROOM-02とはなんぞや

Arduinoのスケッチをある程度互換で動かす事ができる、WiFi搭載マイコンです (補足: AtmelAVR互換かと思ってたけど、そうじゃないようでした！)。500円〜1000円程度で入手できてWifi通信が可能で単体動作可能なマイコンです。すごくないですか？流行ってるのも理解できるというものです。

## ESP-WROOM-02開発でRaspberry Pi を母艦にする

世の中ではESP-WROOM-02をUSB-serial変換器でPCにつなぐ系の記事ばかりですが、実はラズパイを母艦にすることも十分に可能です。電源も供給できますし、シリアルをクロス接続するだけで通信もできます。いちいちUSB-serial変換器を買う必要はありません。

### 電源をどうつなぐか

ラズパイのGPIOのピン番号1番は3.3Vが出ています。そのままESP-WROOM-02につなげば動きます。が、一つ問題があって、3.3Vは、最大で50mAしか出せません。2番ピンの5Vにはそのような制限はないようです。なので、三端子レギュレータで5Vから作成してしまいましょう。

### シリアル(RXD, TXD)をクロスにつなぐ

ラズパイのピン番号8番がTXDでピン番号10番がRXDです。これらをESP-WROOM-02のTXD, RXDとそれぞれクロスにつなぐだけで通信が可能です。

### 用意するモノ

* ブレッドボード二つ (ファーム焼くやつと、実際に動かすやつ)
* [Wi-Fiモジュール ESP-WROOM-02 DIP化キット](http://akizukidenshi.com/catalog/g/gK-09758/)
* [カーボン抵抗 (炭素皮膜抵抗) 1/4W 10kΩ (100本入)](http://akizukidenshi.com/catalog/g/gR-25103/)
* [低損失三端子レギュレーター 3.3V 500mA TA48M033F(S Q)](http://akizukidenshi.com/catalog/g/gI-00538/) x2
* [タクトスイッチ 100個セット](http://akizukidenshi.com/catalog/g/gP-01282/) (実際に使うのは1個だが、どうせ色々使い勝手いいんだからまとめて買っておきましょう)
* ジャンパワイヤ
* 好きな RaspberryPi
* 動作検証用のLEDとそれに必要な抵抗

ひとまずこんなところでしょうか。秋月なのは単に好みです。というか、秋月のESP-WROOM-02 DIP化キットが一番使いやすそうな気がしています。ただ、秋月バージョンはモード切替をする時に自前でタクトスイッチを使う必要があります。結構操作が面倒です。なので、ファーム焼くモードと、普通に立ち上げるモードを別々に作ってしまおうということです。なのでブレッドボードを二つ用意しましょう。

むしろ、ブレッドボードは小さいサイズ、普通サイズ、大きいサイズをいくつかそろえておくといいと思います。カジュアルに買いましょう。

### 組み立て方 (焼く方)

回路図の書き方よくわからないので表形式で書いてみます。

ESP-WROOM-02|接続先
------------|----------------
3V3|三端子レギュレータの3.3V
EN|10kΩ抵抗を挟んで、三端子レギュレータの3.3V
IO15|10kΩ抵抗を挟んで、GND (RaspberryPiの6番ピン)
IO02|10kΩ抵抗を挟んで、三端子レギュレータの3.3V
IO0|10kΩ抵抗を挟んで、GND (Raspberry Piの6番ピン)
GND|GND (Raspberry Piの6番ピン)
RST|10kΩ抵抗を挟んで、三端子レギュレータの3.3V
TXD|RXD (Raspberry Piの10番ピン)
RXD|TXD (Raspberru Piの8番ピン)

三端子レギュレータ|接続先
------------------|------
左|5V (Raspberry Piの2番ピン)
左|積層セラミックコンデンサを挟んでで真ん中
真ん中|GND (Raspberry Piの6番ピン)
右|3.3V (ESP-WROOM-02の3.3Vに供給)
右|電解コンデンサを挟んで真ん中 (極性に注意)

うーん、これでわかる気がしません。誰かいい感じに回路図をPlantUMLみたいに書けるツール教えてください。

ESP-WROOM-02の接続方法は、[ESP8266 - ESP-WROOM-02 の Arduino 環境で I2C 制御 - Qiita](http://qiita.com/ikesato/items/92f4cb143e7aeb5e0f9b) を参考にしました。この図のうちESP-WROOM-02だけ利用した上で、タクトスイッチを両方省略しています。

![ブレッドボードに乗せた写真](https://pbs.twimg.com/media/CZHiZ5vUMAAqaXi.jpg)

ミニサイズのブレッドボードを使っています。

### 組み立て方 (動かす方)

三端子レギュレータは同じです。

ESP-WROOM-02|接続先
------------|----------------
3V3|三端子レギュレータの3.3V
EN|10kΩ抵抗を挟んで、三端子レギュレータの3.3V
IO15|10kΩ抵抗を挟んで、GND (RaspberryPiの6番ピン)
IO02|10kΩ抵抗を挟んで、三端子レギュレータの3.3V
IO0|10kΩ抵抗を挟んで、GND (Raspberry Piの6番ピン)
GND|GND (Raspberry Piの6番ピン)
RST|10kΩ抵抗を挟んで、三端子レギュレータの3.3V
RST|タクトスイッチを挟んでGND (Raspberry Piの6番ピン)
IO13|動作検証用のLED

動作検証用のLEDは、仕様に合わせて抵抗を決める必要があります。たとえば、[3mm 緑色LED EBG3402S (20個入)](http://akizukidenshi.com/catalog/g/gI-03459/)ならば、(3.3 - 2.1) / 0.02 = 60 ですが、それに近い [カーボン抵抗 (炭素皮膜抵抗) 1/4W 75Ω (100本入り)](http://akizukidenshi.com/catalog/g/gR-25750/) を買っておけばいいような気がします。僕もあまりよくわかっていません。きっと詳しい方のコメントが入ると思います。

あとタクトスイッチは[タクトスイッチでRaspberryPiをシャットダウンさせてみた【Python】【supervisor】: Raspberry Piでやってみた](http://raspi.seesaa.net/article/418174651.html)を参考につなぎましょう。失敗するとリセットが入りっぱなしになります。

![ブレッドボードに乗せた写真](https://pbs.twimg.com/media/CZHmG6KUkAAZTWD.jpg:large)

### 焼き方 (CUIで焼く)

[ESP8266 を CUI で開発する - Qiita](http://qiita.com/hotchpotch/items/81162efb86d12b74c41a)を参考に PlatformIOを使って焼いてしまいましょう (僕はIDEが大嫌いなのです)。

まずラズパイにどうにかしてPythonとcurlが動くようにしましょう。補足: Raspbian (Jessie現在) ならデフォルトでPythonとcurlは入っているのですが、python-devが追加で必要になります。

```
$ sudo apt-get -y install python-dev
$ sudo python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
$ exec bash -l
```

pip 経由でインストールする方法が色々なサイトに書かれてますが、何故かちょっと古いバージョンが入ってしまってラズパイ＆ESP-WROOM-02だとエラーが出たりするので、この方法で最新のを入れましょう。

シリアル(/dev/ttyAMA0)を自由に使えるようにする必要があります。[備忘録 Raspberry PiでUART、シリアル通信](http://nanicananica.blog.fc2.com/blog-entry-14.html)なんかを参考にしてセットアップしてください。

また、シリアルにアクセスする権限が無いとファームウェアを転送できません。/dev/ttyAMA0 のグループである dialout をユーザーに追加しておいてください。

後はスケッチを用意して焼き込みます。

```
$ mkdir test
$ cd test
$ yes y|platformio init -b esp12e
$ cat > src/test.ino
// src/test.ino

#define LED_PIN 13

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}
$ platformio run
$ platformio run -t upload --upload-port /dev/ttyAMA0
```

## おまけの知見 (ラズパイでGPIO)

ラズパイでGPIOを制御するのにライブラリは必要ありません。シェル上からデバイスファイルを叩くだけでも十分可能です。[How to use GPIOs on raspberry pi (Simple I/O, PWM and UART) - Semillero: Advanced Digital Technologies - UPB Bucaramanga, Colombia](https://sites.google.com/site/semilleroadt/raspberry-pi-tutorials/gpio) を参考にしてみてください。

試しにLチカしておくといいでしょう。

## まとめ

* 一家に一台転がってるラズパイを有効活用しましょう
* ファーム焼く用のブレッドボードと、実際に動かすブレッドボードは分けましょう
* 間違ってたら突っ込みお願いします！
* 回路図楽に書くツール教えてください

それではごきげんよう。