ESP8266を使ってIotをするための準備を一から始める.

どうもはとバスです.今回はAizu Advent Calendar 2017の16日目の投稿となります.

adventar.org

本日は手軽に使える とされている ESP8266の始め方です.

そもそもESP8266って何よ

簡単に言うとめちゃくちゃ安いwi-fiモジュール.

f:id:flying_hato_bus:20171210163929j:plain

この画像が全て.

他の要件としては

  • 3.3V駆動
  • 安価( ESP8266自体は 550円くらいで買える)
  • 16ピンのGPIO, SPI, I2C
  • 技適ももちろん通っている

というわけで今回はこれを使ってLチカしてwifiで通信させて,httpを叩くところまでをする.

導入

色々なモジュールが登場していますが,私が今回購入したのはこれ.

Wi-Fiモジュール ESP-WROOM-02 DIP化キット

こんな感じでブレッドボードに直挿しできるので,回路の設計とかも簡単にできる.

f:id:flying_hato_bus:20171210170620j:plain

まず必要なのはブレッドボードと少しのジャンパワイヤ.いくつかの抵抗が必要です.

それ以外には,Lチカ用の抵抗とLED,あとはUSB to serialの変換基板があればいいです.

環境構築

今回は Platformio を使用します.

Platformioは様々な開発のツールチェインを抽象化して,コマンドラインから同一の手法で開発が行う組み込み開発用のツール.

ライブラリマネージャーも独自に持っているのでライブラリの管理にも便利。

インストールはpipでできる.(要 python2.7.*環境)

pip installまでくれば platformioは入っているはず,あとは対応するボードを確認してみる.

コマンドとしては platformio boardsで一覧を取得できる.

めちゃくちゃ多いので ESP8266に関するのだけgrep.

その中にesp_wroom_02があると思うので,これを開発できるようにinitializeする.

ここまでくればフォルダが以下のようになっているはずなので src/以下にプログラムを書いて行きます.

├── lib
│   └── readme.txt
├── platformio.ini
└── src

まずはきちんと動くかわからないのでLチカで動作確認をする.

書き込み

今回書き込むためにはシリアルで通信しないといけない.そのためにUSB to Serialの変換基板などが必要になります.

今回この書き込みのところではまっていました.どうやってもプログラムを書き込めなかった.

なぜかなと思ってデータシートをよくみるとこのような記載が.

f:id:flying_hato_bus:20171211022333p:plain

どうやらこのESP32はUART Down load Mode, Flash Boot Modeという二つのモードがあると言うことが判明.

UART Down load Modeはプログラムを書き込むモード,Flash Boot Modeはプログラムを実行すると言うモード

mode GPIO 15 GPIO 0 GPIO 2
UART Down load Mode LOW LOW HIGH
Flash Boot Mode LOW HIIGH HIGH

表を見るとわかるように,今回はGOPIO 0ピンの状態だけで二つのモードを遷移することになる.

これとまたもう一つ問題がある.実は,このESP8266にあるRSTピンもプログラムを書き込むためには,少し細工をしなければならない.

qiita.com

この記事にもあるように,ブートローダーモードに切り替えるために,ピンをリセットする必要がある.

リセットするには、 RST を1度 GND に落とさなければならない.

二つのモードを遷移するようにGPIOピンのHIGH, LOWを切り替え,その上リセットスイッチを作らなければいけない. めんどくさいね

そのためにプルアップ回路を使用して,モードを遷移できるようにする.

プルアップ回路

プルアップ回路は,デフォルトの状態がHIGH, ボタンなどが押された瞬間だけLOWになると言う回路.

今回持っているちょうどいい抵抗が4K7Ωしかなかったので,4K7を使って,プルアップ回路を組む.

これをESP8266に追加してあげると,ボタンを押している時には書き込みモード,

ボタンを離している時はプログラム実行モードと二つの状態を簡単に行き来することができるようになる.

また,ボタンを押すと,リセットがかかり,プログラムを書き込むことができるようにもなる.

f:id:flying_hato_bus:20171211100043p:plain

プルアップ回路は回路図的にはこんな感じ.

実際にテストしてみるとこうなる,今回はLEDを繋げてHIGH, LOWを見た.

この動画を見ればわかる通り,

  • 何もしない -> OUTPUT は HIGH になって LED が点灯
  • ボタンを押す -> OUTPUT が LOW になって LED が消灯

という回路になる.

GPIO0とRSTピンの二つに,プルアップ回路を組み込んであげて.書き込む前に

  • GPIO0をLOWにする(GPIOのボタンを押したままにする)
  • RSTピンをLOWにしてリセット (RSTのボタンを押して離す)
  • GPIO0をHIGHにする(GPIO0のボタンを離す)

ここまでするとプログラムを書き込みができるようになる.

電力問題

これで無事書き込めるーーーーー!!!!!と思ったら大間違い.

実は,ESP8266はめちゃくちゃ電流を必要とする.

ESP8266の消費電流の徹底調査 – Ambient

このページにあるように,立ち上がりの時にめちゃくちゃ電流を必要とする.

電源オンの立ち上がり時に200mA程度の電流が流れる

とある,USB to serial変換基盤から給電できるのは,出ても80mAくらい.

ぜんぜん足りないため,三端子レギュレータと言うものが必要になる.

akizukidenshi.com

こんなやつ

こいつは,小さい電流を大きい電流に変換してくれるスゲーやつ.

こいつを USB to serialのVCCに繋げて,ESP8266が必要としている電流に足りるくらいの電流にする.

ちなみに,三端子レギュレータは発振してしまうので,目当ての3.3Vよりも電圧が少し高くなる(出力電圧に波があり,目当ての電圧にすることが難しい)

そのため,コンデンサなどを使って整流してあげる.

というわけで以下のような回路を電源側で作ってあげる.

f:id:flying_hato_bus:20171214181543j:plain

青い方のコンデンサは 0.1 uF, 黒い方のコンデンサは 47uFのコンデンサを使用している.

このような回路を使うと,黄色の線から3.3V を最大 1Aまで使用できる.

ここまで回路ができたらあとは書き込みができる

全体像

全体像としてはこんな感じ.

Frizingで書いたのはこちら

f:id:flying_hato_bus:20171214175730p:plain

白いボタンがGPIO0に繋がっていて,赤いボタンがRSTに繋がっている.

モードセレクト等でいじるために必要なピンは全て4K7で HIGH LOWにさせている部分に注意する.

USB to serialでシリアル端子に接続して,あとは書き込みをするだけ.

書き込みとコンパイルを一度にする.

platformio.iniと言うファイルは最初にこのような記載がされている.

f:id:flying_hato_bus:20171214165934p:plain

これに targets = uploadというのを記載すると,コンパイルとプログラムの書き込みが一気にできるようになる.

f:id:flying_hato_bus:20171214170105p:plain

書き込み

ここまで来てようやく書き込みができる.

書き込み方としては

  1. GPIO0をLOWにする(GPIOのボタンを押したままにする)
  2. RSTピンをLOWにしてリセット (RSTのボタンを押して離す)
  3. GPIO0をHIGHにする(GPIO0のボタンを離す)
  4. terminalに platformio run を打ってプログラムを書き込み

これでESP8266にプログラムをアップロードできる.

ボタンを何回か押す必要があるけど,波動拳を打つよか簡単です.

書き込みが成功するとこのように [SUCCESS]と出る.

f:id:flying_hato_bus:20171214183201p:plain

実際に動かすとなるとこんな感じ

上で書いていたプログラムをそのまま動かしただけ. 配線のジャングルで死にそう

ということで初期設定 & 回路の作成はここまでで終了.

WiFi に繋いで http get

ESP8266系統はArduinoのライブラリが普通に動くので.Arduinoのライブラリでhttp getをしていく.

ライブラリの導入方法

platformioはコマンドライン上からライブラリのインストールができる.

今回はHttpClientが欲しいので

platformio lib search HttpClientでどのようなライブラリがあるのかを確認できる.

めちゃくちゃ出てくることなどがあるので

platformio lib search HttpClient | less

などで見た方が見やすい.今回は

f:id:flying_hato_bus:20171214185308p:plain

66のこのライブラリを使用する.

インストールのためには

$ platformio lib install Library ID

でインストールできるので.今回は

$ platformio lib install 66

でインストールができる.

というわけでHttpClientが使えるようになった.

あとはただコーディングしていくだけでなんでも作ることができます.

応用

今回はこれを応用して.

扉の開閉を感知して,僕の個人的なslackで教えてくれるくんを作ります.

まさにIotって感じだ...

と言うわけで作っていく.

slackはwebhookにjsonをPOSTすると,そのチャンネルに自由に投稿をすることができるので,今回はこれを使用します.

テスト

webhookのURLの取得方法は色々な人がやっているので,各自で調べてください.

ここではwebhookのURLが取得できたと言うことで進めていきます.

実際にwebhookで投稿ができるかテストをする.

vimmessage.jsonを作成します.

こんな感じでjsonを書きます.あとはこれをcurlなりでwebhook用のURLにPOSTすればいいだけ.

POSTの方法としては

curl -X POST "<Webhook URL>" -d @message.json

でPOSTができる.実行するとこんな感じで投稿されているはず.

f:id:flying_hato_bus:20171214232032p:plain

これをESP8266にやらせればよい.あとはリードスイッチをESP8266に接続する.

リードスイッチ

リードスイッチは扉の開閉などを検知できるセンサ.

Amazon CAPTCHA

こんなやつ

これをESP8266のGPIO12に接続した.

このセンサは磁力によってHIGHかLOWかを検知することができる.

くっついていたら 0を出力し,離れたら1を出力する.

ESP8266はこれを見ておいて,センサーが1を出力したらwebhookにjsonをPOSTするようにする.

というわけで実装に移す.

リードスイッチの配線

リードスイッチをプルダウンでGPIO12に繋げる.ここでの抵抗は4k7にした.

f:id:flying_hato_bus:20171215160607p:plain

抵抗的には1k以上だったらなんでも大丈夫.

(カラーコードわからない人は,三番目が赤色だったらだいたい大丈夫だと思ってもらえるとありがたい)

上で作った回路にリードスイッチを繋げるだけなので,上から順番にやって来ている人はちょこっと回路を増やすだけですね.

最終的な回路はこうなる.

あのまっさらなブレッドボードはどこへやら...

と言うわけでコーディング.

webhookのURLとかにPOSTする情報などを書いていくだけ.

実際のコードはこのようになっています.

ここで注意するのはWI-Fi機器の周波数帯.2.4GHzなら普通に動いてくれるが,5.0GHz帯には対応しておらず.うまく接続ができない.

これを書いたら.実際に ESP8266に転送をする.

転送をして,wi-fiに繋がったら,実際にリードスイッチを動かしてみる.

すると,シリアルモニタにはこんな感じの情報が流れて来ているはず.

f:id:flying_hato_bus:20171215161936p:plain

一番最初の Connecting の後ろには,設定したwi-fiSSIDが書かれていて,次のURLで,実際に叩いたURLが書かれている.

そうすると,200が帰って来て,リクエストが成功したとなる.

実際にリクエストが成功して,slackに投稿がされると.

f:id:flying_hato_bus:20171215162227p:plain

ちゃんと投稿がされていることが確認できる.

実際に動かした動画がこれです.

見たらわかるように,扉を開くとKaihei-Oshiete-Kureru-Kunが「トビラガアイタヨー」と言ってくれています.

というわけで,最近はやりのIotをArduino互換機でできました.

これで家の防犯とかが簡単にできるようになりますし.

他のセンサーを組み合わせたりするともっと他のこともできるようになります.

例)

  • 赤外線センサをつけて,何かが動いたら通知を出す.
  • 室温センサをつけて,家の気温を一定間隔で通知

色々な可能性を持っているESP8266でした.

今回はESP Wroom 02を最初からやる記事でした.

これを使って皆様がIotに興味を持ってくれますように.

どうもありがとうございました.

今回やった内容をgithubにて後悔しているのでそちらも参考によろしくお願いします.

github.com