ラベル ESPr の投稿を表示しています。 すべての投稿を表示
ラベル ESPr の投稿を表示しています。 すべての投稿を表示

2017年4月22日土曜日

ESP8266でデータロガー(UDP Client)

Switch ScienceのESPr Developperを使えばブレッドボードで即席ロガーが作れる。
左真ん中に繋がっている汚い線が秋月のドア開閉センサで、
左上のICが温度センサのLM61。


ESPr Developperは大事な端子が片側に集まっているので、凝ったことをしなければ小さいブレッドボードで十分。
左側には3.3Vがないので、2つのDiodeで5V⇒4.2V⇒3.4Vを作成。

・ケース入りリードスイッチ
 http://akizukidenshi.com/catalog/g/gP-04025/
・LM61BIZ(4個入りのほうがオススメ)
 http://akizukidenshi.com/catalog/g/gI-09691/

センサデータは、UDPを使ってRasPiで動くRubyのサーバアプリに送信、テキストに直接保存する。


■温度センサ
LM61はリニアな電圧で温度が測れる便利なICで、LM35と違って負電圧にならないので使いやすい。

↓データシートのTyp値。
温度電圧
+100℃+1600mV
+85℃+1450mV
+25℃+850mV
0℃+600mV
-25℃+350mV
-35℃+300mV

式を整理すると、次のようになる。
 <温度>[℃] = (<電圧>[V] - 0.6)×0.1

ESP8266のHTTP Clientと割り込み(Ticker, Timer)でハマる。

ESPr Developer / ESP8266 / ESP-WROOM-02でThingSpeakにデータ送信。
ThingSpeakは15秒の制限があるので、30秒周期でデータを送ることに。

自然な発想でTimerを仕込むが、何故かうまく通信できない。
UDPならうまく行ったのに何故??

参考にしたのは以下のサイト。
 http://www.esp8266.com/viewtopic.php?p=62981

// ソースはこんな感じ
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Ticker.h>
extern "C" {
  #include "user_interface.h"
}

const char* SSID = "<SSID>", PASS= "<PASS>";
Ticker tic1;
void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  IPAddress myIP = WiFi.localIP();
  tic1.attach_ms(30 * 1000, tic1_loop); // 30秒に1回、tic1_loopを実行
}

void sendMessage(String buf) {
  HTTPClient http;
  String url = "http://api.thingspeak.com/update?key=";
  String key = <ThingSpeak API KEY>;
  http.begin(url + key + buf);
  int httpCode = http.GET();
  if(httpCode) {
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);
      if(httpCode == 200) {
          String payload = http.getString();
          Serial.println(payload);
      }
  } else {
      Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
  }
  http.end();
}

void tic1_loop(){
  sendMessage(<センサデータ>);
}
void loop{}


いろいろ試行錯誤して気づいたのだが、HTTPClientも割り込みを使うので割り込みの中では使えない。
検証は以下の通り。
1)sendMessage()を単体で呼ぶ ⇒OK
2)loop内でdelayでsendMessage()を何度も動かす ⇒OK
3)Timer割り込みでsendMessage()を何度も動かす ⇒NG

noInterrupts()なのが問題なのでinterrupts()を明示的に呼び出せばHTTPClientも動くはずだが、今回はシンプルにフラグ処理で逃げることにした。


char flag = 0;void interruptFunc(){
  flag = 1;
}

void loop{
  if(flag){
    sendMessage(<センサデータ>);
    flag = 0;
  }
}

これでOKだった。
ESP8266は1か月以上動かしているけど、元気に温度とドアの開閉を記録してくれている。


2017年2月25日土曜日

無線LANマイコンの決定版 ESP-WROOM-02 / ESP8266(1/2)

遅ればせながら、無線LANマイコンを使ってみた。
ArduinoのIDEで開発できるところが素晴らしい。
簡単に無線LANに接続し、マイコン⇒Raspberry PiへUDPのデータ送信ができた。
こんな強力なデバイスを個人が数百円で買えるなんてすごい時代だ。

本稿では、幾つかハマったところを中心に記録します。

<前半>
①買い物
②基板概要
③ATコマンド実行
④ファームウェア焼き直し

<後半:次記事へ>
⑤Arduino環境構築
⑥UDPクライアント
⑦UDPサーバ(Raspberry Pi+Ruby)

#####################

①買い物
スイッチサイエンスか、秋月でESP8266でググればOK。
自前でピッチ変換やUSB⇔シリアル変換やスイッチ実装できるなら、秋月だと割安。
(狭ピッチのマイコンのみで550円、ピッチ変換実装済で650円くらい)

スイッチサイエンスは秋月よりは高いが、開発ボードが優れている。
オススメは「ESPr Developer」で、必要なスイッチや抵抗やUSB⇔シリアル変換も実装済。
2017/2月時点で2,160円だが、お金や小型実装に拘らないならこれ一択。
少なくともH/Wでは困らないので、時間短縮できる。


②基板概略
・3.3V動作
・IEEE802.11a/b/g対応、技適OK!(日本国内で無線LANが合法利用できる)
・32bitマイコン(非ARM)
・UART/I2C/SPI等対応
・10bit ADC 1ch
・GPIO 9ch

ATコマンドだけで無線接続を構成できるので、親機Arduino+無線機ESP8266という構成も見かける。
これはESPのRAMを書き換えると技適に反する懸念があったためで、今は問題ない事を先人が確認してくれている。
スイッチサイエンス社の当該記事

ESP8266のIOで十分なら、わざわざ外部ボードを繋がなくてもよい。
もしくは、ESP8266を親とし、I2Cで周辺機器を繋げばよい。


③ATコマンド
ESP8266は、通常起動させるとシリアルでATコマンドを受け付けるモードになる。
Arduino IDEで書き込んで単体で動かすなら不要だが、初期不良のチェックも兼ねて一度はATコマンドで無線LANに繋いでおくほうがよい。

不用意にコマンドを打つと、シリアルで繋げなくなるので要注意。
どんな効力を持つコマンドかよく調べてから実行しないと危険。
そのときは④のファーム焼き直しへ。

シリアル設定は以下の通り。
・115200bps (最初のMessageは74800で送ってくるが、無視してよい)
・8bit
・パリティなし
・Stop bit = 1bit
・フロー制御なし

ESPr DeveloperならUSBでそのまま繋げる。
Arduino IDEのシリアルモニタを使うと楽。
うまくいかないときは、電源を指し直すかRESETスイッチを押すとよい。

ATのみもしくはAT+<COMMAND>という形式で制御する。

(1) AT
動作確認用。うまく認識できていれば、OKを返す。

(2) AT+GMR
バージョン確認。
当方の環境では以下の通りだった。
 AT version:1.3.0.0(Jul 14 2016 18:54:01)
 SDK version:2.0.0(656edbf)
 compile time:Jul 19 2016 18:44:22
 OK

(3) AT+CWMODE=1
無線LANのモードをクライアントにする。
これをやらないとAP設定受け付けない。
2にすると、APになる様子。


(4) AT+CWJAP=<SSID>,<PASSWORD>
無線LANのAP設定を書き込む。


(5) AT+CIFSR
今のIP等の設定を確認する。上のCWJAPがうまくできており、接続したAPでDHCPが動いていればIPが表示される。


検証のみなら(1)~(5)で事足りると思う。
他の機能が使いたければ、「ATコマンド」で調べるとよい。


④ファーム焼き直し
ここまでは順調だったが、以下のATコマンドを打ったらシリアルがうまくつながらなくなった。
・AT+UART_DEF=9600,8,1,0,0

以下のサイトを参考にし、ファームを元に戻せば復活した。
http://nemuisan.blog.bai.ne.jp/?eid=215341

ファームの書き込みは、ボードをSPI書き込みモードにする事で実行できる。
ESPr DeveloperならFLASHを押しながらリセットするとSPI書き込みモードになる
書き込みが始まるまではSWを押し続けないといけない。


続きは別投稿とします。


<以下、メモ>
Arduinoを対応させる
http://qiita.com/dz_/items/eb7c80d3caf4a5c84274

Arduino
最新の1.8.1をccから導入
zipがよい
http://arduino.esp8266.com/stable/package_esp8266com_index.json