AliExpressでACS712モジュールを買ってみたので使ってみました。5A、20A、30Aのすべてのモジュールを買ってみました。商品の取り扱いは終わっていますが、秋月にデータシートが残ってました。
ASC712がのった電流測定モジュールを買った
— Unagi Dojyou (@Unagi_Dojyou) 2022年9月23日
ホール効果を使って電流測るやつ pic.twitter.com/NcwdImPhdb
この素子はホール素子を使用していて5Vを入力すると、2.5Vあたりを中心として電流に対して比例的に出力電圧が変化します。データシート(自鯖ミラー)参照
そこで2点のanalogRead()の値と入力した電流値から、analogRead()と電流値の一次式が求められます。それをプログラムにしたのが下のやつです。
const int inpin = 4; //測定ピン
const bool kousei = 1; //1で校正、0で通常使用
const float inI1 = 0; //校正に使用した電流[A]
const float ESP32ValueI1 = 2840;//校正に使用した電流のESP32での表示値
const float inI2 = 1; //校正に使用した電流2[A]
const float ESP32ValueI2 = 3062;//校正に使用した電流2のESP32での表示値
//電流[A]=katamuki*ESP32読み取り値+seppenn を計算する
float katamuki = (inI2 - inI1) / (ESP32ValueI2 - ESP32ValueI1);
float seppenn = inI1 - (katamuki * ESP32ValueI1); //測定可能な最小電流
int count = 0;
float current = 0;
void setup() {
Serial.begin(115200);
Serial.println();
if (kousei){
Serial.println("kousei mode");
katamuki = 1;
seppenn = 0;
}
else{
Serial.print("kousei:");
Serial.print("I[A]=");
Serial.print(katamuki);
Serial.print("*ESP32Value+");
Serial.println(seppenn);
Serial.print("minCurrent:");
Serial.print(seppenn);
Serial.println("A");
}
delay(5000);
}
void loop() {
float pinrawV = analogRead(inpin); //inpinの値を読み込む
current = katamuki * pinrawV + seppenn + current; //電流の計算&平均値計算のための加算
count++;
if(count == 100){ //100回計測したら平均値を出す
current = current / 100; //平均値を算出
Serial.println(current); //電流値を出力
count = 0;
current = 0;
}
delay(10);
}
使い方
0. 配線
GPIO4とOUT、VCCと5V、GNDとGNDを接続します。
1. 校正モードでの書き込み
kousei = 1;の状態で書き込む
2. 校正
校正モードで2つの値の電流(I1、I2)を流して、それぞれの出力値(ESP32ValueI1、ESP32ValueI2)をプログラムに入力する。
3. 通常モードで書き込み
kousei =0;の状態で書き込む
こんな感じで使えます。ちなみに5Aのものを使用しています。
ACS712の5AとESP32を使って、電流を測ってみた
— Unagi Dojyou (@Unagi_Dojyou) 2022年11月27日
少なくとも100mAオーダーでは問題なく測れる pic.twitter.com/nSNrXuhrUa
ちなみに使用しているGPIO4は無線を有効にすると、使えなくなるので気をつけてください。
終わりに
そこそこの精度が出ました。20mAくらいの誤差ないに収まっているように感じます。いい感じの負荷がなく、5Ω5Wのセメント抵抗しかないので3A、5Aで測れていないですが…