ESP8266-WROOM-02 Proxy経由でWEBページを取得

ESP8266HTTPClientを使ってあげれば
httpであればProxy経由で取得するのは簡単でした。
httpsは一筋縄ではいかなそう(?)勉強中です。

単純なサンプルを載せておきます。

/*
 * 単純にProxy経由でWEBページを取得するサンプル
 */

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

void setup() {
  Serial.begin(115200);
  Serial.println();

  WiFi.mode(WIFI_STA);
  WiFi.begin("SSID", "PASSWORD");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("WiFi connected");  
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
    // wait for WiFi connection
    if((WiFi.status() == WL_CONNECTED)) {

        HTTPClient http;

        Serial.print("[HTTP] begin...\n");

        //Proxyサーバを使う場合
        http.begin("Proxy.server.ip",8080,"http://www.dmsk.com/pc/main-hw.html");

        //Proxyサーバを使わない場合
        //http.begin("http://www.dmsk.com/pc/main-hw.html");
        
        Serial.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            Serial.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                Serial.println(payload);
            }
        } else {
            Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    delay(20000);
}

解説というほどのこともないですが、
35行目で、Proxyサーバのアドレス、ポート、開きたいページのURLを指定するだけです。

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

Yahoo天気予報をESP8266-WROOM-02やESP-WROOM-32などのマイコンから参照しやすくしてみる

天気予報はYahooやLivedoorが無料でRSSを提供してくれています。他にもgooとかもやってみたいです。今回はYahoo!の天気予報をマイコンで表示したりするのに利用しやすくするためにごにょごにょしたことをまとめておきたいと思います。

まず、Yahooの天気予報のRSSは、次のページで各地域ごとにxml形式で提供されています。
https://weather.yahoo.co.jp/weather/rss/
実際に開いてみるとわかりますが、更新日時とか、警報や注意報など天気以外の表示するのに必要なさそうな情報も沢山入っています。この大量の文字列からパターンマッチをして必要な文字列を切り出して来なければなりません。なんて考えていたらマイコンでこの処理をさせるのは大変だーと思ってきました。さらに、Yahooの天気予報はhttpsなのでセキュア通信もさせなくてはなりません…。うーん、httpsだとプロキシ経由だったりするとページを取得するだけでも難しそうだな、、、などなど色々考えた結果。扱いやすいデータに変換してからマイコンで受信したほうが簡単じゃないか(?)というとこに至ったのでした。

前置きが長くなりましたが、今回やってみるのは、PHPを使ってマイコンで使いやすい天気予報データに変換しちゃおう♪というのが狙いです。

概要:
・Yahooの天気予報のRSSを利用
・WEBサーバ上で動くPHPプログラムを作成してみる
(PHPにした理由はPHPだと簡単だから)

■getytenki.phpのプログラム

<?php
header('Content-type: application/xml; charset=UTF-8');
date_default_timezone_set('Asia/Tokyo');


//リクエストURLから数字文字列を取得
$placeNo = htmlspecialchars($_GET["p"]);

//Yahoo天気のxmlファイルのURL
$xmlurl = "https://rss-weather.yahoo.co.jp/rss/days/" . $placeNo . ".xml";

//xml読み込む
$lines = file($xmlurl);


echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
echo "<root>\n";
echo "<sourceurl>" . $xmlurl . "</sourceurl>\n";
echo "<dataprovider>Yahoo!天気・災害</dataprovider>\n";

foreach ($lines as $line_num => $line) {

  //copyright表示
  if(preg_match('/<copyright(.+)copyright>/',$line,$matches)){
    echo $matches[0] . "\n";
    echo "<today>" . date('Y年m月d日') . "</today>\n";
  }

  //<title>タグの情報を読み込む
  if(preg_match_all('/<title>(.+?)<\/title>/',$line,$matches)){
    //print_r($matches);

    //場所の文字列を抜き出す
    if(preg_match('/災害 - (.+)の天気/',$matches[1][0],$place)){
      echo "<place>" . mb_convert_kana($place[1],'a','UTF-8') . "</place>\n"; //全角→半角にもしておく
    }

    //天気情報を抜き出す
    foreach ($matches[1] as $mt_num => $mt) {
      if(preg_match_all('/【 (.+日.+?)).+ 】 (.+) - (.+) - /',$mt,$dt)){
        //print_r($dt);
        echo "<item>";
        echo mb_convert_kana($dt[1][0],'a','UTF-8') . ":" . $dt[2][0] . ":" . $dt[3][0];
        echo "</item>\n";
      }
    }
  }
}
echo "</root>\n";
?>

プログラムはたったこれだけです。
上記プログラムをPHPが動くWEBサーバに置いてアクセスしてみます。ゆくゆくはマイコンでアクセスさせますが、まずはパソコンで確認です。
http://bmicom.dmsk.com/php/getytenki.php?p=4820
URLのおしりの数字は、Yahooの天気予報のxmlファイル名の数字です。ブラウザによっては文字が羅列されているかもしれませんが、ソースを見てもらうとxml形式になっているのがわかります。
今回は4820なので長野県松本の天気情報が取得できました。

出力されるxmlの文字コードはUTF-8になっています。
もしかしたらフォントの関係とかでShift-JISで受信したい場合もあるかもしれません。そんなときは以下のようにして、PHP側でShift-JISにしてしまうのも手かと思います。

■getytenkisj.phpのプログラム

<?php
header('Content-type: application/xml; charset=Shift_JIS');
date_default_timezone_set('Asia/Tokyo');


//リクエストURLから数字文字列を取得
$placeNo = htmlspecialchars($_GET["p"]);

//Yahoo天気のxmlファイルのURL
$xmlurl = "https://rss-weather.yahoo.co.jp/rss/days/" . $placeNo . ".xml";

//xml読み込む
$lines = file($xmlurl);


echo mb_convert_encoding("<?xml version=\"1.0\" encoding=\"Shift-JIS\"?>\n", "SJIS", "UTF-8");
echo mb_convert_encoding("<root>\n", "SJIS", "UTF-8");
echo mb_convert_encoding("<sourceurl>" . $xmlurl . "</sourceurl>\n", "SJIS", "UTF-8");
echo mb_convert_encoding("<dataprovider>Yahoo!天気・災害</dataprovider>\n", "SJIS", "UTF-8");

foreach ($lines as $line_num => $line) {

  //copyright表示
  if(preg_match('/<copyright(.+)copyright>/',$line,$matches)){
    echo mb_convert_encoding($matches[0] . "\n", "SJIS", "UTF-8");
    echo mb_convert_encoding("<today>" . date('Y年m月d日') . "</today>\n", "SJIS", "UTF-8");
  }

  //<title>タグの情報を読み込む
  if(preg_match_all('/<title>(.+?)<\/title>/',$line,$matches)){
    //print_r($matches);

    //場所の文字列を抜き出す
    if(preg_match('/災害 - (.+)の天気/',$matches[1][0],$place)){
      echo mb_convert_encoding("<place>" . mb_convert_kana($place[1],'a','UTF-8') . "</place>\n", "SJIS", "UTF-8"); //全角→半角にもしておく
    }

    //天気情報を抜き出す
    foreach ($matches[1] as $mt_num => $mt) {
      if(preg_match_all('/【 (.+日.+?)).+ 】 (.+) - (.+) - /',$mt,$dt)){
        //print_r($dt);
        echo mb_convert_encoding("<item>", "SJIS", "UTF-8");
        echo mb_convert_encoding(mb_convert_kana($dt[1][0],'a','UTF-8') . ":" . $dt[2][0] . ":" . $dt[3][0], "SJIS", "UTF-8");
        echo mb_convert_encoding("</item>\n", "SJIS", "UTF-8");
      }
    }
  }
}
echo "</root>\n";
?>

上記プログラムを動かした結果はこのようになります。
http://bmicom.dmsk.com/php/getytenkisj.php?p=4820

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

ESP-WROOM-02 TCPソケット通信

ESP-WROOM-02を2個使って片方がサーバ、もう片方がクライアントとして接続し、TCPソケット通信をしてみます。
UDPのサンプルは良く見るけど、TCPのソケット通信はなかなか見つからなかったので実験をかねて作成してみました。
クライアント側を電池で動かせばリモコンとして使えそうです。



概要:
・Arduinoの開発環境でプログラミングしてESP-WROOM-02に書込む
・サーバ側はSoftAPモードでWiFiアクセスポイントを開設
・クライアント側はSWを押すとコマンドをサーバに送る
・サーバ側は送られて来たコマンドを見てLEDをON/OFFする

 

動作イメージ

クライアント側のSWを押すとサーバ側のLEDが光ります

 

サーバ側回路図とプログラム


//サーバ側プログラム
#include <ESP8266WiFi.h>

static const char *SSID = "WROOM-B'MICOM";
static const char *PASSWD = "password";

const int LED1 = 12; //SW1のIOピン
const int LED2 = 16; //SW2のIOピン
const int LED3 = 5;  //SW3のIOピン
const int LED4 = 4;  //SW4のIOピン

IPAddress ip(192, 168, 0, 33);
//IPAddress gateway(192, 168, 0, 1);
//IPAddress netmask(255, 255, 255, 0);

WiFiServer server(26842);  //Port番号

void setup() {
  Serial.begin(115200);
  Serial.println();

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  //起動時LEDを光らせてみる
  digitalWrite(LED1, HIGH);
  delay(100);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(100);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
  delay(100);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, HIGH);
  delay(100);
  digitalWrite(LED4, LOW);

  //WiFiアクセスポイントを開始
  WiFi.mode(WIFI_AP);
  WiFi.softAP(SSID, PASSWD);
  WiFi.softAPConfig(ip, WiFi.gatewayIP(), WiFi.subnetMask());
  //WiFi.softAPConfig(ip, gateway, netmask);
  WiFi.begin();

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP Started. myIP address: ");
  Serial.println(myIP);

  //Portのlistenを開始
  server.begin();
  Serial.println("Server started");

}

void loop() {
  String cmd;
  cmd = rcvCommand();

  //受信したコマンドに対応したLEDを点灯/消灯
  if(cmd == "LED1OFF"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED1, LOW);
  }
  if(cmd == "LED1ON"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED1, HIGH);
  }
  if(cmd == "LED2OFF"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED2, LOW);
  }
  if(cmd == "LED2ON"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED2, HIGH);
  }
  if(cmd == "LED3OFF"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED3, LOW);
  }
  if(cmd == "LED3ON"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED3, HIGH);
  }
  if(cmd == "LED4OFF"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED4, LOW);
  }
  if(cmd == "LED4ON"){
    Serial.print("Exec: ");
    Serial.println(cmd);
    digitalWrite(LED4, HIGH);
  }
}

//コマンドを受信してそのコマンド文字列を返す
String rcvCommand(){
  WiFiClient client = server.available();
  String rstr;
  if (client.connected()) {
    Serial.println("Connected to client");

    //コマンド文字列受信(文字列が来なければタイムアウトする)
    rstr = client.readStringUntil('\r');
    Serial.print("[");
    Serial.print(rstr);
    Serial.println("]");

    //応答送信
    client.print("OK\r");

    //接続をクローズ
    client.stop();
    Serial.println("Closed");
  }

  return rstr;
}




クライアント側回路図とプログラム


//クライアント側プログラム
#include <ESP8266WiFi.h>
#include <Ticker.h>

#define SW_ONDELAY  4000  //SWチャタリング防止ディレイ(ループカウント数)
#define SW_OFFDELAY 4000  //SWチャタリング防止ディレイ(ループカウント数)

Ticker ticker1;  //タイマ割り込み (LED点滅用)

const char* ssid = "WROOM-B'MICOM";
const char* password = "password";

char hostIP[] = "192.168.0.33";
int  hostPort = 26842;

const int SW1 = 12; //SW1のIOピン
const int SW2 = 16; //SW2のIOピン
const int SW3 = 5;  //SW3のIOピン
const int SW4 = 4;  //SW4のIOピン
const int LED = 13; //LEDのIOピン

int ledStatus = 0; //0:消灯 1:点灯 2:点滅 
int sw1Status = 0; //0:OFF 1:ON
int sw2Status = 0; //0:OFF 1:ON
int sw3Status = 0; //0:OFF 1:ON
int sw4Status = 0; //0:OFF 1:ON

WiFiClient client;

void setup() {
  Serial.begin(115200);

  //タイマ割り込み間隔と 割り込み関数名 LEDの点滅に使用
  ticker1.attach_ms(500, ticker1_interrupt);

  pinMode(SW1, INPUT);
  pinMode(SW2, INPUT);
  pinMode(SW3, INPUT);
  pinMode(SW4, INPUT);
  pinMode(LED, OUTPUT);
    
  Serial.println("Booting...");
  WiFi.mode(WIFI_STA);

  connectToWiFi();
  
}

void connectToWiFi(){
    ledStatus = 2;//0:消灯 1:点灯 2:点滅 
    
    WiFi.begin(ssid, password);
    delay(500);

    int retrycnt = 0;
    while(WiFi.waitForConnectResult() != WL_CONNECTED){
      Serial.print(".");
      delay(100);
      retrycnt++;
      if(retrycnt > 100){
        ESP.restart();
      }
    }
    Serial.println("Connect Success");
}


void loop() {

  if (WiFi.status() == WL_CONNECTED) {
    ledStatus = 1;//0:消灯 1:点灯 2:点滅 

    sw1process();
    sw2process();
    sw3process();
    sw4process();
    
  }else{
    //WiFi接続が切れた
    Serial.println("WiFi ERR. Restart.");
    ESP.restart();
  }
}

void sendSocket(String str)
{
  if (client.connect(hostIP, hostPort))
  { 
    Serial.print("Connected:");
    Serial.println(hostIP);
    Serial.println("Posting: " + str);

    //送信
    client.print(str);
 
    //応答受信
    client.setTimeout(1000);
    do{
      String line = client.readStringUntil('\r');
      Serial.print(line);
    } while (client.available() != 0);  //残りがあるときはさらに受信のためループ
    Serial.println();
  }
  else
  {
     Serial.println("Connection failed.");
  }
}

//SW1の処理
int sw1onCnt = 0;
int sw1offCnt = 0;
void sw1process(){
  if(sw1Status == 0){
    if(digitalRead(SW1) == HIGH){
      sw1onCnt++;
      if(sw1onCnt == SW_ONDELAY){
        //ON送信
        sendSocket("LED1ON\r");;
        sw1Status = 1;
        sw1offCnt = 0;
      }else if(sw1onCnt > SW_ONDELAY){
        sw1onCnt = SW_ONDELAY;
      }
    }else{
      sw1onCnt = 0;
    }    
  }else{
    if(digitalRead(SW1) == LOW){
      sw1offCnt++;
      if(sw1offCnt == SW_OFFDELAY){
        //OFF送信
        sendSocket("LED1OFF\r");
        sw1Status = 0;
        sw1onCnt = 0;
      }else if(sw1offCnt > SW_OFFDELAY){
        sw1offCnt = SW_OFFDELAY;
      }
    }else{
      sw1offCnt = 0;
    } 
  }
}

//SW2の処理
int sw2onCnt = 0;
int sw2offCnt = 0;
void sw2process(){
  if(sw2Status == 0){
    if(digitalRead(SW2) == HIGH){
      sw2onCnt++;
      if(sw2onCnt == SW_ONDELAY){
        //ON送信
        sendSocket("LED2ON\r");;
        sw2Status = 1;
        sw2offCnt = 0;
      }else if(sw2onCnt > SW_ONDELAY){
        sw2onCnt = SW_ONDELAY;
      }
    }else{
      sw2onCnt = 0;
    }    
  }else{
    if(digitalRead(SW2) == LOW){
      sw2offCnt++;
      if(sw2offCnt == SW_OFFDELAY){
        //OFF送信
        sendSocket("LED2OFF\r");
        sw2Status = 0;
        sw2onCnt = 0;
      }else if(sw2offCnt > SW_OFFDELAY){
        sw2offCnt = SW_OFFDELAY;
      }
    }else{
      sw2offCnt = 0;
    } 
  }
}

//SW3の処理
int sw3onCnt = 0;
int sw3offCnt = 0;
void sw3process(){
  if(sw3Status == 0){
    if(digitalRead(SW3) == HIGH){
      sw3onCnt++;
      if(sw3onCnt == SW_ONDELAY){
        //ON送信
        sendSocket("LED3ON\r");;
        sw3Status = 1;
        sw3offCnt = 0;
      }else if(sw3onCnt > SW_ONDELAY){
        sw3onCnt = SW_ONDELAY;
      }
    }else{
      sw3onCnt = 0;
    }    
  }else{
    if(digitalRead(SW3) == LOW){
      sw3offCnt++;
      if(sw3offCnt == SW_OFFDELAY){
        //OFF送信
        sendSocket("LED3OFF\r");
        sw3Status = 0;
        sw3onCnt = 0;
      }else if(sw3offCnt > SW_OFFDELAY){
        sw3offCnt = SW_OFFDELAY;
      }
    }else{
      sw3offCnt = 0;
    } 
  }
}

//SW4の処理
int sw4onCnt = 0;
int sw4offCnt = 0;
void sw4process(){
  if(sw4Status == 0){
    if(digitalRead(SW4) == HIGH){
      sw4onCnt++;
      if(sw4onCnt == SW_ONDELAY){
        //ON送信
        sendSocket("LED4ON\r");;
        sw4Status = 1;
        sw4offCnt = 0;
      }else if(sw4onCnt > SW_ONDELAY){
        sw4onCnt = SW_ONDELAY;
      }
    }else{
      sw4onCnt = 0;
    }    
  }else{
    if(digitalRead(SW4) == LOW){
      sw4offCnt++;
      if(sw4offCnt == SW_OFFDELAY){
        //OFF送信
        sendSocket("LED4OFF\r");
        sw4Status = 0;
        sw4onCnt = 0;
      }else if(sw4offCnt > SW_OFFDELAY){
        sw4offCnt = SW_OFFDELAY;
      }
    }else{
      sw4offCnt = 0;
    } 
  }
}


//タイマ割り込み時の処理
void ticker1_interrupt(){
  if(ledStatus == 0){
    digitalWrite(LED, LOW);
  }else if(ledStatus == 1){
    digitalWrite(LED, HIGH);
  }else if(ledStatus == 2){
    digitalWrite(LED, !digitalRead(LED));
  }
}

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

100円ショップのケースとユニバーサル基板の組み合わせが最強

100円ショップのダイソーで買った名刺サイズのケースがユニバーサル基板にぴったり。
ntp_clock01基板はネジなどで固定せずにコードフックのアームを90度くらいに開いて、そこに乗せるようにしました。こちらのコードフックも100円ショップで購入です。サイズはいろいろあるけど、この写真のは16個入りの極小タイプ。
ntp_clock02スポンジのクッションが付いているので大丈夫だとは思いますが、コードフックのベースになっている部分は金属なのでショートしないようになにか巻いておいたほうが安全かもしれません。

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

PICとWROOM-02でNTP機能付き時計を作ってみる

(最初にことわっておきますが、PICからWROOMへATコマンドを送って時刻を取得します。Arduinoでやるやり方ではないです。)

ntp_clock01PICマイコンとESP-WROOM-02で電波時計ならぬ、インターネットへ接続しNTPサーバから時刻を取得し自動で時刻修正する時計を作っていきたいと思います。早い話、電波時計のインターネット版だと思ってください。
夏休みの自由研究なんかにうってつけなんじゃないでしょうか?

概要:
・PICはPIC18F25K22-I/SPを使用
・ESP-WROOM-02は公式のNONOSファーム v1.5.4を使用
・プログラムを作って書込むのはPICだけ
・PICとWROOMの通信はUSARTでATコマンドを使用
・7セグをダイナミック点灯。7セグは秋月の[OSL40391-LG]を使用
・時計用のクロックは32.768kHz水晶発振子を使用
・1日に1回時刻を自動修正
・開発環境はMPLAB X v3.30, xc8 v1.3.7を使用

回路は以下の通り。
PicClock WROOM-02LED用の抵抗値は使用するLEDに合わせて適宜変えてください。

MPLAB X用プロジェクトファイル
ダウンロード:PIC18F25k22_WifiClock160622a.zip

このプログラムの改変は自由に行ってもらっても良いですが、再配布や直リンクは禁止とします。また、営利目的のための使用も禁止します。
このサイトへのリンクは歓迎です。

使い方:
①まずは、プログラムをご自分のWifi環境に書き換えてください。
変更する箇所はmain.cの冒頭のここの部分。
picclock_program書換えたらビルドしてPICに書込んでください。

②初回起動時はSW1またはSW2を押したまま電源を投入するとWifiアクセスポイントへ接続をここみます。LEDが点灯したらSWを離してください。
2回目以降の起動はSWを押しながらでなくても最後に接続したアクセスポイントをWROOMは覚えているので自動で接続します。
(Wifiアクセスポイントの設定は2つ登録でき、SW1を押しながらのときとSW2を押しながらのときで切り替えることが可能)

③LEDが点滅になると時刻を調整している最中です(約1分)。

④約1分後、LEDが消灯すれば調整は成功。LEDが点灯だと失敗です。

通常時のスイッチ操作について
SW1を押すと押している間、時刻表示から秒表示に切り替わります。
時刻表示中にSW2を押すと時刻を1分進めます。長く押すとどんどん進めます。
秒表示中にSW2を押すと現在の時刻のまま秒だけ0秒にします。

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

WROOM-02を最新ファームV1.5.4に更新してみる

前回の記事の通り、WROOM-02に書かれているファームウェアが古かったので新しいものを書き込んでみたいと思います。今回ここで行うのはATコマンドを使えるファームです。

では、最新版をダウンロードします。
(ファームは日々更新されています。さらに新しいバージョンが出ていたら適宜読み替えて行ってください)

●ファームウェアのデータ本体のダウンロード先は
http://www.espressif.com/en/support/download/sdks-demos

WROOM-02 ファーム最新版2016/06/12現在最新のESP8266 NONOS SDK V1.5.4をダウンロードしました。
ちなみにATコマンド対応のファームはNONOSというやつです。
最新版のリリースなどいろいろとフォーラム内でアナウンスされているので、詳しく知りたい人はそちらで確認してください。→ESPRESSIFのフォーラム

●書込みツール「ESP8266 Flash Download Tools v2.4」のダウンロードはココ
http://www.espressif.com/en/support/download/other-tools

firmware02追記:リンク先のサイトが更新されました。「ESP8266 Flash Download Tools v3.3.4」がリリースされたようですが、まだ試していません。

●資料のpdf「ESP8266 AT Instruction Set」もダウンロードしておきましょう
http://www.espressif.com/en/support/download/documents

firmware03↑下線の補足にあるようにダウンロードしたファームウェアバージョンに対応したpdf資料

●回路の修正「IO0をグランドに」
ファームウェアを書き換えるにはIO0をグランド側につなげてあげる必要があります。
パソコン側の接続方法の詳細は前にやったここを参考にしてください。
WROOM-02ファームウェア書換え回路図

“WROOM-02を最新ファームV1.5.4に更新してみる” の続きを読む

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

WROOM-02と通信してみる


前回までで配線はできたので、今回は実際にソフトを使って通信してみます。一番オーソドックスなソフトでやっていきたいと思います。また、当サイトで解説しているのはWindowsでのやり方です。MacやLinuxはわからないのでスミマセン。

まず、通信用ソフトとして「TeraTerm」というフリーソフトをインストールします。
窓の杜 http://forest.watch.impress.co.jp/library/software/utf8teraterm/

teraterm01ここに書いてあるバージョンと違っても、そのときの最新版をダウンロードしてインストールすれば問題ないと思います。今回はv4.91をダウンロードしました。

インストールしてTeraTermを起動します。このときWROOMに3.3Vの電源はまだつなげないでおきます。
teraterm02シリアルのラジオボタンを選択して、接続するポートを選択します。人によってここの表示は違います。我が家の環境では、COM1がデスクトップPCの裏側についているシリアルポート。COM3がサンワサプライのUSBシリアル変換器。COM4がFT232RLのUSBシリアル変換モジュールでした。

teraterm03上部のメニューから設定→端末 を選んで送信コードをCR+LFにしOKを押します。

teraterm04さらに、設定→シリアルポートでボーレートを115200にしてOKを押します。

teraterm05aWROOMに3.3Vの電源をつなげてみます。文字化けした文字が流れ最後にreadyと表示されたら接続は成功です。readyが表示されないときはボーレートが違ってたり、違うCOMポートだったりするので設定を見直してください。

teraterm06aAT+GMR⏎
と入力してみます。するとWROOMに書かれているファームウェアのバージョンが表示されます。

今回の例では
AT version:0.40.0.0
SDK version:1.3.0
で、2015年の8月のバージョンだということがわかりました。
今となっては古いので次回はファームウェアの更新をしてみたいと思います。

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...

WROOM-02とパソコンをつなげてみる

最近はやっているという噂の技適OKな格安WIFIモジュール「ESP-WROOM-02(以下WROOM)」を秋月で買ってみたのでちょこちょことこれについて書いてみたいと思います。

で、今回やってみたかったのはインターネットに接続して自動で時刻修正する7セグ時計です。
電子工作初心者なので成功するかどうかも未知数ですがお付き合いください。

パソコンとWROOMを接続してテストするには次の回路のように接続します。
WROOM-02回路図ざっくり「パソコン側○○へ」と書いてますが、USARTのシリアル通信ができればどんなんでもOKです。あと電源は3.3V 2.0AのACアダプタを使いました。WROOMにGNDピンが3つあるけど、内部でつながっているのでどれか1つで良いのでグランドにつなげてください。

パソコン側はいろんな方法があると思うけど、今回2つの方法で試してみました。どちらも秋月とかで簡単に手に入るので持ってない人は一緒に買うと良いかもです。
①FT232RLを使った仮想USBシリアル通信
②ADM3202ANを使ったRS-232Cレベル変換でシリアル通信

では①の方法で必要なのは
FT232RL USBシリアル変換モジュール
http://akizukidenshi.com/catalog/g/gK-01977/
たぶんこの方法が一番一般的だと思います。接続の回路図はさっきの回路図に追加して書くと次のような感じ。
WROOM-02回路図FT232RLパソコン側はUSBなのでどのパソコンでもOKですし、抵抗とかコンデンサとか使わなくても簡単に接続できるのでおススメです。950円出す価値はあります。ちなみにFT232RLの3V3OUTからUSBのバスパワーを3.3Vに変換した電源がでているから、わざわざACアダプタを使わなくても良いのでは?と思いますが、容量不足でファーム書込み中とかに落ちたりしたら厄介なのでおとなしく最初からACアダプタを使いました。グランドマークは全部同じ電位するためにケーブルやジャンパ線で結線してください。

②の方法で必要なのは
ADM3202AN
http://akizukidenshi.com/catalog/g/gI-03030/
ちょっと古いやり方ですがこちらも問題なくできました。
kairo01こちらも複数あるグランドマークは全部結線してください。
パソコン側はRS-232Cなのでちょっと古めのデスクトップPCを使っている人か、こんなような↓USBシリアル変換器をもっている人用になります。
USBシリアル変換器私はサンワサプライのこれを持っていたので使いました。
あと、RS-232Cの延長ケーブル使う場合はクロスとかストレートとかあるので注意してください。

それでは実際にパソコンを使って通信する方法は次の記事で。

Share on FacebookShare on Google+Tweet about this on Twitter
It's only fair to share...