Как стать автором
Обновить

Комментарии 30

Как гадко обжат сетевой кабель в RPi на первой картинке.
На практике востребованы не инвазивные (бесконтактные) способы измерения тока и, как следствие, потребляемой мощности в квартире или доме. К примеру британский Current Cost EnviR рассмотренный ранее на Хабре или же WebMeteoBox разработанный в Дубне и используемый в Народном мониторинге.
Разумеется данный метод измерений менее точен (у британца до 5% заявлено), но отсутствие необходимости врезаться в электропроводку много стоит. Наиболее популярный измерительный датчик (трансформатор тока) SCT-013 за примерно $9 на eBay.
Еще одного его применение также было опубликовано на Хабре.
Спасибо за ссылку на SCT-013, интересно.
Вообще прототип предназначается для управления отдельно стоящим телевизором, чтобы дети днем делали уроки, а не пялились в ящик, пока родителей нет дома. Отсюда — реле. Измерялка же позволяет точно определить, «а не пялились ли дети в телевизор, вместо того чтобы делать уроки? (не играли ли в компьютер и т.д.)».
Собственно, реализовать это как устройство — вариантов много. Мне показалось, что будет интересно рассказать про применение Mathematica для Raspberry Pi и напомнить про алгебру тем, кто ее подзабыл. На реально работающее устройство этот прототип, конечно, не тянет.
Телевизор проще по пингу отлавливать (-
При условии, что смарт.
Свой не смарт ловлю по наличию синезуба в эфире, запитанного от USB телевизора.
У меня ТВ воткнут в ИБП, на котором кроме ТВ висит только точка доступа и маршрутизатор — они его грузят на 1-3%, а вот когда включается телек, то нагрузка возрастает до 17%, поэтому мне легче по ИБП мониторить, когда дети телек включали.
Как-то слишком сложно… Проще ведь отлавливать начало синусоиды(переход через ноль), суммировать измеренные значения(абсолютные, без знака) за один период(10мс, или 20мс для полной волны) и разделить на количество измерений(обычно подбирается такая частота измерения которая дает количество измерений на период кратное двойке — 16, 32, 64...) за один период. Потом при необходимости пропускаем через оконный фильтр и можно показывать значение на индикаторе, с задержкой равной размеру окна зато без шума. Если датчик шумит даже при отсутствии тока — этот шум можно откалибровать и вычитать из измерений. Можно даже без отлова нуля, для медленно изменяющегося во времени среднего за период тока.
Переход через ноль, по идее, должен соответствовать 1024 / 2, но в реальности довольно сильно от него отличается. Датчик действительно шумит на нуле, свою ошибку добавляет АЦП. Ноль также может плавать со временем. Не могу сказать почему, но результаты усреднения по 512 измерениям на нуле в разное время довольно сильно отличались.

Кроме того, я бы не сказал, что второй вариант сильно сложный. По-моему наоборот все довольно просто. Не универсально, конечно, потому что не будет работать, скажем, для сети 60 Гц. Но можно заложить в скетч инициализацию и указывать частоту тока при подключении устройства в Raspberry.
Переход через ноль можно отлавливать по напряжению.
Я кажется понимаю откуда шум берется, видимо пытаетесь измерять ток в цепи на уровне разрешающей способности датчика — слишком грубый датчик для измерения тока. Например, измерять 10мА на датчике со шкалой в 5А. Тогда надо усреднять выборки по нескольким периодам.

В конце концов, можно заложится на чисто синусоидальный ток измерять его аналоговой схемой а АЦП пусть измеряет уже готовый результат после выпрямления и фильтрации.

У меня задача была несколько проще — я знаю что ток около нуля точно не протекает и есть довольно широкие интервалы возле нуля в которых тока гарантированно не может быть(либо это аварийное состояние) поэтому не так важно сколько точно циклов измерения уложится за полупериод — +-1 роли играть не будет, всеравно там в начале и конце много нулей. Усреднение 16 выборок за полупериод, затем за 16 периодов еще одно среднее получается и направляется на вычисление среднего из последних 8 значений. Получилось очень замечательно — показания не прыгают, стоят как вкопаные(3 знака) инерционность где-то в 1.5 секунд(почти стрелочный прибор получился).
Можно еще в качестве АЦП использовать модуль на базе PCF8591.
В модуль встроены датчик температуры и освещенности, есть простейший ЦАП.
Интерфейс I2C, т.е. ничего лишнего. Цена бюджетна.

image

Ссылки для приобретения:
electrodragon,
dealextreme
Он довольно медленный, подойдет конечно для измерения медленных параметров таких как освещенность, датчик температуры и влажности, но захватить отдельные выборки 50Гц синусоиды будет проблематично.
Судя по графику, там ВЧ шум. Его легко отфильтровать НЧ фильтром, благо он пишется ровно в одну строчку. Надобно ещё измерять настоящее напряжение (у меня оно например колеблется от 215В до 240В в зависимости от времени суток). Далее, тупо интегрируя, можно получить энергию и, соотвественно, мощность.
Приемлемое сглаживание получается на отрезке около 1/2 периода синусоиды. Понятно, что при этом амплитуда сильно проседает. Скорее всего с приемлемой точностью можно получить фактическую амплитуду, просто умножив сглаженную на заранее подобранную константу. Но я не проверял.
Э… не совсем понял. Вы НЧ фильтр использовали или просто усредняли по окну?
У вас остались сырые данные? Попробуйте применить к ним во такое преобразование:
y[i] := y[i-1] + α * (x[i] — y[i-1]) и поэскпериментировать со значением альфы от 0 до 1.
x — это сырые данные, y — отфильтрованные.
Нет, НЧ фильтр на цепь нагрузки я не ставил. Просто сглаживал по окну и смотрел, на каком объеме выборки графики будут достаточно гладкими.
Честно говоря, дальше экспериментировать я не планировал: результат меня вполне устраивает как по точности, так и по быстродействию.
А вы можете на ардуино сделать анализатор качества электроэнергии с автоматической генерацией отчета на соответсвие ГОСТ Р 54149-2010? Особенно интересует статистика всплесков напряжения. Я в таком заинтересован.
Только на Arduino — вряд ли. В связке с Raspberry — думаю да. Показания с Arduino можно снимать несколько (2 или 3) раз в секунду. Если такая дискретность удовлетворяет требованиям ГОСТа, то можно. Сделать сервер на PHP или Java, который будет генерить отчет легко. В выходные почитаю ГОСТ и отпишусь сюда же.
Если под анализатором качества подразумевается нечто подобное www.zetlab.ru/catalog/analyzers/a17_e8.php, то на Arduino его не сделать.

На Arduino можно добавить повесить датчик напряжения, например, как здесь habrahabr.ru/post/193022/. Но я бы скорее не отлавливал ноль, как автор, а сделал аналогично измерению тока и в цикле собирал данные и по току и по напряжению. Тогда можно было бы вычислять фазовое напряжение и ток, а также фазовый угол между током и напряжением.

Если же с Arduino брать только статистику, а анализ делать уже на Raspberry, тогда, скорее всего, можно вычислить все, что делает анализатор ZETLAB, включая частоту и гармоники.
Шумит не АЦП, а эти «сети» на фото, которые тянутся к датчику, вместо дифф-линий. Замените на скрученную пару: сигнал + земля. Земляной надо вывести к земляному выводу АЦП микроконтроллера, а не на любую первую попавшуюся землю. АЦП там всего-лишь десяти-разрядный, у него даже младший бит не прыгает, а в режиме 8-и бит чтобы там помехи были — нонсес.
Эта интересно. Я немного «упростил» схему, убрав «сопли»:



Правда это мало на что повлияло (график без нагрузки):



Есть еще какие-нибудь соображения, как избавиться от шума?
Нормирующий усилитель… немудрено столько шума наловить, амплитуда всего в 3 бита укладывается — малейшие наводки и имеем что имеем. Это кстати порядка 10мВ для АЦП, вполне может быть шум на «земле», надо бы общий провод для шунта взять непосредственно с вывода AGND контроллера и по этому проводу кроме прямого его назначения другой ток не пускать.
ACS712 — это не шунт, а дачик Холла. И я не знаю, какая из ног ATMEGA328P есть AGND. В даташите на него про отдельный AGND ничего не нашел, поэтому воткнул в ближайшую к блоку A0-A5 землю. Не думаю, чтобы это было принципиально. Мне все-таки кажется, что шумы на датчике. Залью на гит еще проект и назову ГСЧ на эффекте Холла… :)
Для таких величин порядка миливольт это очень принципиально. Для этого и задумывался этот вывод — именно относительно него идет отсчет АЦП. Если подключать не к нему, то практически любой ток вызовет изменение потенциала в точке подключения твоего «общего» провода относительно AGND и соответственно измеряемой величины.
Я когда-то давным давно делал блок питания, классика — стабилитрон, составной транзистор и т.д. долго не мог понять — на стабилитроне напряжение стабильно а на выходе идут пульсации в 200мВ — уже позже измерив всю схему вдоль и поперек выяснил причину — 15мА тока шли к стабилитрону от выпрямителя очень длинными дорожками, и все бы ничего но транзисторы стабилизатора брали общий провод прямо с выпрямителя, и этого длинного общего провода было достаточно чтобы ток в 15мА создавал 200мВ пульсаций, которые складывались с напряжением стабилитрона(которое таки было очень стабильное) и шли на транзисторы стабилизатора передавая эти пульсации на выход.

Странное дело, почему-то в даташите вывод этот не обозначен как аналоговая земля — вобщем он рядом с AVCC, AREF. AGND — 22 вывод(для DIP-а).
Кстати посмотри еще на схеме как подключено AVCC — он должен быть подключен к питанию через LC-фильтр, а на AREF должен быть конденсатор на AGND иначе АЦП можно использовать только с потенциометрами именно из-за помех в аналоговые цепи.
У меня Arduino такое: freeduino.ru/arduino/freeduino-2013.html

На нем 22 нога припаяна к общей земле. AVCC не выведен никуда. AREF на другой стороне от A0-A5 и никаких конденсаторов я там не разглядел. Я попробую как-нибудь завязать датчик на него вместо VCC. Посмотрим, станет ли лучше.
Судя по расположению контроллера, AVCC AREF и AGND должны быть как раз со стороны аналоговых входов A0-A5. То что питание аналоговой части никак не фильтруется это фигово вобщем-то и может стать причиной «шума».
Вообще по хорошему, на время измерения аналоговой величины необходимо еще и контроллер останавливать — для этого даже предусмотрен специальный спящий режим, из которого контроллер выходит в конце преобразования.
Отцепите всё — от датчика сети, USB и т.п, запитайтесь от аккумулятора. Далее острым пинцетом соедините выводы микроконтроллера AGND и входной пин АЦП. Снимите «осциллограмму», например в память, а потом по USB залейте к себе в приложение, там должно быть совершенно чисто, максимум, и то не факт, может прыгать младший бит. Если прыгает, то грязь идёт по питанию, например от ИП, или стабилизатора или USB, или по питанию REF. Тут только осциллографом можно это увидеть.
Я решил попробовать с другим датчиком и собрал конструкцию как здесь: openenergymonitor.org/emon/buildingblocks/measuring-voltage-with-an-acac-power-adapter Выглядит так:



Под напряжением дает такую картинку:



Лепота. Амплитуда вдвое шире, чем у авторов OpenEnergyMonitor, но это потому, что я взял трансформатор 12V/24V (какой оказался в принесенном в жертву БП). Без напряжения картинка получается в пределах (± 1 бит):









Скорее всего совершенствуя схему можно добиться чистого нуля (спаять, а не собирать на макете; подобрать емкость конденсатора; провода убрать...). Продолжение в следующей серии

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

Та же тенденция почему-то встречается и в программах отображающих атмосферное давление… накой ляд автоматически подстраивать масштаб чтобы график давления всегда занимал всю ширину экрана? что изменение на 1милиБар что на 20милиБар — одинаковая амплитуда, визуально кажется что давление меняется одинаково сильно и подвох замечаешь только при считывании масштаба по меткам на оси.
Скетч (вдруг кому нужен) уехал сюда: bitbucket.org/babinvn/ac-current-meter/src/master/meter.ino

Репозиторий на Github это отродье мелкой мякоти заблокировало во время моей поездки в Крым и неосторожной попытки поработать из отпуска.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории