Датчик тока ACS712: подключение к Arduino и измерение тока
«Сколько жрёт мой проект?» — вопрос, который новички решают гаданием: щупают провод (тёплый — значит много), смотрят на просадку светодиода. Мультиметр честнее, но его надо втыкать в разрыв цепи в режиме амперметра, а потом вынимать и собирать схему заново. ACS712 живёт в цепи постоянно: модуль в разрыве линии питания нагрузки, а Arduino читает амперы с аналогового пина хоть каждую миллисекунду — ток мотора или помпы виден в Serial в реальном времени.
Ниже — как чип превращает ток в напряжение, чем отличаются версии 5A, 20A и 30A, скетч с усреднением и таблица вариантов. Граница тоже честная: новичкам — только слаботочный постоянный ток, про 220 В отдельный абзац. Датчик уже лежит в палитре «Макетка» нашего симулятора — попробуйте его, не дожидаясь посылки с маркетплейса.
Как устроен ACS712: ток в провод, поле в чип, напряжение в пин
Внутри модуля — медная перемычка, через которую течёт измеряемый ток, и чип на эффекте Холла рядом с ней. Ток создаёт магнитное поле, чип меряет его и выдаёт напряжение: 0 А — ровно половина питания (2,5 В), плюс ток — напряжение растёт, минус — падает. Измеряемая цепь с Arduino не соединяется электрически: развязка 2,1 кВ, поэтому перепутать клеммы не страшно — показания просто сменят знак. Следствие для практики: выход цепляется на A0-A5 и читается analogRead — никаких библиотек, голая математика.
Версии 5A, 20A, 30A: что купить под свою задачу
Модули различаются диапазоном и чувствительностью — мВ на ампер. Чем меньше диапазон, тем выше чувствительность: версия 5A видит вибромоторчик, версия 30A его не заметит на фоне шума. Один шаг analogRead на Uno — это 5 В / 1023 ≈ 4,89 мВ, делим на чувствительность — получаем разрешение в амперах.
| Версия | Диапазон | Чувствительность | Шаг измерения на Uno | Под что |
|---|---|---|---|---|
| ACS712-05B | −5…+5 А | 185 мВ/А | ~26 мА | датчики, светодиоды, моторчики |
| ACS712-20A | −20…+20 А | 100 мВ/А | ~49 мА | моторы с драйвером, питание робота |
| ACS712-30A | −30…+30 А | 66 мВ/А | ~74 мА | мощные нагрузки, где точность не важна |
Практический ориентир: для слаботочной макетки берите 5A. Проекты до 1 А на 30-й версии — рулетка с делениями в сантиметр. Нужно разрешить десятки миллиампер — ставьте внешний 16-битный АЦП ADS1115.
Подключение: датчик в разрыв плюсовой линии
- Клеммы IP+ и IP− стоят в разрыв плюсового провода нагрузки: от «+» питания в IP+, из IP− дальше к мотору.
- VCC модуля — на 5 В Arduino, GND — на землю, земли общие.
- Аналоговый выход — на A0; читается обычным analogRead.
- Направление тока задаёт знак: от IP+ к IP− — значения выше 512, наоборот — ниже.
Питание строго 5 В: выход привязан к половине питания, при 3,3 В середина шкалы уедет. Для первого опыта возьмите нагрузку, которую не жалко: вибромоторчик на транзисторе — его ток как раз в зоне чувствительности 5A-версии.
Формула: из сырого analogRead в амперы
Считается в два шага: сырые единицы АЦП переводим в вольты, вольты — в амперы делением на чувствительность. Для 5A-версии на Uno: I = (raw − 512) × 4,89 мВ / 185 мВ/А. Сырое 512 — это 0 А, сырое 700 — примерно +5 А. В симуляторе шкала упрощена: весь диапазон АЦП растянут на ±5 А, ампер двигает показание на ~102 единицы (raw = 512 + I × 102,4), а не на 38, как у реального чипа. Логика «сместить от середины 512» та же — код переносится без правок, меняется только множитель.
const byte PIN_ACS = A0;const float SENS = 0.185; // В/А: 0.185 — 5A, 0.100 — 20A, 0.066 — 30Aconst float VCC = 5.0;float zero = 512.0; // середину откалибруем в setup() void setup() { Serial.begin(9600); // Калибровка нуля: нагрузка ВЫКЛЮЧЕНА — что видит АЦП, то и 0 А long sum = 0; for (byte i = 0; i < 200; i++) { sum += analogRead(PIN_ACS); delay(2); } zero = sum / 200.0;} void loop() { long sum = 0; for (byte i = 0; i < 100; i++) { sum += analogRead(PIN_ACS); delay(2); } float raw = sum / 100.0; float volts = (raw - zero) * VCC / 1023.0; float amps = volts / SENS; Serial.print("raw="); Serial.print(raw, 1); Serial.print(" I="); Serial.print(amps, 3); Serial.println(" A"); delay(500);}Калибровка нуля в setup() — не украшение: у реальных модулей середина уплывает на 5-10 единиц от питания и температуры, и без неё «выключенный» проект покажет 0,1-0,2 А. Усреднение по 100 точкам убирает дрожь последней цифры. Поверить датчик руками можно мультиметром — лендинг про мультиметр для Arduino.
Соберите стенд без железа: откройте симулятор — в палитре «Макетка» лежит «Датчик тока ACS712»: ползунок −5…+5 А, а analogRead видит то же, что плата. Дальше: датчик уровня воды — в паре это контроль тока помпы, и урок про ток в проекте.