工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ACS712でAC電流を測定する

コンポーネントと消耗品

>
Arduino UNO
× 1
OLEDi²c128x32
× 1
ACS712 30A
× 1
LCD16x2i²c
× 1

このプロジェクトについて

電力線を使用している場合は注意してください

こんにちは、そして別のチュートリアルへようこそ。これは交流(AC)の測定に関するものです。ACS712を使用しています。ACS71230Aである30Ampsバージョンを使用しています。素敵なArduino Unoボードで、OLED画面を追加しようとしましたが、残念ながら終了しました。チュートリアルの撮影中に壊れてしまったので、LCDに切り替えましたが、以下に両方のバージョンの配線とコードがあります。

そして、「Any AC…」とは、正弦波1つだけでなく、すべての信号タイプで機能するコード/ライブラリが表示されることを意味します。電流計は、TRUE ROOT MEANSQUAREを計算できるようになります。また、センサーはホール効果(導体内の電流と電流に垂直な印加磁場を横切る、導体間の電圧差の生成)を使用することに注意してください。

このプロジェクトを次のプロジェクトと組み合わせることができます:ArduinoとZMPT101Bを使用したAC電圧の簡単な測定

テストは、リファレンスマルチメータおよびACS712電流センサーモジュールと直列に接続された調光器によって制御される白熱電球で行われます。

<図>

計画は次のとおりです:

  • まず、モジュールをArduinoボードに接続し、調光器がオンのときの信号形状を確認する必要があります–フルサイクル–ハーフサイクル。
  • 次に、ライブラリを必要としない単純なコードをチェックしますが、Sinewaves信号でのみ機能します(テストされます)。
  • その後、ACのTRMSを測定し、LCDを使用するコードを確認します。

パーツ

<図> <図> <図>

ACS712を選択するときは慎重に行ってください。私が行ったように(30アンペアバージョンを購入して)安全にプレイしようとしないでください。これは、家庭用または小型アンペアのアプリケーションに使用しようとすると大きな変動をもたらすだけです。私にとっては、5Aまたは10Aバージョンで十分でした。また、30Aまたは20A…はキャリブレーションにも影響しますが、ビデオとコードコメントでキャリブレーションする方法が説明されていることにも注意してください。

これらは私が使用した部品です。UNOを互換性のあるボードに交換するか、LCDi²cをOLEDまたは任意のディスプレイに交換できます。

テスト1

配線 および コード

テスト1の配​​線は、コード(コード1)と一緒に以下(配線1)にあります。

結果

コードをアップロードしてシリアルプロッタを起動すると、正弦波のような信号が表示されるはずです。赤い線は、調光器を下げたときに表示され、電流は通常トライアックで見られるような形状になり始めました。

<図>

テスト2

上記のコードのみを使用して電流を測定する場合は、512〜511前後の値が得られますが、これらはRMS値をまったく反映していません。したがって、信号のRMS値を測定するには、上記と同じ配線を維持しますが、RMSを計算できる別のコードが必要です。

配線 および コード

配線は(配線1)と同じですが、以下に異なるコードがあります(コード2)。

結果

<図>

左側の値(RMS)はマルチメーターで測定された値と同じであることがわかりますが、右側はピークツーピーク値です。75W電球を使用しているため、調光器はフルサイクルであることに注意してください。 230VAC / 50Hz。

!!!!!!!!!!!!!!!!しかし!!!!!!!!!!!!!!!!!!!!!

<図>

ここでは、調光器を完全に下げました。つまり、サイクルの約1/4であり、マルチメーターは0.21Aを与えますが、コードは0.36Aを与えます。コードは、ピークからピークまで測定しますが、上記のように、調光器を完全に下げたとき、信号は線形ではありません。

これが、TRMS測定と正弦波信号でのみ機能する測定の違いです。

テスト3

上記のコードの問題がわかりましたが、幸いなことに、救助できるライブラリがあります。RMS値を計算する場合は、積分計算を使用する必要があるため、ライブラリが実行するすべての作業に感謝します。これを電子開発ボードで実現するのは非常に困難です。ライブラリのcppファイルをチェックして、「平均」「シグマ」などのどの方法が使用されているかを確認できます。統計/確率に関連するもの…。

配線 コード および ライブラリ

配線は上で使用した配線(配線1)と同じで、下にコード(コード3)があります。

そして、ここでフィルターライブラリをダウンロードできます:ここからライブラリをダウンロード

結果

正しい結果は中央にあり、左側の結果はキャリブレーションなしで、右側の結果はキャリブレーションの方法を示すために使用されています(ビデオを確認してください)。

<図> <図>

非線形信号に対する2つのコードの応答には大きな違いがありますが、2番目のコードはTRMSマルチメーターとして機能します。

LCD / OLEDでテスト

ここでは、LCDまたはOLEDを使用できるシリアルモニターを使用する代わりに、私たちが行うのと同じことをすべて維持します

配線 コード および ライブラリ

配線は(Wiring_LCD)と(Wiring_OLED)の下にあり、コードは(Code_ACS712_LCD)と(Code_ACS712_OLED)の下にもあります。

これがOLEDライブラリです

https://github.com/adafruit/Adafruit_SSD1306https://github.com/adafruit/Adafruit-GFX-Library

これがLCD_i2c_libraryです

https://drive.google.com/file/d/1Oc56q2GPs5SOA-PdbVHHSxKCnI9KY5xd/view

結果

<図>

ビデオチュートリアルを撮影しようとしたときにOLED画面が壊れたため、これが実行できる唯一のテストです。全体として、これは前に見たのと同じように機能し、LCDi²c画面に表示するだけです。 (はい、TRMS値はピークツーピーク法ではありません。)

以上です。このチュートリアルが気に入っていただければ幸いです。ビデオチュートリアルを気に入って、サポートを提供したい場合はSurtrTechチャンネルに登録してください。ありがとうございます。

質問がある場合はコメントに残してください。

コード

  • Code_1.ino
  • Code_2.ino
  • Code_3.ino
  • Code_ACS712_LCD.ino
  • Code_ACS712_OLED.ino
Code_1.ino Arduino
このコードは、モジュールをテストし、信号形状を視覚化するためのものです
 / *このコードはACS712電流センサーで動作し、生データを読み取ることができます。シリアルプロッターで使用することをお勧めします。詳細については、www.surtrtech.comをご覧ください* / #define Current_sensor A0 //センサーアナログ入力pinfloati; void setup(){Serial.begin(9600); pinMode(Current_sensor、INPUT);} void loop(){i =analogRead(Current_sensor); Serial.println(i); delay(100); //遅延を変更または削除すると、信号の表示方法が変更されます//正しい正弦波形状が得られるまで設定します} 
Code_2.ino Arduino
このコードは、ピークツーピーク測定法を使用して正弦波信号のRMSを計算します
 / *このコードはACS712電流センサーで動作し、正弦波交流のRMSを計算できます*ピークツーピークを使用しますRMSの計算方法*詳細については、www.surtrtech.comを確認してください* /#define SAMPLES 300 //ループするたびに取得するサンプルの数#defineACS_Pin A0 // ACS712データピンanalonginputfloat High_peak、Low_peak; // floatを測定または計算する変数Amps_Peak_Peak、Amps_RMS; void setup(){Serial.begin(9600); pinMode(ACS_Pin、INPUT); //ピンモードを定義} void loop(){read_Amps(); // read_Amps関数を起動しますAmps_RMS =Amps_Peak_Peak * 0.3536 * 0.06; //これでピークツーピーク値が得られました。通常、数式には0.3536を掛けるだけで済みます。//値は非常に大きくなるため、0.06を掛ける必要があるため、最初は使用できません。//計算を行い、次のように比較します。電流計によって測定された実際の値。例:0.06 =実際の値/測定値Serial.print(Amps_RMS); //ここにRMS値とピークツーピーク値を示します。必要なものを印刷して「A」記号を追加できます... Serial.print( "\ t"); Serial.println(Amps_Peak_Peak); delay(200);} void read_Amps()// read_Amps関数は、高ピークと低ピークの差を計算します{//ピーク間の値を取得しますint cnt; // Counter High_peak =0; //最初に、高ピークが0に等しく、低ピークが1024であると想定します。はい、反転しましたLow_peak =1024; for(cnt =0; cnt  High_peak)//その値が高ピークよりも高い場合(最初は0){High_peak =ACS_Value; //高ピークは0から見つかった値に変更されます} if(ACS_Value  
Code_3.ino Arduino
このコードは、統計式を使用して、sapeに関係なく信号のTRMSを計算し、シリアルモニターに表示します
 / *このコードはACS712電流センサーで動作し、信号TRMSの計算を可能にします* www.surtrtech.comにアクセスします詳細については* /#include  //このライブラリは大規模な作業を行います。.cppfile#define ACS_Pin A0 // A0アナログ入力フロートACS_Valueのセンサーデータピン。 //ここでは生データ値を保持しますsfloattestFrequency =50; //テスト信号周波数(Hz)float windowLength =40.0 / testFrequency; // statististfloat切片=0の場合、信号を平均化する時間。 //キャリブレーションテストに基づいて調整されますfloatslope =0.0752; //キャリブレーションテストに基づいて調整する// SurtrTechによるACS712チュートリアルビデオをチェックして、センサーに依存するため、それらを取得する方法を確認するか、フロート以下のAmps_TRMSを確認してください。 // ampsunsigned longprintPeriodの推定実際電流=1000; //ミリ秒単位//最後の読み取りからのミリ秒単位の追跡時間unsignedlong previousMillis =0; void setup(){Serial.begin(9600); //シリアルポートを開始しますpinMode(ACS_Pin、INPUT); //ピンモードを定義します} void loop(){RunningStatistics inputStats; //生のテストシグナルを確認するための統計を作成しますinputStats.setWindowSecs(windowLength); //ウィンドウの長さを設定しますwhile(true){ACS_Value =analogRead(ACS_Pin); //アナログの値を読み取ります:inputStats.input(ACS_Value); // Stats関数にログを記録しますif((unsigned long)(millis()-previousMillis)> =printPeriod){//毎秒計算を行いますpreviousMillis =millis(); //更新時間Amps_TRMS =切片+勾配* inputStats.sigma(); Serial.print( "\ t Amps:"); Serial.print(Amps_TRMS); }}} / *傾きと切片について*最初に、すべてのTRMS計算がライブラリの関数によって行われることを知っておく必要があります。これは、「inputStats.sigma()」値です。*最初に、「inputStats.sigma」を表示できます。 () "をTRMS値として使用し、入力が0.00Aのときにそれを使用して測定してみてください*測定値が0の場合は、切片を0のままにしておくことができます。それ以外の場合は、加算または減算する必要があります。 0に等しい値*言い換えると「オフセットを削除する」*次に、既知の値に電源をオンにします。たとえば、電源を知っていて、電圧をすでに知っている電球またはリード線を使用します。理論的なアンプを取得します*その理論値を測定値で除算し、ここで勾配を取得します。次に、それらを配置または変更します* / 
Code_ACS712_LCD.ino Arduino
このコードはTRMS計算方法を使用し、LCDi²cに表示します
 / *このコードはACS712およびLCDicで動作します*交流電流のTRMSを測定し、画面に値を表示します* www.SurtrTech.comにアクセスします詳細* /#include  //このライブラリは.cppファイルをチェックする膨大な作業を行います#include  // LCD ic library#define ACS_Pin A0 // ACS712データピン#defineI2C_ADDR 0x27 // I2Cアドレス、最初にアドレスをスキャンするコードを使用する必要があります(0x27)here#define BACKLIGHT_PIN 3 // LCDピンの宣言#defineEn_pin 2#define Rw_pin 1#define Rs_pin 0#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7LiquidCrystal_I2C lcd(I2C_ADDR、En_pin、Rw_pin、Rs_pin、D4_pin、D5_pin、D6_pin、D7_pin); // lcdfloattestFrequency =50を宣言します; //テスト信号周波数(Hz)float windowLength =40.0 / testFrequency; // statististfloat切片=0の場合、信号を平均化する時間。 //キャリブレーションテストに基づいて調整されますfloatslope =0.0752; //キャリブレーションテストに基づいて調整する// SurtrTechによるACS712チュートリアルビデオをチェックして、センサーに依存するため、それらを取得する方法を確認するか、フロート以下のAmps_TRMSを確認してください。 float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0; void setup(){digitalWrite(2、HIGH); lcd.begin(16,2); lcd.setBacklightPin(BACKLIGHT_PIN、POSITIVE); lcd.setBacklight(HIGH); //照明バックライトlcd.home(); } void loop(){RunningStatistics inputStats; //生のテストシグナルを確認するための統計を作成しますinputStats.setWindowSecs(windowLength); while(true){ACS_Value =analogRead(ACS_Pin); //アナログの値を読み取ります:inputStats.input(ACS_Value); // Stats関数にログを記録しますif((unsigned long)(millis()-previousMillis)> =printPeriod){//毎秒計算を行いますpreviousMillis =millis(); //更新時間Amps_TRMS =切片+勾配* inputStats.sigma(); //値を調整しますlcd.clear(); // lcdをクリアし、特定の位置に出力しますlcd.setCursor(2,0); lcd.print(Amps_TRMS); lcd.print( "A"); }}} / *傾きと切片について*最初に、すべてのTRMS計算がライブラリの関数によって行われることを知っておく必要があります。これは、「inputStats.sigma()」値です。*最初に、「inputStats.sigma」を表示できます。 () "をTRMS値として使用し、入力が0.00Aのときにそれを使用して測定してみてください*測定値が0の場合は、切片を0のままにしておくことができます。それ以外の場合は、加算または減算する必要があります。 0に等しい値*言い換えると「オフセットを削除する」*次に、既知の値に電源をオンにします。たとえば、電源を知っていて、電圧をすでに知っている電球またはリード線を使用します。理論的なアンプを取得します*その理論値を測定値で除算し、ここで勾配を取得します。次に、それらを配置または変更します* / 
Code_ACS712_OLED.ino Arduino
このコードはTRMS計算方法を使用し、OLEDに値を表示します。
 / *このコードはACS712およびOLEDicで動作します*交流電流のTRMSを測定し、画面に値を表示します* www.SurtrTechにアクセスしてください。詳細についてはcom * /#include  //このライブラリは.cppファイルをチェックする膨大な作業を行います#include  // OLEDライブラリ#include  #define ACS_Pin A0#define SCREEN_WIDTH 128 // OLEDディスプレイ幅(ピクセル単位)#defineSCREEN_HEIGHT 32 // OLEDディスプレイ高さ(ピクセル単位)#define OLED_RESET -1 //ピン番号をリセット(またはArduinoリセットピンを共有している場合は-1)float testFrequency =50; //テスト信号周波数(Hz)float windowLength =40.0 / testFrequency; // statististfloat切片=0の場合、信号を平均化する時間。 //キャリブレーションテストに基づいて調整されますfloatslope =0.0752; //キャリブレーションテストに基づいて調整する// SurtrTechによるACS712チュートリアルビデオをチェックして、センサーに依存するため、それらを取得する方法を確認するか、フロート以下のAmps_TRMSを確認してください。 float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0; Adafruit_SSD1306 display(SCREEN_WIDTH、SCREEN_HEIGHT、&Wire、OLED_RESET); //表示名の宣言(display)void setup(){display.begin(SSD1306_SWITCHCAPVCC、0x3C); // OLEDディスプレイを開始しますdisplay.clearDisplay(); display.display();} void loop(){RunningStatistics inputStats; //生のテストシグナルを確認するための統計を作成しますinputStats.setWindowSecs(windowLength); while(true){ACS_Value =analogRead(ACS_Pin); //アナログの値を読み取ります:inputStats.input(ACS_Value); // Stats関数にログを記録if((unsigned long)(millis()-previousMillis)> =printPeriod){// 1秒ごとに計算を実行previousMillis =millis(); //更新時間Amps_TRMS =切片+勾配* inputStats.sigma(); display.clearDisplay(); display.setTextSize(3); display.setTextColor(WHITE); display.setCursor(15,10); display.print(Amps_TRMS); display.println( "A"); display.display(); }}} / *傾きと切片について*最初に、すべてのTRMS計算がライブラリの関数によって行われることを知っておく必要があります。これは、「inputStats.sigma()」値です。*最初に、「inputStats.sigma」を表示できます。 () "をTRMS値として使用し、入力が0.00Aのときにそれを使用して測定してみてください*測定値が0の場合は、切片を0のままにしておくことができます。それ以外の場合は、加算または減算する必要があります。 0に等しい値*言い換えると「オフセットを削除する」*次に、既知の値に電源をオンにします。たとえば、電源を知っていて、電圧をすでに知っている電球またはリード線を使用します。理論的なアンプを取得します*その理論値を測定値で除算し、ここで勾配を取得します。次に、それらを配置または変更します* / 

回路図

テスト1、2、3で使用した配線 LCDi²cを使用 OLED128x32を使用

製造プロセス

  1. OpenSensorsで空気の質を測定する方法
  2. K30センサーによるCO2モニタリング
  3. 1Sheeld / Arduinoとの盲ろう者のコミュニケーション
  4. Arduinoでコインアクセプターを制御する
  5. LEDを制御するBluetoothを搭載したArduino!
  6. ArduinoまたはESP8266を搭載した静電容量式指紋センサー
  7. Nextionディスプレイで遊ぶ
  8. Nunchuk制御ロボットアーム(Arduino付き)
  9. ビリーベースの口を任意のオーディオソースでアニメートする
  10. Arduinoで日射量を測定する
  11. Arduinoを搭載したミニレーダー