55
ESP8266を はじめよう けーいち@9SQ 吉村 圭一郎 THE IoT READY Wi-Fi MODULE Wankuma:Fukuoka#36 わんくま同盟 福岡勉強会 #36 March 26, 2016

ESP8266をはじめよう

Embed Size (px)

Citation preview

ESP8266を はじめようけーいち@9SQ 吉村 圭一郎

THE IoT READY

Wi-Fi MODULE

Wankuma:Fukuoka#36

わんくま同盟 福岡勉強会 #36 March 26, 2016

はじめに

今回のお話の対象 •Arduino触ったことある •触ったことないけどこれを機に挑戦したい

•乗るしかないこのビックウェーブにと思っている

超HOT

IoT

はじめに

というわけで ESP8266で オリジナルIoTデバイス 作りましょう。

超HOT

IoT

ESP8266とは?上海のファブレス半導体メーカー Espressif Systems が 製造しているWi-Fiモジュールのチップセット及びそのシリーズ

ESP8266EX chipset • TCP/IPプロトコルスタック搭載32bit MCU • アーキテクチャ : RISC (Diamond Standard 106Micro Core) • クロック : 80MHz • RAM : 64KB(命令用), 96KB(データ) • Wi-Fi STA, AP, STA+AP

• IEEE 802.11b/g/n, WPA/WPA2 • 10-bit ADC with HSPI, SDIO, UART, PWM, I2C, and I2S

ESP8266とは?

http://l0l.org.uk/

今までにESP-xxとして 海外では販売されていた

しかし…

技適が通ってない

日本国内で堂々と使うと 法律的にアウトーっ!

※こっそり使ってもアウトです

そこに登場した救世主

http://espressif.com/en/products/wroom/

ESP-WROOM-022015年に販売開始された ESP-WROOM-02は

FCC, CE, KCC, TELEC, LCIE, WiFi Alliance Certification

技適通ってる!

日本国内で問題なく使える ので、これを使ってみよう

他の似たものと比較Arduino UNO mbed (LPC1768) Raspberry Pi ESP-WROOM-02

値段 3000円くらい 6000円くらい A+ ~ 2B 3000円~6000円

Breakout Board 600~2500円

I/O (GPIO) 20 26 17 11

機能UART/I2C/SPI/

PWM +シールドで拡張

UART/I2C/SPI/ PWM/CAN/LAN/

USBなど

UART/I2C/SPI/PWM/LAN/USB

ソフトで色々

UART/I2C/I2S/ SPI/SDIO/PWM/

IR/Wi-Fi

ポテンシャル (大雑把に)

ふつう ちょっとつよい 超つよい つよい

難しい? かんたん ちょっと難しい ふつう わりとかんたん

夢広がる? お勉強用+α 使いこなせたら 広がりまくり

えっ、この値段… いろいろな物に

組み込んでネットに繋ぎたくなる!

※個人の感想です

どこで買えるの?

秋月電子通商 •Wi-Fiモジュール ESP-WROOM-02 DIP化キット … 650円(税込)

http://akizukidenshi.com/catalog/g/gK-09758/

スイッチサイエンス •ESP-WROOM-02ピッチ変換済みモジュール … 909円(税込)

https://www.switch-science.com/catalog/2347/

•ESP-WROOM-02開発ボード … 2160円(税込) https://www.switch-science.com/catalog/2500/

などなど… 別途 USBシリアル変換やモード 切り替え用の抵抗(後述)が不要

その他に必要なもの

USBシリアル変換 … 1個持っていればOK

秋月電子通商 •FT231X USBシリアル変換モジュール … 750円(税込)

http://akizukidenshi.com/catalog/g/gK-06894/

スイッチサイエンス •FT232RL搭載小型USB-シリアルアダプタ 3.3V … 1868円(税込)

https://www.switch-science.com/catalog/343/

どうやって使う(動かす)の?

方法 その1 ATコマンドを叩いて、Wi-Fi通信モジュールとして使う ※ATコマンド…簡単に言うとモデムを制御するコマンドだよ!エヴァじゃないよ!

方法 その2 内蔵ファームウェアを書き換えてArduinoみたいに使う ➡Arduino IDEを使って開発&書き込みできます

今回は単体でArduinoっぽく使う方法を説明します

Arduinoについて(復習)

Arduino 電子工作プロトタイピング プラットフォーム ←IDE(開発環境)やボードを含めた総称

スケッチ Arduino IDEで書くソースコードのこと 拡張子は .ino

Arduino言語 C/C++がベースになっている

Arduinoについて(復習)

void setup() {…} 電源ONした後に1回だけ実行される

void loop() {…} setupの後に繰り返し実行される

シリアルモニタ マイコンとのシリアル通信

コンパイル&書き込み マイコンに書き込むコンパイル

スケッチをマイコンが 実行できる形に変換する

int main(void) { setup(); while(1) {

loop(); } return 0;

}

実行時の動作は ←こんなイメージ

ESP8266 core for ArduinoArduino IDEにESP8266 core for Arduinoを導入する (1)

1. Preferences(環境設定)を開く 2. 追加のボードマネージャのURL の一番右のボタンをクリック 3. http://arduino.esp8266.com/stable/package_esp8266com_index.json をコピペ

4. OKをクリック 5. OKをクリックで環境設定を閉じる

2

3

4

5

これでボードマネージャで インストール可能になった

次へ続く

1

ESP8266 core for ArduinoArduino IDEにESP8266 core for Arduinoを導入する (2)

1. ツール → マイコンボード : “…” 2. ボードマネージャ... 3. 一番下の esp8266 by ESP8266 Community を インストール

3

1 2

ESP8266 core for ArduinoArduino IDEにESP8266 core for Arduinoを導入する (3)

1. ツール → マイコンボード : “…” 2. Generic ESP8266 Module 3. Flash Mode : QIO, Flash Size : 4M (3M SPIFFS) にする (以下のように)

3

1

2

ピンダイアグラム

特定のピンをプルアップ/ダウン することでモードが切り替わる

ESP-WROOM-02

GND

GND

GND

3V3EN

IO14IO12IO13IO15IO2IO0

IO16TOUTRSTIO5

TXDRXDIO4

GPIO14GPIO12GPIO13GPIO15GPIO2GPIO0

GPIO16ADC

GPIO5

GPIO1GPIO3GPIO4 4

5

16

1214

13

U0TXDU0RXD

U1TXD

CLKMISOMOSI

CS

SCL

SDA

PWM-RPWM-BPWM-G 15

20 3

1

I2CSPI

PWM

UART

ADCGPIO

Arduino

PowerGND

Pin Name

UART Download ModeFlash Boot Mode

3.3V

GND

3.3V

GND

IO15IO2IO0

IO15IO2IO0

スケッチを書き込むUART Download Modeで電源をONにして書き込む

ESP-WROOM-02FTDI Breakout 3.3V

GND

GND

GND

0

2

15

3V3

TX

RX

10kΩ

EN

スケッチを実行

ESP-WROOM-02FTDI Breakout 3.3V

GND

GND

GND

0

2

15

3V3

TX

RX

10kΩ

Flash Boot Modeで電源をONにすると実行

EN

まずは「Lチカ」

従来のArduinoと同じように サンプルスケッチ “Blink” を開く

LEDを点滅させる

ESP-WROOM-02を UART Download Modeにして コンパイル&書き込み

まずは「Lチカ」

接続はこんな感じ (実行時)

LEDを点滅させる

ESP-WROOM-02FTDI Breakout 3.3V

GND

GND

GND

0

2

15

3V3

TX

RX

10kΩ

13

LED1kΩ

EN

まずは「Lチカ」LEDを点滅させる

http://www.aitendo.com/product/12120aitendoの変換基板

Boot Mode 選択用の抵抗×3本

USBシリアル変換 FT232RL

RXTX

LEDの電流制限抵抗

5mm 赤色LED

まずは「Lチカ」LEDを点滅させる

スイッチサイエンスの開発ボード

USBシリアル変換(FT231X)と レギュレーター搭載なので 周辺のゴタゴタが不要

書き込み時はUSBを下にして 右のボタンを押しながら 左のボタンを押してリセットで UART Download Modeになる

スマートフォンからLチカ

回路は先ほどと同じでOK

ブラウザ経由でLEDを点灯/消灯させる

およそ60行https://github.com/9SQ/esp8266-sample/tree/master/led_server

スマートフォンからLチカブラウザ経由でLEDを点灯/消灯させる

include, グローバル変数など

SSIDやIPアドレスを設定

root (/)にアクセスしてきた時の処理

jsを含むhtmlを返している

led (/led)にアクセスしてきた時の処理

HTTP POSTで送られてくる パラメータに応じてLEDをON/OFF

スマートフォンからLチカブラウザ経由でLEDを点灯/消灯させる

setup (起動時に1度だけ実行される処理)

WiFi.mode(WIFI_AP) : アクセスポイントモードとして動作する WiFi.softAPConfig(…) : IPアドレスを設定 WiFi.softAP(SSID) : SSIDを設定 dnsServer.start(…) : DNSサーバ起動 webServer.on(…) : handleをここで登録 webServer.begin() : Webサーバ起動

loop (setup後に繰り返し実行される処理)

DNSとWeb serverへのリクエストを待つ

スマートフォンからLチカブラウザ経由でLEDを点灯/消灯させる

勘所1:電源

電源容量が足りずにWi-Fiが掴めない (モジュールが起動しない or Wi-Fi接続開始直後にリセットが掛かる)

実は(ほとんどの)USBシリアル変換ボードの場合…

USBシリアル変換ボード(FT232R/FT231Xなど)の 内蔵3端子レギュレータは50mA MAXくらい

RF起動時に瞬間的に大電流 & 通信時も平均で100~300mAくらい

電源を増強しなくちゃ!圧倒的な電源容量足りなさ感

勘所1:電源対処法1 (簡単) 容量の大きいコンデンサを入れる

対処法2 (簡単) 電池やバッテリーから電源供給

対処法3 (おすすめ) 3端子レギュレータから電源供給

あまりおすすめできない

USBシリアル変換からの3.3Vは 接続しないように (GNDだけ接続)

他にも色々センサー繋げるなら 500mAくらいあると余裕で安心

3V3とGNDの間に

スマートフォンから気温チェック

http://akizukidenshi.com/catalog/g/gM-08775/

ブラウザで気温/湿度を見る

I2C接続 気温・湿度センサー HDC1000 … 680円(税込)

ESP-WROOM-02

FTDI Breakout 3.3VGND

GND

GND

0

2

15

3V3

TX

RX

10kΩ12

14

電源 (レギュレータ, バッテリー等)

EN

スマートフォンから気温チェックブラウザで気温/湿度を見る

およそ100行https://github.com/9SQ/esp8266-sample/tree/master/hdc1000

スマートフォンから気温チェックブラウザで気温/湿度を見る

include, グローバル変数など

下記でタイマーを使用するためにESP8266のuser_interface.hをinclude

タイマー関連

HDC1000からの定期読み込みを delayではなくタイマーで実現するため

root (/)にアクセスしてきた時の処理

温度や湿度をグローバル変数から取り出して 変換式で人間が読み取り可能な値に変換, 表示

スマートフォンから気温チェックブラウザで気温/湿度を見る

setup (起動時に1度だけ実行される処理)

Wire.begin(12, 14) : ピン12をSDA, 14をSCLで I2C接続 initHDC1000() : HDC1000を初期化 timeCountArm(1000) : 1000ミリ秒でタイマーセット

loop (setup後に繰り返し実行される処理)

10秒ごとにreadHDC1000()を実行

readHDC1000 (HDC1000から値を読み込む)

14bitのデータを上位, 下位で分割して読み込み, ビットシフトして結合

initHDC1000 (HDC1000を初期化)

データシートに従って、HDC1000に対して初期化を実行

スマートフォンから気温チェックブラウザで気温/湿度を見る

実際にスマートフォンで確認 (度と%を忘れてた…)

HDC1000とESP-WROOM-02を I2C(2wire)で接続

void loop() { server.handleClient(); if(led_sw) { digitalWrite(LED, HIGH); delay(500); //500ミリ秒点灯 digitalWrite(LED, LOW); delay(500); //500ミリ秒消灯 } }

勘所2:タイマーdelay()は全ての処理を止めてしまう

void handleControl() { if (server.method() == HTTP_GET) { if (server.arg("c") == "on") { led_sw = true; } else if (server.arg("c") == "off") { led_sw = false; } String s = "<html>…</html>"; server.send(200, "text/html", s); } }

LEDの1点滅中は サーバが応答しない!

注:解説用なので色々と大幅に省いています

例:スマホからLEDの点滅をON/OFFできるものを作りたい

void loop() { server.handleClient(); if (led_sw_on) { led_blink_arm(500); led_sw_on = false; } if (led_sw_off) { led_blink_disarm(); led_sw_off = false; } if (led_flag) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } yield(); }

勘所2:タイマー

void change_led_flag(void *pArg) { if (led_flag) { led_flag = false; } else { led_flag = true; } } void led_blink_arm(int ms) { os_timer_setfn(&blink_timer, change_led_flag, NULL); os_timer_arm(&blink_timer, ms, true); } void led_blink_disarm() { os_timer_disarm(&blink_timer); }

注:解説用なので色々と大幅に省いています

#ifdef ESP8266 extern "C" { #include "user_interface.h" } #endif os_timer_t blink_timer;

点滅ONになった時にタイマー設定、OFFで解除するように

handleではhttpリクエストに応じて led_sw_on = true / led_sw_off = true

とするようなコードを書く (現在のON/OFF状況も別途保持必要)

接続はこんな感じ (実行時)

ESP-WROOM-02

FTDI Breakout 3.3VGND

GND

GND

0

2

15

3V3

TX

RX

10kΩ

12

LED

1kΩ

ボタンを押したらXXする外部のサーバにHTTP GET/POSTする

5

スイッチ

電源 (レギュレータ, バッテリー等)

EN

ボタンを押したらXXする外部のサーバにHTTP GET/POSTする

およそ180行 https://github.com/9SQ/esp8266-Yo-button

ボタンを押したらXXする外部のサーバにHTTP GET/POSTする

主要な部分だけ説明

httpPost 普通にHTTPリクエスト(ヘッダ&ボディ)を組み立てる

レスポンスが帰ってきたら、¥r¥n¥r¥nを読み飛ばした後のbodyをresultに格納

ボタンを押したらXXする外部のサーバにHTTP GET/POSTする

loop スイッチの状態を取得 パラメータを準備 HTTP POSTし、JSON形式で返されるレスポンスをパース 結果がsuccessだったらLEDを短く3回点滅 結果がそれ以外だったらLEDを長く2回点滅

主要な部分だけ説明

こんなのモノ作ってみました

✓押すとYoを送るボタン ✓部屋の気温や湿度、気圧を監視する ✓ドアが開いたらプッシュ通知 ✓トイレの温水便座をスマホで操作

こんなのモノ作ってみました

トイレの温水便座をスマホで操作

通称 RESTful トイレ

ハードウェア構成• ESP-WROOM-02 (with オリジナル基板)

• 赤外線LED

ケース 3Dプリンタで製作 基板

スイッチサイエンスPCB

リモコンからコードを取得Arduino UNOに赤外線リモコン受信モジュールを接続

PL-IRM2161-XD1

Arduino-IRremote https://github.com/z3t0/Arduino-IRremote

example/IRrecvDumpを書き込んで シリアルモニタで取得

リモコンからコードを取得トイレのリモコンが 送信している信号をGET

流す(小)流す(大)

停止1 停止2

やわらか1 やわらか2

送信開始リーダ部 約6ms, 2.9ms

データ部 1.5ms=1, 0.5ms=0が続く

流す以外のコマンドは 2回に分けて送信されている

プログラムを書く&書き込む

1. 無線LAN接続する 2. サーバ起動 3. リクエストを受ける 4. 赤外線送信

ESP8266 core for Arduino https://github.com/esp8266/Arduino

ESP-WROOM-02を単体で Arduinoのように使える

IRremote ESP8266 https://github.com/markszabo/IRremoteESP8266

38kHzで変調して赤外線LEDを 点滅させるライブラリ

トータル 150行くらい

設置

http://toilet.local/

HTML(bootstrap3)+JavaScript

ボタンを押すとXMLHttpRequestで各コマンドを叩く

mDNS対応ブラウザ でアクセス可能 (Androidは…)

toilet.local/washlet

おしりを洗浄したいときcurl -X POST -d 'c=rear' http://toilet.local/washlet

洗浄を止めたいときcurl -X POST -d 'c=stop' http://toilet.local/washlet

example

®

ウォシュレット, WashletはTOTOの登録商標です

toilet.local/washlet

「大」を流すときcurl -X DELETE -d 'c=big' http://toilet.local/washlet

®

ウォシュレット, WashletはTOTOの登録商標です

example

Androidアプリ作りました。 Android 5.0~

✔通知領域に常駐 他のアプリ起動中もシームレスに おしりの洗浄が可能

こんなのモノ作ってみました

その他、作ったものを持ってきているので 見たい方は声をかけてください

もちろん質問などもOK!

ご静聴ありがとうございました!

番外編 (後日追加)

PCB製造を海外に発注してみた ~2015年度 簡易版~

これ以降のスライドは、当日の会場で質問された プリント基板製造サービスについてのお話です。

プリント基板製造サービス比較条件:50mm*50mm / 両面(2層)基板 / 1oz, 35μm銅箔    1.6mm厚 / はんだレベラー / レジスト色 : 緑

国内P社 国内S社 海外F社 海外E社

10枚作る 約2万5千円 約1400円 9.99ドル

100枚作る 約4万円 約1万円 約75ドル 99.9ドル

レジストを 黒色に

+1000~3000円 +約3000円 +20ドル +0ドル

送料 込み 1080円 約5~20ドル(重さと配送方法で異なる)

サポート 日本語 日本語 英語

ちゃんと届く?品質は?海外E社の場合 1回目(2種40枚):11/10発注→11/16着 (7日) 2回目(1種10枚):1/9発注→1/18着 (10日) 3回目(2種30枚+ステンシル):3/21発注→3/30着 (10日)

・今まで注文した分で不良はゼロ ・国内製造と比較して大差ない   ※個人の感想です。   高周波回路とかアナログ回路、オーディオ向け   の場合に違いが出る/出ないとかは分からない

←シルク印刷とてもキレイ

プリント基板製造サービスについての詳細は 改めてブログ記事 or スライドにします(たぶん)

ブログ:http://eleclog.quitsq.com/