Arduinoใง้›ปๆตใƒป้›ปๅœง๏ผˆINA219๏ผ‰ใฎๆธฌๅฎšใ‚’ใ™ใ‚‹ – imo Lab.
PR

Arduinoใง้›ปๆตใƒป้›ปๅœง๏ผˆINA219๏ผ‰ใฎๆธฌๅฎšใ‚’ใ™ใ‚‹

่จ˜ไบ‹ๅ†…ใซๅบƒๅ‘ŠใŒๅซใพใ‚Œใฆใ„ใพใ™ใ€‚

ใ€€้›ปๆตใƒป้›ปๅœงใ‚ปใƒณใ‚ตใƒผ๏ผˆINA219ใƒขใ‚ธใƒฅใƒผใƒซ๏ผ‰ใจArduinoใงไฝฟใฃใฆ้›ปๆตใƒป้›ปๅœงใฎๆธฌๅฎšใ‚’่กŒใฃใฆใฟใพใ—ใŸใ€‚

ใ€€ไปŠๅ›žใฏINA219ใƒขใ‚ธใƒฅใƒผใƒซใฎไฝฟใ„ๆ–นใจใใฎ็ฒพๅบฆใ‚’็ขบ่ชใงใ™ใ€‚

ใ‚นใƒใƒณใ‚ตใƒผใƒชใƒณใ‚ฏ

ๆฆ‚่ฆ

ใ€€INA219๏ผˆใƒขใ‚ธใƒฅใƒผใƒซ๏ผ‰ใฏ้›ปๆตใƒป้›ปๅœงใฎๆธฌๅฎš๏ผˆใƒขใƒ‹ใ‚ฟใƒผ๏ผ‰ใŒๅฏ่ƒฝใชใƒ‡ใƒใ‚คใ‚นใงใ€I2C้€šไฟกใงๆƒ…ๅ ฑใฎใ‚„ใ‚Šๅ–ใ‚Šใ‚’่กŒใ†ใŸใ‚Arduinoใ‚„RaspberryPiใชใฉใ‹ใ‚‰็ฐกๅ˜ใซไฝฟใˆใฆใ€้›ปๆต่จˆใ‚„้›ปๅœง่จˆใชใฉใ‚‚ๅ‰ฒใจ็ฐกๅ˜ใซไฝœๆˆใงใใ‚‹ใ‹ใจๆ€ใ„ใพใ™ใ€‚

โ–ผINA219ใƒขใ‚ธใƒฅใƒผใƒซโ–ผ

ใ€€ใƒฉใ‚คใƒ–ใƒฉใƒชใŒๅ…ฌ้–‹ใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€ใใ‚Œใ‚’ใใฎใพใพๅˆฉ็”จใ™ใ‚Œใฐ็ฐกๅ˜ใงใ™ใŒใ€ใ„ใคใ‚‚ใฎใ‚ˆใ†ใซใƒฉใ‚คใƒ–ใƒฉใƒชใฏไฝฟใ‚ใšใซ้›ปๅœงใƒป้›ปๆตใ‚’ๆธฌๅฎšใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚

ๅ›ž่ทฏ

โ–ผArduinoใจINA219โ–ผ

ใ€€INA219ใจArduinoใฎ็ต็ทšใงใ™ใ€‚้›ปๆตใƒป้›ปๅœงๆธฌๅฎšใฏVin+ใ€Vin-ใƒ”ใƒณใ‚’ไฝฟใฃใฆใ€ๆธฌๅฎšใ™ใ‚‹ๅ›ž่ทฏใซ็›ดๅˆ—ใง็น‹ใŽใพใ™ใ€‚

ใ€€ใ“ใ“ใงใฏArduino๏ผˆ3.3v๏ผ‰ใ‹ใ‚‰ๆŠตๆŠ—ใ‚’็ตŒ็”ฑใ™ใ‚‹ๅ›ž่ทฏใฎ้›ปๅœงใƒป้›ปๆตใ‚’ๆธฌๅฎšใ€‚ยฑใงๆธฌๅฎšใงใใ‚‹ใฎใงใ€Vin๏ผ‹ใ€Vin๏ผใฎๆฅตๆ€งใฏๆ„่ญ˜ใ—ใชใ„ใงใ‚‚ๅ•้กŒใชใ„ใฏใšใงใ™ใ€‚่ฒ ่ทใซใฏ้ฉๅฝ“ใชๆŠตๆŠ—ใ‚’ไฝฟ็”จใ€‚

โ–ผใƒ–ใƒฌใƒƒใƒ‰ใƒœใƒผใƒ‰ใง็ต็ทšโ–ผ

ใ‚นใƒใƒณใ‚ตใƒผใƒชใƒณใ‚ฏ

ใ‚นใ‚ฑใƒƒใƒ๏ผˆใ‚ฝใƒผใ‚น๏ผ‰

ใ€€ใ‚ฝใƒผใ‚นใ‚’ๆŠœ็ฒ‹ใ—ใฆ่ชฌๆ˜Žใ—ใพใ™ใ€‚ไปŠๅ›žไฝฟ็”จใ—ใŸใ‚ฝใƒผใ‚นๅ…จไฝ“ใฏ่จ˜ไบ‹ๆœ€ๅพŒใซๆŽฒ่ผ‰ใ—ใฆใพใ™ใ€‚๏ผˆArduinoใงI2C้€šไฟกใ‚’ไฝฟใ†ๆ–นๆณ•ใฏใ“ใกใ‚‰๏ผ‰

โ–ผใ‚ณใƒณใƒ•ใ‚ฃใ‚ฐใฎ่จญๅฎšโ–ผ

int16_t config_value = 0x399F;           //ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ
Wire.beginTransmission(0x40);            //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
Wire.write(0x00);                        //configใ‚ขใƒ‰ใƒฌใ‚น
Wire.write((config_value >> 8) & 0xFF);
Wire.write(config_value & 0xFF);
Wire.endTransmission();

ใ€€ไปŠๅ›žใฏใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฎใพใพใงใ™ใ€‚BUS้›ปๅœงใƒฌใƒณใ‚ธยฑ32V๏ผˆLSB4mV๏ผ‰ใ€ใ‚ทใƒฃใƒณใƒˆๆŠตๆŠ—้–“้›ปๅœงใƒฌใƒณใ‚ธ320mV๏ผˆใ‚ฒใ‚คใƒณ/8๏ผ‰ใ€ยฑ2Aใ€12bitใ€‚

โ–ผBUS้›ปๅœงใฎๆธฌๅฎšโ–ผ

Wire.beginTransmission(0x40);                 //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
Wire.write(0x02);                             //BusVoltageใƒฌใ‚ธใ‚นใ‚ฟ
Wire.endTransmission();
Wire.requestFrom(0x40, 16);
while (Wire.available() < 16);
BusVoltage = Wire.read() << 8 | Wire.read();
BusVoltage = (BusVoltage >> 3) * 4;

ใ€€้›ปๅœงๆธฌๅฎšๅ€คใฏใ€Œ0x02ใ€ใ‚ขใƒ‰ใƒฌใ‚นใ‹ใ‚‰2byteๅˆ†ใงๆ ผ็ดใ•ใ‚Œใฆใพใ™ใ€‚ไธŠไฝ12bitใŒ้›ปๅœงใงใ€LSBใฏ4mVใจใชใ‚Šใพใ™ใ€‚ใฎใงๆœ€ๅพŒใซๅณ3ใ‚ทใƒ•ใƒˆใ—ใฆ4ๆŽ›ใ‘ใฆใพใ™ใ€‚

โ–ผ้›ปๆต๏ผˆใ‚ทใƒฃใƒณใƒˆๆŠตๆŠ—้–“ใฎ้›ปๅœง๏ผ‰ใฎๆธฌๅฎšโ–ผ

Wire.beginTransmission(0x40);                 //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
Wire.write(0x01);                             //ShuntVoltageใƒฌใ‚ธใ‚นใ‚ฟ
Wire.endTransmission();
Wire.requestFrom(0x40, 16);
while (Wire.available() < 16);
ShuntVoltage = Wire.read() << 8 | Wire.read();

ใ€€ใ‚ทใƒฃใƒณใƒˆๆŠตๆŠ—้–“ใฎ้›ปๅœงๆธฌๅฎšใงใ™ใ€‚ใ€Œ0x01ใ€ใ‚ขใƒ‰ใƒฌใ‚นใ‹ใ‚‰2byteๅˆ†ใงLSBใฏ0.01mVใจใชใ‚Šใพใ™ใ€‚ไปŠๅ›žใฏใ‚ทใƒฃใƒณใƒˆๆŠตๆŠ—้–“ใฎ้›ปๅœงใ‹ใ‚‰้›ปๆตใ‚’่จˆ็ฎ—ใ™ใ‚‹ๆ–นๆณ•ใง้›ปๆตๅ€คใ‚’ๆธฌๅฎšใ—ใฆใพใ™ใ€‚

ใ€€้›ปๅœงใ‚’ๆธฌๅฎšใ™ใ‚‹ใ ใ‘ใชใ‚‰้žๅธธใซ็ฐกๅ˜ใงใ™ใ€‚

ใ€€ใใฎใปใ‹ใ€ใ‚ขใƒ‰ใƒฌใ‚นใ€Œ0x04ใ€ใ‹ใ‚‰้›ปๆตใ€ใ‚ขใƒ‰ใƒฌใ‚นใ€Œ0x03ใ€ใ‹ใ‚‰้›ปๅŠ›ใ‚’็›ดๆŽฅ่จˆๆธฌใงใใ‚‹ใฎใงใ™ใŒใ€ใ‚ขใƒ‰ใƒฌใ‚นใ€Œ0x05ใ€ใฎใ‚ญใƒฃใƒชใƒ–ใƒฌใƒผใ‚ทใƒงใƒณ่จญๅฎšใจLSBใฎ่€ƒใˆๆ–นใŒ่‹ฅๅนฒใ‚„ใ‚„ใ“ใ—ใ„ใฎใงไปŠๅ›žใฏไฝฟ็”จใ—ใฆใพใ›ใ‚“ใ€‚้›ปๆตใ‚‚้›ปๅŠ›ใ‚‚่จˆ็ฎ—ใงๆฑ‚ใ‚ใ‚‰ใ‚Œใ‚‹ใฎใงๅ•้กŒใชใ„ใ‹ใจใƒปใƒปใƒปใ€‚ใ“ใ“ใ‚‰่พบใฎใ‚ˆใ‚Š่ฉณใ—ใ„ๅ†…ๅฎนใฏใƒ‡ใƒผใ‚ฟใ‚ทใƒผใƒˆๅ‚็…งใใ ใ•ใ„ใ€‚

ใ‚นใƒใƒณใ‚ตใƒผใƒชใƒณใ‚ฏ

็ฒพๅบฆ็ขบ่ช

ใ€€้›ปๅœงใจๆŠตๆŠ—ๅ€คใ‚’ๅฐ‘ใ—ใšใคๅค‰ใˆใฆใ€้›ปๅœงใ€้›ปๆตใฎๆธฌๅฎšใ‚’่กŒใฃใฆใฟใพใ—ใŸใ€‚

ใ€€โ–ผใ‚ทใƒชใ‚ขใƒซใƒขใƒ‹ใ‚ฟใงใฎ่จˆๆธฌ็ตๆžœ่กจ็คบโ–ผ

โ–ผ็ฒพๅบฆ็ขบ่ช็ตๆžœโ–ผ

ใ€€้›ปๆตใฏๆœบไธŠ่จˆ็ฎ—๏ผˆ็†่ซ–ๅ€ค๏ผ‰ใจๆฏ”่ผƒใ—ใฆใพใ™ใ€‚ๆ‰‹ๆŒใกใฎๆŠตๆŠ—ใŒใ‚ใพใ‚Šใชใ‹ใฃใŸใฎใงๅพฎๅฆ™ใชNๆ•ฐใงใ™ใŒใ€ใพใๆฆ‚ใญ่จˆ็ฎ—้€šใ‚Šใฎ็ตๆžœใงใ™ใ€‚

ใ€€็งใŒไฝฟ็”จใ™ใ‚‹็”จ้€”ใใ‚‰ใ„ใงใ‚ใ‚Œใฐๅๅˆ†ใช็ฒพๅบฆใง้›ปๅœงใ€้›ปๆตใŒๆธฌๅฎšใงใใพใ™ใ€‚Arduinoใ‹ใ‚‰ใงใ‚ใ‚Œใฐใƒชใ‚ขใƒซใ‚ฟใ‚คใƒ ใซๆธฌๅฎšใงใใพใ™ใ—ใ€ใ„ใ‚ใ„ใ‚้Šในใใ†ใงใ™ใ€‚

โ–ผใ‚ฝใƒผใ‚นๅ…จไฝ“โ–ผ

ไปŠๅ›žใฎใƒ†ใ‚นใƒˆๆธฌๅฎšใซไฝฟ็”จใ—ใŸใ‚ฝใƒผใ‚นๅ…จๆ–‡ใงใ™ใ€‚

#include <Wire.h>
int16_t BusVoltage, ShuntVoltage;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(400000);

  int16_t config_value = 0x399F;           //ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ
  Wire.beginTransmission(0x40);            //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
  Wire.write(0x00);                        //configใ‚ขใƒ‰ใƒฌใ‚น
  Wire.write((config_value >> 8) & 0xFF);
  Wire.write(config_value & 0xFF);
  Wire.endTransmission();
}

void loop() {
  //Get BusVoltage
  Wire.beginTransmission(0x40);                 //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
  Wire.write(0x02);                             //BusVoltageใƒฌใ‚ธใ‚นใ‚ฟ
  Wire.endTransmission();
  Wire.requestFrom(0x40, 16);
  while (Wire.available() < 16);
  BusVoltage = Wire.read() << 8 | Wire.read();
  BusVoltage = (BusVoltage >> 3) * 4;

  //Get ShuntVoltage
  Wire.beginTransmission(0x40);                 //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
  Wire.write(0x01);                             //ShuntVoltageใƒฌใ‚ธใ‚นใ‚ฟ
  Wire.endTransmission();
  Wire.requestFrom(0x40, 16);
  while (Wire.available() < 16);
  ShuntVoltage = Wire.read() << 8 | Wire.read();

  Serial.print("BusVoltage");
  Serial.print(BusVoltage * 0.001);
  Serial.print("V");
  Serial.print("   ");
  Serial.print("ShuntVoltage");
  Serial.print(ShuntVoltage * 0.01);
  Serial.print("mV");
  Serial.println("   ");
}

ใ‚ณใƒกใƒณใƒˆ

  1. ใจใ‚‚ใ  ใ‚ˆใ‚Š:

    ใฏใ˜ใ‚ใพใ—ใฆใ€‚ๅ‚่€ƒใซใ•ใ›ใฆใ„ใŸใ ใ„ใŸใฎใงใ™ใŒๅ‹•ใ‹ใชใ‹ใฃใŸใฎใง่‰ฏใ‹ใฃใŸใ‚‰่ณชๅ•ใ•ใ›ใฆใใ ใ•ใ„ใ€‚
    startใฎใฟ่กจ็คบใ•ใ‚Œใฆใƒใƒณใ‚ฐใ—ใพใ™ใ€‚
    ๅŒใ˜ใ‚ˆใ†ใซ้…็ทšใ—ใฆใ€vin voutใฏๆœช็ต็ทš๏ผˆ็ต็ทšใ—ใฆใ‚‚ๅŒใ˜ใงใ™ใŒ๏ผ‰

    void setup() {
    Serial.begin(115200);
    Wire.begin();
    Wire.setClock(400000);

    int16_t config_value = 0x399F; //ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ
    Wire.beginTransmission(0x40); //ใƒ‡ใƒใ‚คใ‚นใ‚ขใƒ‰ใƒฌใ‚น
    Wire.write(0x00); //configใ‚ขใƒ‰ใƒฌใ‚น
    Wire.write((config_value >> 8) & 0xFF);
    Wire.write(config_value & 0xFF);
    ใ€€Serial.println(โ€Aโ€);
    Wire.endTransmission();
    ใ€€Serial.println(โ€Bโ€);
    }

    ไธŠ่จ˜ใฎใ‚ˆใ†ใซๅค‰ๆ›ดใ—ใฆใฟใŸใจใ“ใ‚ใ€Aใ ใ‘ใŒ่กจ็คบใ•ใ‚Œใพใ™ใ€‚

    SCLใฎ็ทšใ‚’ๆŠœใใจๅ‹•ใๅ‡บใ—ใพใ™ใŒใ€ๅฝ“็„ถ่จˆๆธฌ็ตๆžœใฏๅ–ใ‚Œใชใ„ใฎใงๆ„ๅ‘ณใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚
    INA219ใ‚’ๆ–ฐใ—ใ„ใ‚‚ใฎใซๅค‰ใˆใŸใ‚Šใ€Arduinoใ‚‚ๆ–ฐๅ“ใซๅค‰ใˆใพใ—ใŸใŒๅŒใ˜็ตๆžœใงใ™ใ€‚
    ไฝ•ใŒๆ‚ชใ„ใฎใงใ—ใ‚‡ใ†ใ‹๏ผŸ

    • imo ใ‚ˆใ‚Š:

      ใจใ‚‚ใ ใ•ใ‚“ใ€‚ใ‚ตใ‚คใƒˆๆ‹่ฆ‹ใใ ใ•ใ‚Šๆœ‰้›ฃใ†ๅพกๅบงใ„ใพใ™ใ€‚
      ใ”่ณชๅ•ใฎไปถใ€ๅŽŸๅ› ใฏใ‚ˆใใ‚ใ‹ใ‚‰ใชใ„ใฎใงใ™ใŒใ€Serial.ใ‚’้–“ใซๅ…ฅใ‚Œใ‚‹ใฎใ‚’ไธ€ๅบฆใ‚„ใ‚ใฆใฟใฆ่ฉฆใ—ใฆใฟใฆใฏใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚
      Wire.endTransmission();ใงไธ€ๅบฆI2Cใฎ้€ไฟกใ‚’ๅฎŒไบ†ใ•ใ›ใ‚‹ใจใ‹ใ€ใ‚ตใƒณใƒ—ใƒซใ‚นใ‚ฑใƒƒใƒ็ญ‰ใงๅ‹•ใใ‹็ขบ่ชใ—ใฆใฟใŸใ‚Šใ€ใ€ใƒใƒผใƒ‰ใƒปใ‚ฝใƒ•ใƒˆไธก้ขใ‹ใ‚‰ๅ•้กŒใฎๅˆ‡ใ‚Šๅˆ†ใ‘ใ‚’ใ—ใฆใฟใฆใฏใ„ใ‹ใŒใงใ—ใ‚‡ใ†ใ‹ใ€‚

  2. ใจใ‚‚ใ  ใ‚ˆใ‚Š:

    ่‰ฒใ€…่ฉฆ่กŒ้Œฏ่ชคใ—ใฆ่‡ชๅทฑ่งฃๆฑบใ—ใพใ—ใŸใ€‚
    ๆญขใพใ‚‹ใฎใฏIna219ๆ•…้šœใฎใŸใ‚
    VoltใŒ่จˆๆธฌใงใใชใ‹ใฃใŸใฎใฏใ€
    Vin+ใฎๆ‰‹ๅ‰ใซๆŠตๆŠ—ใ‚’ๅ…ฅใ‚Œใฆใ„ใŸ็‚บ๏ผˆVin-ใจGNDใฎ้–“ใซๅค‰ๆ›ด๏ผ‰ใงๅ–ใ‚Œใพใ—ใŸ

    ๆœ€็ต‚็š„ใซใ“ใกใ‚‰ใฎๅ›ž่ทฏๅ›ณใฟใฆใฆใƒ”ใƒณใจใใพใ—ใŸใ€‚
    ็„ก่จˆๆธฌ็Šถๆ…‹ใง้›ปๅœงใŒ0Vใซใชใ‚‰ใชใ„ใฎใงใ™ใŒใ€ใใ“ใฏใพใไฝ•ใจใ‹ใชใ‚Šใใ†ใชใฎใง็„ก่ฆ–ใ—ใพใ™ใ€‚
    ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ—ใŸใ€‚

ใ‚ฟใ‚คใƒˆใƒซใจURLใ‚’ใ‚ณใƒ”ใƒผใ—ใพใ—ใŸ