ESP8266を使ってIotをするための準備を一から始める.
どうもはとバスです.今回はAizu Advent Calendar 2017の16日目の投稿となります.
本日は手軽に使える とされている ESP8266の始め方です.
そもそもESP8266って何よ
簡単に言うとめちゃくちゃ安いwi-fiモジュール.
この画像が全て.
他の要件としては
- 3.3V駆動
- 安価( ESP8266自体は 550円くらいで買える)
- 16ピンのGPIO, SPI, I2C
- 技適ももちろん通っている
というわけで今回はこれを使ってLチカしてwifiで通信させて,httpを叩くところまでをする.
導入
色々なモジュールが登場していますが,私が今回購入したのはこれ.
Wi-Fiモジュール ESP-WROOM-02 DIP化キット
こんな感じでブレッドボードに直挿しできるので,回路の設計とかも簡単にできる.
まず必要なのはブレッドボードと少しのジャンパワイヤ.いくつかの抵抗が必要です.
それ以外には,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の変換基板などが必要になります.
今回この書き込みのところではまっていました.どうやってもプログラムを書き込めなかった.
なぜかなと思ってデータシートをよくみるとこのような記載が.
どうやらこの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ピンもプログラムを書き込むためには,少し細工をしなければならない.
この記事にもあるように,ブートローダーモードに切り替えるために,ピンをリセットする必要がある.
リセットするには、 RST を1度 GND に落とさなければならない.
二つのモードを遷移するようにGPIOピンのHIGH, LOWを切り替え,その上リセットスイッチを作らなければいけない. めんどくさいね
そのためにプルアップ回路を使用して,モードを遷移できるようにする.
プルアップ回路
プルアップ回路は,デフォルトの状態がHIGH, ボタンなどが押された瞬間だけLOWになると言う回路.
今回持っているちょうどいい抵抗が4K7Ωしかなかったので,4K7を使って,プルアップ回路を組む.
これをESP8266に追加してあげると,ボタンを押している時には書き込みモード,
ボタンを離している時はプログラム実行モードと二つの状態を簡単に行き来することができるようになる.
また,ボタンを押すと,リセットがかかり,プログラムを書き込むことができるようにもなる.
プルアップ回路は回路図的にはこんな感じ.
実際にテストしてみるとこうなる,今回はLEDを繋げてHIGH, LOWを見た.
— 飛ばすはとバス (.*) (@flying_hato_bus) 2017年12月11日
この動画を見ればわかる通り,
- 何もしない -> OUTPUT は HIGH になって LED が点灯
- ボタンを押す -> OUTPUT が LOW になって LED が消灯
という回路になる.
GPIO0とRSTピンの二つに,プルアップ回路を組み込んであげて.書き込む前に
- GPIO0をLOWにする(GPIOのボタンを押したままにする)
- RSTピンをLOWにしてリセット (RSTのボタンを押して離す)
- GPIO0をHIGHにする(GPIO0のボタンを離す)
ここまでするとプログラムを書き込みができるようになる.
電力問題
これで無事書き込めるーーーーー!!!!!と思ったら大間違い.
実は,ESP8266はめちゃくちゃ電流を必要とする.
このページにあるように,立ち上がりの時にめちゃくちゃ電流を必要とする.
電源オンの立ち上がり時に200mA程度の電流が流れる
とある,USB to serial変換基盤から給電できるのは,出ても80mAくらい.
ぜんぜん足りないため,三端子レギュレータと言うものが必要になる.
こんなやつ
こいつは,小さい電流を大きい電流に変換してくれるスゲーやつ.
こいつを USB to serialのVCCに繋げて,ESP8266が必要としている電流に足りるくらいの電流にする.
ちなみに,三端子レギュレータは発振してしまうので,目当ての3.3Vよりも電圧が少し高くなる(出力電圧に波があり,目当ての電圧にすることが難しい)
そのため,コンデンサなどを使って整流してあげる.
というわけで以下のような回路を電源側で作ってあげる.
青い方のコンデンサは 0.1 uF, 黒い方のコンデンサは 47uFのコンデンサを使用している.
このような回路を使うと,黄色の線から3.3V を最大 1Aまで使用できる.
ここまで回路ができたらあとは書き込みができる
全体像
全体像としてはこんな感じ.
ESP8266 pic.twitter.com/HWASzCg6zi
— 飛ばすはとバス (.*) (@flying_hato_bus) 2017年12月14日
Frizingで書いたのはこちら
白いボタンがGPIO0に繋がっていて,赤いボタンがRSTに繋がっている.
モードセレクト等でいじるために必要なピンは全て4K7で HIGH LOWにさせている部分に注意する.
USB to serialでシリアル端子に接続して,あとは書き込みをするだけ.
書き込みとコンパイルを一度にする.
platformio.ini
と言うファイルは最初にこのような記載がされている.
これに targets = upload
というのを記載すると,コンパイルとプログラムの書き込みが一気にできるようになる.
書き込み
ここまで来てようやく書き込みができる.
書き込み方としては
- GPIO0をLOWにする(GPIOのボタンを押したままにする)
- RSTピンをLOWにしてリセット (RSTのボタンを押して離す)
- GPIO0をHIGHにする(GPIO0のボタンを離す)
- terminalに
platformio run
を打ってプログラムを書き込み
これでESP8266にプログラムをアップロードできる.
ボタンを何回か押す必要があるけど,波動拳を打つよか簡単です.
書き込みが成功するとこのように [SUCCESS]と出る.
実際に動かすとなるとこんな感じ
— 飛ばすはとバス (.*) (@flying_hato_bus) 2017年12月14日
上で書いていたプログラムをそのまま動かしただけ. 配線のジャングルで死にそう
ということで初期設定 & 回路の作成はここまでで終了.
WiFi に繋いで http get
ESP8266系統はArduinoのライブラリが普通に動くので.Arduinoのライブラリでhttp getをしていく.
ライブラリの導入方法
platformioはコマンドライン上からライブラリのインストールができる.
今回はHttpClientが欲しいので
platformio lib search HttpClient
でどのようなライブラリがあるのかを確認できる.
めちゃくちゃ出てくることなどがあるので
platformio lib search HttpClient | less
などで見た方が見やすい.今回は
66のこのライブラリを使用する.
インストールのためには
$ platformio lib install Library ID
でインストールできるので.今回は
$ platformio lib install 66
でインストールができる.
というわけでHttpClientが使えるようになった.
あとはただコーディングしていくだけでなんでも作ることができます.
応用
今回はこれを応用して.
扉の開閉を感知して,僕の個人的なslackで教えてくれるくんを作ります.
まさにIotって感じだ...
と言うわけで作っていく.
slackはwebhookにjsonをPOSTすると,そのチャンネルに自由に投稿をすることができるので,今回はこれを使用します.
テスト
webhookのURLの取得方法は色々な人がやっているので,各自で調べてください.
ここではwebhookのURLが取得できたと言うことで進めていきます.
実際にwebhookで投稿ができるかテストをする.
vimでmessage.json
を作成します.
こんな感じでjsonを書きます.あとはこれをcurlなりでwebhook用のURLにPOSTすればいいだけ.
POSTの方法としては
curl -X POST "<Webhook URL>" -d @message.json
でPOSTができる.実行するとこんな感じで投稿されているはず.
これをESP8266にやらせればよい.あとはリードスイッチをESP8266に接続する.
リードスイッチ
リードスイッチは扉の開閉などを検知できるセンサ.
こんなやつ
これをESP8266のGPIO12に接続した.
このセンサは磁力によってHIGHかLOWかを検知することができる.
くっついていたら 0を出力し,離れたら1を出力する.
ESP8266はこれを見ておいて,センサーが1を出力したらwebhookにjsonをPOSTするようにする.
というわけで実装に移す.
リードスイッチの配線
リードスイッチをプルダウンでGPIO12に繋げる.ここでの抵抗は4k7にした.
抵抗的には1k以上だったらなんでも大丈夫.
(カラーコードわからない人は,三番目が赤色だったらだいたい大丈夫だと思ってもらえるとありがたい)
上で作った回路にリードスイッチを繋げるだけなので,上から順番にやって来ている人はちょこっと回路を増やすだけですね.
最終的な回路はこうなる.
回路の全体像です pic.twitter.com/2fINaxxNhH
— 飛ばすはとバス (.*) (@flying_hato_bus) 2017年12月15日
あのまっさらなブレッドボードはどこへやら...
と言うわけでコーディング.
webhookのURLとかにPOSTする情報などを書いていくだけ.
実際のコードはこのようになっています.
ここで注意するのはWI-Fi機器の周波数帯.2.4GHzなら普通に動いてくれるが,5.0GHz帯には対応しておらず.うまく接続ができない.
これを書いたら.実際に ESP8266に転送をする.
転送をして,wi-fiに繋がったら,実際にリードスイッチを動かしてみる.
すると,シリアルモニタにはこんな感じの情報が流れて来ているはず.
一番最初の Connecting
の後ろには,設定したwi-fiのSSIDが書かれていて,次のURLで,実際に叩いたURLが書かれている.
そうすると,200が帰って来て,リクエストが成功したとなる.
実際にリクエストが成功して,slackに投稿がされると.
ちゃんと投稿がされていることが確認できる.
実際に動かした動画がこれです.
扉を開けるとslackに通知を飛ばしてくれるくんです pic.twitter.com/t4heJa2wvf
— 飛ばすはとバス (.*) (@flying_hato_bus) 2017年12月15日
見たらわかるように,扉を開くとKaihei-Oshiete-Kureru-Kunが「トビラガアイタヨー」と言ってくれています.
というわけで,最近はやりのIotをArduino互換機でできました.
これで家の防犯とかが簡単にできるようになりますし.
他のセンサーを組み合わせたりするともっと他のこともできるようになります.
例)
- 赤外線センサをつけて,何かが動いたら通知を出す.
- 室温センサをつけて,家の気温を一定間隔で通知
色々な可能性を持っているESP8266でした.
今回はESP Wroom 02を最初からやる記事でした.
これを使って皆様がIotに興味を持ってくれますように.
どうもありがとうございました.
今回やった内容をgithubにて後悔しているのでそちらも参考によろしくお願いします.