ESP32 を使って LC共振回路の理解を深め、電波時計をガッツリ合わせてみる実験

ESP32 ( ESP-WROOM-32 )

Arduino – ESP32 を予めインストールしておく

パソコンに Arduino IDE をインストールしておいてください。
ver 1.8.8 で動作確認しております。

Arduino core for the ESP32 は stable 版 1.0.1 で動作確認しておりますので、それもインストールしておいてください。
インストール方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

Arduino 標準 Time ライブラリをインストールしておく

Arduino IDE に Time ライブラリをインストールしておいてください。
GitHub の以下のリンクにあります。

https://github.com/PaulStoffregen/Time

ZIP ファイルをダウンロードして、インストールしてください。
ZIP形式ファイルのまま Arduino IDE にインストールする方法は以下の記事を参照してください。

GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

共振回路を理論通りに作ってみる

まずは、とにかく共振回路を作っちゃいます。

インダクターとコンデンサで並列共振回路を構成します。
インダクタンスの値とコンデンサ容量値は、ネット上に沢山計算ツールがありますが、私自身も自分だけが使いやすいようにJavaScriptで作って、このブログ上に公開してみました。

LC 共振回路計算ツール

私は手持ちのパーツで、インダクタンスが 100uF のマイクロインダクターがありましたので、それ、それを固定とします。
電波時計の搬送波が 40kHz なので、共振周波数 40kHz と入力してツールで計算して、コンデンサ容量値を決定します。

すると、

f = 40000 Hz
L = 100 × 10の-6乗 = 100e-6

と入力して計算させると

C  =  1.5831435484225622e-7  F

と表示されます。
つまり、
1.58×10の-7乗 = 0.158uF = 158nF

となります。
この近辺ならば、私の手持ちの積層セラミックコンデンサで何とか構成できそうです。

コンデンサは低ESRで高周波特性の良いセラミックコンデンサが適しています。
結果、下図のようになりました。

コンデンサは並列と直列を組み合わせて、0.158uF に近づけました。
交流のコンデンサの容量の測定は LCRインピーダンスメーター を使わないと正しい値は測定できません。
私は長年愛用のインピーダンスメーター ( LCRメーター ) キーサイト U1733C があります。

40kHz レンジが無かったので、10kHz レンジでコンデンサ容量を測定しました。
実測値は下図の様でした。

実測値は
C = 157nF = 0.157uF
でした。

また、インダクターの実測値は以下でした。

10kHz で測定すると約 98uH でした。

この値で再度、LC 共振回路計算ツールで計算してみると、

f  =  40575  Hz

となりました。

ヨシ!

そこそこ理想的な値が出ました。
これで実際に回路を組んでみたいと思います。

マイコンを故障させる恐れのあるダメ回路で、敢えて共振回路の挙動を見てみる

では、上記の回路に ESP32 の GPIO からパルス電圧をかけたらどんな挙動になってしまうのか見てみたいと思います。
そこで、絶対にやってはいけないと思われる回路を敢えて組んで、ESP32 マイコンが故障するかもしれないことを覚悟で見てみたいと思います。

プロの方々からは突っ込まれそうな回路を以下のように故意に組んでみて、オシロスコープで波形を見てみます。

そして、GPIO #17 を HIGH → LOW を切り替えるプログラム(スケッチ)をArduino IDE に入力します。
delay(1) を入れて、1ms 毎に切り替えます。

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

const int gpio = 17;

void setup() {
  Serial.begin(115200);
  Serial.println();
  pinMode(gpio, OUTPUT);
  digitalWrite(gpio, LOW);
  Serial.println("Start!!!");
  delay(10000);
  digitalWrite(gpio, HIGH);
}

void loop() {
  delay(1);
  digitalWrite(gpio, LOW);
  delay(1);
  digitalWrite(gpio, HIGH);
}

setup関数内で、マイコンを起動させてから、10秒間 LOWレベルになるので、その間にオシロスコープ測定開始させ、電圧がHIGHレベルに上がってトリガーがかかるのを待ちます。

すると、下図の様な結果になります。
まずは、GPIO が LOWレベルから3.3Vの HIGHレベルに切り替わる瞬間を見てみます。

こんな感じで、サイン波の様な波形が出て、時間と共に減衰しています。

この間、GPIOの出力はHIGHレベルです。

ここがポイントです!!!
3.3V の電圧がかかっているにも関わらず、振動して、GNDレベル以下の負電圧がかかってしまっています。
(このことは、後で述べる共振回路のひらめきにもなりました。)

これでは、ESP32 マイコンのGPIOの負電圧の絶対定格値を超えてしまう可能性があります
-0.48V も下がっています。

では、3.3VのHIGHレベルから0VのLOWレベルに切り替わった瞬間の波形は以下のようになりました。

HIGHレベルが長く続くと、回路のコードやパーツの銅線の抵抗熱等でエネルギーが失われて、減衰していき、交流波形は消えていきます。
すると、直流状態になって、インダクターやコイルは機能せず、単なる短絡状態となって、インダクターの持つ抵抗値だけの電圧降下だけになります。
100uH のインダクターの直流抵抗値は 3Ω 程の微々たるものです。
殆ど短絡状態ですね。
GPIO から3.3V供給しているのに、ほぼ短絡状態なので、上図のように0.18Vほどしかありません。
電流に換算すると、何と約60mA も流れています。
GPIO の絶対定格値を超えてしまっている可能性がありますね。

こんな状態でも、GPIO をHIGH からLOWレベルに切り替えると、それだけでも上図のようにインダクターから逆起電力が生じて、-0.54V まで下がってしまいます。
LOWレベルからHIGHレベルに変化する時よりも、エネルギーが小さいからでしょうか、減衰も速いですね。

こんな感じで、インダクターはコイルですから、電圧が急激に変化して、コイルに流れている電流が急激に変化しようとする時、電流が変化しないように妨げるための逆起電力が発生します。
その為マイナス電圧まで下がってしまうものと思います。
マイナスに振れている間は順方向に電流が流れ続けますから・・・。
これはコイルの独特の挙動ですね。
これはほんとに不思議な現象で、とっても魅力的ではあります。
ですが、このおかげで、マイコンやパーツを壊してしまうかもしれないので、私はちょっと前までは大の苦手なパーツで、長年、あえて使うのを避けていました。

特にモーターやソレノイド、リレーなどは、めちゃめちゃ起電力が発生するコイルなので、保護回路を作るのは大変だろうなぁと思いますね。

では、次では共振回路から保護する回路を紹介します。

コメント

  1. てる より:

    mgo-tecさま始めまして。
    あなたさまのHP楽しく拝見させていただいております。
    此処に有る電波時計のサーバーを作ってみました、動作はするのですがシリアルモニタのTotal 時間が 60000 msの所が上 60008 ms 下が 59994 ms と一寸バラツキが大きいように思っております。
    後は、特に問題なく時間もピッタリと会っております、ここだけの問題ですが気にしなければ特に問題はないのですが製作上何か何かまずいところがあったのでしょうか、ちょっと気になっております。
    Amazonの1,250円の安いwaves ESP32を使ってせいでしょうか?。

    • mgo-tec mgo-tec より:

      てるさん

      はじめまして。
      記事をご覧いただき、そして実際に作って頂きありがとうございます。
      別の記事で同じようなコメント投稿があったのですが、こちらで回答させていただきます。

      かなり昔に作った記事ですので、うろ覚えの記憶をたどってお答えしますが、トータル60000msのバラつきは必ず出ますので、ハードの不良ではありません。
      そもそも、この記事のプログラムでは、パルスの精度が悪く、CPUクロックカウントも誤差があり、しかもESP32のシステム関連の割り込みなどがあって、60000msピッタリとはいきません。
      ですから、しばらく動かしていていて、時刻と大幅にズレて来た場合、現行時刻の00秒に合わせるために1分少々動作がストップするようにプログラミングしています。
      なお、この記事内でも案内していますが、LEDCライブラリを使って出力パルスの精度を大幅に上げることができます。
      それは、この記事を作ってしばらく後でわかったことです。
      以下の記事を参照してみてください。

      ●https://www.mgo-tec.com/blog-entry-ledc-pwm-arduino-esp32.html

      ●https://www.mgo-tec.com/blog-entry-m5stack-jjy-watch-yhaoo-news.html

  2. てる より:

    mgo-tecさま、ご返答ありがとうございました。
    コメントをする時に、コメント送信ボタンを押すと、パ!と全て消えてしまうので送れていないと勘違いて何度か同じコメントを送ってしまったらしいです、お詫び申し上げます。
    LEDCライブラリを使って出力パルスの精度を上げてみたいと思っております、ありがとうございました。

    • mgo-tec mgo-tec より:

      そうなんですよね~。
      WordPressのブログでは、コメント投稿送信はそうなってしまうんです。

      LEDCライブラリはお勧めですよ~。
      (^^)

  3. てる より:

    それと
    3番目のセラミックコンデンサの乗数が1μFのが0.01μになっておりました。
    先に連絡すればよかったのですが、遅れて申し訳ありません。

    • mgo-tec mgo-tec より:

      おー!
      この記事は3年半以上前の記事ですが、気付きませんでした。
      早速修正しました~。
      ご連絡、ありがとうございました。
      m(_ _)m

  4. てる より:

    お忙しい中大変申し訳ありませんが又質問させていただきたくお願いいたします。
    時計サーバーですが、良くしようと色々といじくりまわしておりましたが、
    「task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:」と出て途切れ途切れになってしましました、サーバーの役目をしなく成ってしまいました、何が原因なのかわかりません、このような症状出たことありませんでしょうか。
    暇なときにでも、わかる範囲で宜しいのでお教えいただければと思っております。
    本当に暇な時で宜しいです。

    • mgo-tec mgo-tec より:

      私もウォッチドックタイマに関しては詳しくないのですが、当ブログで何回か扱ったので検索して参照してみてください。
      例えば、以下の記事を参照してみてください。
      https://www.mgo-tec.com/blog-entry-trouble-shooting-esp32-wroom.html/4
      ウォッチドッグタイマの自動リセット?が機能しなかったかもです。

      • てる より:

        ご回答ありがとうございます。

        >WiFiClientSecure ライブラリを使って

        とありましたので、プログラムには全く駄目な僕ですが、スケッチを下記のようにしてみました

        1://#include
        2:#include //安定化させる、てるが追加
        3:#include
        4:#include //Arduino time library ver1.5-

        今のところ非常に安定しています。

        もうこれ以上は、いじらない様にしたいと思います。

        ありがとうございました。

        http://monsirochou.blog.fc2.com/

  5. てる より:

    おはようございます。

    includenoの中身が記入されていないみたいですが、この様に送らておりましたか?。

    • mgo-tec mgo-tec より:

      実は、コメント投稿欄では半角の括弧<>以降は削除されてしまうんです。
      一般的なブログの場合、多くがそうだと思われます。
      私の場合、WordPressでブログを作成しているので、仕方のないところです。
      括弧だけ全角で投稿してみてください。
      例えばこんな感じです。
      #include<ESP32_lib.h>

タイトルとURLをコピーしました