Как подключить трансформатор тока к ардуино

Обновлено: 01.05.2024

Как подключить датчик тока к Arduino

Датчики тока, как следует из их названия, служат для измерения силы тока. Существуют датчики, которые основаны на различных физических эффектах и имеют различные особенности. В частности, рассматриваемый датчик ACS712 основан на эффекте Холла, датчик INA219 имеет в своём составе аналого-цифровой преобразователь (АЦП ), а датчик INA3221 – трёхканальный. Рассмотрим их по порядку.

Содержание:

1 Описание датчикатока ACS712

Датчик тока ACS712 – это датчик, который основан на эффекте Холла. Эффект Холла заключается в том, что когда через проводник, помещённый в магнитное поле, протекает электрический ток, в проводнике возникает напряжение. Это напряжение и служит индикатором силы тока: оно линейно зависит от силы тока. Ещё оно имеет небольшую зависимость от температуры окружающей среды и поддаётся влиянию внешних магнитных полей. Так, например, на графике ниже показана зависимость напряжения на выходе датчика ACS712 от силы протекающего тока (для одной из разновидностей датчика, об этом чуть ниже) при различных температурах:

Зависимость напряжения на выходе датчика ACS712 от силы тока

Зависимость напряжения на выходе датчика ACS712 от силы тока

Модуль с датчиком ACS712 может выглядеть, например, так:

Модуль с датчиком тока ACS712 и схема подключения

Модуль с датчиком тока ACS712 и схема подключения

Датчик ACS712 имеет следующие характеристики:

  • работает с постоянным и переменным током;
  • ток потребления – до 13 мА;
  • температура эксплуатации -40…+85 °C.

Существуют несколько разновидностей датчика ACS712, которые отличаются величиной измеряемого тока. Так, существуют разновидности с максимально измеряемым током 5, 20 и 30 А. Широкий диапазон измеряемых значений тока можно отнести к существенным преимуществам датчика ACS712. Перечисленные модификации имеют чувствительность 185, 100 и 66 мВ/А соответственно.

2 Подключение датчика тока ACS712 к Arduino

Как мы помним из курса школьной физики, для измерения тока необходимо пропустить ток через измерительный прибор, помещённый в разрыв между источником питания и нагрузкой. Соответственно, схема подключения датчика проста:

Вывод датчика ACS712Назначение
VCCПитание, 5 В
GNDЗемля
OUTАналоговый выход датчика, напряжение на котором линейно зависит от протекающего через датчик тока
IP+Вывод 1 для подачи измеряемого тока
IP-Вывод 2 для подачи измеряемого тока

Выводы IP+ и IP- как раз и есть тот разрыв цепи, через который нужно пропустить интересующий ток. Если перепутать полярность, то измерения будут с обратным знаком.

Кстати, эта особенность – измерять ток как с положительным, так и отрицательным знаком, позволяет использовать датчик ACS712 для измерений переменного тока.

Таким образом, для подключения датчика ACS712 к плате Arduino используются 3 провода:

Схема подключения датчика тока ACS712 к Arduino

Схема подключения датчика тока ACS712 к Arduino

Выход сенсора VOUT подключим к любому аналоговому выводу Arduino, например, A0. В качестве нагрузки будем использовать двигатель постоянного тока.

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – двигатель постоянного тока

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – двигатель постоянного тока

Либо вместо нагрузки можно использовать мощную лампу накаливания. Либо любую другую нагрузку.

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – 10 Вт лампа накаливания

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – 10 Вт лампа накаливания

Питать нагрузку будем от лабораторного источника тока, на котором можно менять напряжение и ток.

3 Чтение показаний датчика тока ACS712с помощью Arduino

В скетче будем постоянно читать значение с порта A0 и выводить в монитор последовательных данных. Напомню, АЦП у разных плат Arduino имеет различную разрядность, обычно 10 или 12 бит. Подробнее здесь. Это означает, что с аналогового порта могут приходить значения от 0 до 2 10 = 1024 для 10-разрядного АЦП . Будем считать, что у нас датчик тока, диапазон измерений которого от -5 А до +5 А, а чувствительность 185 мВ/А.

Пояснение принципа вычисления силы тока

Пояснение принципа вычисления силы тока

На практике значение на аналоговом выводе A0 не будет равняться точно 512. Поэтому, чтобы определить начало отсчёта, добавим в скетч примитивную калибровку. Калибровка будет заключаться в том, что некоторое количество раз прочитаем значение с аналогового порта A0 при отсутствии тока на датчике ACS712, и усредним его. Естественно, нагрузка на время калибровки должна быть выключена, чтобы ток не протекал через датчик.

Скетч для измерения постоянного тока датчиком ACS712 (разворачивается)

Загрузим скетч и плавно начнём поднимать напряжение и ток на нагрузке. Какое-то время подождём, а затем начнём уменьшать ток. В результате получим примерно такую картинку:

Вывод тока датчика ACS712 в монитор последовательного порта и его график

Вывод тока датчика ACS712 в монитор последовательного порта и его график

Как видно, аналоговый сигнал постоянно «прыгает». Чтобы этого избежать, следует добавить в скетч сглаживание. Для этого будем проводить подряд несколько измерений, а затем брать среднее арифметическое от них в качестве действительного значения. Заодно совместим начальную калибровку, т.к. она выполняется точно так же. Вот как изменится в результате скетч:

Скетч для измерения постоянного тока датчиком ACS712 со сглаживанием

Кстати, желательно вынести чувствительность датичка ACS712 в константу в начале скетча, чтобы можно было быстро изменить скетч для модификации датчика с другим диапазоном измерений.

В результате выполнения данного скетча картинка получается гораздо более приятная:

Сглаженный график тока, измеренного датчиком ACS712

Сглаженный график тока, измеренного датчиком ACS712

Тот же самый принцип заложен в библиотеки для Arduino, которые оперируют с датчиком тока ACS712. Например, вот эта библиотека Troyka Current.

По результату эксперимента получается, что датчик ACS712 очень простой, но при этом довольно не точный. Гораздо точнее датчик тока, который мы рассмотрим в следующем разделе.

4 Описание датчика тока,напряжения и мощности INA219

Датчик INA219 – цифровой датчик тока, напряжения и мощности. Он позволяет измерять напряжения от 0 до 26 вольт и ток от 0 до 3,2 ампер. Питается датчик напряжением от 3 до 5,5 В. Существуют модули, полностью готовые к подключению к Arduino. Один из таких модулей GY-219:

Модуль GY-219 с датчиком тока INA219: назначение выводов и частей

Модуль GY-219 с датчиком тока INA219: назначение выводов и частей

Датчик INA219 выполняется в двух разновидностях: A и B. Последняя отличается повышенной точностью и меньшей погрешностью. На фото ниже как раз модификация INA219B.

Модуль GY-219 с датчиком тока INA219

Модуль GY-219 с датчиком тока INA219

Для конфигурирования датчика INA219 и для считывания показаний с него используется последовательный интерфейс I2C. Причём адрес на шине можно задать с помощью перемычек A0 и A1 на модуле. Допустимые адреса:

  • 0x40 (без перемычек);
  • 0x41 (с перемычкой A0);
  • 0x44 (с перемычкой A1);
  • 0x45 (установлены обе перемычки).

Соответственно, на одной шине IIC можно иметь до 4-х таких датчиков, подключённых одновременно.

5 Подключение датчика тока и напряжения INA219 к Arduino

Для начала пойдём простым путём: скачаем готовую библиотеку, загрузим в Arduino и посмотрим на результат. Существует несколько библиотек для работы с нашим датчиком. Предлагаю воспользоваться вот этой популярной библиотекой для INA219 от Adafruit. Скачаем её, установим стандартным образом и загрузим в Arduino скетч из примеров getcurrent.

Установка недостающих библиотек через менеджер библиотек Arduino IDE

Установка недостающих библиотек через менеджер библиотек Arduino IDE

Подключим модуль GY-219 к Arduino по следующей схеме. SDA и SCL датчика можно подключить как к аналоговым входам A4 и A5 Arduino, так и к специально выделенным портам SDA и SCL (если они есть на вашей плате).

Схема подключения датчика INA219 к Arduino

Схема подключения датчика INA219 к Arduino

В качестве нагрузки может быть любой источник, например, электромотор, лампа или просто мощный резистор. У меня это 5 соединённых параллельно 5-ваттных 16-омных резисторов. В качестве источника питания также может выступать любой из имеющихся у вас источников. Я буду использовать лабораторный источник питания.

Датчик INA219 подключён к Arduino

Датчик INA219 подключён к Arduino

В результате выполнения скетча получится следующий вывод:

Результат работы скетча "GetCurrent" для датчика тока INA219

Результат работы скетча "GetCurrent" для датчика тока INA219

Отлично! Всё работает! Как говорится, бери – и пользуйся.

Данная библиотека позволяет также проводить калибровку датчика INA219 при необходимости. Подробности – в описании библиотеки и в самих исходниках (в файле Adafruit_INA219.cpp библиотеки даётся большое число пояснений).

6 Как читать данные сдатчика тока и напряжения INA219

Если посмотреть на обмен данными по шине I2C, который происходит при работе данного скетча (с помощью логического анализатора, конечно), то увидим следующее.

Осциллограмма чтения регистров датчика INA219

Осциллограмма чтения регистров датчика INA219

Чтобы понять, что здесь происходит, необходимо познакомиться с картой регистров датчика INA219. Датчик содержит всего 6 регистров. Все регистры 16-разрядные.

Карта регистров датчика тока и напряжения INA219
Адрес регистраНазвание регистраНазначение регистраТип
0x00ConfigurationСброс всех регистров, настройка диапазона измерений, усиления PGA , разрешения АЦП и фильтрации.Чтение/Запись
0x01Shunt voltageХранит измеренное значение напряжения на шунтирующем резисторе 0,1 Ом.Чтение
0x02Bus voltageХранит измеренное значение напряжения шины.Чтение
0x03PowerХранит измеренное значение мощности.Чтение
0x04CurrentСодержит значение силы тока, протекающего через шунтирующий резистор.Чтение
0x05CalibrationКалибровочный регистр. Задаёт диапазон измерений и позволяет осуществлять калибровку системы.Чтение/Запись

Чтение регистров датчика тока INA219 с помощью FT2232H

Чтение регистров датчика тока INA219 с помощью FT2232H

Запустим программу SPI via FTDI, выберем в меню «Устройство» интерфейс I2C. Подключимся к порту A. Просканируем устройства на шине I2C. Программа найдёт устройство по адресу 64 (0x40), если конечно вы не меняли адрес перемычками A0 и A1. Выберем это устройство. В разделе «Чтение» зададим размер буфера 2 байта, напишем команду 00 и нажмём кнопку «Прочитать». Прочитанные данные будут в таблице, которая открывается по нажатию на кнопку с пиктограммой таблицы. Вот что мы увидим.

Чтение регистров датчика тока INA219 с помощью FT2232H и программы "SPI via FTDI"

Чтение регистров датчика тока INA219 с помощью FT2232H и программы "SPI via FTDI"

Как вы уже наверное догадались, команда "0" означает адрес регистра, из которого мы хотим прочитать данные. А число 0x399F – это данные в нулевом регистре (регистр конфигурации). И это соответствует документации, т.к. после включения и загрузки микросхема INA219 имеет именно такую конфигурацию по умолчанию. Вот какую структуру имеет регистр конфигурации.

Структура конфигурационного регистра датчика тока INA219

Структура конфигурационного регистра датчика тока INA219

В регистре конфигурации датчика INA219 присутствуют следующие части:

  • RST (reset) – сброс;
  • BRNG (bus voltage range) – диапазон измерения шины;
  • BADC (bus ADC resolution/averaging) – разрешающая способность АЦП шины;
  • SADC (shunt ADC resolution/averaging) – разрешающая способность АЦП шунта;
  • MODE – режим;
  • PG – усиление и диапазон PGA .

0x399F в двоичном виде это "001_11_0011_0011_111". Следовательно, значения по умолчанию после включения такие.

  • BRNG равен "1", что означает диапазон измерений 32 вольта FSR ;
  • PG равно "11": задаёт диапазон ±320 мВ и коэффициент усиления 8;
  • BADC, SADC равны "0011": максимальная разрешающая способность АЦП – 12 бит;
  • MODE, равное "111", означает непрерывный режим работы, включены и шунт, и шина.

Для чтения других регистров необходимо сначала так же записать их адрес в поле «Чтение» «Команда», а затем прочитать 2 байта. Или можно записать номер регистра в поле «Запись» «Команда», а затем просто читать (не указывая адрес регистра в команде чтения).

К сожалению, последовательного чтения всех регистров микросхемы INA219 «за один проход» не предусмотрено.

Вывод монитора порта в момент снятия осциллограммы с датчика INA219

Вывод монитора порта в момент снятия осциллограммы с датчика INA219

Рассмотрим, как привести данные в регистрах «в человеческий вид». Нам интересны не все значения, а только напряжения и ток. Плюс регистр калибровки, который играет роль поправочного коэффициента.

Регистр Shunt Voltage (адрес 0x01) датчика INA219

Напряжение на шунте равняется тому значению, которое записано в регистре, поделённое на 100: Uшунта = Shunt_voltage/100 = 0x1957/100 = 64.87 (мВ) Для случаев, когда напряжение отрицательное, расчёт несколько сложнее. Это можно посмотреть в техническом описании (datasheet).

Регистр Bus Voltage (адрес 0x02) датчика INA219

Начнём с регистра, в котором записано напряжение шины, т.к. он самый простой. В текущий момент данные в нём это 0x19BA. Согласно всё тому же техническому описанию (datasheet на INA219), для преобразования значения в милливольты необходимо сделать следующее: Uшины = (0x19BA >> 3) × 32000 (мВ) / 8000 = 3292 (мВ).

Здесь 0x19BA это значение в регистре. Его нужно сдвинуть на 3 разряда вправо, т.к. данные о напряжении хранятся, начиная с 3-го разряда. 32000 (мВ) – это предел шкалы измерения (он указан в регистре конфигурации). А 8000 – это предел шкалы измерения в отсчётах. Получается 3292 (мВ) или 3.29 вольта, что мы и видим в выводе скетча в мониторе порта Arduino.‬

Регистр Current Register (адрес 0x04) датчика INA219

Значение тока рассчитывается тоже просто: I = 0x1959 × 0x1000 / 4096 = 6489.

Значение в регистре напряжения шунта 0x1959 умножается на значение регистра калибровки, который в нашем случае равен 0x1000. А затем результат делится на 4096 (что, кстати, то же самое, что 0x1000). То есть ток получается равным 6489. Но в каких единицах? Чтобы ответить на этот вопрос, необходимо определить параметр Current_LSB: Current_LSB = 0.04096 / 0x1000 / 0.1 (Ом) = 0.0001 Здесь 0x1000 – значение регистра калибровки, 0.1 (Ом) – сопротивление шунта, а 0.04096 – просто коэффициент. Теперь посчитанный ток нужно умножить на число Current_LSB, и получим 0.6489 (А) или 648,90 (мА). Такой ток мы видим и в мониторе.

Регистр Power (адрес 0x03) датчика INA219

Мощность рассчитывается как произведение напряжения на шине и тока: P = Uшины × I = 3292 (мВ) × 648.9 (мА) = 2136 (мВт)

Небольшое расхождение с выводом монитора Arduino связано с ошибкой округления. А именно, если посмотреть на вывод монитора порта, мы увидим, что значение напряжения на шине принято равным 3.29 В, в то время как в регистре записано 3.292 В. Из-за этого рассчитанное значение на 2 милливатта больше, чем показанное в выводе скетча.

7 Подключение трёхканального датчика тока и напряжения INA3221 к Arduino

Датчик тока INA3221 практически идентичен датчику INA219. Основное отличие состоит в том, что он имеет 3 измерительных канала вместо одного. Показания с них можно снимать независимо друг от друга. Будем использовать вот такую небольшую плату с датчиком:

Плата с датчиком INA3221

Плата с датчиком INA3221

Подключается данный модуль к Arduino всего 4-мя проводами: два для питания, и ещё два – шина I2C.

Вывод модуля INA3221Вывод ArduinoНазначение
SDAA4Данные шины I2C
SCLA5Импульсы синхронизации шины I2C
VS+3.3VПитание
GNDGNDОбщий
Подключение датчика INA3221 к Arduino Nano
Подключение датчика INA3221 к Arduino Nano

Назначение остальных выводов модуля показано на приведённом рисунке и в таблице ниже.

Вывод модуля INA3221Назначение
TCЦифровой выход оповещения о сбое таймингов (timing control alert).
WARЦифровой выход оповещения о сбоях измерений (warning).
CRIЦифровой выход оповещения о критических сбоях (critical).
PVЦифровой выход оповещения о валидности питающего напряжения (power valid).
VPUАналоговый вход подтягивающего напряжения для смещения выходных цепей определения валидности питания.
POWАналоговый вход питания измеряемой нагрузки.
CH1, CH2, CH3Порты для подключения измеряемых цепей.

Используем библиотеку для работы с датчиком INA3221. Поместим файлы с расширениями *.cpp и *.h в одну директорию, в ней же создадим файл с расширением *.ino и следующим содержимым:

Скетч для чтения показаний датчика INA3221

Загрузим данный скетч в память Arduino. Перед тем как подключать нагрузку, необходимо подать с источника питания напряжение на контакты POW и GND, расположенные с одного из краёв модуля. Это напряжение будет подаваться на нагрузку и оно в данном модуле общее для всех трёх измерительных каналов. Допустимый диапазон напряжений от 0 до 26 вольт. Я сейчас подам 5 В.

Удобно в места подключения нагрузки и питания впаять клеммники для быстрого монтажа.

Теперь можно подключать нагрузку. Давайте нагрузим выходы модуля и посмотрим, что будет выводиться в монитор последовательного порта. Я подключу на канал 1 два параллельных резистора номиналом 4,3 кОм, что в сумме даст сопротивление 2,15 кОм. А на канал 3 – один резистор 4,3 кОм.

Датчик тока INA3221 с нагрузкой

Датчик тока INA3221 с нагрузкой

В мониторе последовательного порта видно, как меняются показания датчика INA3221 при изменении нагрузки. На иллюстрации для примера показаны три состояния: показания датчика без нагрузки, с нагрузкой на одном канале и с разной нагрузкой на двух каналах.

Показания датчика тока INA3221 в мониторе COM-порта

Показания датчика тока INA3221 в мониторе COM-порта

Если мы подключим в измеряемую цепь амперметр, то убедимся, что показания цифрового датчика INA3221 довольно точно совпадают с показаниями амперметра.

Показания датчика тока INA3221 в сравнении с амперметром

Показания датчика тока INA3221 в сравнении с амперметром

В этой статье собраны все данные про счетчик электричества на основе Ардуино, в том числе приведены схемы, прошивки, комментарии по поводу доработки текущей версии прошивки и конструкции.

IMG_1690

Вот так оно выглядит в конечном итоге.

Часть 1. Идея, проектирование и мысли вслух.

Некоторое время назад я установил двухзонный счетчик электроенергии, чтобы воспользоваться более выгодным ночным тарифом(50% с 2300 до 0800). Оказалось, что 45% электрики мы потребляем ночью. Но ответа как происходит потребление в разрезе мест потребления. конечно это устройство не дает.

Поэтому возникла потребность в более детализированном представлении данных про потребление. Первоначально решено сделать устройство показывающее следующие данные:

  1. Текущую мощность нагрузки
  2. Потребление с начала суток
  3. Потребление с начала месяца
  4. Процент ночного потребления в %

Задаваемые в меню параметры:

Первоначальный вариант устройства будет сделан на основе следующего набора модулей:

    (вот тут уточнение по поводу подключения индикатора к мега 2560)

schetchik-elektro-energii-arduino

Прибор интересует для уточнения сколько потребляет мастерская, медиа-приспособления, кухонные принадлежности. В итоге надо получить данные в виде графиков, в Интернете или на локальном сетевом сервере (синолоджи ds212)

Начальная схема подключения узла измерения.

Схему измерений мощности и напряжения я заимствовал вот здесь. Считается средняя мощность, и не только, много других параметров, например частота, поверфактор. Для начала надо собрать вот такой небольшой стенд, для измерения.

pmon

Беру макетную плату, ищу подходящий трансформатор, для замера напряжения (беру от дежурки АТХ), и вперед.

UPD. Измерительный узел

schetchik-elektrichestva-arduino

Часть 2. Макетирование

Пока не включал часть с 220в, хотя по сути ничего смертельно тут нет. ведь все разделено гальванически.

schetchik-maket-001

Использованы также и часы, это будет первое устройство имеющее внутри задействованное RTC.

Сетевой модуль включен по схеме отсюда. Вот она:

Продолжение следует. По сути уже все работает. Кстати, довольно интересно, что отладка этого устройства заняло меньше пары часов. И то, с учетом того, что я копался с ШИМ выводов меги 2560.

Часть 2.1 Заметки про удивительные особенности ENC28J60

И вот, он подключает библиотеку, и думает что сейчас легко сделает запрос к внешнему серверу. Ан нет. Ведь сервер он задал в виде строки. А строка, к сожалению, это не память программы. Гарвардская архитектура. Все разделено.

Часть 3. Начальная отладка программного обеспечения счетчика

Сегодня немного повозился с отладкой ПО счетчика. Дело в том, что ошибочно не установил понижающий резистор, на СТ-датчик и в итоге на вход проникало слишком большое напряжение, равно как и слишком много помех. Поправил, припаял 150 ом параллельно СТ-датчику, в общем вышло около 100 ом.

В итоге замер расхода ЕН на закипание чайника показал тоже самое что и на китайском ваттметре. Уже хорошо, но придется проверить и по основному счетчику, как-то.

elektro-schetchik-maket

На дисплее не поместилась буква h после kW, но следует понимать что она там есть. Число показывает расход с начала текущего часа. В конце часа передается на сервер и сбрасывается в ноль. Потом, наверное сделаю чтобы сбрасывалось раз в сутки.

Часть 4. Делаем первую часть корпуса

korobka-dlja-arduino-chetchika

Остается сделать переднюю панель, закрепить модули, сделать выфрезеровки под USB и питание 12В. В случае с этим приборчиком, достаточно, наверное 0,7А будет, то есть можно применить нечто малогабаритное.

Часть 5 Делаем переднюю панель

Ок, продолжаю со счетчиком-показометром электроенергии. Вчера , кстати, у нас опять подняли цену на электрику. И таких поднятий будет еще несколько за следующие полтора года. Поэтому конструкция такого прибора-показометра стала более актуальной. Вот сегодня решил продолжить и приделал к корпусу переднюю панель.

Корпус электросчетчика, передняя панель

Корпус электросчетчика, передняя панель

UPD. Пару фото, как оно делается, вначале разметка отверстий, потом на минисверлилке зацентрую кнопки и сделаю отверстия по углам окна индикатора

Сверлю Ф12-м сверлом. Фрезерую и получается вот такое:Собираю на потайные винты, в этот раз

korpus-shetchika2--001

Сверху крышки еще не закручено ничего, но общий вид уже понятен.

Часть 6. Доделан макет счетчика
Ок, сегодня доделал макет электросчетчика на основе Ардуино. Купил блок питания от какого-то прибора, вроде планшета. Но он вел себя очень странно, раз в пять секунд сбрасывался. Поэтому пришлось найти другой блок, уже от мобильного. Потребление было при 12В менее 0,2А, что совсем немного.

Вот так оно выглядит в финальном варианте

Часть 7. Установка счетчика

IMG_1690

Теперь надо сделать страничку с отображением статистики потребления. Ну это совсем несложная задача. Завтра и сделаю.

Смета изготовления счетчика:

Всего 954-00 стоимость материалов и запчастей.

Часть 8. Отладка ПО

Ок, продолжаю со счетчиком. Сегодня вроде как окончил отладку прошивки счетчика электрики с выходом в интернет.

По сути. С++ ошибок не допускает. Три дня искал почему данные передаются то через час, то через раз, то вообще не передаются. Оказалось, что все просто. Первый раз программа допускала заполнение буфера путем добавления из другого.

А я уже начал было ругаться на ENC28J60. Хоть микросхема тут не виновата, совершенно. Вот такое:

Помогло. А основная проблема в том, что Arduino тяжко перепрошить удаленно. Даже 10-ть метров это уже проблема. USB кабель длинноват для такого.

Часть 9. Обновлено ПО, по результатам эксплуатации устройства

emonitoring_01

UPD. Доделал немного ПО сайта показывающего данные. Теперь там есть вольтаж по часам, почасовой и посуточный расходы.

u_after_servo

Подумываю над размещением ПО на гитхабе. Наверное. так оно и будет.

Здравсвуйте. Спасибо вам очень интересная статья!

А можно код добавить интерфейса для просмотра данных ?

К сожалению я пока не хочу раздавать код.

Борд успішно отримує IP адресу:
Serial console каже наступне:

Виглядає що не в кабелі справа,закоментував я перевірку DNS і все запустилось, що це за перевірка?

Датчики и микроконтроллеры. Часть 3. Измеряем ток и напряжение



Мы переходим к завершающей части обзорного цикла датчиков, в которой рассмотрим датчики постоянного и переменного тока и напряжения. По всем остальным датчикам, которые не попали в основную серию мы сделаем дополнительные обзоры когда они вдруг понадобятся в будущих статьях.
Данная статья открывает новый цикл материалов про измерение параметров качества электроэнергии, куда войдут вопросы подключения датчиков тока и напряжения к микроконтроллеру, рассмотрение алгоритмов работы анализаторов качества электроэнергии, смысл тех или иных показателей качества электроэнергии и что они обозначают. Кроме того, мы затронем волнующую многих тему точности оцифровки и обработки данных, упомянутую в комментариях к первой статье.
Содержание


Часть 1. Мат. часть. В ней рассматривается датчик, не привязанный к какому-то конкретному измеряемому параметру. Рассматриваются статические и динамические характеристики датчика.
Часть 2. Датчики климат-контроля. В ней рассматриваются особенности работы с датчиками температуры, влажности, давления и газового состава
Часть 3. Датчики электрических величин. В этой части я рассмотрю датчики тока и напряжения

ВНИМАНИЕ: Не вставляйте спицы в розеткуНе лезьте в сеть 220В без необходимых на то навыков!

Бывает постоянный ток, бывает переменный. Бывает все и сразу, что иногда приносит много проблем. Но об этом позже. Для начала, разберемся с терминологией.

Рисунок 1: напряжение в цепях переменного тока
При измерении переменного тока мы имеем 4 различных величины, которыми будем руководствоваться при проведении измерений. Все нижеприведенные формулы и термины применимы и к измерителю тока.
1. Мгновенное значение напряжения — это разность потенциалов между двумя точками. Измеренная в определенный момент времени. Это значение является базовым во всех остальных вычислениях. Фактически, наша задача будет заключаться в считывании последовательного набора мгновенных значений напряжения через равные промежутки времени, чтобы впоследствии с их помощью получить некие другие данные.
u = u(t) (1)
Получится примерно следующий график:

Рисунок 2: Измерение серии мгновенных значений напряжения
При выборе частоты опроса датчиков мы руководствуемся теоремой Котельникова-Шеннона, когда для того, чтобы восстановить сигнал с частотой f необходимо производить считывание с частотой Больше чем 2f. Отмечу необходимость строгого неравенства, т. е. если нам надо оцифровать сигнал с частотой 50Гц, то считывание необходимо производить с частотой, не менее 101 Гц. Но, понятное дело, чем больше тем лучше.
Если вспомнить ГОСТ на показатели качества электроэнергии, то в разделе Гармоник мы найдем, что интересными для нашего измерения являются гармоники вплоть до 40, т. е. до 2кГц. И микросхемы счетчиков электроэнергии производят считывание с частотой 4096 раз в секунду. Степень двойки выбрана для того, чтобы можно было применять быстрые алгоритмы преобразования Фурье.
Имея этот большой набор данных, собранный за единицу времени, например, 1с переходим к следующим:
2. Амплитудное значение напряжения — которое определяется как максимальное по модулю значение из нашей выборки:
(2)
где [u(t)] – массив с данными.
Для гармонических колебаний это значение используется в следующей формуле:
(3)
3. Среднее значение напряжения, т. е. Среднее арифметическое, т. е. постоянная составляющая переменного напряжения.
(4)
Где — период дискретизации аналогового сигнала. Я намеренно пишу сумму вместо интеграла. В промышленной сети переменного тока среднее значение должно быть равно нулю. Если это условие не выполняется, могут быть определенные проблемы, так как постоянный ток подмагничивает трансформаторы, вводя их в насыщение, либо подогревает питающую линию. Последнее кстати может быть полезно для решения проблемы намерзшего льда на проводах — провод подогревают и лед отваливается.
В слаботочных аналоговых цепях постоянная составляющая присутствует сплошь и рядом и может быть очень полезна. А если она нам будет мешать, то мы от нее быстро избавимся, но об этом позже.
4. Среднеквадратичное значение напряжения. — известное также как действующее значение напряжения — на линейной активной нагрузке оно совершает ту же самую работу, что и постоянное напряжение аналогичного уровня. Определяется по следующей формуле:
(5)
При измерении напряжения в розетке нас, как правило, интересует именно это самое действующее напряжение, которое составляет 230/380В.
Амплитудное и действующее значения синусоидального напряжения связаны между собой через . Во время проектирования измерительной системы нас будет интересовать в первую очередь именно амплитудное значение напряжения и тока.
Во время измерений будем руководствоваться одной из следующих схем:

Рисунок 3: Подключение измерительных приборов
Загадка для ума — обе схемы подключения правильные, но при каких обстоятельствах важно правильно выбрать одну из них? Ответы в комментариях.

Датчики напряжения


Первым делом произведем измерение напряжения. Все нижесказанное относится к напряжениям не менее напряжения питания АЦП нашего контроллера. Таким образом, нам необходимо измерить напряжение с амплитудой большей, чем АЦП способен прожевать. Следовательно, уровень напряжения необходимо понизить — т.е. произвести ослабление сигнала.
Для малых напряжений (например как термоЭДС термопары из прошлой статьи) нужна обратная задача — усиление сигнала. Это более сложная задача и мы обязательно к ней вернемся в следующих статьях.
Поставим условие для расчета наших датчиков:
Измеряемое напряжение: переменное, 0-1000В, частота 50/60Гц. Для трехфазного напряжения в 380В амплитудное составляет почти 600В, а ведь есть сети и на 660В. Так что пусть будет. На самом деле этот расчет я взял из своей железки и переделывать его мне лень.
Выходное напряжение ± 1,65В — половина от питающего +3,3В

Делитель напряжения
  • широкий диапазон напряжений и частот, определяемый номиналами резисторов;
  • высокая точность, опять таки определяемая точностью и термостабильностью резисторов;
  • измеряет постоянное и переменное напряжение.
  • отсутствует гальваническая развязка — при взаимодействии с промышленной сетью необходимо предусмотреть защиту пользователя от электрических цепей, либо использовать гальваническую развязку;
  • низкий КПД — весь ток делителя уходит в тепло;
Трансформатор напряжения
  • огромный диапазон рабочих напряжений — до сотен киловольт и выше;
  • столь необходимая гальваническая развязка.
  • работает на определенной полосе частот;
  • работает только с переменным напряжением;
Электронный изолированный датчик



Недостатков и той и другой схемы лишен электронный изолированный датчик. Фактически, он представляет собой завершенное устройство. Внутри которого имеется и делитель напряжения, и операционные усилители, и блок гальванической развязки и схема изолированного питания всего этого безобразия:

Рисунок 9: Структурная схема электронного изолированного датчика
Мне попадались на глаза только промышленные датчики с выходом по напряжению 0-10В или по току 0-10мА. В отличие от предыдущих датчиков выдает однополярный сигнал. В принципе, такую схему можно разработать и самостоятельно, применив, к примеру. изолированный аналоговый усилитель вроде HCPL-7850. Главный недостаток схемы — очень сложно и очень дорого.
И как верно отмечает в комментариях тов. progchip666

Передать аналоговый сигнал с точностью даже один процент по гальваноразвязанному интерфейсу крайне трудно, поэтому часто в этом случае приходится перегонять его в цифру и в таком виде уже перегонять.
К сожалению на усилитель, изображённый на схеме надо ещё и питание подать. Разумеется от гальваноразвязанного источника.

  • гальваническая развязка;
  • высокая точность;
  • широкий диапазон напряжений и частот;
  • измеряет постоянное и переменное напряжение.
  • дорого;
  • сложная схемотехника.
Дополнительные ссылки
Датчики тока
Измерительный шунт
  • высокая точность;
  • широкий диапазон напряжений и частот;
  • измеряет постоянный и переменный ток.
  • отсутствует гальваническая развязка;
  • низкий КПД.
Измерительный трансформатор тока
  • гальваническая развязка;
  • работа с большими токами в тысячи Ампер;
  • измеряет только переменный ток в определенном диапазоне частот(кроме катушки Роговского);
  • изменяет фазу сигнала и требует компенсации
Датчики тока на эффекте Холла
  • Датчик ACS712 – измерение постоянного и переменного тока до 30А с точностью ± 1,5%
  • Датчик ACS713 – оптимизирован для измерения постоянного тока до 30А. Имеет вдвое большую чувствительность чем его универсальный собрат.
  • Датчик ACS754 – измерение постоянного и переменного тока до 200А с точностью ± 1,5%
  • Датчик ACS755 – оптимизирован для измерения постоянного тока.
  • Датчик ACS756 – датчик для измерения постоянного и переменного тока до 100А с напряжением питания 3-5В.
  • широкий диапазон измеряемых токов с частотой до 50-100кГц и выше;
  • измеряет постоянный и переменный ток.
  • гальваническая развязка
  • Дорого
Дополнительные ссылки:
Заключение

Я поставил перед собой задачу сделать обзорный материал по датчикам, наиболее часто используемым сообществом при разработке различных устройств. Большинство датчиков не вошли в цикл лишь по той причине, что в ближайшем будущем для моих материалов они не понадобятся, но некоторые из них в планах. Обязательно сделаю отдельный материал с датчиками ускорения, угловых скоростей, компасом и примерами, так что следите за новыми статьями!

Arduino Pro Mini + токовый датчик GY-712 ведут контроль перегорания ламп

Всем привет. Хочу поделится одним из проектом созданным на базе Arduino.
Для меня работа с токовыми датчиками GY-712 была впервые. Перед созданием этого проекта создавался тестовый блок.

image

Если вам уже интересно, тогда продолжим.

Здесь я расскажу об одном модуле, так как описывать и зарисовывать 7 модулей не очень-то и легко.

Было тех задание:
1) Лампы(фонари) 50-65ВТ 220В переменка или 24В постоянка;
2) Индикация работы лампы (светодиод на панели);
3) Звуковая индикация перегоревшей лампы.

Решение было принято такое:
Используем токовый датчик GY-712 5А

image

По причинам:
1) Меряет переменный и постоянный ток;
2) Легко подключается к контроллеру;
3) Компактный;
4) Недорогой при заказе с Китая.

Давайте посмотрим на схему:

image

Как работает программа.

При старте он проверяется, включен ли тумблер, если включен ты выдается звуковой сигнал и световая индикация, что бы датчик можно было откалибровать без нагрузки. Если тумблер выключить то прога выдаст звук + индикация.
Далее идет калибровка. После калибровки – звуковой сигнал.

И стартует основная программа. Контроль тумблера, если включен то контроль тока нагрузки лампы, если ток выше заданного порога то включить индикацию если тока нет, то выключить индикацию и выдать звуковой сигнал.

Вот простая схема без контроля тумблера, просто световая индикация. Это на тот случай кому просто нужен будет световой индикатор нагрузки – но тогда можно просто намотать на ферритовое кольцо провода(сделать трансформатор тока) и подключить светодиодик.

image

image

image

image

Пример программы для одного модуля. IDE 1.5.2

float srab = 0.650;

const int currentPin1 = 0; // Аналоговый вход с датчика тока

const unsigned long sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
const unsigned long numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
const unsigned long sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time
//const int adc_zero = 512; // relative digital zero of the arudino input from ACS712 (could make this a variable and auto-adjust it)
int adc_zero1; //Переменная автоматической калибровки

void setup()
pinMode(13, OUTPUT);// Пин индикатора
pinMode(12, OUTPUT); // пин звука
pinMode(2, INPUT); // пин входа реле (тумблер)


digitalWrite(13, LOW);
digitalWrite(12, LOW);


tone(12,1500,100); // Звук старта калибровки
delay(180);
tone(12,1500,100);
delay(180);
tone(12,1500,100);


//Serial.begin(9600);
adc_zero1 = determineVQ(currentPin1); //Quiscent output voltage — the average voltage ACS712 shows with no load (0 A)
digitalWrite(13, HIGH);
tone(12,1000,100);

delay(150);
digitalWrite(13, LOW);

void loop() // Serial.print(«ACS712@A2_1:»);Serial.print(readCurrent(currentPin1,adc_zero1),3);Serial.println(" mA");
delay(300);

if(digitalRead(2)==0) < // Если включен тумблер то:
if (readCurrent(currentPin1,adc_zero1)> srab) // Если ток больше указанного порга сработки то:
digitalWrite(13, HIGH); // Включить индикатор

>
else // Иначе
if(digitalRead(2)==0) < //Если тумблер все еще включен то:
digitalWrite(13, LOW); // Погасить индикатор
tone(12,2000,500); > // и выдать звуковой сигнал
>

Датчик тока для Ардуино основан на эффекте Холла, имеет прямую зависимость измеряемой силы тока и выходного сигнала. Модули ACS712 / TA12-100 для измерения тока используются в проектах, где требуется защита от перегрузки, например, при изготовлении зарядных устройств и внешних аккумуляторов (power bank), импульсных источников питания. Рассмотрим, как работать с датчиками тока и Arduino Uno.

Характеристики датчика тока Arduino

ACS713 и ACS712 состоит из линейного датчика на базе эффекта Холла с медным проводником. Ток создает магнитное поле в медном проводнике, которое улавливается датчиком и преобразуется в напряжение. Сила магнитного поля линейно зависит от силы тока. Точность обеспечивается микросхемой на модуле с заводскими настройками. Работает цифровой датчик с постоянным и переменным током.

Технические характеристики ACS712

  • Тип интерфейса: цифровой;
  • Напряжение: постоянное и переменное;
  • Напряжение питания: 5 Вольт;
  • Ток потребления: не более 11 мА;
  • Измерение силы тока: от 5 до 30 Ампер;
  • Чувствительность: от 66 мВ/А до 185 мВ/А;
  • Температура эксплуатации: от -40°C до +85°C;
  • Размер платы модуля: 31 мм на 13 мм.

Датчик TA12-100 Arduino работает на другом принципе. Модуль измеряет напряжение, падающее на транзисторе в 200 Ом, который находится на выходе трансформатора. Датчик TA12-100 преобразует напряжение на резисторе в аналоговый сигнал, применяя закон Ома (I = E / R). Коэффициент трансформатора составляет 1000:1 и, чтобы получить значение тока, следует полученные данные умножить на 1000.

Технические характеристики TA12-100

  • Тип интерфейса: аналоговый;
  • Напряжение: постоянное;
  • Напряжение питания: 5 Вольт;
  • Ток потребления: не более 5 мА;
  • Измерение силы тока: до 5 Ампер;
  • Чувствительность: не известна;
  • Температура эксплуатации: от -55°C до +85°C;
  • Размер платы модуля: 30 мм на 24 мм.

Как подключить к Ардуино датчик ACS712

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • датчика тока ACS712 / TA12-100;
  • источник питания 12 Вольт;
  • нагрузка, например, лампа 12V;
  • провода «папа-папа», «папа-мама».

Счетч для датчика тока Arduino ACS712

Пояснения к коду:
  1. для переменного тока используйте команду sensorCurrent.readCurrentAC() ;
  2. при отрицательных значениях поменяйте местами провода на колодках.

Как подключить к Ардуино датчик TA12-100

Как подключить трансформатор тока к ардуино

Если будете брать, что-то другое, то берите на ATmega328, иначе памяти для кода может не хватить.

Интернет шилд

Чтобы было удобно подключать датчики купил Arduino Prototype Shield

Изображение

Датчик напряжения:
Использовал миниатюрный трансформатор. попался мне 220/18.
Схема подключения:

Вывод цепляю к 0 контакту ардуино (цифровой)

Изображение

схема подключения:

Вывод цепляю к 1 контакту ардуино (цифровой)
На схеме конденсатор 10 мкф - я ставил полярный (+ верхний в схеме).

LCD дисплей для отображения параметров

схему подключения дисплея к ардуино выложу чуть позже.

Последний раз редактировалось BATONS Вс июл 08, 2012 9:50 am, всего редактировалось 2 раза. Рейтинг: 8.24%

Код для Arduino

/*
Код мониторинга электропотребления и трансляции
данных на сервер majordomo
настроены коэфф под эту прошиву 5 июля 2012г


byte mac[] = < 0x00, 0x2A, 0xF6, 0x12, 0x69, 0xDU >; // MAC-адрес устройства
byte ip[] = < 192, 168, 8, 10 >; // ip-адрес устройства
byte server[] = < 192, 168, 8, 3 >; // IP компьютера на котором установлен сервер majordomo
byte gateway[] = < 192, 168, 8, 1 >;
byte subnet[] = < 255, 255, 255, 0 >;
char buf[80];
Client rclient(server, 80); // 80-порт

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest()
//Serial.println(buf);
if (rclient.connect())
<
//Serial.println("OK");
rclient.println(buf);
rclient.println("Host: 192.168.8.3"); // IP компьютера на котором установлен сервер majordomo
rclient.println();
delay(2000);
rclient.stop();
>

int numberOfSamples = 3000;

//Установка датчиков тока и напряжения
int inPinV = 0;
int inPinI = 1;


// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором
double VCAL = 27.00; // для напряжения
double ICAL = 2.21; // для тока
double PHASECAL = 2.3; // для мощности

double V_RATIO = 50.5 / 1024 * VCAL;
double I_RATIO = (long double) 15.15 * 5 / 1024 * ICAL;

//Образцы переменных
int lastSampleV,lastSampleI,sampleV,sampleI;

//Переменные для фильтров
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;

//Сюда сохраняем калибровочное значение фазы мгновенного напряжения
double shiftedV;

//Расчет переменной для мощности
double sqI,sqV,instP,sumI,sumV,sumP;

//Полезные значения переменных
double realPower,
apparentPower,
apparentPower1,
powerFactor,
Vrms,
Irms;

// инициализация библиотеки с перечнем задействованных выводов
LiquidCrystal lcd (8, 7, 6, 5, 3, 2);

void setup ()
Ethernet.begin(mac, ip, gateway, subnet); // Инициализируем Ethernet Shield

// устанавливаем ШИМ выход (регулируем контрастность дисплея):
pinMode (9, OUTPUT);
analogWrite (9, 70);
// устанавливаем кол-во столбцов и строк:
lcd.begin (16, 4);
lcd.print(" POWER MONITOR");
>
void loop ()

//Serial.println(temp);
for (int n=0; n<numberOfSamples; n++) // цикл крутится 3000 раз

//Используется для удаления смещения 2,5в
lastSampleV=sampleV;
lastSampleI=sampleI;

//Читаем с пинов текущее значение U и I
sampleV = analogRead(inPinV);
sampleI = analogRead(inPinI);

// Используется для удаления смещения 2,5в
lastFilteredV = filteredV;
lastFilteredI = filteredI;

//Цифровой фильтр для удаления постоянного смещения 2,5 в

filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);

//Тут калибруем фазу
shiftedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);

//Среднеквадратический метод расчета напряжения
//1) square voltage values
sqV= filteredV * filteredV;
//2) Суммируем
sumV += sqV;

// Среднеквадратический метод расчета тока
//1) square current values
sqI = filteredI * filteredI;
//2) Суммируем
sumI += sqI;

//Мгновенная мощность
instP = shiftedV * filteredI;
//Суммируем
sumP +=instP;
>

//Расчет корня из среднего напряжения и тока (rms)
Vrms = V_RATIO*sqrt(sumV / numberOfSamples);
Irms = I_RATIO*sqrt(sumI / numberOfSamples);

//Расчет величины мощности
//realPower = V_RATIO*I_RATIO*sumP / numberOfSamples;
apparentPower = (Vrms * Irms)/1000; // значение в Киловатах
apparentPower1 = (Vrms * Irms); // значение в Ваттах
powerFactor = realPower / apparentPower;


//Сброс накопленных значений
sumV = 0;
sumI = 0;
sumP = 0;

// устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0):
lcd.setCursor (0, 1);
lcd.print ("U I P kW");
delay(333);


// отправляем значения на сервер majordomo

Читайте также: