Interfacing Sensor Arus ACS712 Dengan Arduino
ACS712 (ditunjukkan pada Gambar 1) merupakan modul sensor yang digunakan untuk mengukur arus listrik, baik arus bolak-balik (AC) maupun arus searah (DC), dengan memanfaatkan prinsip efek Hall. Prinsip kerja efek Hall didasarkan pada pengaliran arus beban melalui suatu jalur konduktor tembaga, yang kemudian menghasilkan medan magnet. Medan magnet ini selanjutnya dideteksi oleh elemen sensor Hall untuk menentukan besarnya arus yang mengalir.
Gambar 1. Module Sensor ACS712
Medan magnet yang dihasilkan oleh aliran arus tersebut selanjutnya dikonversi menjadi sinyal tegangan oleh IC berbasis efek Hall. Besarnya tegangan keluaran berbanding lurus dengan arus listrik yang mengalir melalui konduktor, sehingga perubahan arus dapat diukur secara tidak langsung melalui perubahan tegangan.
Modul sensor ACS712 tersedia dalam tiga varian yang dibedakan berdasarkan rentang arus pengukurannya, yaitu:
- ACS712-05B untuk pengukuran arus dalam rentang -5A sampai 5A
- ACS712-20A untuk pengukuran arus dalam rentang -20A sampai 20A
- ACS712-30A untuk pengukuran arus dalam rentang -30A sampai 30A
Pemilihan varian sensor harus disesuaikan dengan kebutuhan dan besarnya arus yang akan diukur agar diperoleh hasil pengukuran yang optimal. Gambar 2 berikut menunjukkan konfigurasi aplikasi tipikal (typical application) dari modul sensor ACS712 dalam suatu rangkaian pengukuran arus.
Gambar 2. ACS712 typical Application
Dengan tingkat akurasi yang baik, harga yang relatif terjangkau, serta dimensi yang ringkas, modul ACS712 sangat sesuai untuk diterapkan pada berbagai aplikasi dan proyek elektronika. Beberapa contoh penerapannya antara lain:
- Kontrol motor
- Deteksi dan managemen arus beban
- Switching Power Supply
- Proteksi gangguan arus berlebih, dll.
Selain itu, sensor ini juga dapat digunakan pada berbagai aplikasi lain yang memerlukan pemantauan arus listrik secara andal.
Gambar 3 menunjukkan grafik sensitivitas yang tercantum pada datasheet masing-masing varian sensor ACS712, yaitu ACS712 5A, ACS712 20A, dan ACS712 30A. Berdasarkan karakteristik linier yang ditampilkan pada grafik tersebut, dapat disimpulkan beberapa parameter penting sebagai berikut:
- Offset tegangan output = 2,5V
- ACS712 5A mempunyai sensitivitas 185 mV/A
- ACS712 20A mempunyai sensitivitas 100 mV/A
- ACS712 30A mempunyai sensitivitas 66 mV/A
Perbedaan nilai sensitivitas pada setiap varian sensor mengharuskan penyesuaian dalam proses pemrograman, khususnya pada perhitungan arus berdasarkan tegangan keluaran sensor. Oleh karena itu, rumus yang digunakan dalam program harus disesuaikan dengan tipe ACS712 yang digunakan dengan mengacu pada nilai sensitivitas masing-masing sensor.
Pada artikel ini, contoh program disusun menggunakan sensor ACS712 20A. Apabila digunakan tipe ACS712 yang berbeda, maka parameter sensitivitas dalam rumus perhitungan perlu diubah sesuai dengan data datasheet agar hasil pengukuran arus yang diperoleh tetap akurat.
Gambar 3. ACS712 Sensitivity Graphics
Spesifikasi ACS712
Berikut ini adalah spesifikasi dan feature dari sensor ACS712 :
- Low-noise analog signal path
- Device bandwidth is set via the new FILTER pin
- 5 μs output rise time in response to step input current
- 80 kHz bandwidth
- Total output error 1.5% at TA = 25°C
- Small footprint, low-profile SOIC8 package
- 1.2 mΩ internal conductor resistance
- 2.1 kVRMS minimum isolation voltage from pins 1-4 to pins 5-8
- 5.0 V, single supply operation
- 66 to 185 mV/A output sensitivity
- Output voltage proportional to AC or DC currents
- Factory-trimmed for accuracy
- Extremely stable output offset voltage
- Nearly zero magnetic hysteresis
- Ratiometric output from supply voltage
Hardware Yang Dibutuhkan
Perangkat keras (hardware) yang digunakan pada contoh program pengukuran arus menggunakan sensor ACS712 dengan Arduino dalam tutorial ini meliputi beberapa komponen utama, yaitu :
- Modul Sensor Arus ACS712 5A / ACS712 20A / ACS712 30A
- Arduino UNO / Arduino Nano / Arduino Pro Mini atau lainnya
- Beberapa kabel jumper M-F / F-F
- Beban / Load bisa menggunakan Lampu / Bor / Power Supply + Kabel
Rangkaian / Wiring Diagram
Berikut ini adalah koneksi rangkaian antara modul ACS712 dengan Arduino.
Code pemrograman Arduino
1. Pengukuran Arus DC
/*
Measuring DC Current Using ACS712 - www.gapmekatron.com
*/
const int analogIn = A0;
int mVperAmp = 100; // 185 = ACS712 5A, 100 = ACS712 20A, 66 = ACS712-30A
int RawValue= 0;
int ACSoffset = 2500;
double Voltage = 0;
double Amps = 0;
void setup(){
Serial.begin(9600);
pinMode(analogIn, INPUT);
}
void loop(){
RawValue = analogRead(analogIn);
Voltage = (RawValue / 1023) * 5000; // Voltage ( mV )
Amps = ((Voltage - ACSoffset) / mVperAmp);
// Display the Value to Serial Monitor Window
Serial.print("Raw Value = " ); // shows pre-scaled value
Serial.println(RawValue);
Serial.print("mV = "); // shows the voltage measured
Serial.println(Voltage,3); // display 3 digits after decimal point
Serial.print("Amps = "); // shows the voltage measured
Serial.println(Amps,3); // display 3 digits after decimal point
delay(2500);
}
2. Pengukuran Arus AC
/*
Measuring AC Current Using ACS712 - www.gapmekatron.com
*/
const int analogIn = A0;
int mVperAmp = 100; // 185 = ACS712 5A, 100 = ACS712 20A, 66 = ACS712-30A
int ACSoffset = 2500;
double Voltage = 0;
float amplitude_current; //amplitude current
float effective_value; //effective current
void setup()
{
Serial.begin(9600);
pinMode(analogIn, INPUT);
}
void loop()
{
int sensor_max;
sensor_max = getMaxValue();
Serial.print("Sensor_max = ");
Serial.println(sensor_max);
Voltage = (sensor_max / 1023) * 5000; // Voltage ( mV )
amplitude_current = ((Voltage - ACSoffset) / mVperAmp);
effective_value = amplitude_current / 1.414;
Serial.print("Current Max (A) : ");
Serial.println(amplitude_current,6);//6 number after the decimal point
Serial.print("Current RMS (A) : ");
Serial.println(effective_value,6);
Serial.println();
}
/*
Function: Sampling 5000ms and get the maximum value from A0 pin
*/
int getMaxValue()
{
int sensorValue; //value read from the sensor
int sensorMax = 0;
uint32_t start_time = millis();
while((millis()-start_time) < 5000)
{
sensorValue = analogRead(analogIn);
if (sensorValue > sensorMax)
{
//record the maximum sensor value
sensorMax = sensorValue;
}
}
return sensorMax;
}
