- ESP32パワーメーターに必要な材料
- ArduinoおよびESP32ベースの効率メーター-回路図
- ArduinoおよびESP32ベースの効率メーターのPCB設計
- ArduinoおよびESP32ベースの効率メーター-コード
- ArduinoおよびESP32ベースの効率メーターのテスト
- さらなる機能強化
私たちは皆、基本的な電圧計、電流計、電力計を知っています。これらは、電子プロジェクトや回路の値を測定するために必要な3つの基本的なものです。マルチメータを使用して電圧と電流を測定することから始めるのは良い方法ですが、回路のテスト中に直面する最大の問題の1つは、 電力効率の測定です。そこで、今日は、入力電圧、入力電流、出力電圧、出力電流を測定できるArduinoおよびESP32ベースの効率メーターを構築することでこの問題を解決し ます。 したがって、入力電力と出力電力を同時に測定でき、これらの値を使用して効率を簡単に測定できます。以前、Arduinoベースの電力計プロジェクトでも非常に似たようなことをしましたが、ここでは入力電力と出力電力の両方を測定します。 電力効率を計算します。
仕事のために4メートルを購入するのではなく、4メートルすべての機能を1つに組み込むことでこの問題を解決することができます。デジタルメーターを構築すると、コストが削減されるだけでなく、アップグレードや改善の余地が生まれます。このプロジェクトの構築にはESP32を使用しているため、このメーターをIoT対応にし、将来のプロジェクトのトピックであるWeb経由でデータをログに記録することが簡単にできます。すべての基本をクリアしたので、すぐに始めましょう。
注:この電力計は、DC回路用に設計されています。計算されたAC電力効率に対するAC電流の測定を検討している場合は、IoTベースの電力エネルギーメーターおよびプリペイドエネルギーメータープロジェクトを確認できます。
ESP32パワーメーターに必要な材料
下の画像は、回路の構築に使用された材料を示しています。これは非常に一般的なコンポーネントで作られているので、地元のホビーショップでリストされているすべての資料を見つけることができるはずです。
また、必要な数量とともに以下のコンポーネントをリストしました。自分で回路を構築する場合は、以下のリストからすべての資料を入手することを強くお勧めします。
- ESP32ボード-1
- 128X64OLED-1
- ACS712-20 IC-2
- DCバレルジャック-1
- 100uFコンデンサ-2
- 104pF-2
- 102pF-2
- 10K、1%-4
- 68K、1%-2
- 6.8K、1%-2
ArduinoおよびESP32ベースの効率メーター-回路図
ArduinoおよびESP32ベースの効率メーターの回路図を 以下に示します。この回路の作成は非常に簡単で、一般的なコンポーネントを使用します。
回路の操作は非常に簡単です。このプロジェクトでは、独自の方法で電圧と電流を測定します。入力と出力の両方の電圧と電流を測定しているので、回路の効率を確認できます。これは、一部のプロジェクトで非常に役立ちます。例として、効率測定が必須となるDC-DCコンバータがあります。これらの回路が機能する方法を以下に説明します。
ACS712電流センサーIC:
上の写真でわかるように、 ACS712電流センサーIC を使用して電流を測定しています。これは、ホール効果 を使用して電流を測定するため、非常に興味深いIC です。このICには、市場f(または5A、20A、および30A)にある3つのバリエーションがあります。これの20Aバリアントを使用しており、ACS712-20というラベルが付いています。
ACS712のデータシートでは、スムーズに動作するために4.5〜5.5の電圧範囲を推奨しています。また、ESP32で電流を測定するため、許容誤差はわずか3.3Vです。そのため、ACS712ICの出力電圧を下げるために2つの10K抵抗を備えた分圧器を使用しました。ICに電流が流れていないときは2.5Vを出力し、ICにある程度の電流が流れると電流の流れ方向に応じて電圧を下げるか上げるかのどちらかです。これらのICのうち2つを使用して、入力電流と出力電流を測定しました。このACS712センサーを使用した以前のプロジェクト(下記)を確認してください。
- ArduinoとESP8266Wi-Fiモジュールを使用したIoTベースの電力エネルギーメーター
- PICマイクロコントローラーとACS712を使用したデジタル電流計回路
ここでは、これらのセンサーの動作について詳しく説明しました。これらのセンサーについてもっと知りたい場合は、それらをチェックしてください。
分圧器:
入力電圧と出力電圧を測定するため に、回路の入力側と出力側に2つの 分圧器があります。回路が測定できる最大電圧は35Vですが、分圧器の抵抗値を変更することで簡単に変更できます。
電圧レギュレーター:
一般的なLM7805電圧レギュレータは、ESP32、OLED、およびACS712ICに電力を供給するために使用されます。かなりクリーンな電力で電源を投入しているため、デカップリングコンデンサは使用していませんが、ICを安定させるために入力と出力の両方に100uFのコンデンサを使用しています。
ESP32 ICとOLEDディスプレイ:
メインプロセッサとしてESP32を使用しました。これは、すべての読み取り、計算、入力、および出力を担当します。また、値を知るために128X64OLEDディスプレイを使用しました。
ArduinoおよびESP32ベースの効率メーターのPCB設計
ArduinoおよびESP32ベースの効率メーターのPCBは、片面ボード上に設計されています。私はEagleを使用してPCBを設計しましたが、任意の設計ソフトウェアを使用できます。私のボードデザインの2D画像を以下に示します。
すべてのコンポーネント間で適切な接地接続を行うために、十分な接地トレースが使用されます。また、ノイズを低減し、効率を向上させるために、適切な5Vおよび3.3Vトレースを使用するようにしました。
- PCBデザインとガーバーファイルをダウンロードArduinoとESP32ベースの効率メーター
手作りPCB:
利便性とテストのために、PCBの手作りバージョンを作成しました。これを以下に示します。最初のバージョンでは、いくつかの間違いを犯しましたが、いくつかのジャンパー線を使用して修正しました。しかし、最終バージョンでは、それらを修正しました。ファイルをダウンロードして使用するだけです。
ArduinoおよびESP32ベースの効率メーター-コード
これで、ハードウェアの側面を十分に理解できたので、ArduinoIDEを開いてコーディングを開始できます。コードの目的は、ESP32ボードのピン35および33からアナログ電圧を読み取ることです。また、電流値である32、34ピンから電圧を読み取ります。これを行うと、それらを乗算して入力電力と出力電力を取得し、それを効率式に代入すると、効率を取得できます。
最後に、LCD画面に表示します。同じことを行うための完全なプログラムは最後に記載されており、上記のハードウェアにそのまま使用できます。さらに、コードは小さなスニペットに分割されて説明されています。
我々は128×64 OLEDディスプレイを使用しているように、我々は必要 Adafruit_GFXライブラリ と Adafruit_SSD1306ライブラリを 表示して通信します。両方ともArduinoのデフォルトのボードマネージャー端末からダウンロードできます。ボードマネージャーの部分で問題が発生した場合は、以下に示す関連するGitHubリポジトリからライブラリをダウンロードして含めることもできます。
- Adafruit_GFXライブラリをダウンロードする
- Adafruit_SSD1306ライブラリをダウンロードする
いつものように、必要なすべてのライブラリを含めることからコードを開始します。次に、必要なすべてのピンと変数を定義します。これらはすべて以下に示されています。
#include
SCREEN_WIDTH & SCREEN_HEIGHT 定義は、画面サイズを定義するために使用されています。次に、電圧と電流を測定するために必要なすべてのピンを定義しました。次に、回路図からわかるように、ハードウェアで使用される抵抗値を定義しました。これらの値がない場合、またはメーターの範囲を変更したい場合は、これらの値を変更できます。コードは問題なく機能します。
ACS712を使用して電流を測定しているため、電圧から電流を計算するにはmVperAmp 値が必要 です。20A ACS712モジュールを使用しているため、データシートに記載されているようにmV / A値は100です。ただし、ESP32と分圧器を使用しているため、値の半分である50になります。そのため、mV / AMP値を入力しました。
ACSoffset は、電圧から電流を計算するために必要なオフセットです。ACS712 ICは5Vから給電されるため、オフセット電圧は2.5Vです。しかし、分圧器を使用しているため、1.25Vまで低下します。ESP32の安っぽいADCをすでに知っているかもしれないので、私は1136の値を使用しなければなりませんでした。キャリブレーションの問題がある場合は、値を微調整してADCを補正できます。
最後に、 Adafruit_SSD1306 クラスの表示 オブジェクトを 作成し、画面の幅、高さ、I 2 C構成を渡すことでこのセクションを終了 し、最後の-1パラメーターを使用してリセット機能を定義します。ディスプレイに外部リセットピンがない場合(これは確かに私のディスプレイ用です)、最後の引数に-1を使用する必要があります。
void setup(){Serial.begin(115200); if(!display.begin(SSD1306_SWITCHCAPVCC、0x3C)){// 128x64のアドレス0x3D Serial.println(F( "SSD1306の割り当てに失敗しました")); にとって (;;); } display.clearDisplay(); display.setRotation(2); display.setTextSize(1); delay(100); }
次に、 setup() セクションがあります。このセクションでは、私ならば、我々はチェックし、デバッグするためのシリアル有効2 Cの表示は、表示オブジェクトの開始方法の助けを借りて利用できるかどうかです。また、我々は、Iセット2 Cアドレスを。次に、 clearDisplay() メソッドを使用して表示をクリアします 。また、 setRotation メソッドを使用してディスプレイを回転させます 。これは、PCBデザインを台無しにしたためです。次に、機能が有効になるまで100ミリ秒の遅延を設定します。それが完了したら、ループ機能に進むことができます。しかし、ループ機能に進む前に、我々は他の二つの機能を議論する必要がある return_voltage_valueを() 、 および return_current_value() 。
double return_voltage_value(int pin_no){double tmp = 0;ダブルADCVoltage = 0; double inputVoltage = 0;ダブル平均= 0; for(int i = 0; i <150; i ++){tmp = tmp + analogRead(pin_no); } avg = tmp / 150; ADCVoltage =((avg * 3.3)/(4095))+ 0.138; inputVoltage = ADCVoltage /(R2_VOLTAGE /(R1_VOLTAGE + R2_VOLTAGE)); // GNDの電圧を計算する式returninputVoltage; }
return_voltage_value() 関数は、ADCに入ってくる電圧を測定するために使用され、それは引数としてpin_noを取ります。この関数では、tmp、ADCVoltage、inputVoltage、avgなどの変数を宣言することから始めます。 tmp変数は、analogRead() 関数から取得した一時ADC値を格納するために使用さ れ、forループで150回平均化され、その値がavgという変数に格納されます。次に、指定された式からADCVoltageを計算し、最後に入力電圧を計算して値を返します。表示される+0.138値は、電圧レベルの校正に使用した校正値です。エラーが発生した場合は、この値を試してみてください。
double return_current_value(int pin_no){double tmp = 0; ダブル平均= 0; ダブルADCVoltage = 0; ダブルアンペア= 0; for(int z = 0; z <150; z ++){tmp = tmp + analogRead(pin_no); } avg = tmp / 150; ADCVoltage =((avg / 4095.0)* 3300); // mVアンペアを取得=((ADCVoltage-ACSoffset)/ mVperAmp); リターンアンペア; }
次に、 return_current_value() 関数があります。この関数もpin_noを引数として取ります。この関数にも4つの変数があります。tmp、avg、ADCVoltage、およびAmps
次に、 analogRead() 関数を使用してピンを読み取り、 150回平均します。次に、式を使用してADC電圧を計算し、電流を計算して値を返します。これで、ループセクションに移動できます。
void loop(){float input_voltage = abs(return_voltage_value(INPUT_VOLTAGE_SENSE_PIN)); float input_current = abs(return_current_value(INPUT_CURRENT_SENSE_PIN)); float output_voltage = abs(return_voltage_value(OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs((return_current_value(OUTPUT_CURRENT_SENSE_PIN))); input_current = input_current-0.025; Serial.print( "入力電圧:"); Serial.print(input_voltage); Serial.print( "-入力電流:"); Serial.print(input_current); Serial.print( "-出力電圧:"); Serial.print(output_voltage); Serial.print( "-出力電流:"); Serial.println(output_current); delay(300); display.clearDisplay(); display.setCursor(0、0); display.print( "I / PV:"); display.setCursor(37、0); display.print(input_voltage); display.setCursor(70、0);表示。print( "V"); }
ループセクションは、4つの変数すべてで、いくつかのfloat変数を宣言および定義することから始めます。ACS712モジュールは現在の値を負で返すことができるため、引数としてpin_noを渡して、それぞれの関数を呼び出します。数学ライブラリの abs() 関数を使用 して、負の値を正にします。次に、デバッグ用にすべての値をシリアル印刷します。次に、表示をクリアし、カーソルを設定して、値を出力します。これは、ディスプレイに表示されているすべての文字に対して行います。これは、ループ関数とプログラムの終わりを示します。
ArduinoおよびESP32ベースの効率メーターのテスト
あなたが上の画像で私のテストセットアップを見ることができるように。入力として30V変圧器があり、メーターをテストボードに接続しています。私はLM2596ベースの降圧コンバータボードを負荷に使用しており、3つの10オーム抵抗を並列に使用しています。
上の画像でわかるように、入力電圧と出力電圧をチェックするためにマルチメーターに接続しました。トランスはほぼ32Vを生成し、降圧コンバータの出力は3.95Vです。
この画像は、効率計とマルチメーターで測定された出力電流を示しています。ご覧のとおり、マルチメータは.97アンペアを示し、少しズームインすると1.0Aを示し、ACS712モジュールに存在する非線形性のためにわずかにずれていますが、これは私たちの目的を果たします。詳細な説明とテストについては、ビデオセクションのビデオをご覧ください。
さらなる機能強化
このデモンストレーションでは、回路は手作りのPCBで作成されていますが、回路は高品質のPCBで簡単に構築できます。私の実験では、PCBのサイズはコンポーネントのサイズのために非常に大きいですが、実稼働環境では、安価なSMDコンポーネントを使用することでPCBを縮小できます。また、回路には保護機能が組み込まれていないため、保護回路を含めると、回路の全体的な安全面が向上します。また、コードを書いているときに、ESP32のADCがそれほど優れていないことに気づきました。ADS1115モジュールのような外部ADCを含めると、全体的な安定性と精度が向上します。
この記事が気に入って、そこから何か新しいことを学んだことを願っています。疑問がある場合は、以下のコメントで質問するか、フォーラムを使用して詳細なディスカッションを行うことができます。