Grove - 10A DC電流センサー (ACS725)
この文書は 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) はホール効果原理に基づいており、差動ホール検出により共通モードを排除します。
ハードウェア概要
対応プラットフォーム
Arduino | Raspberry Pi | |||
---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
はじめに
テスト中に人体がモジュールに触れることは禁止されています。そうしないと感電の危険があります。
Arduinoで遊ぶ
必要な材料
Seeeduino V4.2 | Base Shield | 10A DC Current Sensor (ACS725) |
---|---|---|
![]() | ![]() | ![]() |
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
さらに、Seeeduino Lotus M0+を検討することもできます。これはSeeeduino V4.2とBase Shieldの組み合わせに相当します。
ハードウェア接続
ステップ1. Grove - 10A DC Current Sensor(ACS725)をBase ShieldのA0ポートに接続します。
ステップ2. テストする回路の正極と負極を、ネジ端子の対応する正極と負極に接続します。
正極と負極を逆に接続すると、読み取り値が逆になります。このセンサーは使用前にキャリブレーションが必要ですので、最初に回路に電源を入れないでください。
ステップ3. Grove - Base ShieldをSeeeduinoに差し込みます。
ステップ4. USBケーブルを使用してSeeeduinoをPCに接続します。
ソフトウェア
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. キャリブレーション
電流が流れていない場合でも、センサーは小さな出力値を持ちます。この値をゼロオフセットと呼びます。
ゼロオフセットが存在するため、センサーは電流がない場合でも値を読み取ります。そのため、これを補正するためにパラメータ Vref を設定します。このパラメータは上記のコードブロックに記載されています。
19行目:
float Vref = 322;
// Vrefはゼロドリフト値です。使用する前に実際に測定した値にこの値を変更する必要があります。
デモコードでは、Vrefを322に設定していますが、ゼロオフセット値はボードごとに異なります。このデモで使用しているボードの値は346.68です。したがって、21行目を次のように修正します:
float Vref = 346.68;
その後、コードを保存して再度アップロードし、ステップ2とステップ3に従います。では、確認してみましょう:
電流出力が0mAまたは小さい値になった場合、キャリブレーションが完了したことを意味します。
- ステップ6. これで準備完了です。電流を供給してください。自由に使用できますが、これは10A DC電流センサーであることを忘れないでください。電流が10Aを超えないようにしてください!
結果の計算式を知りたい場合は、FAQ Q1を参照してください。
Raspberry Piで遊ぶ
必要な材料
Raspberry Pi | Grove Base Hat for RasPi | 10A DC Current Sensor |
---|---|---|
![]() | ![]() | ![]() |
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
ハードウェア接続
ステップ1. Grove Base HatをRaspberry Piに接続します。
ステップ2. Grove - 10A DC Current Sensor(ACS70331)をBase HatのポートA0に接続します。
ステップ3. テストする回路の正極と負極を、ネジ端子の対応する正極と負極に接続します。
正極と負極を逆に接続すると、読み取り値が逆になります。このセンサーは使用前にキャリブレーションが必要ですので、最初に回路に電源を入れないでください。
- ステップ4. Micro-USBケーブルを使用してRaspberry Piに電源を供給します。
Raspberry Piに電源を供給するには、コンピュータのUSBポートまたはDCアダプタを使用できます。ただし、Raspberry Pi 3B+を使用している場合は、DCアダプタで電源を供給することを強くお勧めします。PCのUSBポートを使用すると、Raspberry Pi 3B+が損傷する可能性があります。
ソフトウェア
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
を押して終了します。
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) | DC | 2.5A |
Grove - ±5A DC/AC Current Sensor (ACS70331) | DC | 5A_DC |
AC | 5A_AC | |
Grove - 10A DC Current Sensor (ACS725) | DC | 10A |
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になります。
回路図オンラインビューア
リソース
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートを提供しております。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。