google-site-verification: google3bd66dd162ef54c7.html

ESP-WROOM-02のアナログポートの挙動がおかしい

 ESP-WROOM-02(ESP8266)を使った消費電力ロガーを作ってみたくなったので、基本的な実験を開始しました。でもかなり難航しているのですが、とりあえずここまでで判ったことをまとめておきます。

作りたい物は、以前冷蔵庫の消費電力をロギングするためにArduino UNOで使った物と同じような物です。詳しく説明すると長くなってしまいますが、要はオペアンプなどは使わない最小限の回路で、ソフトの工夫で電力を測定しようという物です。とは言ってもカレントトランスは必要です。

 以前作った物は測定結果をCPU内のEEPROMに保存していたため、長時間の連続記録が出来ないという大きな欠点がありました。その点、ESP8266ならデーターをWiFi経由でサーバーに投げてしまえばいいので、容量の制約は無くなります。

 ちなみにこんな部品です。

▼ESP-WROOM-02 (ESP8266)
ESP-WROOM-02

▼実験用の回路
回路図
 ESP8266のアナログ入力は16PinのTOUTだけです。この回路図ではCDSが接続されていますが、最終的にはこのピンにカレントトランスの信号を接続します。そういう配線をする前に、まずはESP8266が想定した動きをするかどうかを確認しておく必要があります。

 ところがやってみると、Arduino UNOでは出来ていたことが、ESP8266では出来ない時があることに気付きました。

◆高速(160μs)タイマー割り込み、失敗
 先ずやりたかったのは、以前Arduino UNOでやったように、160μs間隔でタイマー割り込み掛けて1250回ADコンバーターの値を読むことです。こうすると50/60Hzのどちらでも整数倍の周期で均等にサンプリングが出来ます。ただ、こういう速度で割り込みを掛ける方法がよく判りませんでした。

 ならばということで、

◆割り込みで積分時間指定方式も失敗
 一歩譲って、Ticker割り込みで100msの間 ADコンバーターの値を読み続ける方法を試しました。Tickerは1ms単位で割り込み間隔が指定出来るので、100msを指定することは可能です。
 ADコンバーターは100μs以下くらいの周期で動くので、十分なサンプル数が確保できるはずです。ただこの方式では、サイクル内のデーター数が一意的に決まらなくなりますが、ソフトでカウントしておいて後で補正すれば問題無いはずです。

 ところが、これうまく動きませんでした。割り込み処理ルーチンでフラグを立てて、メインルーチンでそのフラグを見て処理を止める、つまりwhile(flag)という感じのプログラムにしたのですがダメでした。ループ内で高速で何度もADCを読み出すと、whileの条件処理にひっかからなくなって無限ループに落ち込む感じでした。(実際にはウォチドッグタイマー割り込みでリセットされる)

◆forループの回数で時間指定
 いろいろやったのですが、ラチが空かないので最後の手段です。forループを回す回数を調整して100msの時間を作ってみました。この方法はハードやソフトの違いで時間が変わる可能性が大きい、つまり筋の悪い手なのでやりたくないのですが、、

▼動作確認用スケッチ
/* ESP8622-WROOM-02
* アナログデーターを高速で連続読み取りするテスト
* 2016/7/18 ラジオペンチ
*/

int dataN, AdcData;
long SumAdc, SumAdc2;
long TimeStart,TimeElapsed;

//ESP-WROOM-02でアナログ入力をするための設定
extern "C" { // ADCを使うためのおまじない
#include "user_interface.h"
}

void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT); // 観察用ポート
}

void loop() {
dataN = 0; SumAdc = 0; SumAdc2 = 0; // 変数初期化
digitalWrite(13, HIGH);
TimeStart = micros();
for (int i = 0; i < 1058; i++) { // 約100msのループを実行
AdcData = system_adc_read(); // アナログ電圧読み出し
SumAdc = SumAdc + AdcData; // ΣXi
SumAdc2 = SumAdc2 + AdcData * AdcData; // ΣXi^2
dataN++; //
}
TimeElapsed = micros()- TimeStart; // ループ通過時間を求める
digitalWrite(13, LOW);
Serial.print(SumAdc / dataN); Serial.print(", "); // 平均値
Serial.print(sqrt(SumAdc2 / dataN)); Serial.print(", "); // 実効値
Serial.println(TimeElapsed); // 測定時間
delay(400); // 適当に待つ
}
 データーの平均値や実効値を計算しているのでごちゃごちゃしています。

ところがこれでもダメです

▼実行結果(シリアルモニタ)
323, 323.44, 100270
323, 323.01, 100336
320, 320.39, 100231
319, 319.62, 100206
321, 321.03, 100207
324, 325.00, 100227
325, 325.25, 100104
325, 325.30, 100216
324, 324.90, 100045
324, 324.78, 100400
324, 324.77, 100167
324, 324.84, 100200
324, 324.90, 100227
324, 324.95, 100203
324, 324.90, 99953 ←なぜか少し短い
325, 325.00, 100143
324, 324.97, 100216
324, 324.85, 100164
324, 324.86, 100214
324, 324.90, 100215
325, 325.12, 100227
325, 325.36, 100203
325, 325.48, 100230
325, 325.49, 100203
325, 325.53, 100298
325, 325.55, 100194
325, 325.56, 100286
325, 325.57, 100264
325, 325.63, 100200
334, 334.28, 42653  ←異常に小さい
325, 325.68, 100160
334, 334.37, 42664  ←異常に小さい
325, 325.79, 100314
334, 334.51, 42661  ←異常に小さい
325, 325.83, 100337
325, 325.91, 100332
 一行の最後にforループを通過する時間(μs単位)を出力させています。普通は約100000μsつまり、100msくらいの時間になっているのですが、時々42.6msくらいになっています。こんなに測定時間に違いがあるはずは無いので何かおかしなことが起きているようです。なお、漢字のコメントは後で書き込んだものです。

 電力測定を行うためには、一定の時間の間にサンプリングしないといけないので、これではダメです。

 ただ、ソフト的にこう見えているだけの可能性があるので、ロジアナで見てみました。

ロジックアナライザで見てみた
ロジアナで観察
 状態観察用のPin13の波形です。パルス幅(測定時間)が小さい場合があるので、やはりこれではダメです。

◆まとめ
 ということで、いろいろやったけどうまくいきませんでしたという面白くない話になりました。

 ちなみに、リセット直後の30回くらいまではうまくいきます。また、たぶんこんなに高速で何度も繰り返して動かさなければ問題は顕在化しなかったような気がします。実は電源のノイズ、あるいは熱的な問題を疑ったのですが、いろいろ調べてみるとその可能性は低そうです。この問題の原因は、ESP8266のADCのプログラムに問題があるような気がしますが定かではありません。

 あと、この調査ははっきり言って疲れました。だってソフトが思った通りに動かないので、まずは自分のコーディングが悪いと疑うわけです。「ソフトが思い通りに動かないのではなく、ソフトはあなたが書いた通りにしか動かない。」という名言はほとんどの場合正しいと思っていました。
 しかし条件を変えていろいろ調べてみると、どうもESP8266が仕様通りに動いてないらしいと判ってきました。これ、何とも後味の悪い結果です。

 それで、電力ロガーをどうするかですが、内臓のADコンバーターを使うとうまくいきそうにありません。ならば、I2Cインターフェースの外付けADCを使うしかないかな、と思っています。これはこれで面白そうなのですが、そのためには部品集めから始めないといけません。 
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード