google-site-verification: google3bd66dd162ef54c7.html

ESP32を動かして消費電流を測定

 前の記事でESP32を動かす準備が出来たので今回は実際に動かしてみます。動かし方にはいろいろあるようですが、一般的な、というか私にはこれしか出来ない Arduino の IDE でやってみます。

▼ESP32
ESP-32

 まずはArduino の IDE にESP32を登録する必要がありますが、その前に、IDE のバージョンを最新版に上げておきます。Arduinoをサポートする組織のゴタゴタがあって先行きが不透明だったので、うちのArduino IDEは1.6.5でバージョンアップを止めていたのですが、問題も片付いたようなので、バージョンアップするにはいい機会でしょう。

 とは言っても、普通にやると前のバージョンが消えてしまうので、後で何か困ることがあるかも知れません。ということで、古いバージョンを残してインストールする方法で最新版のArduino IDEをインストールしました。なお、今回インストールしたバージョンは1.8.3でした。

 バージョンアップした Arduino IDE にESP32を登録してやる必要があります。普通はIDEのボードマネージャから登録するのですが、まだ準備が出来ていないようなので、直接ファイルを追加する方法で登録します

◆ Arduino IDEへのCPUの登録
 先人の方が解説記事をいろいろ書かれているのでそれらを参考に登録作業を行います。
 rukihenaさんの書かれた、ESP32(ESP-WROOM-32)でLチカがたいへん判り易くて参考になりました。ありがとうございました。

 CPUの情報の登録先は、自分が使っているスケッチの保存先のフォルダを使い、以下の画面に示すパスに登録しました。MySchechesV16のフォルダがスケッチの保存先で、そこに \hardware\espressi\esp32 のフォルダを自分で切り、一連のファイルを保存します。

▼ESP32のファイルの登録場所
ESP32のハードウェア情報インストール先
 保存が終わったら \toolsの中のget.exeを実行して追加ファイルの入手を行いますが、そのあたりは参考にさせて頂いたサイトの解説通りです。

 話がちょっと脱線しますが、以前ボードマネージャから登録を行った ESP8266 のファイルの保存先を探してみると、以下の場所に入っていました。(人によって上位のフォルダ名は変わってくると思います)

▼ESP8266が保存されていた場所(参考)
ESP8266のハードウェア情報インストール

 CPUのハードウエア情報は、スケッチの保存フォルダ、ユーザーのアプリケーション情報フォルダ、Arduino IDEのプログラム保存フォルダの3か所があるようです。ライブラリについてもこんな感じだったと思います。(このあたりの情報はあまり自信がありません)

 ともかく設定が済めば Arduino IDE から ESP32 を動かすことが出来るようになります。プログラムの書き込みには、EN(リセット)と IO0 のスイッチを押し、その後ENを離した後、プログラムの書き込みが終わるまで IO0 を押し続ける必要があります。このあたりはちょっと面倒です。

2.WiFi Scan 実行結果
wifi scan
 Wifi Scanを実行した時のコンソール画面です。とは言ってもほとんど伏字になっていてすみません。
 
 ESP32 のプログラムについて語れるレベルにはありませんが、消費電流について、測定結果を少しまとめておきます。

▼電流測定用のゲタ
電流測定ゲタ
 左が、昔作ったATmega328の消費電流測定用のゲタです。1Ωのシャント抵抗が入っているので電流を簡単に測定出来ます。ESP32をATmega328とピンコンパチにしたおかげで、こういう便利な小道具が使えるようになりました。

▼ゲタを履かせる
ゲタを履かせる

▼Arduino (ユニバーサルの) に載せて動かす
消費電流測定
 大した周波数の信号では無いので、ミニオシロ (DSO Shell) が活躍してくれました。

 以下いくつか事例を見ていきます。

▼リセット(EN)からの電流の立ち上がり (WifiScan実行時)
WiFiScan実行の立ち上がり
 シャント抵抗は1Ωなので、50mVは50mAと読み替えることが出来ます。プログラムはExampleに入っていた WiFi Scanが走っています。

 内部回路が順番に活性化されているのでしょうか、段階的に電流が上がって行って、最終的には130mAくらいの消費電流になっています。但しスパイク状に電流が流れていて、ピークは200mAになっています。

 なお、このESP32 には電源端子に470μFを2個取り付けているので外から見たピーク電流は抑えられています。もしこのコンデンサが無かったら、もっと大きなピーク電流が流れたはずです。

▼WiFi Scan 動作中の電流波形
WiFi使用時の電流波形
 拡大して見ると、ピークで200mA程度の電流が流れています。

▼3.3Vの電源電圧ドロップ
3.3Vのドロップ
 140mV程度のドロップが発生しています。まあこれくらいは許容範囲だと思います。ちなみに電源の3.3Vは200mAクラスのLDOな三端子レギュレーターで作っています。

 プログラムを変えていろいろ試したのですが、Lチカだと消費電流は55mA程度でした。

◆ BASICを動かす
 ESP32は IO12 を 3.3V にプルアップして起動すると小さな BASIC が動くのですが、この時の消費電流は約20mAでした。ちなみに ESP32にArduinoのIDEからスケッチを書き込んだ後でも BASICは起動しました。ということは、ESP32を組み込みなどで使う時に IO12に変なレベルが入ると、勝手にBASICが走ることになりかねないので、注意が必要だと思います。たぶんこの機能を無効にする方法はあるのだと思いますが・・・、

▼ESP32のBASICの実行例
ESP32のBASIC
 この BASIC では整数しか扱えないようですが、その上限の値を知りたかったので、簡単なプログラムを書いてみました。結果は上の画面の通りで、プラスマイナス2億くらいの範囲まで扱えるようでした。内部では符号付き32ビットで計算しているのでしょう。

◆まとめ
 ということで、消費電流の話を中心に、ESP32をArduioのIDEから動かした事例の紹介でした。やはりWiFiを使うとかなりの消費電流になるようです。電源容量に制約がある場合はスリープをうまく使う必要があります。
 あと、BTを使った場合はどうなるのか興味深いところです。このあたりは機会があれば実験してみたいと思います。

ESP32をATmega328のソケットで使う

 このあいだ秋月で買ってきた ESP-WROOM-32 (以下、ESP32) を動かしてみたいのですが、ハーフピッチのピンになっているので配線がやっかいです。ハーフピッチのユニバーサル基板を使うか、専用のブレークアウト基板の登場を待つなどの手がありますが、ともかく早いとこ電源を入れてミニマムでいいから機能を試してみたくなります。

 ということでいろいろ考えた結果、ESP32 を ATmega328 のソケットで使えるように配線することにしました。つまり、DIP のソケットで ATmega328 が動いている環境をそのまま使い、そのソケット上で ESP32 を動かしちゃおうという作戦です。但し電源は3.3Vが来ていることが前提です。

▼ESP32 on ATmega328 socket (クリックで別窓に拡大)
ESP32をATmega328ソケットに変換する回路図
 ESP32 を動かすのに必要な電源とシリアルと、書き込みのために必要なスイッチだけ配線してあります。あと、Arduino UNO の伝統に従い IO13 を接続しておきます。こうしておくと Lチカがデフォルトの設定で動くはずです。R2 , R3 は安全のために入れました。C1 ,C2 は ESP32 の電源安定化用です。

 この回路図はミニマムの線だけ接続しているので、後は必要になった配線を追加していく予定です。なお、ATmega328(DIP版)は28ピンしか無いので、ESP32 の全てのピンを引き出すことは出来ません。でも、ATmega328 というか Arduino UNO を使っていてピン数が足りなくて困ったことはほとんど無いので、この方法でもけっこういける気がします。

▼組み立て、配線完了
ESP32 to ATmega328

ESP32 to ATmega328
 丸ピンのピンヘッダと両面スルホールのユニバーサル基板を使って組み上げました。ESP32 の側面のパッドは剥がれ易いので、大きな力が加わらないように注意して配線した方がいいでしょう。GNDのすずメッキ線以外はΦ0.26の被覆線を使っています。

▼新しい兄弟誕生
ESP32とATmega328
 手前の二つはATmega328 で奥はESP32。電源電圧は3.3V限定になりますが、同じソケットで動く兄弟の誕生です。しかしこの弟はとんでもないモンスターで、ATmega328の皮をかぶった狼です。

▼「ユニバーサルの」に搭載
ユニバーサルーのにESP32を搭載
 Arduinoの互換ボードに挿せば、シリアルの配線などをそのまま利用できます。カッコウのヒナが巣を乗っ取ったような状態です。

 こんなふうに ATmega328が刺さっていたソケットで ESP32を使うことが今回のアダプタ製作の狙いです。一つ残念なのは、シールドを上に重ねることが出来ないことです。

▼ブレッドボードに挿してみる
ESP32をブレッドボードで使う
 僅かなフットプリントしか消費しないので使い易いと思います。

 ここまでくれば動作確認することが出来ます。電源を入れるとシリアルターミナル(TeraTerm)に以下のようなメッセージが流れました。

▼ESP32のブートメッセージ(一部)
ESP32ブートメッセージ
 エスケープシーケンスが入っているのでしょう、カラーでかっこいい画面が出てきました。

◆まとめ
 ということでハードウエアの準備は完了です。次回はArduino IDE から動かしてみます。こっちは先人の方がやられた情報がいろいろ公開されているので、割と簡単に行くはずです。

 なお、今回紹介した方法はちょっと強引なので万人にお勧め出来るものではありません。それに、はんだ付けのスキルもある程度必要です。まあ、こんな方法もあるよくらいの感じで、一つの事例として見て頂ければと思います。

ESP8266のアナログリードで嵌る

 久しぶりの更新です。実は、以前に、ESP8266のアナログポートの挙動がおかしい、という記事を書いたのですが、この問題を何とか解決出来ないかいろいろ試していたのですが、どうしてもうまくいかなくて時間だけ経ってしまいました。

 このまま続けても解決出来そうに無い感じなので、ここまでにやってみたことを書いておこうと思います。まあ、頭の整理をしつつ自分へのメモ代わりを兼ねています。

 問題になっている環境は、ESP-WROOM-02 (ESP8266) を Arduino の IDE(1.6.5)で実行した場合で、現象としてはsystem_adc_read(); を高速で繰り返し呼ぶと実行時間が短くなることがあるというものです。ちゃんとAD変換やった結果ならそれでもいいのですが、どうもAD変換を実際にやらないで、単に以前の値を返してきている疑いがあります。

 詳しい現象は以前の記事を見ていただくとして、おっと今回試したのは以前の記事の最後に書いた for ループで回数を指定してAD変換を実行させた場合の話です。

 以下のようなプログラムでテストしました。AD変換がうまくいかない現象の対策として、割り込みを禁止したり、タイミングを調整したりいろいろやったのですが、全部ダメでした。コメントに 対策・・・・ と書いてあるのが試した内容の痕跡です。

◆テストプログラム
/* ESP8622-WROOM-02
* アナログデーターを高速で連続読み取りするテスト
* 2016/10/30 ラジオペンチ
* 最初は良いが、15から35回くらい繰り返すとAD変換しないで
* 値を返してくる場合がある。(実行時間が短い)
*
*/
int dataNN = 0;
int dataN, AdcData;
long SumAdc, SumAdc2;
unsigned long TimeStart, TimeElapsed;

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

void setup() {
// noInterrupts(); // 対策テスト、割り込み禁止
Serial.begin(115200);
pinMode(13, OUTPUT); // 観察用ポート
loops(); // 自前のloopで実行
}

void loops() { // loop()では無い場所でループ
for (;;) {
dataN = 0; SumAdc = 0; SumAdc2 = 0; // 変数初期化
dataNN++;
digitalWrite(13, HIGH);
//system_timer_reinit(); // ダメ対策 タイマー初期化
wdt_disable(); // ダメ対策 WDT禁止
TimeStart = micros();
for (int i = 0; i < 1058; i++) { // 約100msのループを実行
// __asm__ __volatile__ ("nop"); // 対策 nopでタイミング調整
// __asm__ __volatile__ ("nop");
noInterrupts(); // 対策 割り込み禁止
delayMicroseconds(100); // 対策 delayMicrosecondsでタイミング調整
AdcData = system_adc_read(); // アナログ電圧読み出し
// AdcData = 700; // 固定値代入テスト
// Interrupts(); // 対策 でもこんな関数無かった
// __asm__ __volatile__ ("nop");
// __asm__ __volatile__ ("nop");

SumAdc = SumAdc + AdcData; // ΣXi
SumAdc2 = SumAdc2 + AdcData * AdcData; // ΣXi^2
dataN++; //
}
TimeElapsed = micros() - TimeStart; // ループ通過時間を求める
delay(10); // 対策 シリアル出力前にちょっと待つ
digitalWrite(13, LOW);
Serial.print(dataNN); Serial.print(", "); // 平均値
Serial.print(SumAdc / dataN); Serial.print(", "); // 平均値
Serial.print(sqrt(SumAdc2 / dataN)); Serial.print(", "); // 実効値
Serial.print(TimeElapsed); Serial.print(", "); // 測定時間
Serial.println(dataN); // ループ回数

delay(400); // 適当に待つ
}
}

void loop() {
delay(1); // 対策 意味の無いdelay
}

 どうやってもリセット後ある程度の時間経過後、具体的には数秒以上経つとAD変換の実行時間が短い場合が発生します。裏にデーモンのようなプロセスが走っていてそいつが悪さをしている気がします。

 この現象の対策につきいろいろ検索しているのですが、うまい情報がヒットしません。system_adc_read() の中で何をやっているのか調べた方が早いのかも知れません。

 あるいは、いつまでもやっていてもダメそうなので、外付けのADCを使った方が早道なのかも知れません。んと、これは7月頃に考えていた話で、ちっとも進歩してません。トホ、
カレンダー
04 | 2017/05 | 06
- 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コード