Upload
kei-yoshimura
View
4.180
Download
0
Embed Size (px)
Citation preview
ESP8266を はじめようけーいち@9SQ 吉村 圭一郎
THE IoT READY
Wi-Fi MODULE
Wankuma:Fukuoka#36
わんくま同盟 福岡勉強会 #36 March 26, 2016
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へのリクエストを待つ
勘所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
スマートフォンから気温チェックブラウザで気温/湿度を見る
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に対して初期化を実行
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する
主要な部分だけ説明
httpPost 普通にHTTPリクエスト(ヘッダ&ボディ)を組み立てる
レスポンスが帰ってきたら、¥r¥n¥r¥nを読み飛ばした後のbodyをresultに格納
ボタンを押したらXXする外部のサーバにHTTP GET/POSTする
loop スイッチの状態を取得 パラメータを準備 HTTP POSTし、JSON形式で返されるレスポンスをパース 結果がsuccessだったらLEDを短く3回点滅 結果がそれ以外だったらLEDを長く2回点滅
主要な部分だけ説明
リモコンからコードを取得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
プリント基板製造サービス比較条件: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日)
・今まで注文した分で不良はゼロ ・国内製造と比較して大差ない ※個人の感想です。 高周波回路とかアナログ回路、オーディオ向け の場合に違いが出る/出ないとかは分からない
←シルク印刷とてもキレイ