Skip to main content

Grove - 10A DC電流センサー (ACS725)

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

Grove - 10A DC電流センサー (ACS725) は、ACS725をベースにした高精度なDC電流センサーです。Allegro™ ACS725電流センサーICは、産業、車載、商業、通信システムにおけるDC電流検出のための経済的かつ正確なソリューションです。

Grove - 10A DC電流センサー (ACS725) は最大10AまでのDC電流を測定でき、基本感度は264mV/Aです。このセンサーはAC電流には対応していません。AC負荷を測定したい場合は、以下をご確認ください:

Grove - ±5A DC/AC電流センサー (ACS70331)

特徴

  • 制御アプリケーションにおける高速応答時間のための120 kHzの高帯域幅アナログ出力
  • 独自のアンプおよびフィルタ設計技術により、業界トップクラスのノイズ性能と大幅に改善された帯域幅
  • 1.2 mΩの一次導体抵抗により、低電力損失と高突入電流耐性を実現
  • 差動ホール検出により共通モード磁場を排除
  • アナログ出力

仕様

パラメータ
電源電圧3.3V / 5V
動作環境温度-40 – 150℃
保管温度-65°C – 165°C
動作電圧<400V
電流検出範囲0 – 10A
感度264mV/A (Typ.)
出力インターフェースアナログ
入力インターフェーススクリュー端子

動作原理

電流検出には直接検出と間接検出の2種類があります。分類は主に電流を測定するために使用される技術に基づいています。

直接検出:

  • オームの法則

間接検出:

  • ファラデーの電磁誘導の法則
  • 磁場センサー
  • ファラデー効果

Grove - 10A DC電流センサー (ACS725) は磁場センサー技術を使用しています。そして、磁場センサー技術には以下の3種類があります:

  • ホール効果
  • フラックスゲートセンサー
  • 磁気抵抗電流センサー

Grove - 10A DC電流センサー (ACS725) はホール効果原理に基づいており、差動ホール検出により共通モードを排除します。

ハードウェア概要

図3. ピン配置

対応プラットフォーム

ArduinoRaspberry Pi

はじめに

Danger

テスト中に人体がモジュールに触れることは禁止されています。そうしないと感電の危険があります。

Arduinoで遊ぶ

必要な材料

Seeeduino V4.2Base Shield10A DC Current Sensor (ACS725)
今すぐ購入今すぐ購入今すぐ購入

さらに、Seeeduino Lotus M0+を検討することもできます。これはSeeeduino V4.2とBase Shieldの組み合わせに相当します。

note

1 USBケーブルを優しく差し込んでください。そうしないとポートを損傷する可能性があります。内部に4本のワイヤーがあるUSBケーブルを使用してください。2本のワイヤーしかないケーブルではデータを転送できません。お持ちのケーブルが不明な場合は、こちらをクリックして購入できます。

2 Groveモジュールを購入すると、各モジュールにGroveケーブルが付属しています。Groveケーブルを紛失した場合は、こちらをクリックして購入できます。

ハードウェア接続

  • ステップ1. Grove - 10A DC Current Sensor(ACS725)をBase ShieldのA0ポートに接続します。

  • ステップ2. テストする回路の正極と負極を、ネジ端子の対応する正極と負極に接続します。

tip

正極と負極を逆に接続すると、読み取り値が逆になります。このセンサーは使用前にキャリブレーションが必要ですので、最初に回路に電源を入れないでください。

  • ステップ3. Grove - Base ShieldをSeeeduinoに差し込みます。

  • ステップ4. USBケーブルを使用してSeeeduinoをPCに接続します。

図4. このデモではDC電源を使用しています。最初は電流を0Aに設定するか、電源を入れないでください。

ソフトウェア

caution

Arduinoを初めて使用する場合は、開始する前にArduinoの使い方を必ずご覧ください。

  • ステップ1. GithubからGrove Current Sensorライブラリをダウンロードします。

  • ステップ2. /example/フォルダ内にデモコードがあります。ここではGrove_10A_Current_Sensorを例に取ります。Grove_10A_Current_Sensor.inoをクリックしてデモを開くか、以下のコードをコピーしてください:

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define RefVal 3.3
#define SERIAL SerialUSB
#else
#define RefVal 5.0
#define SERIAL Serial
#endif
// OLEDディスプレイが必要です
// ピンA0を使用
#define Pin A0

// 500回の平均を取る
const int averageValue = 500;

long int sensorValue = 0;
float sensitivity = 1000.0 / 264.0; //1000mAあたり264mV

float Vref = 322; //Vrefはゼロドリフト値です。使用前に実際に測定した値に変更してください。
void setup()
{
SERIAL.begin(9600);
}

void loop()
{
// 10回値を読み取る
for (int i = 0; i < averageValue; i++)
{
sensorValue += analogRead(Pin);

// 次のループまで2ミリ秒待つ
delay(2);

}

sensorValue = sensorValue / averageValue;


// オンボードADCは10ビット
// 異なる電源は異なる基準電圧をもたらす
// 例: 2^10 = 1024 -> 5V / 1024 ~= 4.88mV
// unitValue= 5.0 / 1024.0*1000 ;
float unitValue= RefVal / 1024.0*1000 ;
float voltage = unitValue * sensorValue;

// 無負荷時、Vref=初期値
SERIAL.print("initialValue: ");
SERIAL.print(voltage);
SERIAL.println("mV");

// 対応する電流を計算
float current = (voltage - Vref) * sensitivity;

// 電圧(mV)を表示
// この電圧は電流に対応するピン電圧です
/*
voltage = unitValue * sensorValue-Vref;
SERIAL.print(voltage);
SERIAL.println("mV");
*/

// 電流(mA)を表示
SERIAL.print(current);
SERIAL.println("mA");

SERIAL.print("\n");

// 次の読み取りのためにsensorValueをリセット
sensorValue = 0;
// 1秒ごとに読み取る
delay(1000);
}
  • ステップ3. デモをアップロードします。コードのアップロード方法がわからない場合は、コードのアップロード方法を確認してください。

  • ステップ4. Arduino IDEのシリアルモニタを開きます。ツール->シリアルモニタをクリックするか、ctrl+shift+mキーを同時に押します。ボーレートを9600に設定します。

  • ステップ5. キャリブレーション
    電流が流れていない場合でも、センサーは小さな出力値を持ちます。この値をゼロオフセットと呼びます。

図5. このボードのゼロオフセットは346.68mVで、電流に換算すると93.48mAです。

ゼロオフセットが存在するため、センサーは電流がない場合でも値を読み取ります。そのため、これを補正するためにパラメータ Vref を設定します。このパラメータは上記のコードブロックに記載されています。

19行目:

float Vref = 322;  
// Vrefはゼロドリフト値です。使用する前に実際に測定した値にこの値を変更する必要があります。

デモコードでは、Vrefを322に設定していますが、ゼロオフセット値はボードごとに異なります。このデモで使用しているボードの値は346.68です。したがって、21行目を次のように修正します:

float Vref = 346.68;

その後、コードを保存して再度アップロードし、ステップ2とステップ3に従います。では、確認してみましょう:

図6. 現在のゼロオフセットが0mAに調整されました

電流出力が0mAまたは小さい値になった場合、キャリブレーションが完了したことを意味します。

  • ステップ6. これで準備完了です。電流を供給してください。自由に使用できますが、これは10A DC電流センサーであることを忘れないでください。電流が10Aを超えないようにしてください!

結果の計算式を知りたい場合は、FAQ Q1を参照してください。

Raspberry Piで遊ぶ

必要な材料

Raspberry PiGrove Base Hat for RasPi10A DC Current Sensor
今すぐ購入今すぐ購入今すぐ購入

ハードウェア接続

  • ステップ1. Grove Base HatをRaspberry Piに接続します。

  • ステップ2. Grove - 10A DC Current Sensor(ACS70331)をBase HatのポートA0に接続します。

  • ステップ3. テストする回路の正極と負極を、ネジ端子の対応する正極と負極に接続します。

図7. このデモではDC電源を使用しています。最初は電流を0Aに設定するか、電源を入れないでください
tip

正極と負極を逆に接続すると、読み取り値が逆になります。このセンサーは使用前にキャリブレーションが必要ですので、最初に回路に電源を入れないでください。

  • ステップ4. Micro-USBケーブルを使用してRaspberry Piに電源を供給します。
caution

Raspberry Piに電源を供給するには、コンピュータのUSBポートまたはDCアダプタを使用できます。ただし、Raspberry Pi 3B+を使用している場合は、DCアダプタで電源を供給することを強くお勧めします。PCのUSBポートを使用すると、Raspberry Pi 3B+が損傷する可能性があります。

ソフトウェア

  • ステップ1. ソフトウェア設定に従って開発環境を構成します。

  • ステップ2. grove.pyライブラリをクローンしてソースファイルをダウンロードします。

cd ~
git clone https://github.com/Seeed-Studio/grove.py
  • ステップ3. 次のコマンドを実行してコードを実行します。
cd grove.py/grove   # デモファイルフォルダに移動
python grove_current_sensor.py 0 10A # デモプログラムを実行

その後、ターミナルに以下のように出力されます:

pi@raspberrypi:~/grove.py/grove $ python grove_current_sensor.py 0 10A
pin_voltage(mV):
324
current(mA):
8.0
()
pin_voltage(mV):
324
current(mA):
8.0
()
pin_voltage(mV):
323
current(mA):
4.0
()
pin_voltage(mV):
324
current(mA):
8.0
()
pin_voltage(mV):
324
current(mA):
8.0
()
pin_voltage(mV):
324
current(mA):
8.0
()
^CTraceback (most recent call last):
File "grove_current_sensor.py", line 200, in <module>
main()
File "grove_current_sensor.py", line 185, in main
time.sleep(1)
KeyboardInterrupt

ctrl+cを押して終了します。

note

2番目のコマンドに注意してください。ファイル名の後に2つのパラメータがあります:

  • 0 はセンサーがポートA0に接続されていることを意味します。センサーをポートA2に接続した場合、このパラメータを2に変更する必要があります。このパラメータの範囲は0-7ですが、Grove Base Hatを使用する場合、インターフェースの物理的制約により0/2/4/6のみ使用できます。
  • 10A は電流センサーのタイプが10A DCであることを意味します。
センサー電流タイプパラメータ値
Grove - 2.5A DC Current Sensor(ACS70331)DC2.5A
Grove - ±5A DC/AC Current Sensor (ACS70331)DC5A_DC
AC5A_AC
Grove - 10A DC Current Sensor (ACS725)DC10A
このシリーズには3つの電流センサーがあり、パラメータリストは上記の通りです
note

10AのDC電流センサーは小さな範囲を測定する際に大きな誤差が生じる可能性があるため、200mA以上の電流を供給してテストすることをお勧めします。また、測定環境も精度に影響を与えるため、供給電圧のリップルを可能な限り小さくしてください。

  • ステップ4 キャリブレーション.

電流が流れていない場合でも、センサーは小さな出力値を持ちます。この値をゼロオフセットと呼びます。ステップ3で示されているように、このボードのゼロオフセットは324mVであり、電流に換算すると8mAです。

ゼロオフセットが存在するため、電流が流れていない場合でもセンサーは値を読み取ります。そのため、これを補正するためにVrefというパラメータを設定します。このパラメータはpython grove_current_sensor.py内で確認できます。Grove - 10A DC Current Sensor (ACS725)の場合、デフォルトでVrefを322に設定しています。ただし、ゼロオフセットはボードごとに異なるため、最初にキャリブレーションを行う必要があります。

以下にPythonコードを示します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# The MIT License (MIT)
# Copyright (C) 2018 Seeed Technology Co.,Ltd.
#
# これはGrove Base Hat用のライブラリです。
# Raspberry Piに接続するためのGroveセンサー用です。
'''
このコードは以下のセンサー用です:
- `Grove - 2.5A DC current sensor <https://www.seeedstudio.com/Grove-2-5A-DC-Current-Sensor-ACS70331-p-2929.html>`_
- `Grove - 5A AC/DC current sensor <https://www.seeedstudio.com/Grove-5A-DC-AC-Current-Sensor-ACS70331-p-2928.html>`_
- `Grove - 10A current sensor <https://www.seeedstudio.com/Grove-10A-DC-Current-Sensor-ACS725-p-2927.html>`_
例:
.. code-block:: python
import time
from grove_current_sensor import Current
pin = 0
sensor_type = "2.5A"
# 10A電流センサーを使用する場合: pin = 0 , sensor_type = "10A"
if (sensor_type == "2.5A"):
sensitivity = 1000.0 / 800.0
Vref = 260
if (sensor_type == "5A_DC"):
sensitivity = 1000.0 / 200.0
Vref = 1498
if (sensor_type == "5A_AC"):
sensitivity = 1000.0 / 200.0
Vref = 1498
if (sensor_type == "10A"):
sensitivity = 1000.0 / 264.0
Vref = 322
averageValue = 500
ADC = Current()
while True:
if(sensor_type == "5A_AC"):
pin_voltage = ADC.get_nchan_vol_milli_data(pin,averageValue)
current = ADC.get_nchan_AC_current_data(pin,sensitivity,Vref,averageValue)
else:
temp = ADC.get_nchan_current_data(pin,sensitivity,Vref,averageValue)
current = temp[0]
pin_voltage = temp[1]

current = round(current)
print("pin_voltage(mV):")
print(pin_voltage)
print("current(mA):")
print(current)
print()
time.sleep(1)

'''

import sys
import time
from grove.i2c import Bus

ADC_DEFAULT_IIC_ADDR = 0X04

ADC_CHAN_NUM = 8

REG_RAW_DATA_START = 0X10
REG_VOL_START = 0X20
REG_RTO_START = 0X30

REG_SET_ADDR = 0XC0

__all__ = ['Current','Bus']

class Current():
'''
Grove Current Sensorクラス
'''

def __init__(self,bus_num=1,addr=ADC_DEFAULT_IIC_ADDR):
'''
I2Cの初期化。
引数:
bus_num(int): バス番号;
addr(int): I2Cアドレス;
'''
self.bus = Bus(bus_num)
self.addr = addr

def get_nchan_vol_milli_data(self,n,averageValue):
'''
nチャンネルのデータをmV単位で取得。
:param int n: ADCピン。
:param int averageValue: 平均取得頻度。
戻り値:
int: 電圧値
'''
val = 0
for i in range(averageValue):
data = self.bus.read_i2c_block_data(self.addr,REG_VOL_START+n,2)
val += data[1]<<8|data[0]
val = val / averageValue
return val

def get_nchan_current_data(self,n,sensitivity,Vref,averageValue):
'''
2.5A/5A DC/10A電流センサーでnチャンネルのデータをmA単位で取得。
:param int n: ADCピン。
:param float sensitivity: 電圧を電流に変換する係数。
:param int Vref: 無負荷時の初期電圧。
:param int averageValue: 平均取得頻度。
戻り値:
int: 電流値
'''
val = 0
for i in range(averageValue):
data = self.bus.read_i2c_block_data(self.addr,REG_VOL_START+n,2)
val += data[1]<<8|data[0]
val = val / averageValue
currentVal = (val - Vref) * sensitivity
return currentVal,val

def get_nchan_AC_current_data(self,n,sensitivity,Vref,averageValue):
'''
5A電流センサーAC出力でnチャンネルのデータをmA単位で取得。
:param int n: ADCピン。
:param float sensitivity: 電圧を電流に変換する係数。
:param int Vref: 無負荷時の初期電圧。
:param int averageValue: 平均取得頻度。
戻り値:
int: 電流値
'''
sensorValue = 0
for i in range(averageValue):
data=self.bus.read_i2c_block_data(self.addr,REG_VOL_START+n,2)
val=data[1]<<8|data[0]
if(val > sensorValue):
sensorValue=val
time.sleep(0.00004)
currentVal = ((sensorValue - Vref) * sensitivity)*0.707
return currentVal

ADC = Current()
def main():
if(len(sys.argv) == 3):

pin = int(sys.argv[1])
sensor_type = sys.argv[2]
if (pin < 8 and (sensor_type == "2.5A" or sensor_type == "5A_DC" or sensor_type == "5A_AC" or sensor_type == "10A") ):
if (sensor_type == "2.5A"):
sensitivity = 1000.0 / 800.0
Vref = 260
if (sensor_type == "5A_DC"):
sensitivity = 1000.0 / 200.0
Vref = 1498
if (sensor_type == "5A_AC"):
sensitivity = 1000.0 / 200.0
Vref = 1498
if (sensor_type == "10A"):
sensitivity = 1000.0 / 264.0
Vref = 322
averageValue = 500

while True:

if(sensor_type == "5A_AC"):
pin_voltage = ADC.get_nchan_vol_milli_data(pin,averageValue)
current = ADC.get_nchan_AC_current_data(pin,sensitivity,Vref,averageValue)
else:
temp = ADC.get_nchan_current_data(pin,sensitivity,Vref,averageValue)
current = temp[0]
pin_voltage = temp[1]

current = round(current)
print("pin_voltage(mV):")
print(pin_voltage)
print("current(mA):")
print(current)
print()
time.sleep(1)

else:
print("パラメータ入力エラー!")
print("以下のようにパラメータを入力してください: python grove_current_sensor 0 2.5A")
print("パラメータ1: 0-7")
print("パラメータ2: 2.5A/5A_DC/5A_AC/10A")

else:
print("以下のようにパラメータを入力してください: python grove_current_sensor 0 2.5A")
print("パラメータ1: 0-7")
print("パラメータ2: 2.5A/5A_DC/5A_AC/10A")


if __name__ == '__main__':
main()

コードブロックの156行目で Vref を変更できます:


if (pin < 8 and (sensor_type == "2.5A" or sensor_type == "5A_DC" or sensor_type == "5A_AC" or sensor_type == "10A") ):
if (sensor_type == "2.5A"):
sensitivity = 1000.0 / 800.0
Vref = 260
if (sensor_type == "5A_DC"):
sensitivity = 1000.0 / 200.0
Vref = 1498
if (sensor_type == "5A_AC"):
sensitivity = 1000.0 / 200.0
Vref = 1498
if (sensor_type == "10A"):
sensitivity = 1000.0 / 264.0
Vref = 322
averageValue = 500

ご覧の通り、10A電流センサーの場合、デフォルトの Vref は322です。そして、ステップ3では、電流がない場合のゼロオフセット値が324mVであることがわかります。では、これを324に変更しましょう。

            if (sensor_type == "10A"):
sensitivity = 1000.0 / 264.0
Vref = 324

では、このデモを再度実行してみましょう。


pi@raspberrypi:~/grove.py/grove $ python grove_current_sensor.py 0 10A
pin_voltage(mV):
324
current(mA):
0.0
()
pin_voltage(mV):
325
current(mA):
4.0
()
pin_voltage(mV):
324
current(mA):
0.0
()
pin_voltage(mV):
323
current(mA):
-4.0
()
pin_voltage(mV):
324
current(mA):
0.0

さて、以前よりも良くなりましたね。これで電流をより正確に測定できるようになりました 😄

FAQ

Q1# 電流計算の公式は何ですか?

A1: 動作原理の部分が非常に複雑だと感じる場合は、簡単に説明しましょう。テスト対象の回路内の電流が磁場を励起し、それがGMR素子の抵抗値を変化させます。そして、ブリッジ内の抵抗変化がチップの出力電圧の変化を引き起こします。この出力電圧を VIOUT と呼びます。

VIOUT = Sens × Ip + VIOUT(Q)

Sens: Sensは電流を出力電圧に変換する係数です。このモジュールでは264mA/Vです。
Ip: Ipはテスト対象の回路内の電流値です(単位:mA)。
VIOUT(Q): VIOUT(Q)は、Ipが0mA(つまり、テスト対象の回路に電流がない場合)の出力電圧です(単位:mV)。

ここで電流値を求める公式が登場します:

Ip = (VIOUT - VIOUT(Q)) / Sens

では、図5を見てみましょう。ここで、テスト対象の回路内の実際の電流値が0である場合でも、出力の電流値が0でない理由を説明します。図5では、initialValueが346.68mVで、これは VIOUT に相当します。電流は93.48mAで、これは Ip に相当します。VIOUT(Q) はコード内で設定した Vref です。図5では265です。そして、Sens は264mA/V、つまり264mA/1000mVです。では、計算してみましょう:

{(346.68mV-322mV) / (264mA/1000mV)} = 93.48mA

したがって、図6では、Vref を346.68に設定すると、Ip は0mAになります。

回路図オンラインビューア

リソース

技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートを提供しております。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。

Loading Comments...