チラシの裏の電子工作

電子工作、PC関係の備忘録というか、チラシの裏

ESP-WROOM-02 CaptivePortal

ESP-WROOM-02でCaptive Portalを実現する方法のメモ。
(Arduino1.6.7 esp8266-2.0.0)

Captive Portalとは何ぞや
例えば、

  1. ESPをスイッチを押しながら電源を入れるとアクセスポイントとして起動
  2. PCからESPのアクセスポイントに接続する
  3. するとあら不思議、ESPの設定画面が表示される
  4. ESPが本来接続しにいくSSIDとかを設定して、電源を入れ直す

と、こんな感じの事ができます。
こんな仕掛けがあれば、SSIDをハードコーディングしなくてよくなるわけですよ。
ISPFFSを使ったりして値を保存/呼び出す手間は増えますが。

海外のサイトとか見に行くと、できるとかできないとかわちゃわちゃ言ってます。
多分、端末によってできる/できないがあるのでしょう。
自分の場合はWindows10端末では自動的に設定画面を開くところまでできました。
Android4.1端末では自動的に設定画面が開かなかったので、自分でブラウザを開く必要がありました。

で、海外のサイトに転がってたソースを眺めてたんですが、要点がよく解らないので調べてみた。


押さえておくべき要点
  • DNSサーバを動かす
  • NotFoundのハンドルで404を返してはいけない。
    htmlそのものを返すか、302あたりで他のページにリダイレクトする(今回は後者を選択)
この2点だけ。

と言うわけで、以下サンプル。

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>

ESP8266WebServer server (80);
DNSServer dnsServer;

void handleRoot(){
    server.send ( 200, "text/plain", "root" );
}

void handleSetup(){
    server.send ( 200, "text/plain", "setup" );
}

void setup(){
    Serial.begin(9600);
    
    //タクトスイッチとかで切り替えられるようにする
    bool captive=true;
   
    server.begin();
    server.on("/",handleRoot);
    server.on("/setup",handleSetup);

    if(captive){
        
        //NotFoundを設定ページに飛ばす
        server.onNotFound([]() {
            server.sendHeader("Location", "/setup", true);
            server.send(302, "text/plain", "");
        });
        
        //softAPの設定
        IPAddress apIP(192,168,4,1);
        IPAddress apMASK(255,255,255,0);
        
        WiFi.mode(WIFI_AP);
        WiFi.softAPConfig(apIP, apIP, apMASK);
        WiFi.softAP("ESP8266-SETUP");
        dnsServer.start(53, "*", apIP);
        
        //loop()の代わり
        while(1){
            dnsServer.processNextRequest();
            server.handleClient();
        }
        
    }
    
    //以下通常の処理
    server.onNotFound([]() {
        server.send ( 404, "text/plain", "notfond" );
    });
    
    WiFi.mode(WIFI_STA);
    WiFi.begin("hgoe","hoge");
    while(WiFi.status() != WL_CONNECTED){
        delay(500);
        Serial.print(".");
    }
    Serial.println(WiFi.localIP());
}


void loop(){
    server.handleClient();
}





スポンサーサイト

カテゴリ:電子工作

ESP-WROOM-02のまとめメモ

基本的にhttps://www.arduino.cc/について。
orgの方は使ってないのでよく知らない。
arduino1.6.7使用。

Additional Boards Manager URLsは以下を指定。
http://arduino.esp8266.com/stable/package_esp8266com_index.json

ファームウエア

http://bbs.espressif.com/viewtopic.php?f=46&t=850
ここの記事が毎回最新版へのダウンロードリンクになるぽいので、ブックマークしとくといいかも。
更新頻度がかなり高い。

http://espressif.com/en/support/download/sdks-demos
今は多分こっち

ファームウエアダウンロードツール

http://bbs.espressif.com/viewtopic.php?f=57&t=433
こちらも同じく、この記事が最新版へのダウンロードリンクのかな。

こっちもいつの間にか整備されてた。
http://espressif.com/en/support/download/other-tools?keys=Flash+Download+Tools


ファームウエアの書き込みについては、ねむいさんの解説が非常に解りやすい。
http://nemuisan.blog.bai.ne.jp/?eid=215341

とりあえず、ファームウエアをどのアドレスに焼くのかだけ抜粋。
boot_v1.5.bin0x0
at\1024+1024\user1.2048.new.5.bin0x1000
blank.bin0xFE000
esp_init_data_default.bin0x3FC000
blank.bin0x3FE000
ファームのアーカイブ内のbin/at/readme.txtに記載あり。

esp_init_data_default.binをアップロードすると、MACアドレスなんかも変わってしまうとの事だったけど、最新のダウンロードツールでは
既存のMAC読み出し→アップロード→MAC書き戻し
を自動でやってくれるようだった。
けど、念のため開封してすぐに動作確認ついでにMACアドレスはメモして置いた方がイイと思う。

最低限必要なプルアップ/ダウンなど。
こばさんの回路図でまとまってて見やすい。
http://d.hatena.ne.jp/wakwak_koba/20150928
ただ、espressifが出してる資料でも、資料を作った時期によって微妙に回路が違うw
2017/04時点での公式の最小回路は↓こんな感じになってる。
esp-wroom-02最小回路
古い資料に記載されてたIO2のプルアップ抵抗が削除されてる気がする…


電源周りについて。
ねむいさんの解説がわかりやすい。
http://nemuisan.blog.bai.ne.jp/?eid=216185
ピーク350mA強だそうで…
あちこち読んでたら、起動中に貧血を起こして再起動を繰り返す現象が多いみたい。
自分は取り敢えず手元にあった2Aのレギュレータ(PQ3RD23/秋月で2個100円)を使ってます。


ハードウエアについて
無線:802.11b/g/n
電源電圧:3.0-3.6V
平均電流:80mA
保管温度:摂氏-40~125
L電圧:-0.3~0.25*VIO 大体0.8V以下?
H電圧:0.75*VIO~3.3 大体2.4V以上?
Maximum Driving Power:12mA これはI/Oピン1本あたりかしら?


ATコマンド
115200bps,送信改行コードはCRLF。

STA(子機)のMACアドレスを取得

AT+CIPSTAMAC?
+CIPSTAMAC:"18:xx:xx:xx:xx:xx"



AP(親機)のMACアドレス取得(最初の桁以外はSTA側と同じだった)

AT+CIPAPMAC?
+CIPAPMAC:"1a:xx:xx:xx:xx:xx"


バージョンチェック

AT+GMR
AT version:1.4.0.0(May 5 2017 16:10:59)
SDK version:2.1.0(116b762)
compile time:May 5 2017 16:37:51



起動メッセージ
74880bpsで読めるらしい。

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 2592, room 16
tail 0
chksum 0xf3
load 0x3ffe8000, len 764, room 8
tail 4
chksum 0x92
load 0x3ffe82fc, len 676, room 4
tail 0
chksum 0x22
csum 0x22

2nd boot version : 1.7(5d6f877)
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size & Map: 32Mbit(1024KB+1024KB)
jump to run user1 @ 1000

rf cal sector: 1019
freq trace enable 1
rf[112] : 03
rf[113] : 00
rf[114] : 01

SDK ver: 2.1.0(116b762) compiled @ May 5 2017 16:08:55
phy ver: 1134_0, pp ver: 10.2





以下個人的に非常に気に入ってる物。

arduinoのSPIFFSプラグイン

https://github.com/esp8266/arduino-esp8266fs-plugin/releases
なんか古いリリースへの直リンクとかが散見されるけど、ちゃんとリリース一覧から最新版をとってこようね。
esp8266のボード定義がstagingでないとFFSが使えないって記載を見かけたけど、2.0.0あたりからはstableで使えるんじゃないかな。
arduino1.6.7+esp8266-2.0.0、esp_iot_sdk1.5.2で使用可能だった。
但し、FlashSizeを『4M(1M SPIFFS)』に設定しないと書き込めない。

Timeライブラリ

https://github.com/PaulStoffregen/Time
時間を扱うなら必要。

NTPライブラリ

https://github.com/exabugs/sketchLibraryNTP
上記Timeライブラリと組み合わせて使用。場合によってはRTC不要に。
ドメイン名でNTPにアクセス、定期的に自動同期など至れり尽くせり。






カテゴリ:備忘録

FC2Ad