技術メモ

電子工作 Unityとか

電流計 INA219

INA219 + ESP-WROOM-02で電流計を作ってみた

ある基板(システム)が電圧降下を起こして、正常に動かない瞬間があった。

8Ωスピーカ + LEDテープを同時に制御しているので、そのタイミングの消費電流がどうやら怪しい。

テスタでは瞬間の電流を表示できない。

NRF-PPK2 は納品1か月待ちで、待っていられなかったの自作することにした。

電流計はINA219を使用した。 I2Cで電流を取得できる。

取得した電流値をESP-WROOM-02UDP送信する。

#include <Adafruit_INA219.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <WiFiUDP.h>

Adafruit_INA219 ina219;
const int CLK = 4;
const int DIO = 5;

IPAddress HOSTIP (192, 168, 11, 8);
IPAddress myIP(192, 168, 11, 39);
const char *ssid = "****";
const char *password = "****";
WiFiUDP udp_;
#define PORT 12345

void connectWiFi() {
  WiFi.begin(ssid, password);
  WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask());

  Serial.println("start_connect");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("CONNECTED!");

}

void sendWiFi(char byteData[]) {
  if (udp_.beginPacket(HOSTIP, PORT)) {
    udp_.write(byteData);
    udp_.endPacket();
  }
}

void setup() {
  WiFi.mode(WIFI_STA); //STAtion_mode. not AP_mode.
  Serial.begin(115200); 
  udp_.begin(PORT);
  connectWiFi();
  
  ina219.begin();
  ina219.setCalibration_16V_400mA();
  //ina219.setCalibration_32V_1A();
}

void loop() {
  float current_mA = ina219.getCurrent_mA();
  Serial.println(current_mA);
  char result[4];
  memcpy(result, &current_mA, 4);
  sendWiFi(result);
}

送信したデータは、Unityで作ったグラフアプリで受信し表示するようにした。

グラフ描画は、Unity Asset Store の「Graph And Chart」を使用した。(高ぇ) assetstore.unity.com

家の環境では1秒間に400回以上のデータを取得できた。(UDP送信がボトルネックになっているので、別の通信方式であればもっといけそう)

電流値の分解能は0.1mA以下なので、今回の用途には十分であった。

400FPSだと、ある電流スパイクの時間積分(足し算)にもある程度対応できる。

これを使って回路の電流消費を調べて、電圧降下の対策をしていこうと思う。